C++ 垃圾桶字节使用g++;

C++ 垃圾桶字节使用g++;,c++,gcc,g++,C++,Gcc,G++,我一直在浏览GCC源代码和谷歌,但一点运气都没有 我正在编译此代码: extern "C" int XMain(unsigned int hModule, unsigned int ulReason, unsigned int lpReserved) { //if (ulReason == DLL_PROCESS_ATTACH) { } return 1; } 使用以下命令: g++-4.9.2-O0-shared-nodefaultlibs-nostlib

我一直在浏览GCC源代码和谷歌,但一点运气都没有

我正在编译此代码:

extern "C" int XMain(unsigned int hModule, unsigned int ulReason, unsigned int lpReserved)
{
    //if (ulReason == DLL_PROCESS_ATTACH)
    {

    }

    return 1;
}
使用以下命令:

g++-4.9.2-O0-shared-nodefaultlibs-nostlib-nostartfiles -fn不使用链接器插件-Wl,-entry,_xmainmain.cpp-o TestLib.dll

这是反汇编程序的输出:

代码输出正常,但代码末尾的垃圾字节是什么?
它们是做什么的?

基于
-falign函数的GCC焊盘
,该焊盘通过
-O2
-O3
打开


我不知道为什么要用这些特定的字节填充。

除了优化被称为
-O0
?gcc-s说了什么?我不相信有任何保证,编译器将永远只产生确切的最小字节显然需要你的程序。。。编译器可以生成“额外的东西”,而不需要任何特殊的解释。[或者它只是反汇编程序产生的随机垃圾?]使用:g++-4.9.2-S-O3-fno align函数-shared-nodefaultlibs-nostlib-nostartfiles-fno使用链接器插件-Wl-entry,_xmainmain.cpp-o TestLib.dll.file“main.cpp”.text.globl\u XMain.defxmain;.scl 2;.第32类;.endef_XMain:movl$1,%eax ret正如我们所看到的,asm输出中没有垃圾字节的迹象。为什么这很重要?就像我说的,我不认为任何编译器保证不会有填充或类似的内容?有趣的是,首先有两个
nop
,然后是4个
0xff
和4个
0x00
字节-这似乎是有人试图确保它是“不可执行的”(例如,当您意外地将某个函数的返回地址修改了一点点,并在函数结束后返回时,这很好)[0xff,0xff不是可执行文件,但0x00,0x00是]