【兼容】用VS的“Visual Studio 20XX - Windows XP (vXXX_xp)”平台工具集编译兼容XP系统的exe的时候,启用增强指令集应
如题。虽然是废话了,但不少人在配置编译优化的时候,在设置平台工具集的时候,都会考虑让32位的编译目标兼容WindowsXP,而在代码生成的选项里,则会为了优化,把平台工具集设置为最高(比如AVX等)。但,这就造成一个矛盾。在XP系统运行的程序真的能使用AVX指令集嘛?实测是不能的。
“要查看这个错误报告包含的数据”这是肯定要看的,不然不知道错误在哪。
“要查看关于错误报告的技术信息”同样也是必看。
看见没?错误代码是0xc000001d。
这个错误代码是什么意思呢?英文原文是“The application was unable to start correctly”也就是“这个应用程序无法正常启动”。
也就是说,你的程序的代码可能没有错误,但它无法被系统加载、启动。既然这样,那就是编译的配置有问题。
经过查阅资料后,我明白了:XP似乎不支持AVX指令集。
“启用增强指令集”这个过程是让编译器把你的C语言算法用特殊的高效指令集来编码,让你的程序能使用CPU的新指令集。
但这是需要系统那边也提供支持的。XP系统太老了,很多最新的指令集都无法使用。它会在加载你的程序的时候,判断你的PE头部的标记,来判断运行你这个程序所需的指令集。如果是系统不认识的指令集的话,它就不给你加载。
有的时候你确实就是需要兼容旧机器的,尤其是很多人不愿意打补丁(某种程度上不是坏事,有的补丁就是打了就后悔的)。就像之前把平台工具集勾选为“Visual Studio 20XX - Windows XP (vXXX_xp)”一样。
像下图这样设置就对了。
如图所示,把它设置为“未设置”就可以在XP上运行了。
讲道理嘛,AVX是CPU特性,不是操作系统特性,不能在XP运行大概是因为XP在初始化CPU核心的时候没在XCR0寄存器设置AVX支持位,于是当AVX指令执行的时候就直接#UD了。
解决思路就是自己写个驱动(因为操作XCR0需要CPL=0),用xsetbv设置XCR0的AVX支持位(写之前先用cpuid检查一下AVX的支持性,甚至XCR0是否存在)
(虽然说在XP执行Ring0代码并不一定需要驱动,可以利用ZwSystemDebugControl在SSDT追加垃圾函数然后写shellcode,再用sysenter进Ring0) tangptr@126.com 发表于 2018-3-28 23:29
讲道理嘛,AVX是CPU特性,不是操作系统特性,不能在XP运行大概是因为XP在初始化CPU核心的时候没在XCR0寄存 ...
因此依然是“操作系统特性”。
页:
[1]