考虑一下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的确切内容是什么?
答案 0 :(得分: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 :(得分:0)
对于单线恋人:
echo "int main(void) {}" | gcc -o /dev/null -v -x c - &> /dev/stdout| grep collect | tr -s " " "\012"
将-x c
替换为-x c++
以获得c ++标志。
也可以与clang一起使用,但是在这种情况下,您应该对/usr/bin/ld
使用grep