2009-04-27 10 views
7

जीएनयू टूलचैन के साथ लिनक्स पर, मुझे पता है कि एक साझा लाइब्रेरी से एक साझा स्क्रिप्ट (gcc-wl, - version-script = symbols.map) के साथ निर्यात किए गए प्रतीकों को कैसे नियंत्रित किया जाए, लेकिन मैं निर्यात किए गए प्रतीकों को सूचीबद्ध करना चाहता हूं इसके बजाय कमांड लाइन। IOW, मैं एमएस टूलचेन सेजीएनयू लिंकर: कमांड लाइन पर निर्यात किए गए प्रतीकों को सूचीबद्ध करने के लिए --version-script के विकल्प?

link /EXPORT:foo 

के बराबर करना चाहता हूं। क्या यह संभव है ?

संपादित करें:

मेरा प्रश्न बहुत clearn नहीं हो सकता है: अगर मैं एक पुस्तकालय libfoo.so है, और मैं केवल निर्यात पुस्तकालयों foo1 और foo2, मैं इस प्रकार एक संस्करण स्क्रिप्ट foo.linux बनाने जा सकते हैं करना चाहते हैं

libfoo.so 
{ 
global: 
    foo1; 
    foo2; 
local: 
    *; 
} 

और

gcc -shared foo.c -Wl,--version-script=foo.linux -o libfoo.so -soname libfoo.so 

मैं बजाय कुछ इस तरह करने में सक्षम होना चाहते हैं करते हैं:

gcc -shared foo.c -Wl,--export-symbol=foo1 -Wl,--export-symbol=foo2 -o libfoo.so -soname libfoo.so 

उत्तर

3

मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं जैसा आप चाहते हैं। आपके द्वारा वर्णित लिंकर संस्करण स्क्रिप्ट के साथ एक तरीका है। एक और तरीका है जो कुछ भी आप निर्यात चाहते हैं के लिए अपने स्रोत कोड __attribute__ ((visibility("default"))) में जोड़ सकते हैं और -fvisibility=hidden

+0

हाँ, ऐसा लगता है कि मेरा इच्छित बस पल में संभव नहीं है। विशेषता का उपयोग करना वही है जो मैं टालना चाहता हूं –

-1

पढ़ा और objdump के पास बहुत सारे विकल्प हैं। कैसे:

readelf --symbols --use-dynamic $yourlib.so 
0

के साथ सब कुछ संकलन मैं आठ साल देर से हो सकता है, लेकिन हां, आप वास्तव में आप क्या चाहते हैं कर सकते हैं के लिए है।

उपयोग बैश process substitution:

gcc -shared foo.c -Wl,--version-script=<(echo "{global:foo1;foo2;local:*;};") -o libfoo.so -soname libfoo.so 
संबंधित मुद्दे

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