2016-04-01 7 views
6

क्या कोई तीन आर्किटेक्चर के बीच अंतर को समझा सकता है? असल में जब मैं लिनक्स में एक 64 बिट आवेदन बनाया है, मैं एक लिंक त्रुटि कह मिल गया:अंतर: x64-32 बनाम i386 बनाम i386: x86_64

skipping incompatible library.a when searching for library.a 

तो मुझे लगता है कि पुस्तकालय पर objdump -f का इस्तेमाल किया और मैं नीचे उत्पादन मिल गया:

a.o: file format elf32-x86-64 
architecture: i386:x64-32, flags 0x00000011: 
HAS_RELOC, HAS_SYMS 
start address 0x00000000 

यह मतलब यह है पुस्तकालय 32 बिट है? क्या मुझे कारण है कि मैं लिंकर त्रुटि प्राप्त कर रहा हूं?

+0

ध्यान दें कि स्थैतिक पुस्तकालय आम तौर पर उनके लायक होने की तुलना में * अधिक * अधिक परेशानी हैं। यदि आप * वास्तव में * की जरूरत है और 'setuid' या किसी अन्य' क्षमताओं की आवश्यकता नहीं है, तो '$ {ORIGIN}' -संबंधित '-rpath' के साथ गतिशील पुस्तकालयों का उपयोग करें। – o11c

उत्तर

8

हैं 3 आम Abis यूएसए मानक इंटेल-संगत मशीनों पर खून (इटेनियम नहीं)।

  • क्लासिक 32-बिट आर्किटेक्चर, जिसे अक्सर "x86" कहा जाता है, जिसमें i[3-6]86-linux-gnu जैसे ट्रिपल होते हैं। रजिस्टर्स और पॉइंटर्स 32 बिट्स दोनों हैं।
  • मूल रूप से एएमडी से 64-बिट एक्सटेंशन, जिसे अक्सर "amd64" कहा जाता है, जिसमें x86_64-linux-gnu का जीएनयू ट्रिपल होता है। रजिस्टर्स और पॉइंटर्स 64 बिट्स दोनों हैं।
  • नया "x32" एबीआई, x86_64-linux-gnux32 के ट्रिपल के साथ। रजिस्टर्स 64 बिट्स हैं, लेकिन पॉइंटर्स केवल 32 बिट्स हैं, जो सूचक-भारी वर्कफ़्लोज़ में बहुत सारी मेमोरी बचाते हैं। यह भी सुनिश्चित करता है कि अन्य सभी 64-बिट केवल प्रोसेसर सुविधाएं उपलब्ध हैं।

ऊपर है अपने पर सिस्टम कॉल इंटरफ़ेस से प्रत्येक के मालिक हैं ld.so, पुस्तकालयों, आदि का पूरा सेट के मालिक हैं लेकिन यह एक ही कर्नेल पर सभी 3 को चलाने के लिए संभव है।

लिनक्स पर, उनके लोडर हैं:

% objdump -f /lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2 

/lib/ld-linux.so.2:  file format elf32-i386 
architecture: i386, flags 0x00000150: 
HAS_SYMS, DYNAMIC, D_PAGED 
start address 0x00000a90 


/lib64/ld-linux-x86-64.so.2:  file format elf64-x86-64 
architecture: i386:x86-64, flags 0x00000150: 
HAS_SYMS, DYNAMIC, D_PAGED 
start address 0x0000000000000c90 


/libx32/ld-linux-x32.so.2:  file format elf32-x86-64 
architecture: i386:x64-32, flags 0x00000150: 
HAS_SYMS, DYNAMIC, D_PAGED 
start address 0x00000960 

अब, अगर आप कुछ आपके विन्यास के साथ गड़बड़ कर रहा है इसका मतलब है कि "असंगत पुस्तकालय लंघन" के बारे में संदेश, हो रही है। सुनिश्चित करें कि आपके पास पर्यावरण में खराब चर नहीं है या कमांड लाइन पर या आपके पैकेज प्रबंधक के नियंत्रण के बाहर स्थापित फ़ाइलों को पास नहीं किया गया है।

+0

जानकारी के लिए धन्यवाद .. मेरे लिनक्स पीसी में, मुझे/lib/libx32 बिल्कुल नहीं मिला .. क्या यह इसके लिए कारण हो सकता है? –

+0

यह आश्चर्य की बात नहीं है, अगर आपके पास मल्टीलिब-सक्षम जीसीसी बेस पैकेज स्थापित नहीं है, तो संभवतः आप ग्लिब बिट्स में नहीं खींचे होंगे। बेशक, उस मामले में, मुझे यकीन नहीं है कि आपको * सभी * पर लाइब्रेरी कैसे मिली है ... – o11c

+0

@ संतोष कुमार शायद आपके पास x32 devenv इंस्टॉल नहीं है (कोई libgcc, no glibc, ...)। X32 स्थापित करने का प्रयास करें और कुछ सरल 'gcc-mx32 helloworld.c' –

3

सामान्य पूर्ण 64 बिट और अच्छी पुरानी 32 बिट एबीआई से परे एक विशेष एबीआई (एसजीआई एन 32 पर्यावरण से प्रेरित) है जहां पॉइंटर्स 32 बिट हैं (इस प्रकार वे 32 बिट ऐप्स हैं), लेकिन इसे 64 बिट होस्ट पर चलाने के लिए डिज़ाइन किया गया है और पूर्ण पहुंच है सभी 64 उपहार के लिए:

  • देशी 64 रजिस्टरों और गणित
  • अधिक रजिस्टरों
  • SSE2/3/4, AVX1/2/...
  • 64 बिट मेजबान पर
  • पूर्ण 4GB पता स्थान

यह है कहा जाता x32 ABI, लिंक: https://en.wikipedia.org/wiki/X32_ABI

अद्यतन

मैं दो पैकेज (deps के साथ) स्थापित किया है उबंटू प्रणाली x32 काम कर पाने के लिए पर:

> sudo apt install gcc-multilib 
> sudo apt install libx32stdc++-5-dev 

फिर संकलन simlple सी ++ g++ -mx32 hellow.cpp काम करता है के साथ कोड, बनाने x32 निष्पादन

> file a.out 
./a.out: ELF 32-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /libx32/ld-linux-x32.so.2, for GNU/Linux 3.4.0 
संबंधित मुद्दे