2009-07-29 3 views
22

निम्न उदाहरण में, कार्यक्रम प्रिंट चाहिए "foo बुलाया": कार्यक्रम इस तरह संकलित किया गया है__attribute __ ((कन्स्ट्रक्टर) क्यों नहीं एक स्थिर पुस्तकालय में काम करता है?

// foo.c 
#include <stdio.h> 

__attribute__((constructor)) void foo() 
{ 
    printf("foo called\n"); 
} 

// main.c 
int main() 
{ 
    return 0; 
} 

है, यह काम करता है:

gcc -o test main.c foo.c 

हालांकि, अगर foo.c में संकलित किया गया है एक स्थिर पुस्तकालय, कार्यक्रम कुछ भी प्रिंट नहीं करता है।

gcc -c main.c 
gcc -c foo.c 
as rcs foo.a foo.o 
gcc -o test foo.a main.o 

ऐसा क्यों होता है?

+0

डाउनवॉट्स क्यों? क्या कुछ गलत है? –

+0

यकीन नहीं है (मैं नहीं था!) ​​लेकिन शायद किसी ने आपके अपने प्रश्न का उत्तर देने के लिए अपवाद लिया? – DaveR

+1

हम्म, मैं बस एक गैर-स्पष्ट समस्या के लिए साइट पर एक उपयोगी संदर्भ जोड़ना चाहता था। एफएक्यू इंगित करता है कि किसी के अपने प्रश्न का उत्तर देना एक अच्छी बात है (यह वास्तव में पहले खंड में है)। –

उत्तर

13

लिंकर में अंतिम प्रोग्राम में foo.a में कोड शामिल नहीं है क्योंकि मुख्य में कुछ भी नहीं है। यदि main.c इस प्रकार के रूप में लिखा गया है, कार्यक्रम काम करेगा:

//main.c 

void foo(); 

int main() 
{ 
    void (*f)() = foo; 
    return 0; 
} 

इसके अलावा, जब एक स्थिर पुस्तकालय के साथ संकलन, जीसीसी (या लिंकर) पर तर्कों की क्रम महत्वपूर्ण है: पुस्तकालय वस्तुओं के बाद आना चाहिए इसका संदर्भ है।

gcc -o test main.o foo.a 
2

के रूप में यह कहा गया था, संग्रह से unreferenced प्रतीकों उत्पादन बाइनरी में यह नहीं कर सकता है, क्योंकि लिंकर उन्हें डिफ़ॉल्ट रूप से छोड़ देता है। जब स्थिर पुस्तकालय के साथ जोड़ने

इस व्यवहार को ओवरराइड करने के लिए, लिंकर के लिए --whole-archive/--no-whole-archive विकल्प इस तरह इस्तेमाल किया जा सकता:

gcc -c main.c 
gcc -c foo.c 
ar rcs foo.a foo.o 
gcc -o test -Wl,--whole-archive foo.a -Wl,--no-whole-archive main.o 

यह, फूला हुआ बाइनरी को जन्म दे सकती है क्योंकि foo.a से सभी प्रतीकों शामिल किया जाएगा आउटपुट के लिंकर द्वारा, लेकिन कभी-कभी यह उचित है।

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