【问题标题】:trash bytes end of file compiled with g++用 g++ 编译的文件末尾的垃圾字节
【发布时间】: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是]

标签: c++ gcc g++


【解决方案1】:

基于-falign-functions 的GCC pads,与-O2-O3 一起使用。

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

【讨论】:

  • 除了优化是-O0?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多