在Linux上寻找静态链接顺序工具

时间:2011-06-22 02:03:29

标签: c++ linker g++

在Linux下使用g ++确定最佳静态链接顺序是否有任何不错的工具?我熟悉一般问题,包括(如果需要)使用重复引用单个库或--start-group和--end-group来解决循环依赖关系,但我想要的是,如果可能的话,是一个工具,将采取一堆.a文件,并为他们吐出一个良好的静态链接顺序,必要时重复库,同时将重复保持在最低限度。

背景:我正在开发一个包含大约800K行继承c ++代码的项目,并尝试将其重构为更小,更易于管理的块。一些现有的文件是巨大的单块 - 今天我一直在与单个34K行.h文件搏斗,它定义了113个类和结构。许多类几乎完全是在.h文件中内联定义的。当我将其拆分为更小的块,并将一些实现代码迁移到.cpp文件时,Linux上所需的链接顺序不断变化。这可能是因为包含.h文件的每个库都用于编译自己所需的任何类的实现,现在他们必须链接到单个库文件中的公共实现。长期我们可能会将一些类重新组织到不同的库中,并打破一些依赖链,但是现在依赖性非常混乱,我正在尝试最小化对可能改变行为的代码的扰动。我不希望每次更改时都必须手动确定正确的链接顺序。建议?

2 个答案:

答案 0 :(得分:4)

我不知道有一个随便,但你可以自己实现一个。只需使用nm从每个静态库中获取符号列表,使用它来构建依赖图,然后对图表执行拓扑排序以获得正确的链接顺序。

或者,使用部分链接(ld -r)而不是静态库。由于这会输出合并的.o文件,因此您的最终链接可以按任何顺序声明库,并且它们都将正确链接。缺点是链接器将无法丢弃未使用的源文件,因为它们在使用数据可用之前已经链接到单个文件中(您可以通过在编译期间传递-ffunction-sections -fdata-sections来解决此问题,并{{1}在最终链接上,虽然这可能会影响编译所需的时间)

答案 1 :(得分:1)

您可以使用共享库而不是静态库,并使用-fPIC选项进行编译。