2008-11-10 184 views

回答

1

我想你是走在正确的轨道上。

它看起来像你需要从脚本::编译到编译器::编译,这将导致你的代码生成器(codegen * .cc和.h)。

所有这一切都可以这么说,看着codegen-ia32.cc,如果你在构建时定义了ENABLE_DISASSEMBLER ,我认为你的反汇编应该打印出来。

当然,所有这些只是通过快速浏览我在这里的源代码的旧副本,所以YMMV,但我认为这应该起作用。 (看看你的帖子,我看到你正在寻找机器语言,而不是汇编 - 我不确定,但是如果你想要汇编的代码输出,你可能需要修改逻辑,而不是它的反汇编)

11

我不知道如何从C++代码调用反汇编程序,但有一种快速和肮脏的方式从shell中反汇编。

首先,编译V8与反汇编器支持:

./shell --print_code hello.js 

这应该给你这样的::

scons [your v8 build options here] disassembler=on sample=shell 

现在你可以用 “--print_code” 选项调用shell

--- 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 

当然,您的输出会有所不同。以上是来自针对Linux x64编译的v8主干。

6

您需要使用反汇编程序支持来构建v8。

下载v8源代码。

git clone https://chromium.googlesource.com/v8/v8.git 

使用反汇编程序支持构建。

make dependencies 
make ia32.release objectprint=on disassembler=on 

使用某些标志调用d8(v8 shell),具体取决于你想要的。

out/ia32.release/d8 --code-comments --print-code <app.js> 

参考:

  • --code-评论:包括代码的注释。
  • - 打印代码:打印出代码至标准输出
  • - 打印代码存根:打印代码存根。
  • --print-opt-code:打印优化的代码。
  • --trace-hydrogen:将IR(中间表示)代码打印到hydrogen.cfg。该文件可以用Java's C1Visualizer打开。
0

看看v8_root/build/features.gypi,你会发现V8的反汇编程序相关的和许多其他的编译时功能开关。

0

尝试或的NodeJS铬:

  1. -print-opt-code:代码通过优化编译器产生。
  2. -print-bytecode:解释器生成的字节码。
  3. -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-generated-by-v8.html

相关问题