找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4011|回复: 2

【兼容】用VS的“Visual Studio 20XX - Windows XP (vXXX_xp)”平台工具集编译兼容XP系统的exe的时候,启用增强指令集应

[复制链接]
发表于 2018-3-20 11:26:30 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
如题。虽然是废话了,但不少人在配置编译优化的时候,在设置平台工具集的时候,都会考虑让32位的编译目标兼容WindowsXP,而在代码生成的选项里,则会为了优化,把平台工具集设置为最高(比如AVX等)。

但,这就造成一个矛盾。在XP系统运行的程序真的能使用AVX指令集嘛?实测是不能的。

err1.png
“要查看这个错误报告包含的数据”这是肯定要看的,不然不知道错误在哪。

err2.png
“要查看关于错误报告的技术信息”同样也是必看。

err3.png
看见没?错误代码是0xc000001d。
这个错误代码是什么意思呢?英文原文是“The application was unable to start correctly”也就是“这个应用程序无法正常启动”。
也就是说,你的程序的代码可能没有错误,但它无法被系统加载、启动。既然这样,那就是编译的配置有问题。
经过查阅资料后,我明白了:XP似乎不支持AVX指令集。

20180320113525.png
“启用增强指令集”这个过程是让编译器把你的C语言算法用特殊的高效指令集来编码,让你的程序能使用CPU的新指令集。
但这是需要系统那边也提供支持的。XP系统太老了,很多最新的指令集都无法使用。它会在加载你的程序的时候,判断你的PE头部的标记,来判断运行你这个程序所需的指令集。如果是系统不认识的指令集的话,它就不给你加载。
有的时候你确实就是需要兼容旧机器的,尤其是很多人不愿意打补丁(某种程度上不是坏事,有的补丁就是打了就后悔的)。就像之前把平台工具集勾选为“Visual Studio 20
XX
- Windows XP (v
XXX
_xp)”一样。

像下图这样设置就对了。
20180320122108.png
如图所示,把它设置为“未设置”就可以在XP上运行了。

pbobench.png
回复

使用道具 举报

发表于 2018-3-28 23:29:04 | 显示全部楼层
讲道理嘛,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)
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-3-29 14:57:39 | 显示全部楼层
tangptr@126.com 发表于 2018-3-28 23:29
讲道理嘛,AVX是CPU特性,不是操作系统特性,不能在XP运行大概是因为XP在初始化CPU核心的时候没在XCR0寄存 ...

因此依然是“操作系统特性”。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 11:55 , Processed in 0.038639 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表