ฉันสนใจที่จะตรวจสอบว่ามีการสร้างไลบรารีแบบคงที่ของ iPhone สำหรับ ARM หรือ Intel หรือไม่
มันเป็นความอยากรู้อยากเห็นมากกว่าสิ่งใด มีเครื่องมือเฉพาะของ MacOS X หรือ BSD สำหรับทำสิ่งนี้หรือไม่? โพสต์นี้ให้ตัวอย่างใน Linux
ฉันสนใจที่จะตรวจสอบว่ามีการสร้างไลบรารีแบบคงที่ของ iPhone สำหรับ ARM หรือ Intel หรือไม่
มันเป็นความอยากรู้อยากเห็นมากกว่าสิ่งใด มีเครื่องมือเฉพาะของ MacOS X หรือ BSD สำหรับทำสิ่งนี้หรือไม่? โพสต์นี้ให้ตัวอย่างใน Linux
คำตอบ:
อีกทางเลือกหนึ่งคือlipo
; เอาต์พุตสั้นและอ่านง่ายกว่าotool
ของ
ตัวอย่าง:
% lipo -info /usr/lib/libiodbc.a
Architectures in the fat file: /usr/lib/libiodbc.a are: x86_64 i386 ppc
% lipo -info libnonfatarchive.a
input file libnonfatarchive.a is not a fat file
Non-fat file: libnonfatarchive.a is architecture: i386
%
file
อาจจะบอกคุณได้ otool
ควรจะทำได้อย่างแน่นอน แต่ฉันจะลองfile
ก่อนเช่น
logan:/Users/logan% file d2
d2: Mach-O executable ppc
ตัวอย่างที่มีไฟล์เก็บถาวร:
logan:/Users/logan% file /usr/lib/libMallocDebug.a
/usr/lib/libMallocDebug.a: Mach-O universal binary with 2 architectures
/usr/lib/libMallocDebug.a (for architecture i386): current ar archive random library
/usr/lib/libMallocDebug.a (for architecture ppc): current ar archive
file
มักจะล้มเหลว
ดังที่ได้กล่าวไว้ก่อนหน้านี้file
ไม่ได้ผลเสมอไป otool -hv -arch all
อาจเป็นสิ่งที่ใกล้เคียงที่สุดที่รับประกันว่าจะใช้งานได้ - ให้ข้อมูลสถาปัตยกรรมสำหรับไฟล์อ็อบเจ็กต์ทุกไฟล์ในไลบรารี
ตัวอย่าง:
% otool -hv /sw/lib/libfftw3.a ที่เก็บถาวร: /sw/lib/libfftw3.a /sw/lib/libfftw3.a(align.o): ส่วนหัวของ Mach magic cputype cpusubtype caps filetype ncmds sizeofcmds แฟล็ก MH_MAGIC_64 X86_64 ทั้งหมด 0x00 วัตถุ 336 SUBSECTIONS_VIA_SYMBOLS /sw/lib/libfftw3.a(alloc.o): ส่วนหัวของ Mach magic cputype cpusubtype caps filetype ncmds sizeofcmds แฟล็ก MH_MAGIC_64 X86_64 ทั้งหมด 0x00 วัตถุ 3416 SUBSECTIONS_VIA_SYMBOLS ...
ฉันพบว่าobjdump
สามารถทำงานได้ดี ตัวอย่างเช่นในสภาพแวดล้อมของฉันฉันสร้างที่เก็บไลบรารีด้วย vxWorks และจำเป็นต้องเชื่อมโยงสิ่งเหล่านั้นกับโปรเจ็กต์อื่น ๆ ในการทดสอบว่าไฟล์เก็บถาวรเป็นสถาปัตยกรรมที่ถูกต้องหรือไม่ฉันสามารถทำสิ่งต่อไปนี้ (ไวยากรณ์ bash):
if [ "$(objdumpsparc -a ${ARCHIVE_FILE} 2>&1 | ggrep -cvP 'elf32-sparc-vxworks')" -ne "0" ]; then
echo "Cannot build with ${ARCHIVE_FILE}, it contains one or more non-sparc components"
fi;
ตัวอย่างนี้ไม่ถูกต้องเนื่องจาก DO บางบรรทัดแสดงขึ้นโดยไม่ได้ระบุว่า elf32-sparc-vxworks แต่มันง่ายพอที่จะปรับเปลี่ยนได้
ข้อดีอย่างหนึ่งของสิ่งนี้คือobjdump
หรือมีการติดตั้งตัวแปรที่มีชื่อคล้ายกันในระบบปฏิบัติการ * nix ส่วนใหญ่ในขณะที่เครื่องมือที่แนะนำในการตอบกลับอื่น ๆ ไม่ได้
แก้ไขมันเพิ่งเกิดขึ้นกับฉันที่ OP ถามบน OSX ขอโทษด้วย.
objdump
คุณสามารถติดตั้ง GNU Binutils ผ่าน MacPorts port search binutils
หากต้องการดูสถาปัตยกรรมที่มีอยู่ทั้งหมดเพียงแค่ดำเนินการ เครื่องมือสำหรับการพัฒนาเนทีฟถูกนำหน้าเพื่อหลีกเลี่ยงความขัดแย้ง (เช่นgobjdump
แทนที่จะเป็นobjdump
) คุณอาจต้องการสร้างนามแฝงเพื่อความสะดวก
สคริปต์ทุบตีนี้จะช่วยให้คุณได้รับรายการสถาปัตยกรรมในตัวแปรโดยทางโปรแกรม
list_archs.sh:
#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'
ตัวอย่างการใช้งาน:
./list_archs.sh /usr/lib/libc.dylib
x86_64 i386