比较从不同版本的工具链生成的ELF /二进制文件

问题描述:

我有两个从各自的ELF文件通过'objcopy -O binary'生成的二进制文件。 ELF文件使用arm-none-linux-gnueabi工具链构建;一个来自linaro gcc 4.6.2,另一个来自codesourcery gcc 4.6.3。比较从不同版本的工具链生成的ELF /二进制文件

我通过Uboot将二进制文件加载到内存中。虽然用Linaro构建的那个按预期执行,但使用codesourcery构建的那个崩溃(很可能是因为)在Uboot提示符上没有错误,但该程序似乎挂起。

从各个工具链的binutils中使用'arm-none-linux-gnueabi-readelf -S'并没有显示出除地址偏移之外的文件之间的很多差异。在尝试对目标进行运行时调试之前,是否有任何工具/技术可以帮助解决这种情况?

谢谢!

+0

这两个编译器是非常密切相关的。 CodeSourcery有一些Linaro选择不使用的补丁。这可能是不同的配置。 – ams

区别竟然是编译器选项-munaligned-access。 Code Sourcery工具链默认为ARMv6及更高版本的体系结构启用此功能。 http://gcc.gnu.org/gcc-4.7/changes.html

虽然这出现在4.7版本的上游gcc中,Code Sourcery早些时候在他们的工具链中增加了此支持。

为了解决这个问题,我跟踪了数据中止异常,然后使用-save-temps选项编译了罪魁祸首文件。比较中间的.s文件提供了提示。

我可以建议你是比较默认标志两种编译器都建有:

/path/to/cross-compiler/bin/arm-*-*-gcc -Q -v 

和预处理定义:

/path/to/cross-compiler/bin/arm-*-*-gcc -dM -E - < /dev/null 

为什么使用Linaro的GCC作品代码编译的原因事实上, 它可能有一些选项默认启用,当CodeSourcery一个 可能没有。