2016-09-20 35 views
0

我有一堆.a文件,其生成过程不受我控制,也不是它们的来源。当我使用它们进行链接时,我想知道它们的依赖关系(libA.a取决于libB.a,如果某个符号在libA.a中未定义,但在libB.a中定义),以便我可以在命令行中将它们按正确的顺序排列。给定两个Linux静态库,如何判断一个是否依赖于另一个?

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

我不知道是否有一些命令行工具,给出libA.alibB.a,可以告诉libA.a是否依赖于libB.a?如果没有这样的话,我该如何编写这样的脚本?

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

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

+0

静态库不依赖于任何明确的其他库。 –

+0

@IporSircer,它们没有像'.so'文件那样编码成文件格式的依赖项,但它们确实有依赖关系。如果'libA.a'依赖于'libB.a',那么在'ld'命令行'libA.a'应该放在'libB.a'之前,因为'ld'的工作方式。 –

回答

0

我会使用以U符号开头的方法。在实践中,大写的符号类型都是您需要关注的(这些是您链接的内容)。我写的脚本打印导出和导入的符号,而这种场合,就足够做

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

列出符号,其中力霸将使用从libB(符号列表进行排序,所以comm应“只是工作“)。如果这些是共享库,则脚本将不得不进行修改(在nm上添加-D选项)。

延伸阅读:

相关问题