LINUX में यह निर्धारित करें कि .a पुस्तकालय / संग्रह 32-बिट या 64-बिट?


87

हम लिनक्स में 64-बिट और 32-बिट दोनों संस्करणों में एक स्थिर परिवाद वितरित करते हैं। जब ग्राहक समस्या निवारण करता है, तो मैं अपनी डायग्नोस्टिक शेल स्क्रिप्ट को जल्दी से समाप्त करने के लिए .a संग्रह फ़ाइल की जाँच करके यह पता लगाना चाहूंगा कि क्या यह 32 या 64 बिट है। मेरे लिए होने वाले तरीके सुरुचिपूर्ण से कम हैं:

  1. -o सदस्य को निकालें और "फ़ाइल" कमांड (जैसे, ईएलएफ 32-बिट आदि) से पूछें

  2. एक डमी सदस्य को इंगित करने के लिए कोडित करें, जैसे 32bit.o / 64bit.o और चेक करने के लिए "ar -t" का उपयोग करें

मैंने "स्ट्रिंग्स xyz.a | grep 32" की कोशिश की है, लेकिन यह संस्करणों पर अच्छी तरह से काम नहीं करता है। दिल टूटने की समस्या नहीं है, लेकिन अगर आप एक सुंदर समाधान जानते हैं, तो मैं जानना चाहूंगा।


मैं stackoverflow.com/questions/184502/… के बारे में जानता हूँ , एक बेहतर समाधान की तलाश में हूँ।
cvsdave

2
दूसरे प्रश्न में समाधान समस्या को बड़े करीने से संबोधित करता है, लेकिन एक त्वरित तरीका है nm foo.a | grep '^ 0' | सिर -1 | wc -c - यदि परिणाम 17 (16 + 1 == 8bytes + 1 लाइन के लिए वापसी) है, तो यह 64 बिट है, यदि यह 9 है तो यह 32 बिट है (8 + 1 == 4bytes + 1 लाइन लाइन वापसी के लिए)
पेटेश

अगर मुझे 14 मिले तो क्या होगा? o_0
Almo

जवाबों:


123

objdump सबसे अच्छा तरीका लगता है:

objdump -f libfoo.a | grep ^architecture

1
fileके रूप में नीचे उल्लेख किया है पढ़ने के लिए आसान है stackoverflow.com/a/8909086/233906
Cerber

1
मैं architecture: i386:x86-64, flags 0x00000039:समझ गया .. इसका मतलब यह है कि यह दोनों है ..? यह संभावना नहीं है। कृपया मदद करें: D
ग्रेवुल्फ

10
@Paladin: यह 64 बिट है - x86 आर्किटेक्चर को i386(सादे पुराने IA32), i386:x86-64(AMD64) और i386:x64-32(X32 32-बिट-एड्रेस-स्पेस-इन-लॉन्ग-मोड आर्किटेक्चर) के रूप में वर्णित किया गया है ।
कैफ़े

1
'Objdump' में ध्वज '-f' लाइब्रेरी 'libfoo.a' के समग्र फ़ाइल हेडर की सामग्री को प्रदर्शित करने के लिए निर्दिष्ट करता है। 'Objdump' से यह आउटपुट फिर grep कमांड में जाता है, जो 'आर्किटेक्चर' शब्द को खोजता है। चरित्र '^' यह दर्शाता है कि 'वास्तुकला' को रेखा शुरू करनी चाहिए।
ल्यूक पर्नेल

3
इसे साफ करें और objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u
डंप

33

सबसे सरल तरीका फ़ाइल कमांड का उपयोग करना है।

$file <.so file or .a file>

31
एमएसआई वातावरण में यह बस इकोस <फ़ाइल>: वर्तमान आर्क संग्रह , लक्ष्य वास्तुकला नहीं।
scones

11
इसी तरह मेरे वर्तमान लिनक्स (उबंटू) के वातावरण में।
अशेरह

4
इसी तरह सेंटोस 7 में
चैम गेर्त्ज

यह Ubuntu 16.04 पर ठीक काम करता है। (१) file armeabi/libpique.so-> libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped। (२) file x86/libpique.so->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
rpattabi

5
Aso फ़ाइल और .a फ़ाइल समान चीज़ नहीं हैं। यह दिखाना कि यह साझा पुस्तकालय के लिए काम करता है, यह दिखाने के समान नहीं है कि यह एक स्थिर पुस्तकालय के साथ काम करता है। मूल प्रश्न एक स्थैतिक पुस्तकालय (.a फ़ाइल) के बारे में है। मेरे मामले में (MSYS का उपयोग करते हुए) कैफ़े द्वारा पोस्ट किया गया objdump समाधान काम करता है, जहाँ फ़ाइल सिर्फ प्रिंट्स 'आर्क आर्काइव' का उपयोग करती है, जैसे कि स्कोनस मिलता है।
सीन बर्टन

17

बस फ़ाइल कमांड का उपयोग करें; अर्थातfile library.so


सवाल विशेष रूप से स्थिर पुस्तकालयों के लिए है।
पोइया 13

3

उफ़, लापता सेड का मतलब है कि यह कई वस्तुओं को प्रदर्शित कर रहा था।

बस एक जवाब में:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

यह कैसे काम करना चाहिए:

  • nm - पुस्तकालय से प्रतीक प्राप्त करें
  • grep - एक हेक्स स्ट्रिंग से शुरू होने वाली लाइनें प्राप्त करें (फ़ाइल में प्रतीक का पता)
  • सिर - पहली पंक्ति प्राप्त करें
  • sed - व्हाट्सएप सहित हर चीज को व्हाट्सएप से हटा दें
  • wc - वर्णों की संख्या गिनें।

32 बिट वातावरण में, आपको 8 हेक्स अंकों से बने पते मिलते हैं, नई लाइन आपको जोड़ती है 9, 64 बिट के वातावरण में, आपको 16 हेक्स अंकों से बने पते मिलते हैं, नई लाइन आपको जोड़ती है 17


1
वहाँ एक sed -e / s। * // 'को फेंकना चाहते हैं
kowey

मुझे रास्ते से 73 मिले। यह समझाने के लिए कि यह क्यों काम करना चाहिए?
फ्रांसेस्को डोंडी

उफ़, वह गायब सेड महत्वपूर्ण था। उत्तर अपडेट किया गया, यह कैसे काम करना चाहिए, इसकी व्याख्या के साथ
पेटेश

1

यदि ऐसे फ़ंक्शन हैं जो किसी विशेष संस्करण के लिए विशिष्ट हैं, तो आप फ़ंक्शन के लिए एनएम की कोशिश कर सकते हैं।


आप कुछ कोड लिखने में सक्षम हो सकते हैं जो लाइब्रेरी में विशिष्ट बाइट्स के लिए दिखता है। आप दोनों फाइलों पर ओड का उपयोग करने और दोनों के बीच अंतर खोजने की कोशिश कर सकते हैं।
ColWhi

1
एक अन्य समाधान पुस्तकालयों का नाम बदलना होगा।
ColWhi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.