2015-04-01 4 views
7

Die beste Erklärung konnte ich aus dem offiziellen Dokument:Was ist Teilverknüpfung in GNU Linker?

-r --relocateable relocatable Ausgabe generieren - das heißt, eine Ausgabedatei erzeugen, die als Eingabe für ld wiederum dienen können.. Dies wird oft teilweise Verknüpfung genannt. Als Nebeneffekt setzt diese Option in Umgebungen, die standardmäßige Unix-Magic-Nummern unterstützen, auch die magische Nummer der Ausgabedatei auf OMAGIC. Wenn diese Option nicht angegeben wird, wird eine absolute Datei erstellt. Wenn Sie C++ - Programme verknüpfen, löst diese Option keine Referenzen auf Konstruktoren auf ; Um das zu tun, benutze -Ur. Diese Option macht dasselbe wie "-i".

Ich bin speziell interessiert zu wissen, was mit den Symbolen in den Eingängen zu Linker passiert. Nehmen Sie einen bestimmten Fall, wenn ich eine statische Bibliothek haben libstatic.a, die eine einzelne Objektdatei enthält component.o. Nun möchte ich eine andere statische Bibliothek libfinal.a erstellen, die als Schnittstelle zu libstatic.a arbeiten wird. Ich verwende diesen Befehl, um es zu schaffen:

ld -r -o libfinal.a wrapper.o -L. -lstatic

Wo wrapper.o exklusive APIs stellt die Funktionen in libstatic.a

Wird die libfinal.a werden nur in Kombination definiert nennen Archiv mit wrapper.o und component.o oder alle Referenzen, die zwischen wrapper.o und component.o aufgelöst werden können gelöst werden (Verknüpfung) und dann in gestellt werden libfinal.a?

Edit_1: die über den Stand der Grundlage Frage aktualisiert: Die objdump der Komponentenbibliothek libstatic.a (objdump -D libstatic.a) zeigt .text Abschnitte separat für jede Funktion (wie erwartet). Während in der kombinierten Bibliothek libfinal.a, die durch teilweises Verknüpfen erzeugt wurde (-r Flag), gibt es nur einen einzigen Abschnitt .text. Ich denke, das bedeutet, dass eine interne Verknüpfung stattgefunden hat und nicht nur ein einfaches Archiv erstellt wird.

Antwort

1

ld erstellt ausführbare Dateien und gemeinsame Bibliotheken, nicht Objektdateiarchive (.a-Dateien).

ar erstellt und ändert Objektdateiarchive.


-r, --relocateable Option ist nützlich, wenn Sie bestimmte (ungelösten) Symbole eines .so und erzeugen eine andere .so lösen möchten.

+2

Es scheint, als ob das Flag '-r' auch für partielles Verknüpfen verwendet werden kann. Bitte sehen Sie meine ** Edit_1 ** in der Frage. Zur Verifizierung kann ich die final-library, die mit dem Flag '-r' erstellt wurde, mit meiner Anwendung verknüpfen. – govind

Verwandte Themen