【发布时间】:2015-06-06 18:48:56
【问题描述】:
我一直在浏览 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 -nostdlib -nostartfiles -fno-use-linker-plugin -Wl,-entry,_XMain main.cpp -o TestLib.dll
这是使用反汇编程序看到的输出:
代码输出没问题,但是代码末尾的那些垃圾字节是什么? 他们是做什么的?
【问题讨论】:
-
gcc -S说什么?我不相信编译器只会生成程序明显需要的最小字节数……编译器可以生成“额外的东西”,而无需任何特别的解释。 [还是反汇编程序产生的只是随机垃圾?] -
使用:g++-4.9.2 -S -O3 -fno-align-functions -shared -nodefaultlibs -nostdlib -nostartfiles -fno-use-linker-plugin -Wl,-entry,_XMain main。 cpp -o TestLib.dll
-
.file "main.cpp" .text .globl _XMain .def _XMain; .scl 2; . 类型 32; .endef _XMain: movl $1, %eax ret
-
我们可以看到,asm 输出中没有垃圾字节的迹象。
-
为什么这很重要?就像我说的那样,我认为任何编译器都不能保证不会有填充或类似的东西?有趣的是,首先有两个
nop,然后是 4 个0xff和 4 个0x00字节 - 这似乎有人试图确保它“不可执行”(当你碰巧不小心修改了某些函数的返回地址时很好只是一点点,并在函数结束后返回,例如)[0xff,0xff不可执行,但0x00,0x00是]