2013-01-19 23 views
9

考虑的hello world C程序:如何确定gcc默认将哪些命令行选项传递给ld?

的hello.c

#include "stdio.h" 

int main() 
{ 
     printf("Hello, World!\n"); 
} 

如果我称之为:

$ gcc -c hello.c -o hello.o 

它会产生一个ELF重定位文件hello.o

如果我然后打电话:

​​

它将链接hello.o与LD和产生ELF可执行文件你好

但是,如果我叫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 must将其他选项传递给ld(例如链接C库)。

是否有无论如何确定命令行gcc正在通过命令[1] ld通过?

回答

15

是的,您可以使用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的别名。

+1

它似乎在我的Ubuntu 12.10 64盒'collect2'不是'ld'的简单别名。 'collect2'是一个可执行文件,而'ld'是'ld.bfd'的sym链接,它是一个到'hardened-ld'的符号链接,它是一个perl脚本。不知道那里发生了什么。 –

+1

对不起,我不是指文字别名。你会发现如果你用'ld'运行相同的命令,它会起到同样的作用。文档:http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gccint/Collect2.html –

+0

'collect2'和'ld'有什么区别?阅读gccint后无法轻松理解。 –

相关问题