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

自定义链接脚本导致objdump反汇编无C代码嵌入问题求助

自定义链接脚本导致ELF缺失DWARF行号信息问题

操作流程

编译

gcc -ggdb3 file0.c ... -fno-builtin -c -o file0.o
gcc -ggdb3 file1.c ... -fno-builtin -c -o file1.o
...
gcc -ggdb3 fileN.c ... -fno-builtin -c -o fileN.o

链接

gcc -ggdb3 -nostdlib -nodefaultlibs -Tscript.lds -Ttext=0x4000000 \
     -Wl,--build-id=none -o main.elf file0.o file1.o ... fileN.o

反汇编

objdump -Stsxd main.elf > main.dis

核心问题

反汇编文件中看不到穿插在汇编代码间的C代码,执行objdump --dwarf=decodedline main.elf无输出,说明ELF文件中不存在DWARF行号映射信息。

已尝试的排查操作

  • 调整调试参数:测试了-g、-ggdb及不同版本的-gdwarf参数
  • 改用文件绝对路径进行编译和链接
  • 覆盖所有优化等级:从-O0到-O3逐一尝试
  • 其他使用的参数仅为-W、-D、-I

环境信息

  • 编译器:针对Cortex-A72集群的Linaro版GCC 6.4.1
  • 构建机器:x86_64架构的CentOS 7.9
  • 已指定使用对应版本的gcc和objdump,且能在ELF调试段中看到编译器标识

疑问与待确认点

  • 是否遗漏了关键编译/链接参数?或是-fno-builtin、-Wl,--build-id=none这类参数导致调试信息丢失?
  • 自定义链接脚本已包含.debug_info、.debug_line等调试段,是否仍存在必要信息被剥离的情况?
  • objdump和readelf均显示调试段占用大量字节,具体需要检查哪些内容定位问题?

编辑1:期望实现C代码嵌入汇编的显示效果(如示例图左侧),但实际仅生成纯汇编内容(示例图右侧)。


编辑2:对单个目标文件执行objdump -Stsxd fileX.o > fileX.dis可正常显示嵌入的C代码,说明调试信息存在于目标文件中,问题出在链接阶段;已改用目标文件绝对路径,问题依旧。


编辑3:自定义链接脚本script.lds中的调试段定义见对应图片。


编辑4:不使用链接脚本或使用默认链接脚本时可得到预期输出,确认问题源于自定义链接脚本;即使将调试段替换为默认脚本内容,问题仍未解决,排除缺失符号的原因;默认链接脚本的调试段见对应图片。


编辑5:经实验确认问题出自链接脚本,添加默认脚本缺失的段方向正确但未解决问题;对脚本进行清理、增删操作后问题修复,但无法确定具体原因,且无法提供完整脚本。

内容的提问来源于stack exchange,提问作者Lance E.T. Compte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:20:40