मैं मैक ओएस एक्स पर स्थिर पुस्तकालय (.A) की लक्ष्य वास्तुकला कैसे निर्धारित करूं?


128

अगर किसी iPhone iPhone को ARM या Intel के लिए बनाया गया है, तो मैं सत्यापित करने में दिलचस्पी रखता हूं।

यह किसी भी चीज से ज्यादा जिज्ञासा है। क्या ऐसा करने के लिए किसी प्रकार का मैक ओएस एक्स या बीएसडी विशिष्ट उपकरण है? यह पोस्ट लिनक्स में एक उदाहरण देता है।

जवाबों:


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। धन्यवाद।
एलेक्स ज़ावाटोन

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अक्सर विफल रहता है।
स्टीफन श्मिट

4
लिपो के बारे में उत्तर को और नीचे देखें, हमेशा काम करता है।
मैकीज स्विक

मैंने देखा है कि यदि कोई .a ranlib'd नहीं है, तो फ़ाइल कभी-कभी कम जानकारी देती है।
पॉल डू बोइस

4
अब 2015 में आपको लिपो का उपयोग करना चाहिए। नीचे उत्तर देखें।
derFunk

1
दुर्भाग्य से यह कई OS संस्करणों के लिए काम नहीं किया है।
rmcclellan

53

जैसा कि पहले उल्लेख किया गया है, fileहमेशा काम नहीं करता है। otool -hv -arch allशायद सबसे करीबी चीज़ है जो काम करने की गारंटी है - यह लाइब्रेरी में हर एक ऑब्जेक्ट फ़ाइल के लिए आर्किटेक्चर की जानकारी देता है।

उदाहरण:

% otool -hv /sw/lib/libfftw3.a
पुरालेख: /sw/lib/libfftw3.a
/sw/lib/libfftw3.a(align.o):
मच हेडर
      मैजिक कैप्टाइप cpusubtype caps filetype ncmds sizeofcmds झंडे
MH_MAGIC_64 X86_64 सभी 0x00 OBJECT 3 336 SUBSECTIONS_VIA_SYMBOLS
/sw/lib/libfftw3.a(alloc.o):
मच हेडर
      मैजिक कैप्टाइप cpusubtype caps filetype ncmds sizeofcmds झंडे
MH_MAGIC_64 X86_64 सभी 0x00 OBJECT 3 416 SUBSECTIONS_VIA_SYMBOLS
...

बस इस उत्तर को जोड़ने के लिए, मैं ओटोल ओवर फाइल या लिपो पसंद करता हूं। मैंने एक आईओएस वसा पुस्तकालय के साथ फ़ाइल, लाइपो और ओटूल की कोशिश की और ओटूल केवल एक ही था जिसने मुझे दिखाया कि इसमें i386 (iPhone सिम्युलेटर) और armv6, armv7 और armv7s (iPhone OS) के लिए फाइलें थीं।
रॉबर्टो

1
नोट: यदि आप यह जांचना चाहते हैं कि आपका पुस्तकालय मोटा है या नहीं, तो आप "ओटूल-वर्ड ऑल" का उपयोग करना चाहते हैं; अन्यथा, यह केवल एक आर्किटेक्चर प्रति .o फ़ाइल की रिपोर्ट करेगा। अपने .a, "ओटूल-एफ" में वास्तुशिल्प के त्वरित अवलोकन के लिए
पॉल डू बोइस

4

एक विकल्प के रूप में, मैंने पाया है कि objdumpयह अच्छी तरह से काम कर सकता है। एक उदाहरण के रूप में, मेरे वातावरण में मैं vxWorks के साथ पुस्तकालय अभिलेखागार का निर्माण करता हूं और उन्हें अन्य परियोजनाओं में जोड़ने की आवश्यकता है। यह जांचने के लिए कि क्या आर्काइव सही आर्किटेक्चर है, मैं निम्नलिखित जैसा कुछ कर सकता हूं (बैश सिंटैक्स):

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;

यह उदाहरण ठीक नहीं है, क्योंकि कुछ पंक्तियाँ यह दर्शाती हैं कि योगिनी-स्पार्क-वीएक्सवर्क्स नहीं कहते हैं, लेकिन इसे अनुकूलित करना काफी आसान है।

इसका एक अच्छा लाभ यह है कि objdump, या इसी तरह नाम वाले संस्करण को, अधिकांश * निक्स ऑपरेटिंग सिस्टम पर स्थापित किया गया है, जबकि अन्य प्रतिक्रियाओं में सुझाए गए उपकरण नहीं हैं।

संपादित करें यह सिर्फ मेरे लिए ओपी OSX पर पूछ रहा था। मैं क्षमाप्रार्थी हूं।


उपयोग करने के लिए objdumpआप MacPorts के माध्यम से GNU Binutils स्थापित कर सकते हैं। सभी उपलब्ध आर्किटेक्चर देखने के लिए बस निष्पादित करें port search binutils। मूल विकास के उपकरण संघर्ष से बचने के लिए उपसर्ग किए जाते हैं (उदाहरण के gobjdumpबजाय objdump)। आप सुविधा के लिए एक उपनाम बनाना चाहते हैं।
स्टीफन श्मिट

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.