0

0

史上最黑的黑科技--把chromium 的blink、v8、skia用vc6的crt编译并运行!

雪夜

雪夜

发布时间:2025-09-11 09:40:18

|

185人浏览过

|

来源于php中文网

原创

这个想法由来已久,其原因有三个显著的优势:

1、可以忽略VS2015的MD版本所需的那些api-xxxx-xxx的dll文件。这些文件数量庞大,令人头疼。

2、可以不必处理manifest的问题。这东西非常烦人,设置稍有不慎就会导致各种无法加载的问题。特别是本机没问题,但客户机上可能就会出现问题。

3、小巧。vc6版本只需要msvcp60.dll和mscrt.dll,这两个文件在所有Windows系统中都自带,非常方便。这意味着可以节省MT版本所需的额外空间。实际上,Windows的所有dll文件基本上都是依赖这两个文件运行的,Windows自己用得非常顺畅,只是没有明确告诉我们如何使用。

现在的目标非常明确,就是将miniblink所使用的VS2015的crt替换为vc6的crt。

这个过程非常艰难。毕竟vc6的crt与最新版本的crt差异巨大,多次我都以为这是不可能完成的任务,差点放弃。但又觉得不甘心,坚持查阅资料,最终居然成功了。

真可谓是山穷水尽疑无路,柳暗花明又一村。

首先是搭建环境。我们需要一套DDK的包,将其中的inc和lib目录提取出来,然后设置到VS2015的工程中。实际上就是清空VS2015的目录,并将其设置为DDK的目录:

史上最黑的黑科技--把chromium 的blink、v8、skia用vc6的crt编译并运行!然后就可以开始编译了。

接下来就是大量的编译错误……

我们一个个地解决。

首先解决blink工程中的问题。

史上最黑的黑科技--把chromium 的blink、v8、skia用vc6的crt编译并运行!举个例子,如上图所示,blink自己编写的deque使用了stl的std::reverse_iterator,但这个模板参数在老版本中发生了变化,需要传入T这个模板参数。因此,在这里针对vc6的rt添加了一个参数。

虽然说起来简单,但在编译过程中,错误提示是一屏接一屏的,所以你能理解当时的心情……

耐心地一个个修改。

然后是更麻烦的与Windows相关的头文件和宏缺失的问题。比如缺少GdiAlphaBlend等。这很麻烦,因为数量巨大……

但最后我还是全部补上了。无非就是从新版头文件中复制缺失的部分,放到一个单独的头文件中,然后让所有工程都引入。

如果在链接时找不到,那就需要动态调用了。这都是工作量的问题,说起来简单,但要知道一次就缺了几十个相关的函数,而且每次添加一个都可能面临rebuild……

然后是令人头疼的__int64问题。vc6的crt,很多stl的重载没有x64版本……比如ostream& operator

最后也是我一点点添加的。

blink相关的工作完成后,轮到v8了。本以为这个简单,因为与操作系统相关的部分较少,没想到也很麻烦。

v8子类化了几个stl的类,比如ZoneVector。但老版本的一些接口又变了,具体如图所示:

史上最黑的黑科技--把chromium 的blink、v8、skia用vc6的crt编译并运行!史上最黑的黑科技--把chromium 的blink、v8、skia用vc6的crt编译并运行!无非就是适配老版本stl的模板接口。不过编译的错误又是大量抛出……心情很郁闷。

其他的也是些零碎的api和宏需要补充。

接下来谈谈skia的问题。

其中最大的麻烦是,skia使用了大量的sse、xmm指令,而老crt没有这些指令!

当时我震惊了,因为如果要手写这些指令的汇编,工作量将非常巨大……

VisualizeAI
VisualizeAI

用AI把你的想法变成现实

下载

但就在我快要绝望的时候,我发现,那堆_mm_cmpeq_ss之类的函数,只要声明了,VS2015就可以内置进去!

原来这些是内置函数(可以搜索VS内置函数)。

于是我直接拿过来新版本的xmmintrin.h等几个头文件,修改了编译错误,居然让VS成功编译了!而且skia的部分也都通过了……当时我泪流满面,差点就放弃了。

编译问题解决后,剩下就是链接问题了。这里也很麻烦,一链接,就抛出了几千个链接错误……大部分是找不到api,这个好解决,动态调用一下就行了。

但有几个麻烦的地方:

一个是_Init_thread_header、_Init_thread_footer等几个函数找不到。这些函数在网上几乎找不到有用的信息(后来知道是内置函数,在一些lib中),于是我先用空函数代替。但这些函数的参数类型和返回值完全不知道,而且VS一旦参数不对,编译也通不过。所以只能靠猜……最后居然被我猜出来了,是void _Init_thread_header(int*)类型的,当时我又泪流满面了……

其他编译错误就不提了,总之都是巨大的工作量,几千个错误要改。

最后终于编译通过,但运行起来又是各种问题。还是刚才的_Init_thread_header的问题。这货居然会插入在每个局部静态变量的前面,用来保证线程安全的局部静态变量的初始化。

但这货还用了几个如__tls_index之类的全局变量,这些需要初始化,但初始化的函数根本没生成,因为初始化的函数所在的lib是VS的新版crt中的。当时搞了很久,想了个很不好的方案,就是搜索特征码,把这个__tls_index的地址拿到手,然后自己去初始化……不过幸运的是,群里有人告诉我,这玩意是VS新版的特性,叫Static local variables are initialized in a thread-safe,

其实是有

/Zc:threadSafeInit-这个开关可以关闭的!

这个真是救了我。把这个开关关闭后,果然_Init_thread_header之类的函数也不会生成了,所以也不需要我写空函数代替了……

Thread-safe “magic” statics: Static local variables are initialized in a thread-safe way,

removing the need for manual synchronization.

Be aware that usage of these variables other than initialization is still not protected.

Thread safety can be disabled by using

/Zc:threadSafeInit- to avoid a dependency on the CRT.

最后是一些还没解决,但不影响的问题,就是有几个stl的操作符重载,一直提示链接不到。比如

basic_ostreamaits> & __cdecl operator> & a, basic_string, allocator> const & b)

但我查看了mscrt.dll,这个函数确实是导出的。最后不管了,写了个本地的函数代替,内部直接调用mscrt.dll。

然后是一堆sse的函数找不到,比如_libm_sse2_sin_precise _libm_sse2_pow_precise _libm_sse2_acos_precise这些。差点在这里又放弃了。

还好找到一篇文章,讲这玩意是VS的新特性,可以通过设置里代码生成的无增强指令 (/arch:IA32)来关闭对高级sse指令的编译优化。

再然后是一些数学库找不到,比如nextafterf之类的。老版的crt没有。这个我从苹果的llvm中扣到具体的代码。

见:https://www.php.cn/link/80f5c854f86f7ecdd80a84b2973a9b08

最后的最后,终于成功运行miniblink~!!!!!!!!!!!!!!!!!!!!!!!!!!

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

537

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.11.23

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

20

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.6万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

NumPy 教程
NumPy 教程

共44课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号