1

我有一个测试应用程序,我首先使用 'mips-linux-gnu-gcc -EL ' 编译以创建 "exec_sigma" ,然后使用 'mipsel-linux-uclibc-gcc' 来创建 "exec_bcm" 。

在对这些可执行文件进行了 readelf 之后,我有很多不同之处。我主要关心 .debug_info 部分的差异

在 elf_sigma :它是:

[33] .debug_info MIPS_DWARF 00000000 01357b 02fa1e 00 0 0 1

[34] .debug_abbrev MIPS_DWARF 00000000 042f99 0040cd 00 0 0 1

在 elf_bcm 中:它是:

[32] .debug_info MIPS_DWARF 00000000 02329b 0058ba 00 0 0 1

[33] .debug_abbrev MIPS_DWARF 00000000 028b55 000619 00 0 0 1

这种差异(大小)导致我的应用程序中的错误进行堆栈跟踪。它适用于 mips-linux-gnu-gcc -EL,但不适用于 mipsel-linux-uclibc-gcc。我想知道为什么相同可执行文件的部分存在这种差异,这是否正常?

感谢您阅读问题..

4

1 回答 1

0

您实际上是在使用两个不同的编译器编译相同的代码,请确保编译器本身可能来自相同的源代码,但它们的构建是为了完成不同的工作并完成不同的工作。您不能期望可执行文件匹配,这里的错误是您的期望。

有人可能希望“您所要做的一切”是翻转一些地址并翻转所有字节和半字数据,但否则具有相同的二进制文件。这是该理论的一个非常简单的问题。假设编译器想要访问一个字节,它使用一个字节序位于地址 0x100000。一条指令 lui 可以将该地址加载到寄存器中,以便以后读取该字节。如果出于某种原因,字节序更改导致该地址需要较低的位,例如 0x100003,则现在需要两条指令将该地址加载到寄存器和/或内存位置以及对该内存位置的单次读取。应该有可能制作一个编译器,其目标是在最后一刻之前保持印度独立,生成无字节序代码(使用来自 . 文本不使用任何立即加载),然后以某种方式跟踪所有内容并在最后对其进行修补。您必须问为什么有人要制作这样的编译器,这是一个不花时间的小用例。通常,您希望编译器的性能不是这样的。

拿你编译的程序,反汇编或 objcopy 到二进制,然后比较两个二进制文件,你应该很快看到两者的分歧,然后使用反汇编我上面描述的东西的味道可能不是具体的例子,而是那种东西。一旦一个编译器而不是另一个编译器必须添加单个字节或字或指令(假设编译器在其他方面是相同的,但它们不是),寻址的变化可能并且将导致更多的指令差异,从而导致二进制文件继续发散。

于 2012-07-02T14:12:11.183 回答