Eigene Libraries
-
Ich habe mal einen Versuch gestartet. Ich wollte dabei den Unterschied zwischen dynamisch gelinkten, statisch gelinkten und mit Objektdatei gelinkten Programmen herausfinden. Ich nutze die Version 4.2.1 der GNU Compiler Connection.
Ich habe eine source-file "libtest.c", in der sich die Implementierung der in "libtest.h" deklarierten 3 Funktionen fak, mult und quadr befinden. Das Hauptprogramm "main.c" bindet "libtest.h" ein und nimmt anschließend eine Zahl vom Benutzer entgegen. Anschließend nutzt es die Funktion fak(), um die Fakultät der Zahl zu errechnen (rek.). Fertig.
Dabei habe ich zunächst eine Datei object_lib nach folgenden Befehlen erstellt:
gcc -c libtest.c -o libtest.o gcc -c main.c -o main.o gcc -o object_lib main.o libtest.o
Danach die static_lib:
gcc -c libtest.c -o libtest.o // eigentlich nicht nötig ar rcs libfak.a libtest.o gcc -static main.c -L. -lfak -o static_lib
Und die dynamic_lib:
gcc -c -fPIC testlib.c -o testlib.o gcc -shared -Wl,-soname,libfak.so.1 -o libfak.so.1.0.1 libtest.o gcc main.c -o dynamic_lib -L. -lfak
Nun habe ich folgendes festgestellt:
Die dynamisch gelinkte Datei ist die kleinste. Die mit der Objektdatei ist genauso groß. Und die statisch gelinkte ist größer.Dass die dynamisch gelinkte kleiner als die statisch gelinkte ist, war mir so ziemlich klar. Aber die mit der Objektdatei finde ich doch etwas merkwürdig. Kann mir das jemand erklären?
-
Wenn du -static angibst, werden _alle_ Libs statisch gelinkt. Also auch die C-Standardbibliothek (libc). Benutz einfach
gcc main.c ./libfak.a -o static_lib
.
-
Jetzt sind alle Dateien gleich groß. Wie kann das sein? Ich schildere mal mein Verständnis von den unterschiedlichen Arten des Linking:
Linke ich mit der Object-File, so wird der komplette Objektcode der Datei gelinkt. Damit werden also auch Funktionen gelinkt, die ich gar nicht benötige.
Bei static linking wird nur diejenige Funktion aus der Bibliothek übernommen, die auch benötigt wird (in meinem Beispiel also nur die Funktion fak()).
Bei dynamical linking wird gar keine Funktion übernommen, sondern erst bei Programmstart geladen.Demnach müsste das Größenverhältnis der Dateien wie folgt sein:
sizeof(dynamic_lib) < sizeof(static_lib) < sizeof(object_lib).Was ist an meiner Sichtweise falsch? Oder bekomme ich den Effekt nur bei größeren Projekten?
-
Kennt denn keiner eine Antwort?
-
c_neversharp schrieb:
Bei dynamical linking wird gar keine Funktion übernommen, sondern erst bei Programmstart geladen.
Zumindest werden aber die Funktionsaufrufe gespeichert; in welcher Datei die Funktionen zu finden sind; in welcher Reihenfolge die Parameter übergeben werden etc. Das kostet auch etwas Platz und fällt natürlich insbesondere bei kurzen Funktionen ins Gewicht.
Außerdem gibt es noch Schalter für Optimierungen für den GCC, hier -Os.