工具:
- ninja: ninja git地址
- depot-tools: depot-tools git地址
- vs2019: 官网下载,使用默认安装路径,否则在用v8gen.py时会因为路径问题导致失败,如果非要使用自定义路径,则需要去改v8源码目录中的vs_toolchain.py脚本,其中有一行代码
path = os.path.expandvars('%ProgramFiles(x86)%' + '/Microsoft Visual Studio/%s' % version)
会去默认安装路径查找vs,可以将此路径改为自定义的vs安装路径 - git: 官网下载
- python2: 需要用到urllib2模块所以使用py2,pip直接安装urllib2可能会报错,直接装urllib3即可
环境配置
因为需要从google下载大量的内容所以需要代理
git代理设置:
git config --global https.proxy http://地址:端口
git config --global https.proxy https://地址:端口
git config --global http.proxy socks5://地址:端口
git config --global https.proxy socks5://地址:端口
系统环境变量设置,此处配置完如果依然报错[fetch 1/2] RPC failed transiently....
那就重启以下:
http://地址:端口
系统代理设置(需要使用管理员权限运行cmd):
netsh winhttp set proxy http://地址:端口
再在设置里将代理打开
将ninja与depot_tools路径写入系统默认路径
然后在命令行中设置一个临时环境变量
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
编译流程
创建一个用于存放v8代码的目录cd进入,执行
fetch v8
gclient sync
如果代理配置有误可能会一直卡住或一直报以下错误
假设现在要编译存在issue-1196683(CVE 2021-21220)漏洞环境,打开issue链接:https://bugs.chromium.org/p/chromium/issues/detail?id=1196683
找到commit并进入
由于此版本已经将漏洞修复,所以找到上一个版本
拷贝其commit哈希
执行以下指令将v8版本回滚到存在漏洞的版本,并重新执行gclient sync
git reset --hard 1e4b1c521a491c7487028b7f2aec550c1b36606b
gclient sync
然后在v8源码根目录下执行以下指令进行编译,编译过程会很漫长,而且可能会占满CPU,如果已经编译过debug版本还需要编译release版本的话,直接忽略以上步骤直接执行以下内容将所有debug都替换为release即可,但要注意的是必须要设置DEPOT_TOOLS_WIN_TOOLCHAIN环境变量否则还是会报错。
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
python tools/dev/v8gen.py -vv x64.debug
ninja -C out.gn\x64.debug
编译好后可以在out.gn\x64.debug目录下找到编译好的exe以及dll文件,其中d8.exe可以帮我们进行一些基础的调试分析
补充
注意点一
除此以外在编译较新版本v8时还可能会遇上以下情况
然后去查看FILE_INFO_BY_HANDLE_CLASS的定义后发现存在一句条件编译指令。
基本可以确定就是这个条件编译指令的原因,将其注释后再编译,出现以下报错
查看后依然还是条件编译指令在判断NTDDI版本时出的问题
将其注释后再编译,还剩一个报错。
查看该函数在Version_Helper.h中的定义,发现还是NTDDI版本的问题,再注释编译
然后发现win系统库中存在大量此类条件编译一个一个注释掉显然不现实,然后观察报错输出后发现两个sdk版本号对不上,10.0.19041.0是我的,而后面的10.0.20348.0我都没有装。
在vs拓展工具里去掉10.0.19041.0,安装10.0.20348.0,相当于将sdk升级至win10平台最新版
然后编译完成,总结来讲在编译新版v8时最好将sdk也升至最新版
注意点二
如果升级过sdk后使用python tools/dev/v8gen.py -vv x64.debug
生成编译配置文件时出现如下报错:
C:\vun\v8\buildtools\win\gn.exe gen out.gn/x64.debug --check
-> returned 1
ERROR at //build/config/win/BUILD.gn:297:27: Script returned non-zero exit code.
vcvars_toolchain_data = exec_script("../../toolchain/win/setup_toolchain.py",
^----------
Current dir: C:/vun/v8/out.gn/x64.debug/
Command: C:/vun/depot_tools/bootstrap-2@3_8_10_chromium_23_bin/python/bin/python.exe C:/vun/v8/build/toolchain/win/setup_toolchain.py "C:\Program Files (x86)/Microsoft Visual Studio/2019/Community" "C:\Program Files (x86)\Windows Kits\10" "C:\Windows\System32;C:\Windows\SysWOW64;Arm64Unused" win x64 none
Returned 1.
See //build/config/BUILDCONFIG.gn:343:5: which caused the file to be included.
"//build/config/win:lean_and_mean",
^---------------------------------
Traceback (most recent call last):
File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 311, in <module>
main()
File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 271, in main
vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib')
File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 210, in FindFileInEnvList
file_name, env_name, '\n'.join(parts))
AssertionError: user32.lib is not found in LIB:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x64
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64
Check if it is installed.
Traceback (most recent call last):
File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 311, in <module>
main()
File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 271, in main
vc_lib_um_path = FindFileInEnvList(env, 'LIB', ';', 'user32.lib')
File "C:/vun/v8/build/toolchain/win/setup_toolchain.py", line 210, in FindFileInEnvList
file_name, env_name, '\n'.join(parts))
AssertionError: user32.lib is not found in LIB:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\ATLMFC\lib\x86
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x86
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x86
C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x86
Check if it is installed.
GN gen failed: 1
Traceback (most recent call last):
File "tools/dev/v8gen.py", line 307, in <module>
sys.exit(gen.main())
File "tools/dev/v8gen.py", line 301, in main
return self._options.func()
File "tools/dev/v8gen.py", line 169, in cmd_gen
gn_outdir,
File "tools/dev/v8gen.py", line 211, in _call_cmd
stderr=subprocess.STDOUT,
File "C:\vun\depot_tools\bootstrap-2@3_8_10_chromium_23_bin\python\bin\lib\subprocess.py", line 223, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['C:\\vun\\depot_tools\\bootstrap-2@3_8_10_chromium_23_bin\\python\\bin\\python.exe', '-u', 'tools\\mb\\mb.py', 'gen', '-f', 'infra\\mb\\mb_config.pyl', '-m', 'developer_default', '-b', 'x64.debug', 'out.gn/x64.debug']' returned non-zero exit status 1
打开v8\build\toolchain\win目录下的setup_toolchain.py文件百分之九十的路径问题报错都源于该脚本文件,该脚本文件较为奇葩它将sdk版本号直接写死在脚本文件里,注意核查该处sdk版本号与你所配置使用的sdk版本号是否一致,不一致就改
更改后输出成功