เครื่องมือกระจายท้องถิ่นสำหรับโปรเจ็กต์การแยกคอมไพล์ แรงบันดาลใจจาก 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 จะดำเนินการระบบ build จากไดเร็กทอรีโปรเจ็กต์เพื่อสร้างทั้งสองอ็อบเจ็กต์:
$ 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
) ให้ระบุที่นี่
คำสั่ง build จะเป็น [custom_make] [custom_args] path/to/object.o
custom_args
(เป็นทางเลือก) : อาร์กิวเมนต์เพิ่มเติมที่จะส่งไปยังคำสั่ง build ก่อนเส้นทางของวัตถุ
build_target
: หากเป็นจริง objdiff จะบอกระบบ build ให้สร้างวัตถุเป้าหมายก่อนที่จะทำการ diff (เช่น make path/to/target.o
)
สิ่งนี้มีประโยชน์หากออบเจ็กต์เป้าหมายไม่ได้ถูกสร้างขึ้นตามค่าเริ่มต้นหรือสามารถเปลี่ยนแปลงได้ตามการกำหนดค่าโปรเจ็กต์หรือการแก้ไขไฟล์แอสเซมบลี
ต้องมีการกำหนดค่าระบบบิลด์อย่างถูกต้อง
build_base
: หากเป็นจริง objdiff จะบอกระบบ build ให้สร้างอ็อบเจ็กต์ฐานก่อนที่จะทำการ 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
จะทำเครื่องหมายวัตถุว่า "ไม่สมบูรณ์"
ติดตั้ง 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
ไบนารีจะถูกติดตั้งไปที่ ~/.cargo/bin
เป็น objdiff
และ objdiff-cli
ได้รับอนุญาตภายใต้ข้อใดข้อหนึ่ง
ตามตัวเลือกของคุณ
เว้นแต่คุณจะระบุไว้เป็นอย่างอื่นอย่างชัดเจน การสนับสนุนใดๆ ที่ส่งโดยเจตนาเพื่อรวมไว้ในผลงานของคุณ ตามที่กำหนดไว้ในใบอนุญาต Apache-2.0 จะต้องได้รับใบอนุญาตแบบคู่ตามข้างต้น โดยไม่มีข้อกำหนดหรือเงื่อนไขเพิ่มเติมใดๆ