ฉันจะกำหนดสถาปัตยกรรมเป้าหมายของไลบรารีแบบคงที่ (.a) บน Mac OS X ได้อย่างไร


128

ฉันสนใจที่จะตรวจสอบว่ามีการสร้างไลบรารีแบบคงที่ของ iPhone สำหรับ ARM หรือ Intel หรือไม่

มันเป็นความอยากรู้อยากเห็นมากกว่าสิ่งใด มีเครื่องมือเฉพาะของ MacOS X หรือ BSD สำหรับทำสิ่งนี้หรือไม่? โพสต์นี้ให้ตัวอย่างใน Linux

คำตอบ:


241

อีกทางเลือกหนึ่งคือ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
%

เพิ่งตรวจสอบสิ่งนี้ด้วยไฟล์ PJSIP .a เก่า ARMv7 ขอบคุณ
Alex Zavatone

69

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

34
จากประสบการณ์ของฉันfileมักจะล้มเหลว
Stefan Schmidt

4
ดูคำตอบเกี่ยวกับ lipo ต่อไปได้ผลเสมอ
Maciej Swic

ฉันสังเกตเห็นว่าถ้า. a ไม่ใช่ ranlib'd บางครั้งไฟล์รายงานข้อมูลน้อย
Paul Du Bois

4
ตอนนี้ในปี 2015 คุณควรใช้ lipo ดูคำตอบด้านล่าง
derFunk

1
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้กับระบบปฏิบัติการหลายเวอร์ชัน
rmcclellan

53

ดังที่ได้กล่าวไว้ก่อนหน้านี้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
...

เพื่อเพิ่มคำตอบนี้ฉันชอบ otool มากกว่าไฟล์หรือ lipo ฉันลองใช้ไฟล์ lipo และ otool ด้วยไลบรารีไขมัน iOS และ otool เป็นไฟล์เดียวที่แสดงให้ฉันเห็นว่ามีไฟล์สำหรับ i386 (iPhone Simulator) และสำหรับ armv6, armv7 และ armv7s (iPhone OS)
Roberto

1
หมายเหตุ: หากคุณต้องการตรวจสอบว่าห้องสมุดของคุณมีไขมันหรือไม่คุณต้องการใช้ "otool -arch all"; มิฉะนั้นจะรายงานเพียงสถาปัตยกรรมเดียวต่อไฟล์. o สำหรับภาพรวมคร่าวๆของสถาปัตยกรรมใน. a ของคุณ "otool -f"
Paul Du Bois

4

ฉันพบว่า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) คุณอาจต้องการสร้างนามแฝงเพื่อความสะดวก
Stefan Schmidt

3

สคริปต์ทุบตีนี้จะช่วยให้คุณได้รับรายการสถาปัตยกรรมในตัวแปรโดยทางโปรแกรม

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.