2012-10-09 17 views
5

21st Century C adlı O'Reilly kitabını okurken, yazarın statik bir kütüphaneye bağlanırken "derleyici [etkin bir şekilde] kütüphanenin ilgili içeriğini son yürütülebilir dosyaya kopyaladığını" belirtiyor. (Bir tek (single_func çağırıyor c dosyaları) ve diğer çağrılar func0 için oluşturulan test içinStatik kitaplığa bağlanırken nesne kodu yürütülebilir dosyaya nasıl kopyalanır?

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; 
} 

) ve:

Bu modül oluşan kendi statik kütüphane oluşturarak bu test çalıştık func1().

Sonuçta ortaya çıkan yürütülebilir dosyalar her iki durumda da 751290B'dir. Strcpy ve strcat'i doğrudan modüllerden çağırırsam, her iki yürütücü de 7215B olur.

Bu, yukarıdaki ifadeyle çelişmiyor mu, yoksa bağlantıyla ilgili bazı ayrıntılar eksik mi?

İlgili bir soru, statik kitaplığın 1600B olmasıdır, bu nedenle boyuttaki bu artış nereden gelir?


Ek:

Hem ana dosyaları bu gibi fonksiyonları çağıran ve sonuçları baskı başka bir şey oluşur

:

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; 
} 

Dosyalar böyle derlenmiştir:

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

Platformu linux ve derleyici gcc v4.6.3 olduğunu.

cevap

3

Statik kütüphanelerde, kopyalama birimi kütüphanedeki nesne dosyasıdır. Her iki program da nesne dosyasından bir işlev çağırdığından, her iki program da yürütülebilir dosyadaki tüm nesne dosyaları ile sonuçlanır, dolayısıyla aynı boyut sonucu (main() numaralı çağrıyı ver veya al).

Yürütülebilir dosyadaki ek bilgiler çeşitli yerlerden gelebilir. Bazıları kontrol ve hata ayıklama bilgisi olacak. Statik olarak da bağladıysanız, bunun bir kısmı C kütüphanesinden olabilir. Muhtemelen ana programı ve bağlantı çizgilerini görmeliyiz ve platformun enflasyona ilişkin diğer nedenlerle ortaya çıkacağını biliyoruz.

+1

Sorumu sorduğum ekstra bilgilerle güncelledim, ancak bunun nereye gittiğini görmeye başlayabileceğimi düşünüyorum. 1: Bir kütüphanenin nesne dosyasından tek bir işlev kullanıldığında, tüm nesne dosyası yürütülebilir dosyaya yuvarlanır. 2: -statik seçeneğini kullanarak _all_ kütüphaneleri, daha büyük dosya boyutunu üreterek nihai yürütülebilir dosyaya aktarılır. Bunu düzeltiyor muyum? – Kenneth

+1

Evet; her iki konuda da haklısın. Plauger'in “Standart C Kütüphanesi” adlı kitabına bakarsanız (C89 standardı için), kaynak dosyalarının çoğunun harici olarak görünür bir işlevi olduğunu görürsünüz ki, kullanmadığınız şeyi sürükle bırakmazsınız. -sharedlib' sonra komut satırına '-shared' ekleyerek büyük olasılıkla çalıştırılabilirinizin boyutunu önemli ölçüde azaltabilirsiniz. –

+0

C kütüphanesinin statik olarak bağlı (görünmektedir) olması beni biraz şaşırttı. Bir keresinde (on yıl önce, belki de) C kütüphanesinin bir statik kütüphane olarak tedarik edilmediğini düşündüm (paylaşılmak zorundaydı).Yanlış anlaşılma olabilir veya Linux yerine bir Unix varyantında olabilir. Ldd main0 ile paylaşılan bir kitaplık olarak yüklenenleri kontrol edebilirsiniz. Kullanılan paylaşılan nesneleri listeler. –

İlgili konular