如何确定哪些命令行选项GCC在默认情况下传递给ld?(How to determine which

2019-07-18 10:59发布

考虑的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可执行文件打招呼

然而,如果我称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通过在命令LD [1]

Answer 1:

是的,你可以使用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



文章来源: How to determine which command line options gcc passes to ld by default?