发布于 2017-04-24 21:45:12
大多数应用程序不需要在各个部分之间有很大的差距--那些应用程序可以使用单独的DLL或通过VirtualAlloc动态分配内存。
更新:经过更多的测试后,我发现各部分之间的差距必须是对齐下一节以满足SectionAlignment所必需的。因此,间隔两个4096字节节0x20000字节需要将整个exe的SectionAlignment字段设置为0x20000。(例如,0x12000的间距是不可能的。)这个128 to间隙不会出现在进程的内存映射中,也不会消耗任何内存,但是如果您试图在ERROR_INVALID_ADDRESS中分配内存,那么ERROR_INVALID_ADDRESS仍然会失败。
下面是GCC/MinGW的一个最小测试用例,它演示了 Win32 exe中的部分必须是连续的。
测试。S:
.global _main
.section .text
_main:
push $1
call _Sleep@4
xor %eax, %eax
ret
.section .bss
.lcomm buf, NUMBYTES这将产生一个有效的可执行文件:
gcc -m32 -Wl,--image-base=0x00400000 -Wl,-Ttext=0x00401000 -Wl,-Tbss=0x00402000 -DNUMBYTES=0xfe000 -Wl,--section-start=.idata=0x00500000 -s -nostartfiles -o contiguous.exe testcase.S
这会产生无效的可执行文件(gap.exe不是有效的Win32应用程序):
gcc -m32 -Wl,--image-base=0x00400000 -Wl,-Ttext=0x00401000 -Wl,-Tbss=0x00402000 -DNUMBYTES=0x200 -Wl,--section-start=.idata=0x00500000 -s -nostartfiles -o gap.exe testcase.S
与十六进制编辑器和objdump相比,这两个文件之间只有16字节的差异。改变的是:
https://stackoverflow.com/questions/32378033
复制相似问题