什么';通过GCC和LD链接有什么区别?
最近我创建了一个可加载的模块,发现什么';通过GCC和LD链接有什么区别?,gcc,shared-libraries,ld,Gcc,Shared Libraries,Ld,最近我创建了一个可加载的模块,发现 gcc -fPIC --shared -o foo.so.1 foo.c 及 可以达到同样的效果 我还发现foo.so.1比foo.so.2大约3KB gcc -### -fPIC --shared -o foo.so.1 foo.c 显示GCC在foo.so.1中添加了foo.c以外的内容(例如,crtrends.o和crtn.o): 由于foo.so.1和foo.so.2都可以通过dlopen加载,我想知道: 这两种链接方法有什么区别 crtn.o和c
gcc -fPIC --shared -o foo.so.1 foo.c
及
可以达到同样的效果
我还发现foo.so.1比foo.so.2大约3KB
gcc -### -fPIC --shared -o foo.so.1 foo.c
显示GCC在foo.so.1中添加了foo.c以外的内容(例如,crtrends.o和crtn.o):
由于foo.so.1和foo.so.2都可以通过dlopen加载,我想知道:
原则上没有区别。当您“通过gcc链接”时,它实际上调用ld。如果您在“通过gcc链接”的链接阶段收到一条消息,您将立即看到它实际上来自ld。如果要将某些特定于ld的命令行选项传递给ld,gcc的命令行界面具有专门用于此目的的功能(
-Xlinker
和-Wl
选项)
至于其他对象文件。。。它们可能包含编译器隐式添加的全局加载时库初始化/反初始化代码。(由标准库请求?)您可以在此处找到一些相关信息:如果“gcc链接”结果与直接ld调用不同,则gcc必须通过向ld传递附加参数(选项、LIB)来实现这一点。
gcc -### -fPIC --shared -o foo.so.1 foo.c
/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