You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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                   # 通过动态链接器运行

遇到的两个异常问题

  1. 运行时触发段错误
    执行ld.so ./main后,程序输出Hello, World!但随即崩溃:
$ ld.so ./main
Hello, World!
Segmentation fault (core dumped)
  1. 直接运行提示文件不存在
    文件实际存在且拥有可执行权限,直接运行却报错:
$ ./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:33:15