2 个版本
使用旧 Rust 2015
0.1.1 | 2018年4月28日 |
---|---|
0.1.0 | 2018年4月27日 |
#12 in #disassemble
17KB
166 代码行
- cargo-disassemble 简单易用地解构你的 Rust 项目
** 使用 cargo-disassemble 尝试模仿其他 cargo 子命令的命令行界面。注意,函数 参数是可选的 - 省略它将解构当前 crate 中的所有函数。
#+BEGIN_SRC text 使用方法: cargo-disassemble [FLAGS] [OPTIONS] [function]
FLAGS: --all-features 启用所有功能 --everything 包括当前 crate 未定义的函数 -h, --help 打印帮助信息 --intel 输出 intel 风格的 x86 汇编 --no-default-features 启用 no_default 功能 --optimize 尽可能优化二进制文件 --release 以发布模式编译 -V, --version 打印版本信息
OPTIONS: --features 要启用的功能(如果有)
ARGS: 要反编译的函数名称 #+END_SRC ** 示例
#+BEGIN_SRC rust #[inline(never)] fn is_branch_label(line: &str) -> bool { line.starts_with(".LBB") } #+END_SRC
对于给定的函数,我们可以使用以下命令解构 is_branch_label 的优化版本
#+BEGIN_SRC shell $ cargo disassemble is_branch_label --release --optimize --intel #+END_SRC
这将产生以下结果
#+BEGIN_SRC asm cargo_disassemble::is_branch_label cmp rsi, 4 je .LBB66_4 cmp rsi, 5 jb .LBB66_3 cmp byte ptr [rdi + 4], -65 jle .LBB66_3 .LBB66_4: push rbp mov rbp, rsp sub rsp, 16 mov qword ptr [rbp - 16], rdi mov qword ptr [rbp - 8], rsi mov al, 1 lea rcx, [rip + .Lbyte_str.1e] cmp rdi, rcx lea rsp, [rsp + 16] pop rbp je .LBB66_6 cmp dword ptr [rdi], 1111641134 je .LBB66_6 .LBB66_3: xor eax, eax ret #+END_SRC ** 注意事项 当以发布模式编译时,rustc 往往会积极内联较小的函数。因为内联函数在最终二进制文件中通常没有独立的副本,所以它们可能不会被解构。将 #[inline(never)] 属性添加到函数中可以确保它被包含,但可能会改变函数内的代码。
依赖项
~25–35MB
~657K SLoC