gpt4 book ai didi

c++ - 链接器会将哪些符号放入可执行 ELF 中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:11 24 4
gpt4 key购买 nike

考虑以下命令:

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

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

最佳答案

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

  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也可能有所帮助。

关于c++ - 链接器会将哪些符号放入可执行 ELF 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14061757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com