假设我正在try 从以下位置创建可执行二进制文件:
// main.c
#include <stdio.h>
int main() {
printf("Hello, world!");
return 0;
}
我只需运行gcc main.c
,就可以得到可执行的二进制a.out
,它会打印出‘Hello,world!’,这是我想要的.
有人告诉我,gcc
在这里做了两件事:
- 把
main.c
个编译成目标代码, - 已将该代码与标准库联系起来,这样
printf
就可以工作了.
如何手动逐个手动完成这两个步骤?
我通过运行gcc -c main.c
开始将main.c
编译为目标代码,创建目标文件main.o
.现在,我想要执行链接步骤.似乎我也可以用gcc
来做这件事,只需运行gcc main.o
,产生可执行的二进制a.out
.
我读到这个gcc
的第二次调用实际上是在幕后运行链接器ld
.我如何使用ld
而不是第二次调用gcc
来实现这一点呢?如果我运行ld main.o
,我得到一个警告和一个错误:
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
ld: main.o: in function `main':
main.c:(.text+0x10): undefined reference to `printf'
该错误似乎表明我需要告诉它链接到C标准库,这样我才能使用printf
.我可以用-lc
号旗帜ld main.o -lc
号.这会产生a.out
个结果,但我仍然收到警告:
ld: warning: cannot find entry symbol _start; defaulting to 00000000004002e0
当我运行a.out
时,它会永远在屏幕上打印Hello, world!
:
Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello, world!Hello,
What's the correct way to invoke 100 here to eliminate the warning and get the correct executable?