我有一堆.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
中列出了许多类型的符号,每个符号都有它们有不同的语义,所以我担心如果我使用这种简化的方法,我可能会错过一些。
答案 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
选项。
进一步阅读: