gpt4 book ai didi

gcc - GCC 和 LD 链接有什么区别?

转载 作者:行者123 更新时间:2023-12-02 15:55:41 24 4
gpt4 key购买 nike

最近我正在创建一个可加载模块,发现两者

gcc -fPIC --shared -o foo.so.1 foo.c

gcc -fPIC --shared -c foo.c
ld --shared -o foo.so.2 foo.o

可以达到同样的效果。

我还发现 foo.so.1 比 foo.so.2 大大约 3KB,并且

gcc -### -fPIC --shared -o foo.so.1 foo.c

透露 GCC 在 foo.so.1 中添加了 foo.c 以外的内容(例如 crtendS.o 和 crtn.o):

/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 "--sysroot=/" --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 "--hash-style=both" -shared -o foo.so.1 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. /tmp/cc3JBdCJ.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o

由于 foo.so.1 和 foo.so.2 都可以通过 dlopen 加载,我想知道:

  1. 这两种链接方法有什么区别?
  2. crtendS.o 和 crtn.o 对创建的库中的函数有什么影响吗?

最佳答案

原则上没有区别。当您“通过 gcc 链接”时,它实际上调用 ld。如果您在“linking by gcc”时在链接阶段收到一条消息,您将立即看到它实际上来自 ld。如果您想将一些特定于 ld 的命令行选项传递给 ld,gcc 的命令行界面具有专门用于此目的的功能(-Xlinker-Wl 选项) .

至于附加对象文件...它们可能包含由编译器隐式添加的全局加载时库初始化/反初始化代码。 (标准库要求?)您可以在这里找到一些相关信息:https://gcc.gnu.org/onlinedocs/gccint/Initialization.html

关于gcc - GCC 和 LD 链接有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26152896/

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