如何确定gcc默认将哪些命令行选项传递给ld?

考虑一下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]

 $ 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正在通过命令[1] ld通过?

Solutions Collecting From Web of "如何确定gcc默认将哪些命令行选项传递给ld?"

是的,你可以使用gcc -v hello.o -o hello来获取链接。 为你的例子在我的Ubuntu机器,我得到这个链接线(编辑为多行为了可读性):

 /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的别名。