该测试平台位于Linux 32位x86上。
所以基本上我写了一个简单的C程序,像这样:我解决了对.rodata部分的引用,并在其中改进了asm代码:

void main()
{
        double a = 10.0;
        printf("hello world %f\n", a);

}


这里是令人困惑的事情:我唯一能找到的是,在主要函数的前面有更多的领先的nop,如下所示:

新的ELF二进制结束点号:



新的ELF二进制结束点号:



旧的ELF二进制文件:



基本上我不认为这是“对齐”问题,因为nop太多。 />还有,当我将原始代码更改为简单的helloworld代码(没有双倍数字a)时,这两个ELF二进制文件之间基本上没有区别。

谁能给我一些帮助为什么为什么会产生那么多的点?

谢谢

评论

这是对齐。为什么会有这个最大值?对齐方式可以大小编译器认为有用的大小(在您的情况下,它似乎在4到16个字节之间抖动)。

在原始.c文件上尝试使用gcc -S,您将获得C编译器生成的汇编代码。我敢打赌汇编程序文件中包含一些“ .align 16”指令。

@GuntramBlohm谢谢,是的,我尝试过,但是我只能在主函数的末尾找到一个“ .align 8”。

#1 楼

对齐。

请注意,所有NOP都在... C0,... F0处结束(并且下一个功能开始)。编译器和/或链接器插入填充字节,以便函数从0x10对齐的地址开始。

不同的编译器/链接器将对这些字节使用不同的值。我已经看过90(nop),CC(int3)以及完全填充函数之间空间的多字节NOP。在堆栈溢出。

简而言之,这样做是出于性能方面的考虑,因为处理器通常以16或32字节的步长来获取指令,因此使函数从这些边界之一开始有意义。

评论


最后一张图片显示的是0x00b4上的功能对齐。但这可能只是通过不同的优化方式进行编译,或者可能是使用库函数进行编译。

–杂件
2014年4月16日在21:50



@ usr2564301注意,最后一个图像的标题为“ old ELF binary”。这就是OP所要进行的比较。

–乔纳森·莱因哈特(Jonathon Reinhart)
19年2月13日在3:03