2012-10-09 4 views
5

Ich lese das O'Reilly-Buch 21st Century C, in dem der Autor erklärt, dass bei der Verknüpfung gegen eine statische Bibliothek "der Compiler [den effektiven Inhalt der Bibliothek in die endgültige ausführbare Datei kopiert"].Wie wird Objektcode in eine ausführbare Datei kopiert, wenn eine Verbindung zur statischen Bibliothek hergestellt wird?

Ich habe versucht, dies zu testen, indem meine eigene statische Bibliothek dieses Moduls bestehend erstellen:

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

Zur Prüfung a bis c-Dateien erstellt, wo man single_func() und die anderen Anrufe func0() ruft und func1().

Die resultierenden ausführbaren Dateien sind 751290B in beiden Fällen. Wenn ich strcpy und strcat direkt von den Modulen aus aufrufen, sind beide ausführbaren Dateien 7215B.

Steht dies nicht im Konflikt mit der obigen Aussage oder fehlen mir einige Details zur Verknüpfung?

Eine verwandte Frage ist, dass die statische Bibliothek 1600B ist, also woher kommt diese Größenzunahme?


Zusätzlich:

Beide Hauptdateien von nichts aus über die Funktionen aufrufen und die Ergebnisse drucken, wie folgt aus:

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

Dateien wurden wie folgt zusammengestellt:

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

Plattform ist Linux und der Compiler gcc v4.6.3.

Antwort

3

Bei statischen Bibliotheken ist die Kopiereinheit die Objektdatei in der Bibliothek. Da beide Programme eine Funktion aus der Objektdatei aufrufen, enden beide Programme mit der gesamten Objektdatei in der ausführbaren Datei, daher die gleiche Größe (geben oder nehmen Sie die Größe des aufrufenden Programms main()).

Die zusätzlichen Informationen in der ausführbaren Datei können von mehreren Stellen stammen. Einige davon werden Kontroll- und Debuginformationen sein. Einige davon stammen möglicherweise aus der C-Bibliothek, wenn Sie diese auch statisch verknüpft haben. Wir müssten wahrscheinlich das Hauptprogramm und die Verbindungslinien sehen und die Plattform kennen, um andere Gründe für die Inflation zu finden.

+1

Ich habe meine Frage mit den zusätzlichen Informationen aktualisiert, die Sie verlangt haben, aber ich denke, ich kann anfangen zu sehen, wohin das geht. 1: Bei Verwendung einer einzelnen Funktion aus der Objektdatei einer Bibliothek wird die gesamte Objektdatei in die ausführbare Datei gerollt. 2: Mit der Option -static werden alle Bibliotheken in die endgültige ausführbare Datei gerollt, wodurch die größere Dateigröße entsteht. Habe ich Recht? – Kenneth

+1

Ja; Du hast Recht in beiden Einzelheiten. Wenn Sie Plaugers Buch 'The Standard C Library' (für den C89-Standard) betrachten, sehen Sie, dass die meisten Quelldateien eine extern sichtbare Funktion haben, so dass Sie nicht das, was Sie nicht verwenden, in die ausführbare Datei ziehen. Sie könnten die Größe Ihrer ausführbaren Datei wahrscheinlich dramatisch reduzieren, indem Sie '-sharedlib' an der Befehlszeile' -shared' hinzufügen. –

+0

Ich bin ein wenig überrascht, dass die C-Bibliothek statisch verknüpft ist (scheint). Zu einer Zeit (vor einem Jahrzehnt, vielleicht) dachte ich, dass die C-Bibliothek nicht als statische Bibliothek geliefert wurde (also musste sie geteilt werden).Ich könnte mich schlecht erinnern, oder es könnte auf einer Unix-Variante statt Linux gewesen sein. Sie könnten prüfen, was als shared library mit 'ldd main0' geladen wird. Es zeigt die verwendeten gemeinsamen Objekte an. –