【发布时间】:2011-10-03 03:13:45
【问题描述】:
我正在尝试在 Linux 下编译 C 程序。但是,出于好奇,我尝试手动执行一些步骤:我使用:
- 生成汇编代码的 gcc 前端
- 然后运行 GNU 汇编程序以获取目标文件
- 然后将其与 C 运行时链接以获得工作可执行文件。
现在我被链接部分卡住了。
程序是一个非常基础的“Hello world”:
#include <stdio.h>
int main() {
printf("Hello\n");
return 0;
}
我使用以下命令生成汇编代码:
gcc hello.c -S -masm=intel
我告诉 gcc 在使用 Intel 语法编译和转储汇编代码后退出。
然后我使用 GNU 汇编器来生成目标文件:
as -o hello.o hello.s
然后我尝试使用 ld 生成最终的可执行文件:
ld hello.o /usr/lib/libc.so /usr/lib/crt1.o -o hello
但我不断收到以下错误消息:
/usr/lib/crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
符号__libc_csu_fini/init 似乎是glibc 的一部分,但我在任何地方都找不到它们!我尝试静态链接 libc(针对/usr/lib/libc.a),结果相同。
可能是什么问题?
【问题讨论】:
-
objdump 为您的 crt1.o 显示什么。我的显示那些符号 -
-
修复目标文件顺序并将
/usr/lib/crti.o添加到混合中可以让我通过链接器,但生成的可执行文件将无法运行 (bash: ./hello: No such file for directory),因此缺少其他内容。 -
在汇编中手动编写的代码相同:stackoverflow.com/questions/3577922/…