首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.text部分开头/结尾处的额外空间

.text部分开头/结尾处的额外空间
EN

Stack Overflow用户
提问于 2020-05-24 18:41:12
回答 1查看 566关注 0票数 1

我正在寻找一种方法,在使用Visual编译器从C/C++开始/结束.text部分时预留一些额外的空间。

关于如何在Visual中的代码部分预留一些额外空间,我只找到了一个解决方案:PE File .text Section Size

代码语言:javascript
运行
复制
#pragma optimize( "", off )
#define NOP __asm { NOP } ;
#define NOP8 NOP NOP NOP NOP NOP NOP NOP NOP
#define NOP64 NOP8 NOP8 NOP8 NOP8 NOP8 NOP8 NOP8 NOP8 
#define NOP512 NOP64 NOP64 NOP64 NOP64 NOP64 NOP64 NOP64 NOP64
#define NOP4096 NOP512 NOP512 NOP512 NOP512 NOP512 NOP512 NOP512 NOP512
#define NOP32768 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096
void unused_global() { NOP32768 }
#pragma optimize( "", on )

int main() {
   [...]
   unused_global(); // <-- Without this call, compiler doesn't include `unused_global` inside .text section
}

这一解决办法的问题是:

  1. 它需要直接调用这个函数。这当然会破坏应用程序逻辑。
  2. --它并不保证unused_global函数将放在.text部分的末尾/开头。
  3. 这是相当令人敬畏的,所以我很想听到一个更清洁的解决方案

更新

我找到了解决问题的办法。这又是一次令人敬畏的黑客攻击:

代码语言:javascript
运行
复制
int main() {
    volatile bool force_false = false;
    if (force_false) unused_global();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-25 23:55:11

在VS 2019中,以下代码段的开头和结尾分别保留了4K。

代码语言:javascript
运行
复制
#pragma section(".constext", read)
#pragma section(".xonstext", read)
#pragma comment(linker, "/merge:.constext=.text")
#pragma comment(linker, "/merge:.xonstext=.text")

extern "C" __declspec(allocate(".constext")) const char before[0x1000]{ __COUNTER__ };
extern "C" __declspec(allocate(".xonstext")) const char after[0x1000] { __COUNTER__ };

int main()
{
    return before[0] + after[0] - 1;
}

地图文件确认了位置。

代码语言:javascript
运行
复制
Preferred load address is 00400000

Start         Length     Name                   Class
0001:00000000 00001000H .constext               CODE
0001:00001000 00000bc8H .text$mn                CODE
0001:00001bc8 00001000H .xonstext               CODE
0002:00000000 000000b4H .idata$5                DATA
[...]

 Address         Publics by Value              Rva+Base       Lib:Object
[...]
0001:00000000       _before                    00401000     constext.obj
0001:00001000       _main                      00402000 f   constext.obj
[...]
0001:00001bc8       _after                     00402bc8     constext.obj
0002:00000000       __imp__SetUnhandledExceptionFilter@4 00404000     kernel32:KERNEL32.dll
[...]

奇怪的是,优化的编译将returnmain中识别为普通的0,但不会导致虚拟数组引用被优化。

代码语言:javascript
运行
复制
PUBLIC  _main
;       COMDAT  _main
_TEXT   SEGMENT
_main   PROC    ; COMDAT
; 14   :        return before[0] + after[0] - 1;
        xor     eax, eax
; 15   : }
        ret 0
_main   ENDP
_TEXT   ENDS
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61990687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档