给定两个 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.alibB.a,可以判断libA.a 是否依赖于libB.a?如果没有,我该如何写这样的脚本?

注意:我对 依赖 的定义可能不是 100% 准确的。让我知道除了已定义/未定义的符号之外是否还有其他类型的依赖项。

最简单的方法是处理nm libA.anm 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环境下静态库(.a)的编译和使用

如何判断一个库是不是是用 -g 编译的?

linux 下C标准库是动态库还是静态库,还是两种库都提供了?

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

如何使用自动工具构建静态和共享库?

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库