问题描述
当我发现某些旧程序无法在现代Windows下运行时,我遇到了这个问题。
这是一个通过mingw64构建的微型示例
.text
.global start
start:
subq $0x48,%rsp
xorl %ecx,%ecx
call *__imp_ExitProcess(%rip)
addq $0x48,%rsp
ret
gcc a.s -nostdlib -nostartfiles -lkernel32 -Wl,-e,start,-s
一个消息框显示,当我打开该exe程序时,它不是有效的Win32程序。但是,当我添加.lcomm a,1
或
.bss
.int 0
到源文件,都有效地将.bss节插入exe文件。添加.data节不能解决问题。
这是Windows的固有限制还是ld内部的错误?
编辑: 好。我发现许多没有.bss的exe文件或带有未初始化数据的任何节,但是运行良好。但这并不能完全回答我的问题。为什么只有.data,.text和.idata的程序无法运行?
编辑V2: 我想我找到了原因。 OptionalHeader.SizeOfImage的值不正确。将其更改为正确的值可以解决该问题。因此,这很可能是ld中的错误。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)