如何确定默认情况下gcc传递给ld的命令行选项?

如何确定默认情况下gcc传递给ld的命令行选项?,c,linux,gcc,binutils,C,Linux,Gcc,Binutils,考虑hello world C程序: 你好,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[

考虑hello world C程序:

你好,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在command
[1]
中到底传递给ld的是什么?

是的,您可以使用
gcc-v hello.o-o hello
来获取链接行。在我的ubuntu机器上的例子中,我得到了以下链接行(为了可读性而编辑为多行):

请注意,
collect2
只是
ld

的别名,适用于在线爱好者:

echo“intmain(void){}”gcc-o/dev/null-v-xc-&>/dev/stdout | grepcollect | tr-s”“\012”
< > >用<代码> -x C++ +代码>替换<代码> >代码>以获得C++标志。< /P>
也可以与叮当声一起使用,但在这种情况下,您应该为
/usr/bin/ld

添加grep。在我的Ubuntu 12.10 64 box上,
collect2
似乎不是
ld
的简单别名
collect2
是一个可执行文件,而
ld
是指向
ld.bfd
的符号链接,后者是指向
强化ld
的符号链接,后者是一个perl脚本。不知道那里发生了什么。对不起,我不是指字面别名。您会发现,如果您使用
ld
运行相同的命令,那么它的工作原理是相同的。文档:
collect2
ld
之间有什么区别?读了gccint后不容易理解。它们实际上是相同的二进制文件。
/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