Gemeinsam genutzte Bibliothek erstellen

In diesem Abschnitt wird beschrieben, wie eine gemeinsam genutzte Bibliothek erstellt wird.

Vorausgesetzte Tasks

  1. 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:

    /************
     * share1.c: shared library source.
    *************/
    
    #include <stdio.h>
    
    void func1 ()
     {
       printf("func1 called\n");
     }
    
    void func2 ()
     {
       printf("func2 called\n");
     }
    Dershare2.centhält den folgenden Code:
    /************
     * share2.c: shared library source.
    *************/
    
    void func3 ()
     {
       printf("func3 called\n");
     }
    Die exportierten Symbole in diesen Dateien sind:func1,func2undfunc3.
  2. 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 ();
     }
  3. 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:

    #! /home/sharelib/shrsub.o 
    * Above is full pathname to shared library object file
    func1
    func2
    func3
    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.

Prozedur

  1. 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:
    cc -c share1.c
    cc -c share2.c
    cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry
    Dadurch wird der Name einer gemeinsam genutzten Bibliothek erstellt.shrsub.oim Verzeichnis /home/sharedlib .
    --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.

  2. Verwenden Sie den folgenden Befehl, um die gemeinsam genutzte Bibliothek in eine Archivdatei zu stellen:
    ar qv libsub.a shrsub.o
    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.
  3. 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:
    cc -o main main.c -lsub -L/home/sharedlib
    Wenn sich die gemeinsam genutzte Bibliothek nicht in einem Archiv befindet, verwenden Sie den Befehl:
    cc -o main main.c /home/sharedlib/shrsub.o -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.
Hinweis: Wenn Sie eine gemeinsam genutzte Bibliothek aus einem C + + -Objekt erstellen, müssen Sie die in Mangled C + + -Symbolnamen in der Exportdatei verwenden. Ihr C + + -Compiler kann jedoch eine Option zum Erstellen der gemeinsam genutzten Bibliothek für Sie bereitstellen. Weitere Informationen finden Sie in der Compilerdokumentation.
--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.