디컴파일 프로젝트를 위한 로컬 비교 도구입니다. 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는 diff 전에 대상 객체를 빌드하도록 빌드 시스템에 지시합니다(예: make path/to/target.o
).
이는 대상 개체가 기본적으로 빌드되지 않거나 프로젝트 구성 또는 어셈블리 파일 편집에 따라 변경될 수 있는 경우에 유용합니다.
빌드 시스템을 올바르게 구성해야 합니다.
build_base
: true인 경우 objdiff는 diff 전에 기본 개체를 빌드하도록 빌드 시스템에 지시합니다(예: make path/to/base.o
).
소스 파일 변경 시 기본 개체를 다시 작성하기 위해 외부 도구를 사용하지 않는 한 이 기능을 비활성화하고 싶지 않을 것입니다.
watch_patterns
(선택 사항) : 변경 사항을 감시할 glob 패턴 목록입니다. (지원되는 구문)
이러한 파일 중 하나라도 변경되면 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 라이선스에 정의된 대로 귀하가 저작물에 포함하기 위해 의도적으로 제출한 기여는 추가 이용약관 없이 위와 같이 이중 라이선스가 부여됩니다.