用于反编译项目的本地差异工具。受到 decomp.me 和 asm-differ 的启发。
特征:
支持:
有关详细信息,请参阅用法。
要从源代码构建,请参阅构建。
对于 Linux 和 macOS,运行chmod +x objdiff-*
以使二进制可执行文件。
CLI 二进制文件可以在发布页面上找到。
objdiff 的工作原理是比较两个可重定位目标文件 ( .o
)。这些对象应具有与“目标”和“基本”目录相同的相对路径。
例如,如果目标(“预期”)对象位于build/asm/MetroTRK/mslsupp.o
且基础(“实际”)对象位于build/src/MetroTRK/mslsupp.o
,则以下配置将使用:
build/asm
build/src
MetroTRK/mslsupp.o
然后 objdiff 将从项目目录执行构建系统来构建这两个对象:
$ make build/asm/MetroTRK/mslsupp.o # Only if "Build target object" is enabled
$ make build/src/MetroTRK/mslsupp.o
然后将对对象进行比较,结果将显示在 UI 中。
请参阅配置以获取更多信息。
虽然不是必需的(大多数设置可以在 UI 中指定),但项目可以添加objdiff.json
文件来自动配置该工具。配置文件必须位于项目根目录中。
如果您的项目有生成器脚本(例如configure.py
),建议也生成 objdiff 配置文件。然后,您可以将objdiff.json
添加到.gitignore
以防止其被提交。
{
"$schema" : " https://raw.githubusercontent.com/encounter/objdiff/main/config.schema.json " ,
"custom_make" : " ninja " ,
"custom_args" : [
" -d " ,
" keeprsp "
],
"build_target" : false ,
"build_base" : true ,
"watch_patterns" : [
" *.c " ,
" *.cp " ,
" *.cpp " ,
" *.cxx " ,
" *.h " ,
" *.hp " ,
" *.hpp " ,
" *.hxx " ,
" *.s " ,
" *.S " ,
" *.asm " ,
" *.inc " ,
" *.py " ,
" *.yml " ,
" *.txt " ,
" *.json "
],
"units" : [
{
"name" : " main/MetroTRK/mslsupp " ,
"target_path" : " build/asm/MetroTRK/mslsupp.o " ,
"base_path" : " build/src/MetroTRK/mslsupp.o " ,
"metadata" : {}
}
]
}
查看 config.schema.json 以了解所有可用选项。下面的列表是最重要选项的摘要。
custom_make
(可选) :默认情况下,objdiff 将使用make
来构建项目。
如果项目使用不同的构建系统(例如ninja
),请在此处指定。
构建命令将为[custom_make] [custom_args] path/to/object.o
。
custom_args
(可选) :在对象路径之前传递给构建命令的附加参数。
build_target
:如果为 true,则 objdiff 将告诉构建系统在比较之前构建目标对象(例如make path/to/target.o
)。
如果目标对象不是默认构建的或者可以根据项目配置或对程序集文件的编辑进行更改,则这非常有用。
需要正确配置构建系统。
build_base
:如果为 true,则 objdiff 将告诉构建系统在比较之前构建基础对象(例如make path/to/base.o
)。
您不太可能想要禁用此功能,除非您使用外部工具在源文件更改时重建基础对象。
watch_patterns
(可选) :用于监视更改的全局模式列表。 (支持的语法)
如果这些文件中的任何一个发生更改,objdiff 将自动重建对象并重新比较它们。
如果未指定,objdiff 将使用上面列出的默认模式。
units
(可选) :如果指定,objdiff 将在侧栏中显示对象列表以便于导航。
name
(可选) :UI 中对象的名称。如果未指定,将使用对象的path
。
target_path
:从项目根目录到“目标”或“预期”对象的路径。
该对象是比赛的预期结果。
base_path
:从项目根目录到“基础”或“实际”对象的路径。
该对象是根据当前源代码构建的。
metadata.auto_generated
(可选) :从对象列表中隐藏对象,但仍将其包含在报告中。
metadata.complete
(可选) :在对象列表中将对象标记为“完整”(或“链接”)。
这对于标记完全反编译的对象很有用。false
值会将对象标记为“不完整”。
通过 rustup 安装 Rust。
$ git clone https://github.com/encounter/objdiff.git
$ cd objdiff
$ cargo run --release
或者使用cargo install
。
$ cargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli
二进制文件将作为objdiff
和objdiff-cli
安装到~/.cargo/bin
。
已获得以下任一许可
由您选择。
除非您另有明确说明,否则您有意提交的包含在作品中的任何贡献(如 Apache-2.0 许可证中所定义)应如上所述获得双重许可,没有任何附加条款或条件。