给定两个 Linux 静态库,如何判断一个是不是依赖于另一个?
Posted
技术标签:
【中文标题】给定两个 Linux 静态库,如何判断一个是不是依赖于另一个?【英文标题】:Given two Linux static libraries, how to tell if one depends on the other?给定两个 Linux 静态库,如何判断一个是否依赖于另一个? 【发布时间】:2016-09-20 23:34:57 【问题描述】:我有一堆.a
文件,它们的生成过程不受我控制,它们的来源也不受控制。当我使用它们进行链接时,我想知道它们的依赖关系(libA.a
依赖于libB.a
,如果在libA.a
中有一些符号未定义但在libB.a
中定义),以便我可以将它们按正确的顺序排列在ld
/gcc
命令行中。
我不想过度链接(即两次指定这些库),因为我想将这些依赖项持久化到bazel 的BUILD
文件中,所以我想知道确切的依赖项。
我想知道是否有一些命令行工具,给定libA.a
和libB.a
,可以判断libA.a
是否依赖于libB.a
?如果没有,我该如何写这样的脚本?
注意:我对 依赖 的定义可能不是 100% 准确的。让我知道除了已定义/未定义的符号之外是否还有其他类型的依赖项。
最简单的方法是处理nm libA.a
和nm libB.a
的输出并寻找U
符号,但是man nm
中列出的符号类型很多,每种都有不同的语义,所以我是担心如果我使用这种简化的方法可能会错过一些。
【问题讨论】:
静态库不依赖于任何其他库。 @IporSircer,它们没有像.so
文件那样编码成文件格式的依赖关系,但它们确实有依赖关系。如果libA.a
依赖于libB.a
,那么在ld
命令行中,libA.a
应该放在libB.a
之前,因为ld
的工作方式。
【参考方案1】:
我会使用以U
符号开头的方法。在实践中,大写的符号类型是你需要关心的(那些是你链接的对象)。我编写了脚本来打印导出和导入的符号,对于这种情况,这样做就足够了
exports libB.a >libB-exports
externs libA.a >libA-externs
comm libB-exports libA-externs >libA-needs-libB
列出 libA 将使用来自 libB 的符号的符号(列表已排序,因此 comm
应该“正常工作”)。如果这些是共享库,则必须修改脚本(向 `nm 添加-D
选项)。
进一步阅读:
exports
script to show which symbols are exported from a collection of object files
externs
display all external symbols used by a collection of object files
download-link
【讨论】:
以上是关于给定两个 Linux 静态库,如何判断一个是不是依赖于另一个?的主要内容,如果未能解决你的问题,请参考以下文章
linux 下C标准库是动态库还是静态库,还是两种库都提供了?