自定义链接脚本导致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
相关产品推荐
相关产品推荐

