2012-10-09 5 views
5

मैं O'Reilly पुस्तक 21st Century C पढ़ रहा हूं जिसमें लेखक कहता है कि एक स्थिर पुस्तकालय के खिलाफ लिंक करते समय "संकलक [प्रभावी रूप से] लाइब्रेरी की प्रासंगिक सामग्री को अंतिम निष्पादन योग्य में कॉपी कर रहा है"।) क) ग फ़ाइलों जहां एक single_func बुला रहा है (और अन्य कॉल func0 करने के लिए बनाया परीक्षण के लिएस्थैतिक पुस्तकालय के खिलाफ लिंक करते समय ऑब्जेक्ट कोड निष्पादन योग्य में कैसे कॉपी किया गया है?

static char szStr[64]; 

char* single_func() { 
    strcpy(szStr, "Hello string!\r\n"); 
    return szStr; 
} 

void func0() { 
    strcpy(szStr, "Hello"); 
} 

char* func1() { 
    strcat(szStr, " string!\r\n"); 
    return szStr; 
} 

(और:

मैं इस मॉड्यूल से मिलकर अपने ही स्थिर पुस्तकालय बनाने के द्वारा इस परीक्षण करने के लिए कोशिश की है func1()।

परिणामस्वरूप निष्पादन योग्य दोनों मामले में 7512 9 0 बी हैं। अगर मैं सीधे मॉड्यूल से स्ट्रैपी और स्ट्रैट को कॉल करता हूं तो दोनों एक्जिक्यूटिव 7215 बी होते हैं।

क्या यह उपरोक्त कथन से संघर्ष नहीं करता है या क्या मुझे लिंक करने के बारे में कुछ जानकारी याद आ रही है?

एक संबंधित प्रश्न यह है कि स्थिर पुस्तकालय 1600 बी है, तो आकार में यह वृद्धि कहां से आती है?


अतिरिक्त:

दोनों मुख्य फ़ाइलों कार्यों बुला और परिणाम मुद्रण इस तरह, से ज्यादा कुछ नहीं से मिलकर बनता है:

main0:

#include <stdio.h> 
#include "sharedlib.h" 
int main() { 
    char* szStr = single_func(); 
    printf("%s", szStr); 
    return 0; 
} 

main1:

#include <stdio.h> 
#include "sharedlib.h" 
int main() { 
    char* szStr; 
    func0(); 
    szStr = func1(); 
    printf("%s", szStr); 
    return 0; 
} 

फ़ाइलें इस तरह संकलित किया गया:

gcc -static main0.c -L. -lsharedlib -o main0 

मंच लिनक्स और संकलक जीसीसी v4.6.3 है।

उत्तर

3

स्थिर पुस्तकालयों के साथ, प्रतिलिपि बनाने की इकाई लाइब्रेरी में ऑब्जेक्ट फ़ाइल है। चूंकि आपके दोनों प्रोग्राम ऑब्जेक्ट फ़ाइल से फ़ंक्शन को कॉल करते हैं, इसलिए दोनों प्रोग्राम निष्पादन योग्य में ऑब्जेक्ट फ़ाइल के साथ समाप्त होते हैं, इसलिए एक ही आकार का परिणाम (main() प्रोग्राम को कॉल करने का आकार दें या ले लें)।

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

+1

मैंने आपके प्रश्न को आपके द्वारा मांगी गई अतिरिक्त जानकारी के साथ अपडेट किया है, लेकिन मुझे लगता है कि मैं यह देखना शुरू कर सकता हूं कि यह कहां जा रहा है। 1: लाइब्रेरी की ऑब्जेक्ट फ़ाइल से एक फ़ंक्शन का उपयोग करते समय संपूर्ण ऑब्जेक्ट फ़ाइल निष्पादन योग्य में घुमाया जाता है। 2: -स्टैटिक विकल्प _all_ लाइब्रेरीज़ का उपयोग करके अंतिम निष्पादन योग्य में घुमाया जाता है, जिससे बड़े फ़ाइल आकार का उत्पादन होता है। क्या मैं इसमें सही हूँ? – Kenneth

+1

हां; आप दोनों विवरणों में सही हैं। यदि आप प्लॉगर की पुस्तक 'द स्टैंडर्ड सी लाइब्रेरी' (सी 8 9 मानक के लिए) देखते हैं, तो आप देखेंगे कि अधिकांश स्रोत फ़ाइलों में एक बाहरी दृश्यमान फ़ंक्शन होता है ताकि आप निष्पादन योग्य में उपयोग न करने वाले ड्रैग न करें। '-shsharedlib' के बाद कमांड लाइन में' -shared' जोड़ कर आप अपने निष्पादन योग्य नाटकीय रूप से आकार को कम कर सकते हैं। –

+0

मुझे आश्चर्य है कि सी लाइब्रेरी स्थिर रूप से जुड़ी हुई है (ऐसा लगता है)। एक समय में (एक दशक पहले, शायद) मैंने सोचा था कि सी पुस्तकालय को स्थिर पुस्तकालय के रूप में आपूर्ति नहीं की गई थी (इसलिए इसे साझा किया जाना था)।मैं गलत समझा जा सकता हूं, या यह लिनक्स के बजाय यूनिक्स संस्करण पर हो सकता है। आप 'ldd main0' के साथ साझा लाइब्रेरी के रूप में क्या लोड किया जा रहा है, यह जांच सकते हैं। यह इस्तेमाल की गई साझा वस्तुओं की सूची देगा। –

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