链接器将哪些符号放入可执行的ELF中?

时间:2012-12-27 21:49:55

标签: c++ c linux linker elf

请考虑以下命令:

g++ -Wl,--start-group main.o liba.a -Wl,--end-group -o a.out

是否有可能在a.out中有一些符号在liba.a中定义但main.o没有使用?如果是,在什么情况下?在编写源代码或调用编译器或链接器以实现这一点时是否有一些技巧?根据我的知识,这不应该发生,但我最近遇到了类似的情况。

1 个答案:

答案 0 :(得分:2)

我至少可以想到可能发生这种情况的三种情况:

  1. -Wl,--whole-archive可用于强制liba.a包含在其完整中,而不仅仅包含在所需的目标文件中。
  2. liba.a可能包含C运行时使用的符号,绕过main.o的内容。此类符号的最常见原因是带有构造函数的C ++全局或文件范围对象。
  3. 默认情况下,链接器以单个目标文件的比例修剪未使用的代码;如果一个目标文件定义了一组只使用了其中一些符号的符号,那么所有这些符号都将存在。您可以通过使用liba.a编译进入 -ffunction-sections -fdata-sections的所有内容,然后在链接时提供-Wl,--gc-sections来解决此问题。使用非常近期的GCC(我不会尝试使用4.7之前的任何内容),使用-flto编译所有内容,然后使用-fwhole-program进行链接也可能有所帮助。