0

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

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

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

谢谢!

4

2 回答 2

2

不同之处在于编译器选项 -munaligned-access。Code Sourcery 工具链默认为 ARMv6 及更高版本的架构启用此功能。 http://gcc.gnu.org/gcc-4.7/changes.html

虽然这出现在 4.7 版本的上游 gcc 中,但 Code Sourcery 在他们的工具链中更早地添加了这种支持。

为了弄清楚这一点,我跟踪了数据中止异常,然后使用 -save-temps 选项编译了罪魁祸首文件。比较中间 .s 文件提供了提示。

于 2013-08-07T23:19:26.793 回答
1

我可以建议您比较两个编译器构建时使用的默认标志:

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

和预处理器定义:

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

使用 Linaro GCC 编译的代码有效的原因是,它可能默认启用了一些选项,而 CodeSourcery 可能没有。

于 2013-08-04T13:01:31.633 回答