4大 JavaScript エンジンを Linux コマンドラインでビルド&実行して逆アセンブルさせる
4大 JavaScript エンジンを Linux コマンドラインでビルド&実行して逆アセンブルさせる:
メジャーな Web ブラウザで使われている4種類の JavaScript エンジン V8 (Chrome), ChakraCore (IE, Edge), SpiderMonkey (Firefox), JavaScriptCore (Safari) をそれぞれ Linux のコマンドラインでビルドして、JavaScript のコードを実行したり、JIT コンパイルされたバイトコードやマシンコードの逆アセンブリを出力する方法をメモしておきます。パフォーマンスの比較や JIT コンパイルされた結果の確認などにご活用ください。
まず、予め共通で必要になる開発環境のパッケージをインストールしておきます。この記事では Fedora Core 上での実行を想定しています。他のディストリビューションで必要なパッケージは、それぞれ参考リンク先で確認してください。
参考:Building from Source
参考:Building ChakraCore
参考: SpiderMonkey Build Documentation
参考:How to Build JavaScriptCore on Your Machine
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]
コメント
コメントを投稿