所以基本上我写了一个简单的C程序,像这样:我解决了对.rodata部分的引用,并在其中改进了asm代码:
void main()
{
double a = 10.0;
printf("hello world %f\n", a);
}
这里是令人困惑的事情:我唯一能找到的是,在主要函数的前面有更多的领先的nop,如下所示:
新的ELF二进制结束点号:
新的ELF二进制结束点号:
旧的ELF二进制文件:
基本上我不认为这是“对齐”问题,因为nop太多。 />还有,当我将原始代码更改为简单的helloworld代码(没有双倍数字a)时,这两个ELF二进制文件之间基本上没有区别。
谁能给我一些帮助为什么为什么会产生那么多的点?
谢谢
#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
评论
这是对齐。为什么会有这个最大值?对齐方式可以大小编译器认为有用的大小(在您的情况下,它似乎在4到16个字节之间抖动)。在原始.c文件上尝试使用gcc -S,您将获得C编译器生成的汇编代码。我敢打赌汇编程序文件中包含一些“ .align 16”指令。
@GuntramBlohm谢谢,是的,我尝试过,但是我只能在主函数的末尾找到一个“ .align 8”。