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.
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
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. –
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. –