使用ld链接生成的可执行文件为何段错误且无法直接运行?
手动编译链接C程序的问题排查与解决
我正在学习编译流程,因此没有直接使用gcc,而是拆分使用cpp、as、ld等工具手动完成编译链操作。针对编写的简单main.c文件,执行了以下Linux编译命令:
cpp -o main.i main.c # 预处理头文件 gcc -o main.s -S main.i # 编译为汇编代码 as -o main.o main.s # 汇编为机器码 ld -o main main.o -e main -lc # 链接(指定入口点为main并引入glibc) ld.so ./main # 通过动态链接器运行
遇到的两个异常问题
- 运行时触发段错误
执行ld.so ./main后,程序输出Hello, World!但随即崩溃:
$ ld.so ./main Hello, World! Segmentation fault (core dumped)
- 直接运行提示文件不存在
文件实际存在且拥有可执行权限,直接运行却报错:
$ ./main bash: ./main: No such file or directory $ ls -l main -rwxrwxr-x 1 snowden snowden 6232 May 4 18:33 main
改用gcc直接链接(gcc -o main main.o)则可正常运行,我怀疑是ld命令的-e main参数存在问题,但不确定正确的入口点应该是什么。
后续尝试与问题解析
- 临时解决命令:使用
ld -o main -dynamic-linker /lib64/ld-linux-x86-64.so.2 main.o /lib64/crt*.o /lib64/libc.so可以解决问题,但希望找到通用的链接命令。 - 文件未找到错误的原因:未指定
-dynamic-linker参数时,生成的可执行文件会将解释器路径设为不存在的/lib/ld64.so.1,系统未直接提示解释器缺失,反而报错原文件不存在。
内容的提问来源于stack exchange,提问作者michaelsnowden
相关产品推荐
相关产品推荐

