4大 JavaScript エンジンを Linux コマンドラインでビルド&実行して逆アセンブルさせる

4大 JavaScript エンジンを Linux コマンドラインでビルド&実行して逆アセンブルさせる:


1. はじめに

メジャーな Web ブラウザで使われている4種類の JavaScript エンジン V8 (Chrome), ChakraCore (IE, Edge), SpiderMonkey (Firefox), JavaScriptCore (Safari) をそれぞれ Linux のコマンドラインでビルドして、JavaScript のコードを実行したり、JIT コンパイルされたバイトコードやマシンコードの逆アセンブリを出力する方法をメモしておきます。パフォーマンスの比較や JIT コンパイルされた結果の確認などにご活用ください。

まず、予め共通で必要になる開発環境のパッケージをインストールしておきます。この記事では Fedora Core 上での実行を想定しています。他のディストリビューションで必要なパッケージは、それぞれ参考リンク先で確認してください。

$ sudo dnf group install -y "Development Tools" "C Development Tools and Libraries" 


2. V8 (Chrome)

参考:Building from Source

  • 準備
$ sudo dnf install -y git depot_tools 
  • レポジトリを取得
$ gclient 
$ fetch v8 
$ cd v8 
  • リリース版をビルド&実行
$ ./build/install-build-deps.sh # 1度だけ 
$ tools/dev/v8gen.py x64.release 
$ ninja -C out.gn/x64.release 
$ out.gn/x64.release/d8 [file.js] 
  • デバッグ版をビルド&実行
$ ./build/install-build-deps.sh # 1度だけ 
$ tools/dev/v8gen.py x64.debug 
$ ninja -C out.gn/x64.debug 
$ out.gn/x64.debug/d8 [file.js] 
  • バイトコードを逆アセンブル
$ out.gn/x64.release/d8 --print-bytecode [file.js] 
  • マシンコードを逆アセンブル
$ out.gn/x64.debug/d8 --print-code [file.js] 
$ out.gn/x64.debug/d8 --print-opt-code [file.js] 


3. ChakraCore (Edge, IE)

参考:Building ChakraCore

  • 準備
$ sudo dnf install -y git cmake clang gcc gcc-c++ kernel-devel python llvm 
$ sudo dnf install -y libuuid-devel lttng-ust-devel.x86_64 libicu-devel.x86_64 
$ sudo dnf install -y libstdc++-static.x86_64 
  • レポジトリを取得
$ git clone https://github.com/Microsoft/ChakraCore 
$ cd ChakraCore 
  • リリース版をビルド&実行
$ ./build.sh -j $(nproc) 
$ out/Release/ch [file.js] 
  • デバッグ版をビルド&実行
$ ./build.sh --debug -j $(nproc) 
$ out/Debug/ch [file.js] 
  • バイトコードを逆アセンブル
$ out/Debug/ch --dump:bytecode [file.js] 
$ out/Debug/ch --AsmDumpMode [file.js] 
  • マシンコードを逆アセンブル
$ out/Debug/ch --dump:assembly [file.js] 


4. SpiderMonkey (Firefox)

参考: SpiderMonkey Build Documentation

  • 準備
$ wget -O bootstrap.py https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py 
$ python bootstrap.py 
$ sudo dnf install -y autoconf213 
  • レポジトリを取得
$ hg clone https://hg.mozilla.org/mozilla-central/ 
$ cd mozilla-central/js/src 
  • リリース版をビルド&実行
$ autoconf-2.13 
$ mkdir build_OPT.OBJ 
$ cd build_OPT.OBJ 
$ ../configure 
$ make -j $(nproc) 
$ dist/bin/js [file.js] 
  • デバッグ版をビルド&実行
$ autoconf-2.13 
$ mkdir build_DBG.OBJ 
$ cd build_DGB.OBJ 
$ ../configure --enable-debug --disable-optimize 
$ make -j $(nproc) 
$ dist/bin/js [file.js] 
  • バイトコード及びマシンコードを逆アセンブル
# use debug build 
$ dist/bin/js -D [file.js] 


5. JavaScriptCore (Safari)

参考:How to Build JavaScriptCore on Your Machine

  • 準備
$ sudo dnf install -y libicu-dev python ruby bison flex cmake ninja-build git gperf 
  • レポジトリを取得
$ git clone git://git.webkit.org/WebKit.git 
$ cd WebKit 
  • リリース版をビルド&実行
$ Tools/Scripts/build-webkit --jsc-only 
$ WebKitBuild/Release/bin/jsc [file.js] 
  • デバッグ版をビルド&実行
$ Tools/Scripts/build-webkit --jsc-only --debug 
$ WebKitBuild/Debug/bin/jsc [file.js] 
  • バイトコードを逆アセンブル
$ WebKitBuild/Debug/bin/jsc -d [file.js] 
  • マシンコードを逆アセンブル
$ JSC_dumpDisassembly=true WebKitBuild/Release/bin/jsc [file.js] 

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)