Gemeinsam genutzte Bibliothek erstellen
In diesem Abschnitt wird beschrieben, wie eine gemeinsam genutzte Bibliothek erstellt wird.
Vorausgesetzte Tasks
- Erstellen Sie mindestens eine Quellendatei, die kompiliert und verlinkt werden soll, um eine gemeinsam genutzte Bibliothek zu erstellen. Diese Dateien enthalten die exportierten Symbole, auf die in anderen Quellendateien verwiesen wird.
Für die Beispiele in diesem Artikel zwei Quellendateien,share1.cundshare2.cwerden verwendet. Dershare1.c enthält den folgenden Code:
Dershare2.centhält den folgenden Code:/************ * share1.c: shared library source. *************/ #include <stdio.h> void func1 () { printf("func1 called\n"); } void func2 () { printf("func2 called\n"); }
Die exportierten Symbole in diesen Dateien sind:func1,func2undfunc3./************ * share2.c: shared library source. *************/ void func3 () { printf("func3 called\n"); } - Erstellen Sie eine Hauptquellendatei, die auf die exportierten Symbole verweist, die in der gemeinsam genutzten Bibliothek enthalten sind.
Für die Beispiele in diesem Artikel die Hauptquellendatei mit dem Namenmain.cermöglicht. Dermain.c enthält den folgenden Code:
/************ * main.c: contains references to symbols defined * in share1.c and share2.c *************/ #include <stdio.h> extern void func1 (), func2 (), func3 (); main () { func1 (); func2 (); func3 (); } - Erstellen Sie die Exportdatei, die erforderlich ist, um die Symbole in der gemeinsam genutzten Bibliothek, auf die andere Objektmodule verweisen, explizit zu exportieren.
Für die Beispiele in diesem Artikel wird eine Exportdatei mit dem Namenshrsub.expermöglicht. Dershrsub.exp enthält den folgenden Code:
Der#!Zeile ist nur von Bedeutung, wenn die Datei als Importdatei verwendet wird. In diesem Fall#!Zeile gibt den Namen der gemeinsam genutzten Bibliotheksdatei an, die zur Laufzeit verwendet wird.#! /home/sharelib/shrsub.o * Above is full pathname to shared library object file func1 func2 func3
Prozedur
- Kompilieren und verlinken Sie die beiden Quellcodedateien, die gemeinsam genutzt werden sollen. (Bei dieser Prozedur wird vorausgesetzt, dass Sie sich im Verzeichnis /home/sharedlib befinden.) Geben Sie die folgenden Befehle ein, um die Quellendateien zu kompilieren und zu verknüpfen:
Dadurch wird der Name einer gemeinsam genutzten Bibliothek erstellt.shrsub.oim Verzeichnis /home/sharedlib .cc -c share1.c cc -c share2.c cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry- --bM:SRE
- Markiert die resultierende Objektdateishrsub.oals wiedereintrittsfähige, gemeinsam genutzte Bibliothek
Jeder Prozess, der den gemeinsam genutzten Code verwendet, erhält eine private Kopie der Daten in seinem privaten Prozessbereich.
- flag
- Legt den Pseudoeingangspunkt fest_nostart, um den Standardeingangspunkt zu überschreiben,_start
- Flag -bnoentry
- Teilt dem Verbindungseditor mit, dass die gemeinsam genutzte Bibliothek keinen Eingangspunkt hat.
Eine gemeinsam genutzte Bibliothek kann einen Eingangspunkt haben, aber das Systemladeprogramm verwendet keinen Eingangspunkt, wenn eine gemeinsam genutzte Bibliothek geladen wird.
- Verwenden Sie den folgenden Befehl, um die gemeinsam genutzte Bibliothek in eine Archivdatei zu stellen:
Dieser Schritt ist optional. Wenn Sie die gemeinsam genutzte Bibliothek in ein Archiv stellen, können Sie die gemeinsam genutzte Bibliothek einfacher angeben, wenn Sie Ihr Programm verknüpfen, da Sie die Flags -l und -L mit dem Befehl ld verwenden können.ar qv libsub.a shrsub.o - Kompilieren und verlinken Sie den Hauptquellcode mit der gemeinsam genutzten Bibliothek, um die ausführbare Datei zu erstellen. (Dieser Schritt setzt voraus, dass Ihr aktuelles Arbeitsverzeichnis die Datei main.c enthält.) Führen Sie den folgenden Befehl aus:
Wenn sich die gemeinsam genutzte Bibliothek nicht in einem Archiv befindet, verwenden Sie den Befehl:cc -o main main.c -lsub -L/home/sharedlib
Das Programmmainist jetzt ausführbar. Derfunc1,func2undfunc3Symbole wurden für verzögerte Auflösung zum Laden markiert. Zur Laufzeit lädt das Systemladeprogramm das Modul in die gemeinsam genutzte Bibliothek (sofern das Modul nicht bereits geladen ist) und löst die Referenzen dynamisch auf.cc -o main main.c /home/sharedlib/shrsub.o -L/home/sharedlib
- --L Flagge
- Fügt das angegebene Verzeichnis hinzu (in diesem Fall/home/sharedlib) in den Bibliothekssuchpfad, der im Ladeprogrammabschnitt des Programms gespeichert wird.
Zur Laufzeit wird der Bibliothekssuchpfad verwendet, um dem Ladeprogramm mitzuteilen, wo sich gemeinsam genutzte Bibliotheken befinden.
- LIBPATH, Umgebungsvariable
- Eine durch Doppelpunkte getrennte Liste von Verzeichnispfaden, die auch zur Angabe eines anderen Bibliothekssuchpfads verwendet werden können Ihr Format entspricht dem der Umgebungsvariablen PATH .
Die Verzeichnisse in der Liste werden durchsucht, um Verweise auf gemeinsam genutzte Objekte aufzulösen. Die Verzeichnisse /usr/lib und /lib enthalten gemeinsam genutzte Bibliotheken und sollten normalerweise in Ihren Bibliothekssuchpfad eingeschlossen werden.