逆コンパイルプロジェクト用のローカル差分ツール。 decomp.me と asm-differ からインスピレーションを受けています。
特徴:
サポート:
詳細については、「使用法」を参照してください。
ソースからビルドするには、「ビルド」を参照してください。
Linux および macOS の場合は、 chmod +x objdiff-*
実行してバイナリを実行可能にします。
CLI バイナリはリリース ページにあります。
objdiff は、2 つの再配置可能オブジェクト ファイル ( .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
の場合、オブジェクトは「不完全」としてマークされます。
Rustをrustup経由でインストールします。
$ 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 ライセンスで定義されているように、あなたが作品に含めるために意図的に提出した投稿は、追加の条項や条件なしで上記のように二重ライセンスされるものとします。