1

考虑以下命令:

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

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

4

1 回答 1

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也可能会有所帮助。
于 2012-12-27T21:57:20.713 回答