我有两个二进制文件通过'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',除地址偏移外,文件之间没有太大区别。在我尝试在目标上进行运行时调试之前,是否有任何工具/技术可以帮助解决这种情况。
谢谢!
答案 0 :(得分:2)
差异原来是编译器选项-munaligned-access。 Code Sourcery工具链默认为ARMv6及更高版本的体系结构启用此功能。 http://gcc.gnu.org/gcc-4.7/changes.html
虽然这出现在4.7版本的上游gcc中,但Code Sourcery在他们的工具链中早些时候添加了这种支持。
为了解决这个问题,我跟踪了数据中止异常,然后使用-save-temps选项编译了culprit文件。比较中间.s文件提供了提示。
答案 1 :(得分:1)
我可以建议您使用比较默认标记编译器:
/path/to/cross-compiler/bin/arm-*-*-gcc -Q -v
预处理器定义:
/path/to/cross-compiler/bin/arm-*-*-gcc -dM -E - < /dev/null
使用Linaro GCC编译代码的原因是事实 在CodeSourcery中,默认情况下可能会启用一些选项 可能没有。