跨操作系统编译的二进制文件使用objdump时的源码显示异常问题
跨系统objdump无法显示源码的原因及解决办法
核心原因
问题本质是Windows与Linux的文件路径格式差异,导致目标文件调试信息中的源码路径无法被跨系统的objdump识别:
- 编译时
-g参数会将源码文件的绝对路径嵌入到目标文件的调试段中。Windows下路径是C:\xxx\foo.c这类盘符格式,Linux下是/home/xxx/foo.c这类根目录格式,两种路径格式完全不兼容。 - 跨系统后,objdump会严格按照调试信息里的路径去查找源码文件,即使你把源码复制到对应系统,路径也和调试信息里的不匹配,因此无法加载并显示源码。
- 反向操作(Linux编译、Windows dump)同理,Linux风格的绝对路径在Windows系统中不存在,objdump自然找不到源码。
解决办法
方法1:编译时统一调试信息中的路径
使用-fdebug-prefix-map参数将编译时的绝对路径替换为相对路径或统一标识,让调试信息中的路径跨系统可用:
- Windows编译时执行:
arm-none-eabi-gcc.exe -g --specs=nosys.specs -fdebug-prefix-map=$(pwd)=. -o foo.o foo.c - Linux编译时执行:
这样调试信息中的源码路径会变为arm-none-eabi-gcc -g --specs=nosys.specs -fdebug-prefix-map=$PWD=. -o foo.o foo.c./foo.c,只要将源码和目标文件放在同一目录,跨系统执行objdump就能正常显示源码。
方法2:objdump时指定源码路径
如果已经生成了目标文件,可以在执行objdump时用--source-path参数强制指定源码所在目录:
- Linux下执行:
arm-none-eabi-objdump -S --source-path=/your/source/directory foo.o - Windows下执行:
arm-none-eabi-objdump.exe -S --source-path=C:\your\source\directory foo.o
内容的提问来源于stack exchange,提问作者orsapihki wiioiv
相关产品推荐
相关产品推荐

