gpt4 book ai didi

c - 如何确定 gcc 默认将哪些命令行选项传递给 ld?

转载 作者:IT王子 更新时间:2023-10-29 00:11:18 27 4
gpt4 key购买 nike

考虑一下 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 在命令 [1] 中传递给 ld 的确切内容?

最佳答案

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

关于c - 如何确定 gcc 默认将哪些命令行选项传递给 ld?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418242/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com