基于每个符号模拟--whole-archive行为

时间:2016-02-08 23:05:32

标签: gcc linker static-libraries elf

我熟悉使用静态存档时--whole-archive链接器选项的作用。

有没有办法通过一些符号属性或任何其他技巧在每个符号的基础上实现相同的效果?

要清楚,假设我有一个.a,它有两个功能:

void foo() {}
void bar() {}

我想确保通过链接到此存档构建的任何可执行文件将始终具有foo()符号,无论是否正在使用foo()。我没有同样关心bar()

感谢。

3 个答案:

答案 0 :(得分:0)

您可以使用选项-u

gcc -O2 foo.c -o foo -umysymbol -lmylib

这会强制链接器将mysymbol视为未定义,并通过链接指定的库来解析它。

来自ld:

的联机帮助页
  

-u symbol

     

- 未定义=符号

     

强制符号作为未定义的符号输入到输出文件中。例如,这样做可以触发附加的链接   标准库中的模块。 `-u'可以用不同的方式重复   输入其他未定义符号的选项参数。

答案 1 :(得分:0)

我担心您需要修改链接以实现此目的。

您应该清楚归档中的实体(.a) 可以链接或不链接的可执行文件不是 个别符号定义,但个别档案成员, 它们是目标文件,每个都可以任意定义 很多符号。如果要链接存档中的符号,请链接整个符号 定义它的归档成员。 1

链接档案(.a)之间的最重要区别 使用您的可执行文件并链接目标文件(.o)就是这样 一个目标文件无条件地链接,而一个档案成员 只有在为至少一个符号提供定义时才会链接 在检查存档时已被引用但未定义。

因此,确保符号foo被链接的普通,非迂回方式 无条件地链接定义它的对象文件。没有 将归档成员foo.o标记为的方式必须链接,因为,如果您 必须链接foo.o,您可以通过关联foo.o来完成此操作。

因此,如果foo位于档案成员foo.o中,您可以 从存档中提取该成员:

ar x libthing.a foo.o

并将foo.o添加到您的关联中,即使您没有foo来源也是如此 从中编译foo.o

如果您想要无条件地链接许多功能 然后你可以将它们全部从源代码编译成一个对象 文件,如果您有源,或者您可能收集所有目标文件 将它们定义为与--whole-archive链接的单个存档。

  

我希望找到一种方法来宣传图书馆本身的公共性质

出于链接目的,库中只有公共符号:by 定义链接器可以看到的任何符号都是公共的。

<小时/> [1]如果您能够编译进入的目标文件 你的链接,然后通过使用适当的编译器和链接器标记你 可以确保最终丢弃它可能贡献的冗余符号 链接器。请参阅this answer

答案 2 :(得分:0)

以下似乎对我有用。

在我知道的库中我总是被调用的函数中,我执行以下操作:

TRUE

现在,在创建存档或构建可执行文件时,无需更改链接中的任何内容,我发现可执行文件具有foo符号。