2010-10-29 18 views
10

64 बिट होस्ट पर मैं साझा पुस्तकालयों को -m32 विकल्प के साथ बनाने की कोशिश कर रहा हूं। क्या इन पुस्तकालयों के लिए नियमित 64 बिट पुस्तकालयों से जुड़ा होना संभव है? कुछ इस तरहजीसीसी-एम 32 ध्वज:/usr/bin/ld: असंगत

मैं कर रहा हूँ:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so 

और हो रही इस तरह त्रुटि संदेश:

/usr/bin/ld: skipping incompatible 64_bit_library.so 

तो मेरे सवाल है: कैसे 64_bit_library.so और 32_bit_library.so 64 बिट मेजबान पर संकलित किया जाना चाहिए, के लिए 64_bit_library.so के खिलाफ लिंक होने के लिए इसे संभव बनाएं?

उत्तर

11

64 बिट पुस्तकालयों के विपरीत 32 बिट अनुप्रयोगों को लिंक करना संभव नहीं है और इसके विपरीत। समस्या यह है कि सामान्य रूप से पॉइंटर्स और प्रकार उनके बीच पारित नहीं किए जा सकते हैं। आम तौर पर कामकाज दूसरे आकार की बाल प्रक्रिया को जन्म देना और उस प्रक्रिया के साथ संवाद करने के लिए आईपीसी का उपयोग करना है।

इस तरह से इसके बारे में सोचो: यदि मैं एक सी तुच्छ कार्य हो:

extern void foo(void*); 

यदि यह एक 64 बिट पुस्तकालय में है और मैं कोशिश करते हैं और यह एक 32bit पुस्तकालय से फोन जहां सूचक का दूसरा भाग आता है से?

इसके विपरीत यदि यह 32 बिट लाइब्रेरी में है और मैं इसे 64 बिट एप्लिकेशन से कॉल करता हूं तो पॉइंटर के दूसरे भाग में क्या होता है जिसे मुझे कॉल करने के लिए खोना होगा?

+0

यदि आप वास्तव में सावधान थे तो आप टाइपपेफ के साथ कुछ गेम खेलने में सक्षम हो सकते हैं, एमएपी_32 बीआईटी ध्वज और साझा मेमोरी सेगमेंट के साथ एमएमएपी कर सकते हैं लेकिन यह बहुत परेशानी है! – Flexo

+0

क्या आप इसे कैसे जांच सकते हैं यह असंगत है? शायद खुद का उपयोग कर? - http://rzr.online.fr/q/gcc – RzR

+0

@rzr - चेक करने का सबसे आसान तरीका साझा ऑब्जेक्ट पर 'file' कमांड का उपयोग करना होगा और देखें कि क्या आप कोशिश कर रहे हैं जीसीसी के साथ करने के लिए। उदाहरण के लिए आप इसे 'readelf -h' या' objdump -x' के साथ भी काम कर सकते हैं, लेकिन मुझे 'फ़ाइल' का आउटपुट अधिक संक्षेप में मिलता है। – Flexo

संबंधित मुद्दे