Gcc objdump中函数末尾的字节

Gcc objdump中函数末尾的字节,gcc,assembly,compilation,disassembly,objdump,Gcc,Assembly,Compilation,Disassembly,Objdump,当我用objdump反汇编二进制文件(用g++编译)时,我经常在包含的函数末尾看到“随机”字节,例如: 4005a5: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1) 4005ac: 00 00 00 00 这些字节是什么?为什么编译器会把它们放在那里 编辑: 显然,这些字节代表一条长的NOP指令,由编译器放在那里以保持函数16字节对齐。奇怪的是,唯一没有16字节对齐的函数是主函数。有什么原因吗

当我用objdump反汇编二进制文件(用g++编译)时,我经常在包含的函数末尾看到“随机”字节,例如:

  4005a5:       66 66 2e 0f 1f 84 00    data32 nopw %cs:0x0(%rax,%rax,1)
  4005ac:       00 00 00 00 
这些字节是什么?为什么编译器会把它们放在那里

编辑:
显然,这些字节代表一条长的NOP指令,由编译器放在那里以保持函数16字节对齐。奇怪的是,唯一没有16字节对齐的函数是主函数。有什么原因吗?

这是一个填充NOP指令。请参阅,在这种情况下,gcc通常使用“短”NOP(32位代码0x90-我不知道64位代码);使用带有冗余前缀(0x66 0x66)的指令对我来说似乎很奇怪。可能此内存位置用于存储常量值(0x0000841f0f2e6666),该常量值使用%rip相对指令读取。对齐是为了提高性能。编译器不知道调用函数的频率,因此它会将函数对齐以防万一。但是由于
main
只被调用一次,编译器知道对齐它没有多大好处。