2010-04-28 10 views
6

मैं संस्करण अंतर के कारण लक्ष्य प्रणाली का उपयोग करने के बजाय अपने कार्यक्रम के साथ साझा पुस्तकालयों को आपूर्ति करना चाहता हूं।एक अलग libc फ़ाइल से कैसे लिंक करें?

ldd बताती है कि मेरी कार्यक्रम इन साझा libs का उपयोग करता है:

linux-gate.so.1 => (0xf7ef0000)**(made by kernel)** 
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)** 
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)** 

मैं सफलतापूर्वक के साथ संकलन के द्वारा ld-xxx.so लिंक किया है:

gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c 

लेकिन मैं सफल लिंक libc-xxx.so करने में कामयाब नहीं किया है। मैं उसे कैसे कर सकता हूँ ?

+1

यदि आप केवल एक निष्पादन योग्य है, तो आप स्थिर अपने कार्यक्रम को जोड़ने पर विचार कर सकते है। इस तरह कोई भी गलती से libc का अपना संस्करण खो देगा और यदि वे आपके प्रोग्राम को हटा देते हैं तो उनके पास आपका libc lingering नहीं होगा। – nategoose

+0

वही लेकिन स्थिर रूप से: http://stackoverflow.com/questions/10763394/how-to-build-a-c-program-using-a-custom-version-of-glibc –

उत्तर

7

मुझे पता चला है कि यह कैसे करना है:

rpath निर्दिष्ट करता है जहां प्रदान की पुस्तकालयों स्थित हैं। इस फ़ोल्डर में होना चाहिए: libc.so.6, libdl.so.2, libgcc_s.so.1 और शायद अधिक। यह पता लगाने के लिए स्ट्रेस के साथ जांचें कि आपकी बाइनरी फ़ाइल किस लाइब्रेरी का उपयोग करती है।

ld.so प्रदान की लिंकर

gcc -Xlinker -rpath=/default/path/to/libraries -Xlinker -I/default/path/to/libraries/ld.so program.c

6

-nodefaultlibs या -nostdlib पास करने के लिए जीसीसी को यह बताएगा कि डिफ़ॉल्ट पुस्तकालयों को एलडी के तर्क के रूप में पास नहीं किया जाएगा। फिर आप उस libc को स्पष्ट रूप से निर्दिष्ट करने में सक्षम होंगे जिसके खिलाफ आप लिंक करना चाहते हैं। दोनों विकल्पों के बारे में अधिक जानकारी और चेतावनियों के लिए gcc(1) मैन पेज देखें।

+2

नोट करें कि यह पोस्ट गलत है। आपको इनमें से किसी भी 2 झंडे को पारित करने की आवश्यकता नहीं है। –

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

  • कोई संबंधित समस्या नहीं^_^