Configuration

V8(d8) 빌드 및 gdb를 이용한 디버깅 방법

JUNFUTURE 2026. 2. 23. 09:54

타겟 빌드

V8 빌드 도구(depot_tools) 다운

ninja나 관련된 모든 빌드 도구들이 depot_tools에 들어있다.

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:$(pwd)/depot_tools

V8 소스코드 다운

fetch v8
cd v8
# 특정 CVE가 수정되기 전의 특정 커밋으로 이동 (예: 2024년 3월 중순)
git checkout 28877c5520
gclient sync

예를 들어) CVE-2024-2887의 경우 패치전 (취약버전)이 28877c5520 커밋

 

 

V8 빌드 (d8 쉘 생성)

./tools/dev/gm.py x64.debug
./tools/dev/gm.py x64.release

 

V8 실행

./out.gn/x64.release/d8 *.js
# 혹은
./out/x64.release/d8 *.js

 

V8 디버깅

v8을 디버깅한다는 것은 v8의 쉘 역할을 해주는 d8 바이너리를 이용해서 .js 코드의 동작을 해석하는 브라우저 엔진의 동작을 분석한다는 뜻이다. 

d8은 리눅스 바이너리(ELF)다

 

d8은 리눅스 바이너리이기 때문에 gdb를 이용해서 디버깅이 당연히 가능하다. 근데 이제 .js 파일을 인자로 받아서. 따라서 gdb를 실행할때 인자로 .js 파일을 넘겨주어여야 한다는 것만 생각하면 된다.

 

gdb <d8 바이너리>
# 이 시점에 브레이크 포인트 걸기
r --allow-natives-syntax <.js파일>

 

예시

 

 

 

트러블 슈팅

python3 /home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py -s ../../build/linux/debian_bullseye_amd64-sysroot -a x64 glib-2.0 gmodule-2.0 gobject-2.0 gthread-2.0

➜  v8 git:(afe6883a2a5) ./tools/dev/gm.py x64.debug
# mkdir -p /home/jun/CVE-2024-2887/v8/out/x64.debug
# echo > /home/jun/CVE-2024-2887/v8/out/x64.debug/args.gn << EOF
is_component_build = true
is_debug = true
symbol_level = 2
target_cpu = "x64"
v8_enable_sandbox = true
v8_enable_backtrace = true
v8_enable_fast_mksnapshot = true
v8_enable_slow_dchecks = true
v8_optimized_debug = false
EOF
# gn gen out/x64.debug
ERROR at //build/config/linux/pkg_config.gni:152:19: Script returned non-zero exit code.
      pkgresult = exec_script(pkg_config_script, _script_args, "json")
                  ^----------
Current dir: /home/jun/CVE-2024-2887/v8/out/x64.debug/
Command: python3 /home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py -s ../../build/linux/debian_bullseye_amd64-sysroot -a x64 glib-2.0 gmodule-2.0 gobject-2.0 gthread-2.0
Returned 1.
stderr:

Traceback (most recent call last):
  File "/home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py", line 252, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py", line 142, in main
    prefix = GetPkgConfigPrefixToStrip(options, args)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jun/CVE-2024-2887/v8/build/config/linux/pkg-config.py", line 80, in GetPkgConfigPrefixToStrip
    prefix = subprocess.check_output([options.pkg_config,
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 466, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 548, in run
    with Popen(*popenargs, **kwargs) as process:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 1026, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/home/jun/CVE-2024-2887/depot_tools/bootstrap-2@3.11.8.chromium.35_bin/python3/lib/python3.11/subprocess.py", line 1953, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'pkg-config'

See //build/config/linux/BUILD.gn:58:3: whence it was called.
  pkg_config("glib") {
  ^-------------------
See //build/config/compiler/BUILD.gn:354:18: which caused the file to be included.
    configs += [ "//build/config/linux:compiler" ]
                 ^------------------------------

해결

sudo apt-get update
sudo apt-get install -y pkg-config libglib2.0-dev