Linux Mips和mipsel工具链为同一可执行文件提供不同的堆栈信息

Linux Mips和mipsel工具链为同一可执行文件提供不同的堆栈信息,linux,mips,endianness,toolchain,gnu-toolchain,Linux,Mips,Endianness,Toolchain,Gnu Toolchain,我有一个测试应用程序,我首先使用“mips linux gnu gcc-EL”创建exec_sigma,然后使用“mipsel linux uclibc gcc”创建exec_bcm 在读取这些可执行文件之后,我得到了许多不同之处。我主要关心的是.debug_信息部分中的差异 在elf_西格玛中:它是: [33].调试信息MIPS\U DWARF 00000000 01357b 02fa1e 00 0 1 [34]。调试_abbrev MIPS_DWARF 00000000 042f99 004

我有一个测试应用程序,我首先使用“mips linux gnu gcc-EL”创建exec_sigma,然后使用“mipsel linux uclibc gcc”创建exec_bcm

在读取这些可执行文件之后,我得到了许多不同之处。我主要关心的是.debug_信息部分中的差异

在elf_西格玛中:它是:

[33].调试信息MIPS\U DWARF 00000000 01357b 02fa1e 00 0 1

[34]。调试_abbrev MIPS_DWARF 00000000 042f99 0040cd 00 0 1

在elf_bcm中:它是:

[32].调试信息MIPS\U DWARF 00000000 02329b 0058ba 00 0 1

[33].调试_abbrev MIPS_DWARF 00000000 028b55 000619 00 0 1

这种大小的差异导致我的应用程序中出现了一个错误,无法跟踪堆栈。它适用于mips linux gnu gcc-EL,但不适用于mipsel linux uclibc gcc。我想知道为什么同一个可执行文件的部分会有这种差异,这正常吗


感谢您阅读此问题。

您实际上是在使用两个不同的编译器编译相同的代码,请确保这些编译器可能来自相同的源代码,但它们是为执行不同的任务而构建的。您不能期望可执行文件匹配,这里的bug是您的期望

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

以编译的程序为例,或者反汇编,或者将objcopy转换为二进制,然后比较这两个二进制文件,您应该很快看到这两个二进制文件的不同之处,然后使用反汇编我上面描述的东西的风格可能不是具体的示例,而是类似的东西。只要一个编译器(而非另一个)必须添加一个字节、字或指令(假设编译器在其他方面是相同的,它们不是相同的),地址的更改就会导致更多的指令差异,导致二进制文件继续发散