【问题标题】:Comparing ELF/binary files generated from different versions of a toolchain比较从不同版本的工具链生成的 ELF/二进制文件
【发布时间】:2023-03-31 03:20:01
【问题描述】:

我有两个通过 '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”并没有显示文件之间的太大差异,除了地址偏移。在我尝试在目标上进行运行时调试之前,是否有任何工具/技术可以帮助解决这种情况。

谢谢!

【问题讨论】:

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

标签: arm elf binutils codesourcery


【解决方案1】:

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

虽然这出现在 4.7 版本的上游 gcc 中,但 Code Sourcery 已在其工具链中较早地添加了此支持。

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

【讨论】:

    【解决方案2】:

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

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

    和预处理器定义:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      相关资源
      最近更新 更多