考虑一下hello world C程序:
hello.c :
#include "stdio.h" int main() { printf("Hello, World!\n"); }
如果我打电话给:
$ gcc -c hello.c -o hello.o
它将产生一个ELF可重定位文件 hello.o
如果我再致电:
$ gcc hello.o -o hello [1]
它将hello.o与ld链接,并产生一个ELF可执行文件 hello
但是,如果我直接调用ld [2]而不是[1]:
[2]
[1]
$ ld hello.o -o hello [2]
我得到这些错误:
/usr/bin/ld.bfd.real: warning: cannot find entry symbol _start test.c:(.text+0xa): undefined reference to `puts'
gcc必须将其他选项传递给ld(例如,链接C库)。
无论如何,有没有确切确定命令行gcc传递给ld in命令的信息[1]?
是的,您可以gcc -v hello.o -o hello用来获取链接线。对于您在ubuntu机器上的示例,我得到以下链接行(为便于阅读,已编辑为多行):
gcc -v hello.o -o hello
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/collect2 --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello -z relro /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../.. -L/usr/lib/x86_64-linux-gnu hello.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.4.5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o
请注意,这collect2只是的别名ld。
collect2
ld