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

And*_*zos 9 c linux gcc binutils

考虑一下hello world C程序:

你好.:

#include "stdio.h"

int main()
{
        printf("Hello, World!\n");
}
Run Code Online (Sandbox Code Playgroud)

如果我打电话:

$ gcc -c hello.c -o hello.o
Run Code Online (Sandbox Code Playgroud)

它将生成一个ELF可重定位文件hello.o

如果我然后打电话:

$ gcc hello.o -o hello            [1]
Run Code Online (Sandbox Code Playgroud)

它将hello.o与ld链接并生成一个ELF可执行文件hello

但是,如果我直接调用ld [2]而不是[1]:

$ ld hello.o -o hello             [2]
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

/usr/bin/ld.bfd.real: warning: cannot find entry symbol _start
test.c:(.text+0xa): undefined reference to `puts'
Run Code Online (Sandbox Code Playgroud)

gcc必须将其他选项传递给ld(例如链接C库).

反正有没有确定命令行gcc在命令中传递给ld的确切内容[1]

Car*_*rum 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
Run Code Online (Sandbox Code Playgroud)

请注意,这collect2只是一个别名ld.

  • 在我的 Ubuntu 12.10 64 机器上,似乎 `collect2` 不是 `ld` 的简单别名。`collect2` 是一个可执行文件 - 而 `ld` 是一个到 `ld.bfd` 的符号链接,它是一个到 `hardened-ld` 的符号链接,它是一个 perl 脚本。不知道那里发生了什么。 (2认同)
  • 对不起,我不是指字面别名.你会发现,如果用`ld`运行相同的命令,它将会起作用.文档:http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gccint/Collect2.html (2认同)