2009-10-01 7 views
9

मैंने जीसीसी में एक स्थिर पुस्तकालय बनाया है, लेकिन मैं अधिकांश प्रतीकों को छिपाना चाहता हूं।जीसीसी के साथ, मैं स्थिर पुस्तकालय में केवल कुछ फ़ंक्शंस कैसे निर्यात करूं?

उदाहरण के लिए, test1.c:

extern void test2(void); 
void test1(void) { 
    printf("test1: "); 
    test2(); 
} 

test2.c:

extern void test1(void); 
void test2(void) { 
    printf("test2\n"); 
} 

library_api.c:

gcc -c test1.c -o test1.o 
gcc -c test2.c -o test2.o 
gcc -c library_api.c -o library_api.o 
ar rcs libapi.a test1.o test2.o library_api.o 
:

extern void test1(void); 
extern void test2(void); 
void library_api(void) { 
    test1(); 
    test2(); 
} 

अब साथ संकलन

मैं कैसे के लिए दिखाने के लिए केवल "library_api()" समारोह मिलता है:

nm libapi.a 
कार्यों के बजाय

"test1()", "test2()", और "library_api()"? दूसरे शब्दों में, मैं "test1()" और "test2()" को छुपाने और libapi.a के बाहरी उपयोगकर्ताओं को कॉल करने योग्य कैसे छिपा सकता हूं? मैं नहीं चाहता कि बाहरी उपयोगकर्ता आंतरिक परीक्षण कार्यों के बारे में कुछ भी जान सकें।

उत्तर

9

सबसे आसान समाधान # test2.c और test2.c को library_api.c में शामिल करना है, और केवल उस फ़ाइल को संकलित करें। फिर आप test1() और test2() स्थिर बना सकते हैं।

वैकल्पिक रूप से, आप ऑब्जेक्ट फ़ाइलों को ld -r के साथ जोड़ सकते हैं, और परीक्षण के बाद परीक्षण फ़ंक्शंस को स्थिर करने के लिए objcopy --localize-symbols का उपयोग कर सकते हैं। चूंकि यह काफी कठिन हो सकता है, हालांकि, मैं वास्तव में पहले विकल्प की सिफारिश करता हूं।

+0

प्रतीक 'स्थैतिक' घोषित करने से स्थिर पुस्तकालय में इसे छिपाने में मदद नहीं मिलती है। –

+1

@ पावेल: यह निश्चित रूप से करता है। आप एक स्थिर प्रतीक के खिलाफ लिंक नहीं कर सकते हैं; अगर वांछित है, तो आप संकलन के बाद सभी स्थिर प्रतीकों को भी पट्टी कर सकते हैं। –

+0

मैंने कोशिश की "ld -r --retain-symbols-file tmp.list test1.o test2.o library_api.o -o libapi.a" जहां tmp.list में अभी "library_api" और "nm libapi.a" है वैश्विक के रूप में test1 और test2 प्रतीकों। कोई विचार? – Will

2

ld विकल्प

--retain-प्रतीकों फ़ाइल फ़ाइल केवल फ़ाइल

में सूचीबद्ध प्रतीक रखें आप स्पष्ट रूप से प्रतीकों आप रखने के लिए नाम देने के लिए अनुमति देने के लिए है।

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