또 다른 GameCube/Wii 디 컴파일 툴킷.
Decomp-Toolkit은 개발자를위한 명령 줄 도구와 디 컴파일 프로젝트의 빌드 시스템의 다양한 부분을 대체합니다.
새로운 디 컴파일 프로젝트에 사용하려면 DTK-TEMPLATE를 참조하십시오. DTK-TEMPLATE는 프로젝트 구조 및 빌드 시스템을 제공하여 Decomp-Toolkit을 사용하는 시스템을 참조하십시오.
일치하는 디 컴파일 프로젝트의 목표는 원래 게임과 동일한 바이너리로 다시 컴파일하는 C/C ++ 코드를 작성하는 것입니다. 이것은 종종 원래 게임과 동일한 컴파일러를 사용해야합니다. (Gamecube 및 Wii의 경우 Metrowerks Codewarrior)
C/C ++ 코드를 컴파일 할 때 컴파일러 (이 경우 mwcceppc )는 모든 소스 파일에 대한 객체 파일 ( .o )을 생성합니다. 이 객체 파일에는 컴파일 된 기계 코드와 링커 ( mwldeppc )가 최종 실행 파일을 생성하는 데 사용하는 정보가 포함되어 있습니다.
우리의 코드가 일치하는지 확인하는 한 가지 방법은 코 컴파일 된 코드를 가져 와서 아직 소환되지 않은 원래 바이너리의 일부와 함께 연결하는 것입니다. 먼저, 우리는 원래 바이너리에서 재배치 가능한 객체를 만듭니다.

(심하게 단순화)
그런 다음 일치하는 코드가 작성 될 때 각 객체를 해제 버전으로 대체 할 수 있습니다. 링커가 여전히 원본과 동일한 바이트로 바이트 바이트를 생성하는 경우, 우리는 디 컴파일 된 코드가 일치한다는 것을 알고 있습니다.
Decomp-Toolkit은 원래 바이너리를 재배치 가능한 객체로 분석하고 분할하는 툴링을 제공 할뿐만 아니라 소환 된 코드를 연결하는 데 필요한 링커 스크립트 및 기타 파일을 생성합니다.
기능 경계 분석
높은 정확도로 기능 경계를 발견합니다. 다양한 휴리스틱을 사용하여 내부 기능 제어 흐름에서 꼬리 호출을 명확하게합니다.
서명 분석
내장 서명 데이터베이스를 사용하여 공통 메트로어 및 SDK 기능 및 객체를 식별합니다.
또한 __init_cpp_exceptions 와 같은 필수 스플릿을 자동으로 생성하는 데 도움이됩니다.
재배치 분석
제어 흐름 분석을 수행하고 높은 정확도로 재배치를 재구성합니다.
일부 수동 조정 (주로 데이터)에서는 완전히 이동 가능한 객체를 생성해야합니다.
섹션 분석
서명 및 재배치 분석의 정보를 기반으로 DOL 및 REL 섹션을 자동으로 식별합니다.
객체 분석
사용법을 분석하여 데이터 객체의 유형과 크기를 식별하려고 시도합니다.
또한 문자열 리터럴, 넓은 문자열 리터럴 및 문자열 테이블을 식별하려고 시도합니다.
파편
사용자 구성에 따라 메모리에서 분할 객체 파일을 생성합니다.
mwldeppc.exe 와의 리킹을 지원하기 위해, 모든 unssplit .ctors , .dtors , extab 및 extabindex 항목을 분석하고 관련 함수와 함께 자동 분할됩니다. 이를 통해 링커가 추가 구성없이 이러한 섹션을 올바르게 생성 할 수 있습니다.
분할 객체의 최종 링크 순서를 결정하기 위해 토폴로지 정렬이 수행됩니다.
객체 파일 쓰기
어셈블러가 필요하지 않고 객체 파일을 직접 씁니다. (bye devkitppc!)
원하는 경우 선택적으로 객체 파일과 함께 GNU 어셈블러 호환 파일을 씁니다.
링커 스크립트 생성
mwldeppc.exe 에 대해 ldscript.lcf 생성합니다.
입력 개체에서 정적 라이브러리 (.a)를 만듭니다.
$ dtk ar create out.a input_1.o input_2.o
# or
$ echo input_1.o >> rspfile
$ echo input_2.o >> rspfile
$ dtk ar create out.a @rspfile정적 라이브러리 (.A) 파일의 내용을 추출합니다.
여러 파일, 글로벌 패턴 (예 : *.a ) 및 응답 파일 (예 : @rspfile )을 허용합니다.
옵션 :
-o , --out <output-dir> : 출력 디렉토리. 기본값은 현재 디렉토리로 나타납니다.-v , --verbose : 장황한 출력.-q , --quiet : 오류를 제외한 모든 출력을 억제합니다. # Extracts to outdir
$ dtk ar extract lib.a -o outdir
# With multiple inputs, extracts to separate directories
# Extracts to outdir/lib1, outdir/lib2
$ dtk ar extract lib1.a lib2.a -o outdirdemangles codewarrior c ++ 기호. cwdemangle을위한 얇은 포장지.
$ dtk demangle ' BuildLight__9CGuiLightCFv '
CGuiLight::BuildLight () const disc 명령은 NOD 라이브러리와 nodtool 명령 줄 도구 주변의 포장지입니다.
디스크 이미지에 대한 정보를 표시합니다.
디스크 이미지의 내용을 나열하려면 VFS LS를 사용하십시오.
지원되는 디스크 이미지 형식 :
$ dtk disc info /path/to/game.iso디스크 이미지의 내용을 디렉토리로 추출합니다.
지원되는 형식은 디스크 정보를 참조하십시오.
메모
VFS CP는 더 유연하며 디스크 이미지를 지원합니다.
$ dtk disc extract /path/to/game.iso [outdir] 기본적으로 기본 데이터 파티션 만 추출됩니다.
-p / --partition 옵션을 사용하여 다른 파티션을 선택하십시오.
(옵션 : all , data , update , channel 또는 파티션 인덱스)
지원되는 디스크 이미지를 원시 ISO (GCM)로 변환합니다.
형식이 무손실 인 경우 출력은 원래 디스크 이미지와 동일합니다.
지원되는 형식은 디스크 정보를 참조하십시오.
$ dtk disc convert /path/to/game.wia /path/to/game.iso디스크 이미지의 내용을 해시하여 내장 된 레드 럼프 데이터베이스에 대해 확인합니다.
지원되는 형식은 디스크 정보를 참조하십시오.
$ dtk disc verify /path/to/game.isoDOL 파일을 분석하고 정보 섹션 및 기호 정보를 출력합니다.
VFS 추상화에 대한 정보는 VFS LS를 참조하십시오.
$ dtk dol info input.dol
# or, directly from a disc image
$ dtk dol info ' disc.rvz:sys/main.dol '중요한
이 명령은 대결 프로젝트의 빌드 시스템의 일부로 사용되도록 고안되었습니다.
프로젝트 구조 예와 구성에 대한 문서에 대해서는 DTK-Template을 참조하십시오.
DOL 파일을 사용자 구성을 기반으로 재배치 가능한 객체로 분석하고 분할합니다.
$ dtk dol split config.yml target 연결된 엘프의 문제에 대한 간단한 차이 도구. (예, Dol이 아닙니다. 이름이 잘못되었습니다.)
불일치를 일으키는 가장 명백한 차이를 찾으려고합니다.
프로젝트 구성 파일과 링크 된 ELF 파일의 경로를 전달하여 비교할 수 있습니다.
$ dtk dol diff config.yml build/main.elf링크 된 ELF에서 프로젝트 구성에 업데이트 된 기호를 적용합니다. (다시, 이름이 잘못되었습니다.)
파일 일치 후 유용합니다. 최종 결과에서 업데이트 된 기호 정보를 가져옵니다.
$ dtk dol apply config.yml build/main.elfDOL (& RELS)에서 초기 프로젝트 구성 파일을 생성합니다.
DOL 파일 및 링크 된 REL 파일을 전달하십시오.
또는 Wii Games의 경우 selfile.sel 을 통과하십시오. (RSO가 아님)
$ dtk dol config main.dol rels/ * .rel -o config.ymlELF 파일에서 Dwarf 1.1 정보를 덤프합니다. (Dwarf 2+를 지원하지 않음 )
$ dtk dwarf dump input.elf추첨되지 않은 CodeWarrior ELF 파일을 분해하십시오. 가능하면 객체를 자동으로 분할하고 재배치를 재건하려고 시도합니다.
$ dtk elf disasm input.elf out mwldeppc.exe 와의 호환성을 보장하기 위해 GNU 어셈블러 제작 객체의 문제를 해결합니다.
(asm) 접미사를 추가합니다. (일치 진행 계산) # input and output can be the same
$ dtk elf fixup file.o file.o제공된 ELF 파일에서 DOL 파일을 만듭니다.
$ dtk elf2dol input.elf output.dol
# or, to ignore certain sections
$ dtk elf2dol input.elf output.dol --ignore debug_section1 --ignore debug_section2CodeWarrior MAP 파일을 처리하고 기호 및 TU에 대한 정보를 제공합니다.
$ dtk map entries Game.MAP ' Unit.o '
# Outputs all symbols that are referenced by Unit.o
# This is useful for finding deduplicated weak functions,
# which only show on first use in the link map.
$ dtk map symbol Game.MAP ' Function__5ClassFv '
# Outputs reference information for Function__5ClassFv
# CodeWarrior link maps can get very deeply nested,
# so this is useful for emitting direct references
# in a readable format.REL 파일에 대한 정보를 인쇄합니다.
VFS 추상화에 대한 정보는 VFS LS를 참조하십시오.
$ dtk rel info input.rel
# or, directly from a disc image
$ dtk rel info ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel 'DOL 파일과 관련 Rels를 단일 ELF 파일로 병합하여 좋아하는 리버스 엔지니어링 소프트웨어에서 분석에 적합합니다.
$ dtk rel info main.dol rels/ * .rel -o merged.elf경고
이 명령은 아직 기능하지 않습니다.
RSO 파일에 대한 정보를 인쇄합니다.
$ dtk rso info input.rso경고
이 명령은 아직 SEL 파일 생성을 지원하지 않습니다.
재배치 가능한 ELF 파일에서 RSO 파일을 만듭니다.
옵션 :
-o , --output <File> : output rso 파일.-m , --module-name <Name> : 모듈 이름 (또는 경로). 기본값 : 입력 이름-e , --export <File> : 내보낸 기호 이름이 포함 된 파일. (Newline 분리) $ dtk rso make input.elf -o input.rsoSHA-1 해시를 계산하고 확인하십시오.
$ dtk shasum baserom.dol
949c5ed7368aef547e0b0db1c3678f466e2afbff baserom.dol
$ dtk shasum -c baserom.sha1
baserom.dol: OKNLZSS 압축 파일을 압축합니다.
$ dtk nlzss decompress input.bin.lz -o output.bin
# or, for batch processing
$ dtk nlzss decompress rels/ * .lz -o rels메모
VFS LS는보다 유연하며 RARC 아카이브를 지원합니다.
이 명령은 이제 dtk vfs ls -r input.arc:
RARC (구형 .ARC) 아카이브의 내용을 나열합니다.
$ dtk rarc list input.arc메모
VFS CP는보다 유연하며 RARC 아카이브를 지원합니다.
이 명령은 이제 dtk vfs cp input.arc: output_dir 와 동일합니다.
RARC (구형 .ARC) 아카이브의 내용을 추출합니다.
$ dtk rarc extract input.arc -o output_dir메모
VFS LS는보다 유연하며 U8 아카이브를 지원합니다.
이 명령은 이제 dtk vfs ls -r input.arc:
U8 (새로운 .ARC) 아카이브의 내용을 추출합니다.
$ dtk u8 list input.arc메모
VFS CP는보다 유연하며 U8 아카이브를 지원합니다.
이 명령은 이제 dtk vfs cp input.arc: output_dir 와 동일합니다.
U8 (새로운 .ARC) 아카이브의 내용을 추출합니다.
$ dtk u8 extract input.arc -o output_dirDecomp-Toolkit에는 다양한 컨테이너로 작업 할 수있는 강력한 가상 파일 시스템 (VFS) 추상화가 있습니다. 모든 작업은 최소한의 오버 헤드와 임시 파일이없는 메모리에서 발생합니다.
지원되는 컨테이너 :
지원되는 압축 형식은 투명하게 처리됩니다.
:nlzss ) vfs ls 컨테이너 또는 디렉토리의 내용을 나열합니다.
옵션 :
-r , --recursive : 내용을 재귀 적으로 나열합니다.-s , --short : 파일 이름 만 나열합니다.예 :
# List the contents of the `amem` directory inside `RELS.arc` in a disc image
$ dtk vfs ls ' disc.rvz:files/RELS.arc:amem '
# List the contents of `RELS.arc` recursively
$ dtk vfs ls -r ' disc.rvz:files/RELS.arc: '
# All commands that accept a file path can also accept a VFS path
$ dtk rel info ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel '
# Example disc image within a disc image
$ dtk dol info ' disc.rvz:files/zz_demo.tgc:sys/main.dol 'VFS 추상화에 대한 정보는 VFS LS를 참조하십시오.
vfs cp 파일과 디렉토리를 호스트 파일 시스템에 다시 복사합니다.
옵션 :
--no-decompress : 복사 할 때 파일을 압축하지 마십시오.-q , --quiet : 오류를 제외한 모든 출력을 억제합니다.예 :
# Extract a file from a nested path in a disc image to the current directory
$ dtk vfs cp ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel ' .
# Directories are copied recursively, making it easy to extract entire archives
$ dtk vfs cp ' disc.rvz:files/RELS.arc: ' rels
# Or, to disable automatic decompression
$ dtk vfs cp --no-decompress ' disc.rvz:files/RELS.arc: ' relsyay0 압축 파일을 압축합니다.
$ dtk yay0 decompress input.bin.yay0 -o output.bin
# or, for batch processing
$ dtk yay0 decompress rels/ * .yay0 -o relsyay0 압축을 사용하여 파일을 압축합니다.
$ dtk yay0 compress input.bin -o output.bin.yay0
# or, for batch processing
$ dtk yay0 compress rels/ * -o relsyaz0- 압축 파일을 압축합니다.
$ dtk yaz0 decompress input.bin.yaz0 -o output.bin
# or, for batch processing
$ dtk yaz0 decompress rels/ * .yaz0 -o relsYAZ0 압축을 사용하여 파일을 압축합니다.
$ dtk yaz0 compress input.bin -o output.bin.yaz0
# or, for batch processing
$ dtk yaz0 compress rels/ * -o relsWAD 파일에 대한 정보를 인쇄합니다.
$ dtk wad info input.wad메모
VFS CP는 더 유연하며 WAD 파일을 지원합니다.
이 명령은 이제 dtk vfs cp input.wad: output_dir
WAD 파일의 내용을 추출합니다.
$ dtk wad extract input.wad -o output_dirWAD 파일의 내용을 확인합니다.
$ dtk wad verify input.wad