wake-up-neo.com

Statischer Link der Shared Library Funktion in gcc

Wie kann ich eine gemeinsam genutzte Bibliotheksfunktion in gcc statisch verknüpfen?

124
suresh

Beziehen auf:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

Zum Verknüpfen benötigen Sie eine statische Version der Bibliothek.

Eine gemeinsam genutzte Bibliothek ist eine ausführbare Datei in einem speziellen Format mit festgelegten Einstiegspunkten (und einigen Problemen bei der Adressierung). Es sind nicht alle Informationen vorhanden, die für eine statische Verknüpfung erforderlich sind.

Sie können eine gemeinsam genutzte Bibliothek nicht statisch verknüpfen (oder statisch dynamisch verknüpfen)

Mit Flag -static wird der Linker gezwungen, die statische Bibliothek (.a) anstelle der freigegebenen (.so) zu verwenden. Statische Bibliotheken werden nicht immer standardmäßig installiert. Wenn Sie also einen statischen Link benötigen, müssen Sie statische Bibliotheken installieren.

Ein anderer möglicher Ansatz ist die Verwendung von Statifikator oder Ermine . Beide Tools verwenden als Eingabe dynamisch verknüpfte ausführbare Dateien und erstellen als Ausgabe eigenständige ausführbare Dateien, in die alle gemeinsam genutzten Bibliotheken eingebettet sind.

98
Sam Liao

Wenn Sie verlinken möchten, sagen Sie libapplejuice statisch, aber nicht liborangejuice, können Sie wie folgt verlinken:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

Es gibt eine Einschränkung - wenn liborangejuicelibapplejuice verwendet, wird libapplejuice ebenfalls dynamisch verknüpft.

Sie müssen liborangejuice neben libapplejuice statisch verknüpfen, um libapplejuice statisch zu erhalten.

Und vergiss nicht, -Wl,-Bdynamic andernfalls werden Sie am Ende alles Statische verknüpfen, einschließlich libc (was nicht gut ist).

73
Eugene Bujak

Wenn Sie die .a-Datei Ihrer gemeinsam genutzten Bibliothek (.so) haben, können Sie sie einfach mit ihrem vollständigen Pfad einfügen, als ob es sich um eine Objektdatei handeln würde:

Dies erzeugt main.o durch einfaches Kompilieren von:

gcc -c main.c

Diese verknüpft die Objektdatei mit der entsprechenden statischen Bibliothek und erstellt die ausführbare Datei (mit dem Namen "main"):

gcc main.o mylibrary.a -o main

Oder in einem einzigen Befehl:

gcc main.c mylibrary.a -o main

Es kann sich auch um einen absoluten oder relativen Pfad handeln:

gcc main.c /usr/local/mylibs/mylibrary.a -o main
18
NeoEGM

Ja, ich weiß, dass dies eine 8-jährige Frage ist, aber mir wurde gesagt, dass es möglich ist, statische Verknüpfungen mit einer gemeinsam genutzten Objektbibliothek herzustellen, und dies war buchstäblich der Hit, als ich nach weiteren Informationen darüber suchte.

Um zu demonstrieren, dass das statische Verknüpfen einer gemeinsam genutzten Objektbibliothek mit dem Linker von ld (gcc) nicht möglich ist - im Gegensatz zu nur einigen Personen, die darauf bestehen, dass dies nicht möglich ist - verwenden Sie Folgendes gcc Befehl:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(Natürlich müssen Sie objectname.o Aus sourcename.c Kompilieren, und Sie sollten wahrscheinlich auch Ihre eigene Shared-Object-Bibliothek erstellen. Wenn Sie dies tun, verwenden Sie -Wl,--library-path,., Damit ld Ihre Bibliothek im lokalen Verzeichnis findet.)

Der tatsächliche Fehler, den Sie erhalten, ist:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

Hoffentlich hilft das.

7
Ian Moote

Ein bisschen spät, aber ... Ich habe einen Link gefunden, den ich vor ein paar Jahren gespeichert habe, und dachte, er könnte für euch nützlich sein:

CDE: Tragbare Linux-Anwendungen automatisch erstellen

http://www.pgbovine.net/cde.html

  • Laden Sie einfach das Programm herunter
  • Führen Sie die binäre Übergabe als Argument des Namens der Binärdatei aus, die Sie portabel machen möchten, zum Beispiel: nmap

    ./cde_2011-08-15_64bit nmap

Das Programm liest alle mit nmap und seinen Abhängigkeiten verknüpften Bibliotheken und speichert sie alle in einem Ordner mit dem Namen cde-package/ (im selben Ordner) Verzeichnis, das Sie sind).

  • Schließlich können Sie den Ordner komprimieren und die portable Binärdatei auf einem beliebigen System bereitstellen.

Denken Sie daran, um das tragbare Programm zu starten, müssen Sie die Binärdatei ausführen, die sich in cde-package/nmap.cde befindet.

Freundliche Grüße

7
Francis

In gcc wird dies nicht unterstützt. Tatsächlich wird dies von keinem mir bekannten Compiler/Linker unterstützt.

0
nothrow