给定两个Linux静态库,如何判断一个是否取决于另一个?

时间:2016-09-20 23:34:58

标签: linux gcc static-libraries ld nm

我有一堆.a个文件,其生成过程不受我控制,也不是它们的来源。当我使用它们进行链接时,我想知道它们的依赖关系(libA.a取决于libB.a,如果在libA.a中有一些未定义但在libB.a中定义的符号),那么我可以在ld / gcc命令行中按正确顺序放置它们。

我不想做链接(即指定那些库两次),因为我想将这些依赖项保存到bazelBUILD文件中,所以我想知道准确的依赖性。

我想知道是否有一些命令行工具,libA.alibB.a,可以判断libA.a是否依赖于libB.a?如果不存在,我该如何编写这样的脚本?

注意:我对依赖的定义可能不是100%准确。如果除了已定义/未定义的符号之外还有其他类型的依赖关系,请告诉我。

最简单的方法是处理nm libA.anm libB.a的输出并查找U符号,但man nm中列出了许多类型的符号,每个符号都有它们有不同的语义,所以我担心如果我使用这种简化的方法,我可能会错过一些。

1 个答案:

答案 0 :(得分:0)

我会使用以U符号开头的方法。实际上,您需要关注的是大写的符号类型(这些是您链接的内容)。我编写了脚本来打印导出和导入的符号,对于这种情况,它就足够了

exports libB.a >libB-exports
externs libA.a >libA-externs
comm libB-exports libA-externs >libA-needs-libB

列出符号,其中libA将使用来自libB的符号(列表已排序,因此comm应该"只需工作")。如果这些是共享库,则必须修改脚本(向{nm}添加-D选项。

进一步阅读: