use*_*128 22 javascript code-generation v8
有谁知道我怎么能看到v8从Javascript生成的实际机器代码?我已经到了这里Script::Compile(),src/api.cc但我无法弄清楚从哪里去.
sst*_*ock 13
我不知道如何从C++代码中调用反汇编程序,但有一种快速而肮脏的方法从shell中获取反汇编.
首先,使用反汇编程序支持编译v8:
scons [your v8 build options here] disassembler=on sample=shell
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用"--print_code"选项调用shell:
./shell --print_code hello.js
Run Code Online (Sandbox Code Playgroud)
哪个应该给你这样的东西:
--- Raw source ---
print("hello world");
--- Code ---
kind = FUNCTION
Instructions (size = 134)
0x2ad0a77ceea0 0 55 push rbp
0x2ad0a77ceea1 1 488bec REX.W movq rbp,rsp
0x2ad0a77ceea4 4 56 push rsi
0x2ad0a77ceea5 5 57 push rdi
0x2ad0a77ceea6 6 49ba59c13da9d02a0000 REX.W movq r10,0x2ad0a93dc159 ;; object: 0xa93dc159 <undefined>
0x2ad0a77ceeb0 16 4952 REX.W push r10
0x2ad0a77ceeb2 18 49ba688b700000000000 REX.W movq r10,0x708b68
0x2ad0a77ceebc 28 493b22 REX.W cmpq rsp,[r10]
0x2ad0a77ceebf 31 0f824e000000 jc 115 (0x2ad0a77cef13)
0x2ad0a77ceec5 37 488b462f REX.W movq rax,[rsi+0x2f]
0x2ad0a77ceec9 41 4883ec18 REX.W subq rsp,0xlx
0x2ad0a77ceecd 45 49ba094b3ea9d02a0000 REX.W movq r10,0x2ad0a93e4b09 ;; object: 0xa93e4b09 <String[5]: print>
0x2ad0a77ceed7 55 4c8955e0 REX.W movq [rbp-0x20],r10
0x2ad0a77ceedb 59 488945d8 REX.W movq [rbp-0x28],rax
0x2ad0a77ceedf 63 49ba014d3ea9d02a0000 REX.W movq r10,0x2ad0a93e4d01 ;; object: 0xa93e4d01 <String[11]: hello world>
0x2ad0a77ceee9 73 4c8955d0 REX.W movq [rbp-0x30],r10
0x2ad0a77ceeed 77 49baa06c7ba7d02a0000 REX.W movq r10,0x2ad0a77b6ca0 ;; debug: statement 0
;; code: contextual, CALL_IC, UNINITIALIZED, argc = 1
0x2ad0a77ceef7 87 49ffd2 REX.W call r10
0x2ad0a77ceefa 90 488b75f8 REX.W movq rsi,[rbp-0x8]
0x2ad0a77ceefe 94 4883c408 REX.W addq rsp,0xlx
0x2ad0a77cef02 98 488945e8 REX.W movq [rbp-0x18],rax
0x2ad0a77cef06 102 488be5 REX.W movq rsp,rbp ;; js return
0x2ad0a77cef09 105 5d pop rbp
0x2ad0a77cef0a 106 c20800 ret 0x8
0x2ad0a77cef0d 109 cc int3
0x2ad0a77cef0e 110 cc int3
0x2ad0a77cef0f 111 cc int3
0x2ad0a77cef10 112 cc int3
0x2ad0a77cef11 113 cc int3
0x2ad0a77cef12 114 cc int3
0x2ad0a77cef13 115 49ba60657ba7d02a0000 REX.W movq r10,0x2ad0a77b6560 ;; code: STUB, StackCheck, minor: 0
0x2ad0a77cef1d 125 49ffd2 REX.W call r10
0x2ad0a77cef20 128 488b7df0 REX.W movq rdi,[rbp-0x10]
0x2ad0a77cef24 132 eb9f jmp 37 (0x2ad0a77ceec5)
RelocInfo (size = 10)
0x2ad0a77ceea8 embedded object (0xa93dc159 <undefined>)
0x2ad0a77ceecf embedded object (0xa93e4b09 <String[5]: print>)
0x2ad0a77ceee1 embedded object (0xa93e4d01 <String[11]: hello world>)
0x2ad0a77ceeed statement position (0)
0x2ad0a77ceeef code target (context) (CALL_IC) (0x2ad0a77b6ca0)
0x2ad0a77cef06 js return
0x2ad0a77cef15 code target (STUB) (0x2ad0a77b6560)
hello world
Run Code Online (Sandbox Code Playgroud)
当然,你的输出会有所不同.以上是为Linux x64编译的v8 trunk.
您需要使用反汇编程序支持构建v8.
下载v8源代码.
git clone https://chromium.googlesource.com/v8/v8.git
Run Code Online (Sandbox Code Playgroud)
使用反汇编程序支持构建.
make dependencies
make ia32.release objectprint=on disassembler=on
Run Code Online (Sandbox Code Playgroud)
根据您的需要,使用某些标志调用d8(v8 shell).
out/ia32.release/d8 --code-comments --print-code <app.js>
Run Code Online (Sandbox Code Playgroud)
以供参考:
尝试使用NodeJS或Chrome:
-print-opt-code:通过优化编译器生成的代码。-print-bytecode:解释器生成的字节码。-trace-opt和-trace-depot:(取消)优化了哪些功能。查看@Franziska Hinkelmann的这篇文章:
https://medium.com/dailyjs/understanding-v8s-bytecode-317d46c94775
此外,您也可以尝试
D8:它将帮助您编译V8和查看从JavaScript生成的汇编代码。
有关用法和详细信息:
http://www.mattzeunert.com/2015/08/19/viewing-assembly-code-generation-by-v8.html
我认为你走在正确的道路上。
看起来您需要从 Script::Compile 转到 Compiler::Compile,这将引导您到达代码生成器(codegen*.cc 和 .h)。
所有这些都是为了说明,查看 codegen-ia32.cc,如果您在构建时定义 ENABLE_DISASSEMBLER,我认为应该打印您的反汇编代码。
当然,所有这些都只是快速浏览我这里的旧源代码副本,所以 YMMV,但我认为这应该可行。
(再次查看您的帖子,我发现您正在寻找机器语言,而不是汇编程序 - 我不确定,但如果您想要汇编代码输出而不是反汇编,您可能必须修改逻辑)
| 归档时间: |
|
| 查看次数: |
8893 次 |
| 最近记录: |