Handbücher für die Kommandozeile

Man » ld-Handbuch online - Detaillierte Online-Dokumentation für die ld-Manpage

🌍
ld - Der GNU-Linker

SYNOPSIS

ld [optionen] objdatei ...

BESCHREIBUNG

ld kombiniert eine Reihe von Objekt- und Archivdateien, verarbeitet deren Daten und verknüpft Symbolreferenzen. In der Regel ist der letzte Schritt beim Kompilieren eines Programms die Ausführung von ld.

ld akzeptiert Linker-Befehlssprache-Dateien, die in einer erweiterten Version der AT&T Link Editor Command Language-Syntax geschrieben sind, um eine explizite und vollständige Kontrolle über den Linkprozess zu ermöglichen.

Diese Manpage beschreibt nicht die Befehlssprache; siehe den Eintrag für ld in "info" für vollständige Details zur Befehlssprache und zu anderen Aspekten des GNU-Linkers.

Diese Version von ld verwendet die allgemeine BFD-Bibliothek, um mit Objektdateien zu arbeiten. Dadurch kann ld Objektdateien in vielen verschiedenen Formaten lesen, kombinieren und schreiben – beispielsweise COFF oder "a.out". Verschiedene Formate können miteinander verknüpft werden, um jede verfügbare Art von Objektdatei zu erstellen.

Neben seiner Flexibilität bietet der GNU-Linker mehr hilfreiche Informationen als andere Linker. Viele Linker beenden die Ausführung sofort, wenn ein Fehler auftritt; wann immer möglich setzt ld die Ausführung fort, sodass Sie andere Fehler identifizieren können (oder in einigen Fällen eine Ausgabedatei erstellen können, trotz des Fehlers).

Der GNU-Linker ld soll eine breite Palette von Situationen abdecken und so kompatibel wie möglich mit anderen Linkern sein. Daher haben Sie viele Möglichkeiten, sein Verhalten zu steuern.

OPTIONEN

Der Linker unterstützt eine Vielzahl von Befehlszeilenoptionen, aber in der Praxis werden nur wenige davon in einem bestimmten Kontext verwendet. Beispielsweise ist eine häufige Verwendung von ld das Verknüpfen von Standard-Unix-Objektdateien auf einem Standard-Unix-System. Auf einem solchen System, um eine Datei "hello.o" zu verknüpfen:

ld -o <Ausgabe> /lib/crt0.o hello.o -lc

Dadurch wird ld angewiesen, eine Datei mit dem Namen "Ausgabe" als Ergebnis der Verknüpfung der Datei "/lib/crt0.o" mit "hello.o" und der Bibliothek "libc.a" zu erstellen, die aus den Standard-Suchverzeichnissen stammt. (Siehe die Beschreibung der Option -l unten.)

Einige der Befehlszeilenoptionen für ld können an einer beliebigen Stelle in der Befehlszeile angegeben werden. Optionen, die sich auf Dateien beziehen, z. B. -l oder -T, bewirken jedoch, dass die Datei an der Stelle gelesen wird, an der die Option in der Befehlszeile relativ zu den Objektdateien und anderen Dateioptonen erscheint. Das wiederholte Verwenden von nicht-Datei-Optionen mit einem anderen Argument hat entweder keinen weiteren Effekt oder überschreibt frühere Vorkommnisse dieser Option (die weiter links in der Befehlszeile stehen). Optionen, die sinnvoll mehr als einmal angegeben werden können, sind in den Beschreibungen unten angegeben.

Nicht-Optionsargumente sind Objektdateien oder Archive, die miteinander verknüpft werden sollen. Sie können den Optionen in der Befehlszeile vorangestellt, nachgestellt oder mit ihnen gemischt werden, mit der Ausnahme, dass ein Objektdateiargument nicht zwischen einer Option und ihrem Argument platziert werden darf.

Normalerweise wird der Linker mit mindestens einer Objektdatei aufgerufen, aber Sie können andere Formen von Binäreingabedateien mithilfe von -l, -R und der Skriptsprache angeben. Wenn keine Binäreingabedateien angegeben werden, erzeugt der Linker keine Ausgabe und gibt die Meldung „Keine Eingabedateien“ aus.

Wenn der Linker das Format einer Objektdatei nicht erkennen kann, geht er davon aus, dass es sich um ein Linkerskript handelt. Ein auf diese Weise angegebenes Skript erweitert das Hauptlinkerskript, das für die Verknüpfung verwendet wird (entweder das Standardlinkerskript oder das, das mit der Option -T angegeben wird). Diese Funktion ermöglicht es dem Linker, mit einer Datei zu verknüpfen, die wie eine Objekt- oder Archivdatei aussieht, die jedoch lediglich einige Symbolwerte definiert oder „INPUT“ oder „GROUP“ verwendet, um andere Objekte zu laden. Das Angeben eines Skripts auf diese Weise erweitert lediglich das Hauptlinkerskript, wobei die zusätzlichen Befehle nach dem Hauptskript platziert werden. Verwenden Sie die Option -T, um das Standardlinkerskript vollständig zu ersetzen, beachten Sie jedoch die Wirkung des Befehls „INSERT“.

Für Optionen, deren Namen aus einem einzelnen Buchstaben bestehen, müssen die Optionsargumente entweder ohne Leerzeichen zwischen dem Optionsbuchstaben folgen oder als separate Argumente unmittelbar nach der Option, die sie erfordert, angegeben werden.

Für Optionen, deren Namen aus mehreren Buchstaben bestehen, kann entweder ein oder zwei Bindestriche dem Optionsnamen vorangestellt werden; zum Beispiel sind -trace-symbol und --trace-symbol gleichwertig. Beachten Sie, dass es hierfür eine Ausnahme gibt. Optionen mit mehreren Buchstaben, die mit einem Kleinbuchstaben „o“ beginnen, können nur durch zwei Bindestriche vorangestellt werden. Dies soll Verwechslungen mit der Option -o vermeiden. Zum Beispiel setzt -omagic den Namen der Ausgabedatei auf „magic“, während --omagic das Flag NMAGIC für die Ausgabe setzt.

Argumente für Optionen mit mehreren Buchstaben müssen entweder durch ein Gleichheitszeichen von dem Optionsnamen getrennt oder als separate Argumente unmittelbar nach der Option, die sie erfordert, angegeben werden. Zum Beispiel sind --trace-symbol foo und --trace-symbol=foo gleichwertig. Eindeutige Abkürzungen der Namen von Optionen mit mehreren Buchstaben werden akzeptiert.

Beachten Sie, dass, wenn der Linker indirekt über einen Compiler-Treiber (z. B. gcc) aufgerufen wird, alle Linker-Befehlszeilenoptionen mit -Wl (oder was auch immer für den jeweiligen Compiler-Treiber angemessen ist) vorangestellt werden sollten, z. B.:

gcc -Wl,--start-group foo.o bar.o -Wl,--end-group

Dies ist wichtig, da der Compiler-Treiber ansonsten die Linker-Optionen möglicherweise stillschweigend verwirft, was zu einem fehlerhaften Link führt. Verwirrung kann auch entstehen, wenn Optionen, die Werte erfordern, über einen Treiber übergeben werden, da die Verwendung eines Leerzeichens zwischen Option und Argument als Trennzeichen dient und dazu führt, dass der Treiber nur die Option an den Linker und das Argument an den Compiler übergibt. In diesem Fall ist es am einfachsten, die zusammenhängenden Formen sowohl von Optionen mit einem einzelnen Buchstaben als auch von Optionen mit mehreren Buchstaben zu verwenden, z. B.:


gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map

Hier ist eine Tabelle mit den generischen Befehlszeilenschaltern, die vom GNU-Linker akzeptiert werden:

@file

Liest Befehlszeilenoptionen aus der Datei. Die gelesenen Optionen werden anstelle der ursprünglichen @file-Option eingefügt. Wenn die Datei nicht existiert oder nicht gelesen werden kann, wird die Option wörtlich behandelt und nicht entfernt.

Optionen in der Datei sind durch Leerzeichen getrennt. Ein Leerzeichen kann in einer Option enthalten werden, indem die gesamte Option in einfache oder doppelte Anführungszeichen gesetzt wird. Jedes Zeichen (einschließlich eines Backslash) kann durch Voranstellen des einzuschließenden Zeichens mit einem Backslash eingeschlossen werden. Die Datei kann selbst zusätzliche @file-Optionen enthalten; alle solchen Optionen werden rekursiv verarbeitet.

-a keyword

Diese Option wird zur HP/UX-Kompatibilität unterstützt. Das Schlüsselwort muss eines der Strings archive, shared oder default sein. -aarchive ist funktional äquivalent zu -Bstatic, und die beiden anderen Schlüsselwörter sind funktional äquivalent zu -Bdynamic. Diese Option kann beliebig oft verwendet werden.

--audit AUDITLIB

Fügt AUDITLIB dem Eintrag „DT_AUDIT“ im dynamischen Abschnitt hinzu. AUDITLIB wird nicht auf seine Existenz überprüft, noch wird der mit der Bibliothek angegebene DT_SONAME verwendet. Wenn die Option mehrmals angegeben wird, enthält „DT_AUDIT“ eine durch einen Doppelpunkt getrennte Liste von zu verwendenden Audit-Schnittstellen. Wenn der Linker beim Suchen nach gemeinsam genutzten Bibliotheken ein Objekt mit einem Audit-Eintrag findet, wird ein entsprechender „DT_DEPAUDIT“-Eintrag in der Ausgabedatei hinzugefügt. Diese Option ist nur auf ELF-Plattformen mit der rtld-Audit-Schnittstelle von Bedeutung.

-b input-format
--format=input-format

ld kann so konfiguriert werden, dass es mehr als einen Objektdatentyp unterstützt. Wenn Ihr ld auf diese Weise konfiguriert ist, können Sie mit der Option -b das Binärformat für die eingebenden Objektdaten angeben, die auf diese Option in der Befehlszeile folgen. Selbst wenn ld so konfiguriert ist, dass es alternative Objektdatentypen unterstützt, müssen Sie diese Option normalerweise nicht angeben, da ld so konfiguriert sein sollte, dass es standardmäßig das auf jeder Maschine üblichste Format erwartet. input-format ist eine Textzeichenfolge, der Name eines von den BFD-Bibliotheken unterstützten Formats. (Sie können die verfügbaren Binärformate mit objdump -i auflisten.)

Sie können diese Option verwenden, wenn Sie Dateien mit einem ungewöhnlichen Binärformat verlinken.
Sie können -b auch verwenden, um Formate explizit zu wechseln (beim Verlinken von Objektdaten mit
unterschiedlichen Formaten), indem Sie -b input-format vor jeder Gruppe von Objektdaten in einem
bestimmten Format in die Befehlszeile einfügen.

Das Standardformat wird aus der Umgebungsvariablen „GNUTARGET“ übernommen.

Sie können das Eingabeformat auch in einem Skript definieren, indem Sie den Befehl „TARGET“ verwenden.

-c MRI-commandfile
--mri-script=MRI-commandfile

Zur Kompatibilität mit von MRI erstellten Linkern akzeptiert ld Skriptdateien, die in einer alternativen, eingeschränkten Befehlssprache geschrieben sind, die in der Dokumentation von GNU ld im Abschnitt „MRI-kompatible Skriptdateien“ beschrieben ist. Führen Sie MRI-Skriptdateien mit der Option -c ein; verwenden Sie die Option -T, um Linkerskripte in der allgemeineren Linker-Skriptsprache auszuführen. Wenn MRI-cmdfile nicht existiert, sucht ld danach in den mit den -L-Optionen angegebenen Verzeichnissen.


-d
-dc
-dp Diese drei Optionen sind äquivalent; mehrere Formen werden zur Kompatibilität mit anderen
Linkern unterstützt. Sie weisen gemeinsamen Symbolen Speicher zu, auch wenn eine relocierbare Ausgabedatei angegeben ist
(mit -r). Der Skriptbefehl "FORCE_COMMON_ALLOCATION" hat die gleiche Wirkung.

--depaudit AUDITLIB
-P AUDITLIB
Fügt AUDITLIB dem Eintrag "DT_DEPAUDIT" des dynamischen Abschnitts hinzu. AUDITLIB wird nicht auf
die Existenz überprüft, noch wird die in der Bibliothek angegebene DT_SONAME verwendet. Wenn sie mehrmals angegeben wird, enthält "DT_DEPAUDIT" eine durch Doppelpunkte getrennte Liste von zu verwendenden Audit-Schnittstellen.
Diese Option ist nur auf ELF-Plattformen sinnvoll, die die rtld-Audit-Schnittstelle unterstützen. Die Option -P wird zur Solaris-Kompatibilität bereitgestellt.

--enable-linker-version
Aktiviert die Linker-Skriptdirektive "LINKER_VERSION", die in Output Section Data beschrieben ist. Wenn
diese Direktive in einem Linker-Skript verwendet wird und diese Option aktiviert wurde, wird an der aktuellen Stelle eine Zeichenkette eingefügt, die die Linker-Version enthält.

Hinweis – die Position dieser Option in der Linker-Befehlszeile ist wichtig. Sie wirkt sich nur auf Linker-Skripte aus, die nach ihr in der Befehlszeile stehen oder die in den Linker eingebaut sind.

--disable-linker-version
Deaktiviert die Linker-Skriptdirektive "LINKER_VERSION", sodass keine Versionszeichenkette eingefügt wird. Dies ist die Standardeinstellung.

--enable-non-contiguous-regions
Diese Option verhindert, dass ein Fehler erzeugt wird, wenn eine Eingabesektion nicht in eine übereinstimmende Ausgabesektion passt.
Der Linker versucht, die Eingabesektion den nachfolgenden übereinstimmenden Ausgabesektionen zuzuordnen, und erzeugt erst dann einen Fehler, wenn keine Ausgabesektion groß genug ist. Dies ist nützlich, wenn mehrere nicht zusammenhängende Speicherbereiche verfügbar sind und die Eingabesektion nicht unbedingt einen bestimmten Bereich benötigt. Die Reihenfolge, in der Eingabesektionen ausgewertet werden, ändert sich nicht, zum Beispiel:

MEMORY {
MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14
MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40
MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40
}
SECTIONS {
mem1 : { *(.data.*); } > MEM1
mem2 : { *(.data.*); } > MEM2
mem3 : { *(.data.*); } > MEM3
}

mit Eingabesektionen:
.data.1: Größe 8
.data.2: Größe 0x10
.data.3: Größe 4

führt dazu, dass .data.1 mem1 zugeordnet wird und .data.2 und .data.3 mem2 zugeordnet werden, obwohl .data.3 in mem3 passen würde.

Diese Option ist nicht mit INSERT-Anweisungen kompatibel, da sie die Art und Weise ändert, wie Eingabesektionen Ausgabesektionen zugeordnet werden.

--enable-non-contiguous-regions-warnings
Diese Option aktiviert Warnungen, wenn "--enable-non-contiguous-regions" möglicherweise unerwartete Zuordnungen in Sektionen ermöglicht, was möglicherweise dazu führt, dass eine Sektion stillschweigend verworfen wird, anstatt dass ein Fehler auftritt, weil sie keiner Ausgaberegion zugeordnet werden kann.

-e entry
--entry=entry

Verwendet entry als explizites Symbol für den Beginn der Ausführung Ihres Programms, anstatt des Standardeinstiegspunkts. Wenn es kein Symbol mit dem Namen entry gibt, versucht der Linker, entry als Zahl zu interpretieren und diese als Einstiegsadresse zu verwenden (die Zahl wird als Dezimalzahl interpretiert; Sie können ein führendes 0x für die Basis 16 oder ein führendes 0 für die Basis 8 verwenden). Für i386 PE kann entry auch der ursprüngliche Funktionsname sein (ohne das führende Unterstrichzeichen und/oder das nachgestellte stdcall @number, falls zutreffend).

--exclude-libs lib,lib,...

Gibt eine Liste von Archivbibliotheken an, deren Symbole nicht automatisch exportiert werden sollen. Die Bibliotheksnamen können durch Kommas oder Doppelpunkte getrennt werden. Das Angeben von --exclude-libs ALL schließt die Symbole aller Archivbibliotheken vom automatischen Export aus. Diese Option ist nur für die i386 PE-Zielplattform des Linkers und für ELF-Zielplattformen verfügbar. Für i386 PE werden Symbole, die explizit in einer .def-Datei aufgeführt sind, weiterhin exportiert, unabhängig von dieser Option. Für ELF-Zielplattformen werden die von dieser Option betroffenen Symbole als ausgeblendet behandelt.

--exclude-modules-for-implib module,module,...

Gibt eine Liste von Objektdateien oder Archivmembern an, deren Symbole nicht automatisch exportiert werden sollen, die aber vollständig in die beim Linken generierte Importbibliothek kopiert werden sollen. Die Modulnamen können durch Kommas oder Doppelpunkte getrennt werden und müssen genau mit den Dateinamen übereinstimmen, die von ld zum Öffnen der Dateien verwendet werden; für Archivmember ist dies einfach der Membername, für Objektdateien muss der Name jedoch genau mit dem Pfad übereinstimmen, der in der Befehlszeile des Linkers zum Angeben der Eingabedatei verwendet wird. Diese Option ist nur für die i386 PE-Zielplattform des Linkers verfügbar. Symbole, die explizit in einer .def-Datei aufgeführt sind, werden weiterhin exportiert, unabhängig von dieser Option.

-E
--export-dynamic
--no-export-dynamic

Beim Erstellen einer dynamisch verlinkten ausführbaren Datei bewirkt die Verwendung der Option -E oder der Option --export-dynamic, dass der Linker alle Symbole zur dynamischen Symboltabelle hinzufügt. Die dynamische Symboltabelle ist die Menge der Symbole, die zur Laufzeit für dynamische Objekte sichtbar sind.

Wenn Sie keine dieser Optionen verwenden (oder die Option --no-export-dynamic verwenden, um das Standardverhalten wiederherzustellen), enthält die dynamische Symboltabelle normalerweise nur die Symbole, die von einem dynamischen Objekt im Link referenziert werden.

Wenn Sie dlopen verwenden, um ein dynamisches Objekt zu laden, das auf die vom Programm definierten Symbole und nicht auf ein anderes dynamisches Objekt verweisen muss, müssen Sie diese Option möglicherweise beim Linken des Programms selbst verwenden.

Sie können auch die dynamische Liste verwenden, um zu steuern, welche Symbole zur dynamischen Symboltabelle hinzugefügt werden sollen, falls das Ausgabeformat dies unterstützt. Siehe die Beschreibung von --dynamic-list.


Beachten Sie, dass diese Option spezifisch für ELF-Zielplattformen ist. PE-Ziele unterstützen eine ähnliche Funktion, um alle Symbole aus einer DLL oder EXE zu exportieren; siehe die Beschreibung von --export-all-symbols unten.

`--export-dynamic-symbol=glob`

Beim Erstellen einer dynamisch verknüpften ausführbaren Datei werden Symbole, die dem Muster glob entsprechen, zur dynamischen Symboltabelle hinzugefügt. Beim Erstellen einer gemeinsam genutzten Bibliothek werden Referenzen auf Symbole, die dem Muster glob entsprechen, nicht an die Definitionen innerhalb der gemeinsam genutzten Bibliothek gebunden. Diese Option ist eine Leeroperation, wenn eine gemeinsam genutzte Bibliothek erstellt wird und weder -Bsymbolic noch --dynamic-list angegeben sind. Diese Option ist nur auf ELF- Plattformen sinnvoll, die gemeinsam genutzte Bibliotheken unterstützen.

`--export-dynamic-symbol-list=file`

Geben Sie für jedes Muster in der Datei eine --export-dynamic-symbol an. Das Format der Datei ist das gleiche wie das Format eines Version-Knotens ohne Bereich und Knotenname. Weitere Informationen finden Sie unter VERSION.

`-EB` Linkt Big-Endian-Objekte. Dies beeinflusst das Standardausgabeformat.

`-EL` Linkt Little-Endian-Objekte. Dies beeinflusst das Standardausgabeformat.

`-f name`
`--auxiliary=name`

Beim Erstellen eines ELF- gemeinsam genutzten Objekts wird das interne Feld DT_AUXILIARY auf den angegebenen Namen gesetzt. Dies teilt dem dynamischen Linker mit, dass die Symboltabelle des gemeinsam genutzten Objekts als ein Hilfsfilter für die Symboltabelle des gemeinsam genutzten Objekts verwendet werden soll.

Wenn Sie später ein Programm gegen dieses Filterobjekt verlinken, sieht der dynamische Linker beim Ausführen des Programms das Feld DT_AUXILIARY. Wenn der dynamische Linker beliebige Symbole aus dem Filterobjekt auflöst, überprüft er zuerst, ob eine Definition in dem gemeinsam genutzten Objekt vorhanden ist. Wenn ja, wird diese anstelle der Definition im Filterobjekt verwendet. Das gemeinsam genutzte Objekt muss nicht vorhanden sein. Daher kann das gemeinsam genutzte Objekt verwendet werden, um eine alternative Implementierung bestimmter Funktionen bereitzustellen, möglicherweise zum Debuggen oder für maschinenspezifische Leistung.

Diese Option kann mehrmals angegeben werden. Die Einträge DT_AUXILIARY werden in der Reihenfolge erstellt, in der sie auf der Befehlszeile erscheinen.

`-F name`
`--filter=name`

Beim Erstellen eines ELF- gemeinsam genutzten Objekts wird das interne Feld DT_FILTER auf den angegebenen Namen gesetzt. Dies teilt dem dynamischen Linker mit, dass die Symboltabelle des erstellten gemeinsam genutzten Objekts als Filter für die Symboltabelle des gemeinsam genutzten Objekts verwendet werden soll.

Wenn Sie später ein Programm gegen dieses Filterobjekt verlinken, sieht der dynamische Linker beim Ausführen des Programms das Feld DT_FILTER. Der dynamische Linker löst Symbole gemäß der Symboltabelle des Filterobjekts auf, verknüpft aber tatsächlich mit den Definitionen, die im gemeinsam genutzten Objekt gefunden werden. Daher kann das Filterobjekt verwendet werden, um eine Teilmenge der vom Objekt bereitgestellten Symbole auszuwählen.

Einige ältere Linker verwendeten die Option -F während einer gesamten Compiler-Toolchain, um das Objektdateiformat sowohl für Eingabe- als auch für Ausgabeobjektdateien anzugeben. Der GNU-Linker verwendet andere Mechanismen dafür: die Optionen -b, --format, --oformat, der Befehl TARGET in Linker- Skripten und die Umgebungsvariable GNUTARGET. Der GNU-Linker ignoriert die Option -F, wenn er kein ELF- gemeinsam genutztes Objekt erstellt.


-fini=name

Beim Erstellen einer ELF-Ausführungsdatei oder einer gemeinsam genutzten Bibliothek wird beim Entladen der Ausführungsdatei oder der gemeinsam genutzten Bibliothek die Funktion NAME aufgerufen, indem DT_FINI auf die Adresse der Funktion gesetzt wird. Standardmäßig verwendet der Linker „_fini“ als aufzurufende Funktion.

-g Ignoriert. Für die Kompatibilität mit anderen Tools bereitgestellt.

-G Wert
--gpsize=Wert

Setzt die maximale Größe von Objekten, die mit dem GP-Register optimiert werden sollen, auf die angegebene Größe. Dies ist nur für Objektdateiformate wie MIPS ELF von Bedeutung, die das Platzieren großer und kleiner Objekte in verschiedenen Abschnitten unterstützen. Dies wird für andere Objektdateiformate ignoriert.

-h Name
-soname=Name

Beim Erstellen einer ELF-gemeinsam genutzten Bibliothek wird das interne Feld DT_SONAME auf den angegebenen Namen gesetzt. Wenn eine Ausführungsdatei mit einer gemeinsam genutzten Bibliothek verknüpft ist, die ein Feld DT_SONAME enthält, versucht der dynamische Linker beim Ausführen der Ausführungsdatei, die in dem Feld DT_SONAME angegebene gemeinsam genutzte Bibliothek anstelle der dem Linker übergebenen Dateinamen zu laden.

-i Führt eine inkrementelle Verknüpfung durch (entspricht der Option -r).

-init=Name

Beim Erstellen einer ELF-Ausführungsdatei oder einer gemeinsam genutzten Bibliothek wird beim Laden der Ausführungsdatei oder der gemeinsam genutzten Bibliothek die Funktion NAME aufgerufen, indem DT_INIT auf die Adresse der Funktion gesetzt wird. Standardmäßig verwendet der Linker „_init“ als aufzurufende Funktion.

-l namenspez
--library=namenspez

Fügt die durch namenspez angegebene Archiv- oder Objektdatei zur Liste der zu verknüpfenden Dateien hinzu. Diese Option kann beliebig oft verwendet werden. Wenn namenspez die Form :Dateiname hat, sucht ld im Bibliotheksverzeichnis nach einer Datei mit dem Namen Dateiname; andernfalls sucht es im Bibliotheksverzeichnis nach einer Datei mit dem Namen libnamenspez.a.

Auf Systemen, die gemeinsam genutzte Bibliotheken unterstützen, kann ld auch nach anderen Dateien als libnamenspez.a suchen. Insbesondere sucht ld auf ELF- und SunOS-Systemen in einem Verzeichnis nach einer Bibliothek mit dem Namen libnamenspez.so, bevor es nach einer mit dem Namen libnamenspez.a sucht. (Per Konvention kennzeichnet eine Erweiterung „.so“ eine gemeinsam genutzte Bibliothek.) Beachten Sie, dass dieses Verhalten nicht für :Dateiname gilt, da dies immer eine Datei mit dem Namen Dateiname angibt.

Der Linker durchsucht ein Archiv nur einmal, und zwar an der Stelle, an der es sich in der Befehlszeile befindet. Wenn das Archiv ein Symbol definiert, das in einem Objekt, das vor dem Archiv in der Befehlszeile erscheint, nicht definiert war, schließt der Linker die entsprechenden Dateien aus dem Archiv ein. Ein nicht definiertes Symbol in einem Objekt, das später in der Befehlszeile erscheint, führt jedoch nicht dazu, dass der Linker das Archiv erneut durchsucht.

Siehe die Option -( für eine Möglichkeit, den Linker zu zwingen, Archive mehrmals zu durchsuchen.

Sie können dasselbe Archiv mehrmals in der Befehlszeile angeben.

Diese Art der Archivsuche ist Standard für Unix-Linker. Wenn Sie ld jedoch unter AIX verwenden, beachten Sie, dass dies sich von dem Verhalten des AIX-Linkers unterscheidet.


    -L suchverzeichnis
    --library-path=suchverzeichnis

Fügt das Verzeichnis suchverzeichnis zur Liste der Verzeichnisse hinzu, in denen ld nach Archivbibliotheken und ld-Steuerungsdateien sucht. Diese Option kann beliebig oft verwendet werden. Die Verzeichnisse werden in der Reihenfolge durchsucht, in der sie auf der Befehlszeile angegeben sind. Auf der Befehlszeile angegebene Verzeichnisse werden vor den Standardverzeichnissen durchsucht. Alle -L-Optionen gelten für alle -l-Optionen, unabhängig von der Reihenfolge, in der die Optionen erscheinen. -L-Optionen haben keinen Einfluss darauf, wie ld nach einer Linker-Skriptdatei sucht, es sei denn, die -T-Option wird angegeben.

Wenn suchverzeichnis mit = oder $SYSROOT beginnt, wird dieses Präfix durch das sysroot-Präfix ersetzt, das mit der Option --sysroot gesteuert oder bei der Konfiguration des Linkers angegeben wird.

Der Standardsatz von Verzeichnissen, die durchsucht werden (ohne dass sie mit -L angegeben werden), hängt davon ab, welchen Emulationsmodus ld verwendet, und in einigen Fällen auch davon, wie es konfiguriert wurde.

Die Verzeichnisse können auch in einem Linker-Skript mit dem Befehl SEARCH_DIR angegeben werden. Die auf diese Weise angegebenen Verzeichnisse werden an der Stelle durchsucht, an der das Linker-Skript in der Befehlszeile erscheint.

    -m Emulation

Emuliert den angegebenen Linker. Die verfügbaren Emulationen können mit den Optionen --verbose oder -V aufgelistet werden.

Wenn die Option -m nicht verwendet wird, wird die Emulation aus der Umgebungsvariablen LDEMULATION übernommen, falls diese definiert ist.

Andernfalls hängt die Standardemulation davon ab, wie der Linker konfiguriert wurde.

    --remap-inputs=muster=dateiname
    --remap-inputs-file=datei

Mit diesen Optionen können die Namen der Eingabedateien geändert werden, bevor der Linker versucht, sie zu öffnen. Die Option --remap-inputs=foo.o=bar.o bewirkt, dass jeder Versuch, eine Datei mit dem Namen foo.o zu laden, stattdessen versucht, eine Datei mit dem Namen bar.o zu laden. Wildcard-Muster sind im ersten Dateinamen erlaubt, sodass --remap-inputs=foo*.o=bar.o jede Eingabedatei, die auf foo*.o passt, in bar.o umbenennt.

Eine alternative Form der Option --remap-inputs-file=dateiname ermöglicht es, die Umbenennungen aus einer Datei zu lesen. Jede Zeile in der Datei kann eine einzelne Umbenennung enthalten. Leere Zeilen werden ignoriert. Alles von einem Hash-Zeichen (#) bis zum Ende einer Zeile wird als Kommentar betrachtet und ebenfalls ignoriert. Das Muster kann durch Leerzeichen oder ein Gleichheitszeichen (=) vom Dateinamen getrennt werden.

Die Optionen können mehrmals angegeben werden. Ihre Inhalte werden akkumuliert. Die Umbenennungen werden in der Reihenfolge verarbeitet, in der sie auf der Befehlszeile auftreten, und wenn sie aus einer Datei stammen, in der Reihenfolge, in der sie in der Datei auftreten. Wenn eine Übereinstimmung gefunden wird, werden keine weiteren Überprüfungen für diesen Dateinamen durchgeführt.

Wenn der Ersatzdateiname /dev/null oder einfach NUL ist, führt die Umbenennung tatsächlich dazu, dass die Eingabedatei ignoriert wird. Dies kann eine bequeme Möglichkeit sein, um mit dem Entfernen von Eingabedateien aus einer komplexen Build-Umgebung zu experimentieren.


Beachten Sie, dass diese Option positionsabhängig ist und nur Dateinamen beeinflusst, die danach auf der Befehlszeile stehen. Somit:

ld foo.o --remap-inputs=foo.o=bar.o

Hat keine Auswirkung, wohingegen:

ld --remap-inputs=foo.o=bar.o foo.o

Die Eingabedatei foo.o in bar.o umbenennt.

Hinweis - diese Optionen wirken sich auch auf in Linker-Skripten durch INPUT-Anweisungen referenzierte Dateien aus. Da Linker-Skripte jedoch erst dann verarbeitet werden, wenn die gesamte Befehlszeile gelesen wurde, ist die Position der Umbenennungsoptionen auf der Befehlszeile nicht relevant.

Wenn die ausführliche Option aktiviert ist, werden alle übereinstimmenden Zuordnungen gemeldet, obwohl die ausführliche Option zuerst auf der Befehlszeile aktiviert werden muss, bevor die umbenannten Dateinamen angezeigt werden.

Wenn die Option -Map oder --print-map aktiviert ist, wird die Umbenennungsliste in die Map-Ausgabe aufgenommen.

-M
--print-map

Gibt eine Link-Map auf der Standardausgabe aus. Eine Link-Map bietet Informationen über den Link-Vorgang, einschließlich der folgenden:

Wo Objektdateien im Speicher abgebildet werden.

Wie gemeinsame Symbole zugewiesen werden.

Alle Archiv-Member, die in den Link-Vorgang einbezogen wurden, zusammen mit der Angabe, welches Symbol dazu geführt hat, dass das Archiv-Member einbezogen wurde.

Die den Symbolen zugewiesenen Werte.

Hinweis - Symbole, deren Werte durch einen Ausdruck berechnet werden, der einen Verweis auf einen vorherigen Wert desselben Symbols enthält, haben möglicherweise nicht das korrekte Ergebnis in der Link-Map. Dies liegt daran, dass der Linker Zwischenergebnisse verwirft und nur den endgültigen Wert eines Ausdrucks beibehält. In solchen Fällen zeigt der Linker den endgültigen Wert in eckigen Klammern an. Beispielsweise würde ein Linker-Skript, das Folgendes enthält:

foo = 1
foo = foo * 4
foo = foo + 8

die folgende Ausgabe in der Link-Map erzeugen, wenn die Option -M verwendet wird:

000000001 foo = 0x1
[0x0000000c] foo = (foo * 0x4)
[0x0000000c] foo = (foo + 0x8)

Weitere Informationen zu Ausdrücken in Linker-Skripten finden Sie im Abschnitt "Ausdrücke".

Wie GNU-Eigenschaften zusammengeführt werden.

Wenn der Linker Eingabe-.note.gnu.property-Abschnitte in einen einzigen Ausgabe-.note.gnu.property-Abschnitt zusammenführt, werden einige Eigenschaften entfernt oder aktualisiert. Diese Aktionen werden in der Link-Map gemeldet. Beispielsweise:

Entfernte Eigenschaft 0xc0000002 beim Zusammenführen von foo.o (0x1) und bar.o (nicht gefunden)

Dies zeigt an, dass die Eigenschaft 0xc0000002 aus der Ausgabe entfernt wird, wenn Eigenschaften in foo.o, deren Eigenschaft 0xc0000002 den Wert 0x1 hat, und bar.o, das die Eigenschaft 0xc0000002 nicht hat, zusammengeführt werden.

Aktualisierte Eigenschaft 0xc0010001 (0x1) beim Zusammenführen von foo.o (0x1) und bar.o (0x1)

Dies zeigt an, dass der Wert der Eigenschaft 0xc0010001 in der Ausgabe auf 0x1 aktualisiert wird, wenn Eigenschaften in foo.o, dessen Eigenschaft 0xc0010001 den Wert 0x1 hat, und bar.o, dessen Eigenschaft 0xc0010001 ebenfalls den Wert 0x1 hat, zusammengeführt werden.

Auf einigen ELF-Zielen wird eine Liste der durch --relax eingefügten Fixups angezeigt.

foo.o: Anpassen des Sprungs bei 0x00000008 zu "far" im Abschnitt .text

Dies zeigt an, dass der Sprung bei 0x00000008 in foo.o, der auf das Symbol "far" im Abschnitt .text abzielt, durch ein Trampolin ersetzt wurde.


--print-map-discarded
--no-print-map-discarded

Druckt (oder unterdrückt das Drucken) der Liste der verworfenen und vom Garbage Collector freigegebenen Abschnitte in der Link-Map. Standardmäßig aktiviert.

--print-map-locals
--no-print-map-locals

Druckt (oder unterdrückt das Drucken) lokale Symbole in der Link-Map. Lokale Symbole werden mit dem Text (local) vor ihrem Namen versehen und werden nach allen globalen Symbolen in einem bestimmten Abschnitt aufgelistet. Temporäre lokale Symbole (typischerweise solche, die mit .L beginnen) werden nicht in der Ausgabe enthalten. Standardmäßig deaktiviert.

-n
--nmagic

Deaktiviert die Seitenausrichtung von Abschnitten und deaktiviert die Verknüpfung mit gemeinsam genutzten Bibliotheken. Wenn das Ausgabeformat Unix-ähnliche Magic-Nummern unterstützt, wird die Ausgabe als „NMAGIC“ gekennzeichnet.

-N
--omagic

Setzt die Text- und Datensegmente auf lesbar und beschreibbar. Außerdem wird die Seitenausrichtung des Datensegments deaktiviert und die Verknüpfung mit gemeinsam genutzten Bibliotheken deaktiviert. Wenn das Ausgabeformat Unix-ähnliche Magic-Nummern unterstützt, wird die Ausgabe als „OMAGIC“ gekennzeichnet. Hinweis: Obwohl ein beschreibbarer Textabschnitt für PE-COFF-Ziele zulässig ist, entspricht dies nicht der von Microsoft veröffentlichten Formatspezifikation.

--no-omagic

Diese Option negiert die meisten Auswirkungen der Option -N. Sie setzt den Textabschnitt auf schreibgeschützt und erzwingt die Seitenausrichtung des Datensegments. Hinweis: Diese Option aktiviert nicht die Verknüpfung mit gemeinsam genutzten Bibliotheken. Verwenden Sie -Bdynamic dafür.

-o output
--output=output

Verwendet output als Namen für das von ld erzeugte Programm; wenn diese Option nicht angegeben wird, wird standardmäßig der Name a.out verwendet. Der Skriptbefehl „OUTPUT“ kann auch den Namen der Ausgabedatei angeben.

Hinweis: Der Linker löscht die Ausgabedatei, bevor er mit dem Schreiben beginnt. Er wird dies auch dann tun, wenn sich herausstellt, dass die Verknüpfung aufgrund von Fehlern nicht abgeschlossen werden kann.

Hinweis: Der Linker prüft, ob der Name der Ausgabedatei mit dem Namen einer der Eingabedateien übereinstimmt, aber das ist alles. Insbesondere wird er nicht meckern, wenn die Ausgabedatei eine Quelldatei oder eine andere wichtige Datei überschreiben könnte. Daher wird empfohlen, die Option -o als letzte Option in der Linker-Befehlszeile in Build-Systemen zu verwenden. Betrachten Sie zum Beispiel:

ld -o $(EXE) $(OBJS)
ld $(OBJS) -o $(EXE)

Wenn die Variable EXE aus irgendeinem Grund nicht definiert ist, könnte die erste Version des Linker-Befehls am Ende eine der Objektdateien (die erste in der Liste OBJS) löschen, während die zweite Version des Linker-Befehls eine Fehlermeldung generiert und nichts löscht.

--dependency-file=depfile

Schreibt eine Abhängigkeitsdatei in depfile. Diese Datei enthält eine Regel, die für „make“ geeignet ist und die Ausgabedatei und alle Eingabedateien beschreibt, die zum Erstellen verwendet wurden. Die Ausgabe ähnelt der Ausgabe des Compilers mit -M -MP. Beachten Sie, dass es keine Option wie die Compiler-Option -MM gibt, um „Systemdateien“ auszuschließen (was kein klar definiertes Konzept im Linker ist, im Gegensatz zu „System-Headern“ im Compiler). Daher ist die Ausgabe von --dependency-file immer spezifisch für den genauen Zustand der Installation, in der sie erstellt wurde, und sollte nicht ohne sorgfältige Bearbeitung in verteilte Makefiles kopiert werden.


-O level

Wenn level ein numerischer Wert größer als Null ist, optimiert ld die Ausgabe. Dies kann deutlich länger dauern und sollte daher wahrscheinlich nur für die endgültige Binärdatei aktiviert werden. Im Moment betrifft diese Option nur die Erstellung von ELF-Shared-Libraries. Zukünftige Versionen des Linkers können diese Option stärker nutzen. Außerdem gibt es derzeit keinen Unterschied im Verhalten des Linkers für verschiedene nicht-null Werte dieser Option. Dies kann sich jedoch in zukünftigen Versionen ändern.

-plugin name

Beziehen Sie ein Plugin in den Link-Prozess ein. Der Parameter name ist der absolute Dateiname des Plugins. Normalerweise wird dieser Parameter automatisch vom Compiler hinzugefügt, wenn die Link-Time-Optimierung verwendet wird, aber Benutzer können auch ihre eigenen Plugins hinzufügen, wenn sie dies wünschen.

Beachten Sie, dass sich der Speicherort der vom Compiler generierten Plugins von dem Ort unterscheidet, an dem die Programme ar, nm und ranlib nach ihren Plugins suchen. Damit diese Befehle ein vom Compiler erstelltes Plugin verwenden können, muss es zuerst in das Verzeichnis ${libdir}/bfd-plugins kopiert werden. Alle GCC-basierten Linker-Plugins sind abwärtskompatibel, daher reicht es aus, nur das neueste zu kopieren.

--push-state

Mit --push-state kann der aktuelle Zustand der Flags, die die Dateiverarbeitung steuern, gespeichert werden, sodass sie mit der entsprechenden Option --pop-state wiederhergestellt werden können.

Die Optionen, die abgedeckt sind, sind: -Bdynamic, -Bstatic, -dn, -dy, -call_shared, -non_shared, -static, -N, -n, --whole-archive, --no-whole-archive, -r, -Ur, --copy-dt-needed-entries, --no-copy-dt-needed-entries, --as-needed, --no-as-needed und -a.

Ein Ziel für diese Option sind Spezifikationen für pkg-config. Wenn sie zusammen mit der Option --libs verwendet wird, werden alle möglicherweise benötigten Bibliotheken aufgelistet und dann möglicherweise immer mit diesen verknüpft. Es ist besser, Folgendes zurückzugeben:

-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state

--pop-state

Macht die Wirkung von --push-state rückgängig und stellt die vorherigen Werte der Flags wieder her, die die Dateiverarbeitung steuern.

-q
--emit-relocs

Belassen Sie die Umsetzungsabschnitte und -inhalte in vollständig verknüpften ausführbaren Dateien. Analyse- und Optimierungstools nach dem Linken benötigen diese Informationen möglicherweise, um die ausführbaren Dateien korrekt zu ändern. Dies führt zu größeren ausführbaren Dateien.

Diese Option wird derzeit nur auf ELF-Plattformen unterstützt.

--force-dynamic

Erzwingt, dass die Ausgabedatei dynamische Abschnitte enthält. Diese Option ist spezifisch für VxWorks-Ziele.

-r
--relocatable

Generiert eine relocatable Ausgabe, d. h. eine Ausgabedatei, die wiederum als Eingabe für ld dienen kann. Dies wird oft als partielle Verknüpfung bezeichnet. Als Nebeneffekt setzt diese Option in Umgebungen, die Standard-Unix-Magic-Nummern unterstützen, die Magic-Nummer der Ausgabedatei auf "OMAGIC". Wenn diese Option nicht angegeben wird, wird eine absolute Datei erstellt. Beim Verknüpfen von C++-Programmen werden mit dieser Option keine Referenzen auf Konstruktoren aufgelöst; dies kann mit -Ur erfolgen.


Wenn eine Eingabedatei nicht das gleiche Format wie die Ausgabedatei hat, wird das partielle Verknüpfen nur unterstützt, wenn die Eingabedatei keine Relokationen enthält. Verschiedene Ausgabeformate können weitere Einschränkungen haben; zum Beispiel unterstützen einige „a.out“-basierte Formate das partielle Verknüpfen mit Eingabedateien in anderen Formaten überhaupt nicht.

Wenn die relokierbare Ausgabe sowohl Inhalte enthält, die eine Linkzeitoptimierung (LTO) erfordern, als auch solche, die keine LTO erfordern, wird ein .gnu_object_only-Abschnitt erstellt, der eine relokierbare Objektdatei enthält, als ob die Option -r auf alle relokierbaren Eingaben angewendet würde, die keine LTO erfordern. Beim Verarbeiten einer relokierbaren Eingabe mit einem .gnu_object_only-Abschnitt extrahiert der Linker den .gnu_object_only-Abschnitt als separate Eingabe.

Beachten Sie, dass, da -r einige Abschnitte aus verschiedenen Eingabedateien zusammenfasst, dies negative Auswirkungen auf die Codegröße und -lokalität in der endgültigen ausführbaren Datei oder Bibliothek haben kann.

Diese Option bewirkt das Gleiche wie -i.

-R Dateiname
--just-symbols=Dateiname

Liest Symbolnamen und ihre Adressen aus der Datei, verknüpft sie aber nicht und fügt sie nicht in die Ausgabe ein. Dadurch kann Ihre Ausgabedatei symbolisch auf absolute Speicherorte verweisen, die in anderen Programmen definiert sind. Sie können diese Option mehr als einmal verwenden.

Zur Kompatibilität mit anderen ELF-Linkern wird, wenn der Option -R ein Verzeichnisname und nicht ein Dateiname folgt, dieser als Option -rpath behandelt.

--rosegment
--no-rosegment

Versucht, sicherzustellen, dass nur ein einzelnes, schreibgeschütztes, nicht-Code-Segment erstellt wird. Nur sinnvoll, wenn in Verbindung mit der Option -z separate-code verwendet. Die resultierenden Binärdateien sollten kleiner sein, als wenn die Option -z separate-code allein verwendet wird. Ohne diese Option oder wenn --no-rosegment angegeben ist, erstellt die Option -z separate-code zwei schreibgeschützte Segmente, eines vor dem Code-Segment und eines danach.

Die Namen der Optionen sind irreführend, wurden aber gewählt, um die Kompatibilität des Linkers mit den Linkern LLD und GOLD zu gewährleisten.

Diese Optionen werden nur von ELF-Zielen unterstützt.

-s
--strip-all

Entfernt alle Symbolinformationen aus der Ausgabedatei.

-S
--strip-debug

Entfernt Debugger-Symbolinformationen (aber nicht alle Symbole) aus der Ausgabedatei.

--strip-discarded
--no-strip-discarded

Entfernt (oder entfernt nicht) globale Symbole, die in verworfenen Abschnitten definiert sind. Standardmäßig aktiviert.

-plugin-save-temps

Speichert die „temporären“ Zwischendateien des Plugins dauerhaft.

-t
--trace

Gibt die Namen der Eingabedateien aus, während ld diese verarbeitet. Wenn -t zweimal angegeben wird, werden auch die Elemente innerhalb von Archiven ausgegeben. Die Ausgabe von -t ist nützlich, um eine Liste aller Objektdateien und Skripte zu erstellen, die an der Verknüpfung beteiligt sind, zum Beispiel, wenn Dateien für einen Linker-Fehlerbericht verpackt werden.


-T scriptdatei
--script=scriptdatei

Verwenden Sie die Scriptdatei als Linker-Script. Dieses Script ersetzt das Standard-Linker-Script von ld (anstatt es zu erweitern), es sei denn, das Script enthält "INSERT", sodass die Befehlsdatei alles angeben muss, was zum Beschreiben der Ausgabedatei erforderlich ist.

Wenn die Scriptdatei nicht im aktuellen Verzeichnis vorhanden ist, sucht ld in den Verzeichnissen, die von allen vorherigen -L-Optionen angegeben wurden.

Befehlszeilenoptionen, die vor der Option -T stehen, können das Script beeinflussen, aber Befehlszeilenoptionen, die danach stehen, haben keinen Einfluss.

Mehrere -T-Optionen werden angesammelt, wenn sie das aktuelle Script erweitern, andernfalls wird die letzte, nicht-erweiternde -T-Option verwendet.

Es gibt andere Möglichkeiten, Linker-Scripts anzugeben. Siehe

-dT scriptdatei
--default-script=scriptdatei

Verwenden Sie die Scriptdatei als Standard-Linker-Script.

Diese Option ähnelt der Option --script, jedoch wird die Verarbeitung des Scripts erst nach der Verarbeitung des Rests der Befehlszeile verzögert. Dadurch können Optionen, die nach der Option --default-script in der Befehlszeile angegeben werden, das Verhalten des Linker-Scripts beeinflussen, was wichtig sein kann, wenn die Linker-Befehlszeile nicht direkt vom Benutzer gesteuert werden kann (z. B., weil die Befehlszeile von einem anderen Tool erstellt wird, wie z. B. gcc).

-u symbol
--undefined=symbol

Erzwingen Sie, dass das Symbol in die Ausgabedatei als undefiniertes Symbol eingefügt wird. Dadurch kann beispielsweise das Verknüpfen zusätzlicher Module aus Standardbibliotheken ausgelöst werden. -u kann mit unterschiedlichen Optionsargumenten wiederholt werden, um zusätzliche undefinierte Symbole einzufügen. Diese Option entspricht dem Linker-Script-Befehl "EXTERN".

Wenn diese Option verwendet wird, um zusätzliche Module in das Linken zu zwingen, und wenn es ein Fehler wäre, wenn das Symbol undefiniert bleibt, sollte stattdessen die Option --require-defined verwendet werden.

--require-defined=symbol

Erzwingen Sie, dass das Symbol in der Ausgabedatei definiert ist. Diese Option ist die gleiche wie die Option --undefined, jedoch gibt der Linker einen Fehler aus und beendet das Programm, wenn das Symbol nicht in der Ausgabedatei definiert ist. Der gleiche Effekt kann im Linker-Script durch die Verwendung von "EXTERN", "ASSERT" und "DEFINED" zusammen erreicht werden. Diese Option kann mehrmals verwendet werden, um zusätzliche Symbole zu erzwingen.

-Ur Für Programme, die keine Konstruktoren oder Destruktoren verwenden, oder für ELF-basierte Systeme, ist diese Option äquivalent zu `-r`: Sie erzeugt eine relocierbare Ausgabe, d. h. eine Ausgabedatei, die wiederum als Eingabe für `ld` dienen kann. Für andere Binärdateien ist die Option `-Ur` jedoch ähnlich wie `-r`, löst aber auch Referenzen auf Konstruktoren und Destruktoren auf.

Für die Systeme, in denen sich -r und -Ur unterschiedlich verhalten, funktioniert es nicht, -Ur auf Dateien zu verwenden, die selbst mit -Ur verknüpft wurden; sobald die Konstruktortabelle erstellt wurde, kann sie nicht mehr hinzugefügt werden. Verwenden Sie -Ur nur für das letzte Teillinken und -r für die anderen.


--orphan-handling=MODE
Steuert, wie nicht referenzierte Abschnitte behandelt werden. Ein nicht referenzierter Abschnitt ist ein Abschnitt, der nicht explizit im Linkerskript erwähnt wird.

MODE kann einen der folgenden Werte haben:

"place"
Nicht referenzierte Abschnitte werden in einem geeigneten Ausgabebereich gemäß der im Abschnitt „Nicht referenzierte Abschnitte“ beschriebenen Strategie platziert. Die Option --unique beeinflusst auch, wie Abschnitte platziert werden.

"discard"
Alle nicht referenzierten Abschnitte werden verworfen, indem sie in den Abschnitt /DISCARD/ platziert werden.

"warn"
Der Linker platziert den nicht referenzierten Abschnitt wie bei "place" und gibt auch eine Warnung aus.

"error"
Der Linker beendet die Ausführung mit einem Fehler, wenn ein nicht referenzierter Abschnitt gefunden wird.

Die Standardeinstellung, wenn --orphan-handling nicht angegeben ist, ist "place".

--unique[=SECTION]
Erstellt für jeden Eingabeabschnitt, der SECTION entspricht, einen separaten Ausgabebereich, oder, wenn das optionale Wildcard-Argument SECTION fehlt, für jeden nicht referenzierten Eingabeabschnitt. Ein nicht referenzierter Abschnitt ist ein Abschnitt, der nicht explizit im Linkerskript erwähnt wird. Sie können diese Option mehrmals in der Befehlszeile verwenden; sie verhindert das normale Zusammenführen von Eingabeabschnitten mit demselben Namen und überschreibt Zuweisungen von Ausgabebereichen in einem Linkerskript.

-v
--version
-V Zeigt die Versionsnummer von ld an. Die Option -V listet auch die unterstützten Emulationen auf. Siehe auch die Beschreibung von --enable-linker-version in Optionen, Befehlszeilenoptionen, mit der die Linker-Versionszeichenfolge in ein Binärprogramm eingefügt werden kann.

-x
--discard-all
Löscht alle lokalen Symbole.

-X
--discard-locals
Löscht alle temporären lokalen Symbole. (Diese Symbole beginnen mit system-spezifischen lokalen Label-Präfixen, typischerweise .L für ELF-Systeme oder L für traditionelle a.out-Systeme).

-y symbol
--trace-symbol=symbol
Gibt den Namen jeder verlinkten Datei aus, in der das Symbol vorkommt. Diese Option kann beliebig oft angegeben werden. Auf vielen Systemen ist es notwendig, ein Unterstrichzeichen voranzustellen.

Diese Option ist nützlich, wenn Sie ein undefiniertes Symbol in Ihrer Verknüpfung haben, aber nicht wissen, woher die Referenz stammt.

-Y path
Fügt den Pfad zum Standardbibliothekssuchpfad hinzu. Diese Option ist für die Solaris-Kompatibilität vorhanden.

-z schlüsselwort
Die erkannten Schlüsselwörter sind:

call-nop=prefix-addr
call-nop=suffix-nop
call-nop=prefix-byte
call-nop=suffix-byte
Gibt das 1-Byte-"NOP"-Padding an, wenn ein indirekter Aufruf in eine lokal definierte Funktion, foo, über ihren GOT-Slot transformiert wird. call-nop=prefix-addr generiert "0x67 call foo". call-nop=suffix-nop generiert "call foo 0x90". call-nop=prefix-byte generiert "byte call foo". call-nop=suffix-byte generiert "call foo byte". Unterstützt für i386 und x86_64.

cet-report=none
cet-report=warning
cet-report=error
Gibt an, wie die fehlenden GNU\_PROPERTY\_X86\_FEATURE\_1\_IBT- und GNU\_PROPERTY\_X86\_FEATURE\_1\_SHSTK-Eigenschaften im Eingabe-.note.gnu.property-Bereich gemeldet werden sollen. cet-report=none, was die Standardeinstellung ist, verhindert, dass der Linker fehlende Eigenschaften in Eingabedateien meldet. cet-report=warning bewirkt, dass der Linker eine Warnung für fehlende Eigenschaften in Eingabedateien ausgibt. cet-report=error bewirkt, dass der Linker einen Fehler für fehlende Eigenschaften in Eingabedateien ausgibt. Beachten Sie, dass ibt die Meldung fehlender GNU\_PROPERTY\_X86\_FEATURE\_1\_IBT-Eigenschaften deaktiviert und shstk die Meldung fehlender GNU\_PROPERTY\_X86\_FEATURE\_1\_SHSTK-Eigenschaften deaktiviert. Unterstützt für Linux/i386 und Linux/x86_64.

combreloc
nocombreloc

Kombiniert mehrere dynamische Relokationsabschnitte und sortiert sie, um die dynamische Symbolsuche und das Caching zu verbessern. Nicht verwenden, wenn nocombreloc angegeben ist.

common
nocommon

Generiert Common-Symbole mit dem Typ STT_COMMON während einer relokierbaren Verknüpfung. Verwenden Sie den Typ STT_OBJECT, wenn nocommon angegeben ist.

common-page-size=value

Setzt die am häufigsten verwendete Seitengröße auf den Wert. Die Speicherbild-Anordnung wird optimiert, um die Anzahl der Speicherseiten zu minimieren, wenn das System Seiten dieser Größe verwendet.

defs

Meldet nicht aufgelöste Symbolreferenzen aus regulären Objektdateien. Dies geschieht auch dann, wenn der Linker eine nicht-symbolische Shared Library erstellt. Diese Option ist das Gegenteil von -z undefs.

dynamic-undefined-weak
nodynamic-undefined-weak

Markiert undefinierte schwache Symbole als dynamisch, wenn sie in einer dynamischen Objektdatei verwendet werden und nicht durch die Symbol-Sichtbarkeit oder Versionierung als lokal erzwungen werden. Nicht als dynamisch markieren, wenn nodynamic-undefined-weak angegeben ist. Wenn keine der Optionen angegeben ist, kann ein Ziel standardmäßig entweder eine der Optionen erzwingen oder eine andere Auswahl undefinierter schwacher Symbole als dynamisch markieren. Nicht alle Ziele unterstützen diese Optionen.

execstack

Markiert das Objekt als ausführbaren Stack benötigend.

global

Diese Option ist nur bei der Erstellung einer Shared Object von Bedeutung. Sie macht die von dieser Shared Object definierten Symbole für die Symbolauflösung nachfolgend geladener Bibliotheken verfügbar.

globalaudit

Diese Option ist nur bei der Erstellung eines dynamischen ausführbaren Programms von Bedeutung. Diese Option markiert das ausführbare Programm als für die globale Prüfung durch Setzen des Bits "DF_1_GLOBAUDIT" im dynamischen Tag "DT_FLAGS_1" erforderlich. Die globale Prüfung erfordert, dass jede über die Befehlszeilenoptionen --depaudit oder -P definierte Prüfbibliothek für alle vom Programm geladenen dynamischen Objekte ausgeführt wird.

ibtplt

Generiert Intel Indirect Branch Tracking (IBT)-fähige PLT-Einträge. Unterstützt für Linux/i386 und Linux/x86_64.

ibt

Generiert GNU_PROPERTY_X86_FEATURE_1_IBT in der .note.gnu.property-Sektion, um die Kompatibilität mit IBT anzuzeigen. Dies impliziert auch ibtplt. Unterstützt für Linux/i386 und Linux/x86_64.

indirect-extern-access
noindirect-extern-access

Generiert GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS in der .note.gnu.property-Sektion, um anzuzeigen, dass die Objektdatei kanonische Funktionszeiger benötigt und nicht mit Copy-Relokation verwendet werden kann. Diese Option impliziert auch noextern-protected-data und nocopyreloc. Unterstützt für i386 und x86-64.


noindirect-extern-access   entfernt   GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS    aus
dem .note.gnu.property-Abschnitt.

initfirst

Diese Option ist nur dann sinnvoll, wenn ein Shared Object erstellt wird. Sie kennzeichnet das Objekt so, dass seine Laufzeitinitialisierung vor der Laufzeitinitialisierung aller anderen Objekte stattfindet, die gleichzeitig in den Prozess geladen werden. Ebenso findet die Laufzeitfinalisierung des Objekts nach der Laufzeitfinalisierung aller anderen Objekte statt.

interpose

Geben Sie an, dass der dynamische Lader seine Symbolsuchreihenfolge so ändern soll, dass Symbole in dieser Shared Library alle anderen Shared Libraries überschreiben, die nicht ebenfalls so gekennzeichnet sind.

unique
nounique

Beim Generieren einer Shared Library oder eines anderen dynamisch ladbaren ELF-Objekts markieren Sie es als ein Objekt, das standardmäßig nur einmal und nur im Haupt-Namensraum (bei Verwendung von "dlmopen") geladen werden soll. Dies wird hauptsächlich verwendet, um grundlegende Bibliotheken wie libc, libpthread usw. zu kennzeichnen, die normalerweise nicht korrekt funktionieren, es sei denn, sie sind die einzigen Instanzen von sich selbst. Dieses Verhalten kann vom "dlmopen"-Aufrufer überschrieben werden und gilt nicht für bestimmte Ladeverfahren (z. B. Audit-Bibliotheken).

lam-u48

Generiert GNU_PROPERTY_X86_FEATURE_1_LAM_U48 im .note.gnu.property-Abschnitt, um die Kompatibilität mit Intel LAM_U48 anzuzeigen. Unterstützt für Linux/x86_64.

lam-u57

Generiert GNU_PROPERTY_X86_FEATURE_1_LAM_U57 im .note.gnu.property-Abschnitt, um die Kompatibilität mit Intel LAM_U57 anzuzeigen. Unterstützt für Linux/x86_64.

lam-u48-report=none
lam-u48-report=warning
lam-u48-report=error

Gibt an, wie das fehlende GNU_PROPERTY_X86_FEATURE_1_LAM_U48-Attribut im Eingabe- .note.gnu.property-Abschnitt gemeldet werden soll. lam-u48-report=none, was die Standardeinstellung ist, bewirkt, dass der Linker fehlende Attribute in Eingabedateien nicht meldet. lam-u48-report=warning bewirkt, dass der Linker eine Warnung für fehlende Attribute in Eingabedateien ausgibt. lam-u48-report=error bewirkt, dass der Linker einen Fehler für fehlende Attribute in Eingabedateien ausgibt. Unterstützt für Linux/x86_64.

lam-u57-report=none
lam-u57-report=warning
lam-u57-report=error

Gibt an, wie das fehlende GNU_PROPERTY_X86_FEATURE_1_LAM_U57-Attribut im Eingabe- .note.gnu.property-Abschnitt gemeldet werden soll. lam-u57-report=none, was die Standardeinstellung ist, bewirkt, dass der Linker fehlende Attribute in Eingabedateien nicht meldet. lam-u57-report=warning bewirkt, dass der Linker eine Warnung für fehlende Attribute in Eingabedateien ausgibt. lam-u57-report=error bewirkt, dass der Linker einen Fehler für fehlende Attribute in Eingabedateien ausgibt. Unterstützt für Linux/x86_64.

lam-report=none
lam-report=warning
lam-report=error

Gibt an, wie die fehlenden GNU_PROPERTY_X86_FEATURE_1_LAM_U48- und GNU_PROPERTY_X86_FEATURE_1_LAM_U57-Attribute im Eingabe- .note.gnu.property-Abschnitt gemeldet werden sollen. lam-report=none, was die Standardeinstellung ist, bewirkt, dass der Linker fehlende Attribute in Eingabedateien nicht meldet. lam-report=warning bewirkt, dass der Linker eine Warnung für fehlende Attribute in Eingabedateien ausgibt. lam-report=error bewirkt, dass der Linker einen Fehler für fehlende Attribute in Eingabedateien ausgibt. Unterstützt für Linux/x86_64.


lazy
Wenn eine ausführbare Datei oder eine gemeinsam genutzte Bibliothek generiert wird, wird diese markiert, um dem dynamischen Linker mitzuteilen, dass die Auflösung von Funktionsaufrufen auf den Zeitpunkt verschoben werden soll, an dem die Funktion aufgerufen wird (Lazy Binding), anstatt zum Zeitpunkt des Ladens. Lazy Binding ist die Standardeinstellung.

loadfltr
Gibt an, dass die Filter des Objekts sofort zur Laufzeit verarbeitet werden sollen.

max-page-size=value
Setzt die maximale unterstützte Speicherseitengröße auf den Wert.

mark-plt
nomark-plt
Markiert PLT-Einträge mit dynamischen Tags, DT\_X86\_64\_PLT, DT\_X86\_64\_PLTSZ und DT\_X86\_64\_PLTENT.
Da diese Option einen Wert ungleich Null im Feld r\_addend der R\_X86\_64\_JUMP\_SLOT-Relokationen speichert, sind die resultierenden ausführbaren Dateien und gemeinsam genutzten Bibliotheken nicht kompatibel mit dynamischen Linkern, wie sie in älteren Versionen von glibc verwendet werden, ohne die Änderung, die r\_addend in R\_X86\_64\_GLOB\_DAT und R\_X86\_64\_JUMP\_SLOT-Relokationen ignoriert. Dies gilt für x86_64.

muldefs
Erlaubt mehrere Definitionen.

nocopyreloc
Deaktiviert vom Linker generierte .dynbss-Variablen, die anstelle von in gemeinsam genutzten Bibliotheken definierten Variablen verwendet werden. Dies kann zu dynamischen Textrelokationen führen.

nodefaultlib
Gibt an, dass der dynamische Loader bei der Suche nach Abhängigkeiten dieses Objekts alle Standardbibliothekssuchpfade ignorieren soll.

nodelete
Gibt an, dass das Objekt zur Laufzeit nicht entladen werden soll.

nodlopen
Gibt an, dass das Objekt nicht über "dlopen" verfügbar ist.

nodump
Gibt an, dass das Objekt nicht mit "dldump" gedumpt werden kann.

noexecstack
Markiert das Objekt so, dass kein ausführbarer Stack erforderlich ist.

noextern-protected-data
Behandelt geschützte Datensymbole beim Erstellen einer gemeinsam genutzten Bibliothek nicht als extern. Diese Option überschreibt die Standardeinstellung des Linker-Backends. Sie kann verwendet werden, um inkorrekte Relokationen gegenüber geschützten Datensymbolen zu umgehen, die vom Compiler generiert werden. Aktualisierungen von geschützten Datensymbolen durch ein anderes Modul sind für die resultierende gemeinsam genutzte Bibliothek nicht sichtbar. Dies gilt für i386 und x86-64.

noreloc-overflow
Deaktiviert die Überprüfung auf Relokations-Overflow. Dies kann verwendet werden, um die Überprüfung auf Relokations-Overflow zu deaktivieren, wenn es zur Laufzeit keinen dynamischen Relokations-Overflow geben wird. Dies gilt für x86_64.

memory-seal
nomemory-seal
Weist die ausführbare Datei oder die gemeinsam genutzte Bibliothek an, dass alle PT\_LOAD-Segmente versiegelt werden sollen, um weitere Manipulationen zu verhindern (z. B. das Ändern der Schutzflags, der Segmentgröße oder das Entfernen der Zuordnung). Dies ist eine Sicherheitsmaßnahme, die Systemunterstützung erfordert. Dies generiert GNU_PROPERTY_MEMORY_SEAL im Abschnitt .note.gnu.property

now
Wenn eine ausführbare Datei oder eine gemeinsam genutzte Bibliothek generiert wird, wird diese markiert, um dem dynamischen Linker mitzuteilen, dass alle Symbole beim Starten des Programms oder beim Laden der gemeinsam genutzten Bibliothek durch dlopen aufgelöst werden sollen, anstatt die Auflösung von Funktionsaufrufen auf den Zeitpunkt zu verschieben, an dem die Funktion zum ersten Mal aufgerufen wird.

origin

Gibt an, dass das Objekt eine $ORIGIN-Behandlung in Pfaden benötigt.

pack-relative-relocs
nopack-relative-relocs

Generiert kompakte relative Relokationen in positionunabhängigem ausführbarem Code und in gemeinsam genutzten Bibliotheken. Es fügt die Einträge „DT_RELR“, „DT_RELRSZ“ und „DT_RELRENT“ zum dynamischen Abschnitt hinzu. Es wird ignoriert, wenn ein positionsabhängiger ausführbarer Code oder eine relocierbare Ausgabe erstellt wird. nopack-relative-relocs ist die Standardeinstellung, die die kompakte relative Relokation deaktiviert. Wenn gegen die GNU C-Bibliothek verknüpft wird, wird eine Symbolversion-Abhängigkeit GLIBC_ABI_DT_RELR für die gemeinsam genutzte C-Bibliothek zur Ausgabe hinzugefügt. Unterstützt für i386 und x86-64.

relro
norelro

Erstellt einen ELF „PT_GNU_RELRO“-Segmentheader im Objekt. Dies gibt ein Speichersegment an, das nach der Relokation schreibgeschützt sein soll, falls unterstützt. Das Angeben einer commonpage-size, die kleiner ist als die Systemseitengröße, macht diesen Schutz unwirksam. Wenn norelro verwendet wird, wird kein ELF „PT_GNU_RELRO“-Segment erstellt.

report-relative-reloc

Meldet dynamische relative Relokationen, die vom Linker generiert werden. Unterstützt für Linux/i386 und Linux/x86_64.

sectionheader
nosectionheader

Generiert einen Abschnittsheader. Wenn nosectionheader verwendet wird, wird kein Abschnittsheader generiert. sectionheader ist die Standardeinstellung.

separate-code
noseparate-code

Erstellt einen separaten Code „PT_LOAD“-Segmentheader im Objekt. Dies gibt ein Speichersegment an, das nur Anweisungen enthalten soll und vollständig von anderen Daten getrennt sein muss. Wenn noseparate-code verwendet wird, wird kein separates Code „PT_LOAD“-Segment erstellt.

shstk

Generiert GNU_PROPERTY_X86_FEATURE_1_SHSTK im Abschnitt .note.gnu.property, um die Kompatibilität mit dem Intel Shadow Stack anzuzeigen. Unterstützt für Linux/i386 und Linux/x86_64.

stack-size=value

Gibt eine Stapelgröße für ein ELF „PT_GNU_STACK“-Segment an. Das Angeben von Null setzt jedes standardmäßige, nicht-null-wertige „PT_GNU_STACK“-Segment außer Kraft.

start-stop-gc
nostart-stop-gc

Wenn --gc-sections in Kraft ist, führt eine Referenz von einem beibehaltenen Abschnitt auf „__start_SECNAME“ oder „__stop_SECNAME“ dazu, dass alle Eingangsabschnitte mit dem Namen „SECNAME“ ebenfalls beibehalten werden, wenn „SECNAME“ als C-Bezeichner dargestellt werden kann und entweder „__start_SECNAME“ oder „__stop_SECNAME“ vom Linker synthetisiert wird. -z start-stop-gc deaktiviert diese Wirkung, sodass Abschnitte so verworfen werden können, als ob die speziellen synthetisierten Symbole nicht definiert wären. -z start-stop-gc hat keine Auswirkung auf eine Definition von „__start_SECNAME“ oder „__stop_SECNAME“ in einer Objektdatei oder einem Linkerskript. Eine solche Definition verhindert, dass der Linker ein synthetisiertes „__start_SECNAME“ oder „__stop_SECNAME“ bereitstellt, und daher wird die spezielle Behandlung durch die Garbage-Collection für diese Referenzen nicht angewendet.

start-stop-visibility=value

Gibt die ELF-Symbol-Sichtbarkeit für die synthetisierten Symbole „__start_SECNAME“ und „__stop_SECNAME“ an. value muss genau default, internal, hidden oder protected sein. Wenn keine Option -z start-stop-visibility angegeben wird, wird protected zur Kompatibilität mit der historischen Praxis verwendet. Es wird jedoch dringend empfohlen, -z start-stop-visibility=hidden in neuen Programmen und gemeinsam genutzten Bibliotheken zu verwenden, sodass diese Symbole nicht zwischen gemeinsam genutzten Objekten exportiert werden, was normalerweise nicht beabsichtigt ist.


text
notext
textoff

Meldet einen Fehler, wenn DT_TEXTREL gesetzt ist, d.h. wenn das positionsunabhängige oder gemeinsam genutzte Objekt dynamische Relokationen in schreibgeschützten Abschnitten enthält. Meldet keinen Fehler, wenn notext oder textoff angegeben ist.

undefs

Meldet keine nicht aufgelösten Symbolreferenzen aus regulären Objektdateien, weder beim Erstellen einer ausführbaren Datei noch beim Erstellen einer gemeinsam genutzten Bibliothek. Diese Option ist das Gegenteil von -z defs.

unique-symbol
nounique-symbol

Vermeidet doppelte lokale Symbolnamen in der Symboltabelle. Fügt bei Verwendung von unique-symbol ".number" an doppelte lokale Symbolnamen an. nounique-symbol ist der Standardwert.

x86-64-baseline
x86-64-v2
x86-64-v3
x86-64-v4

Gibt das benötigte x86-64-ISA-Level im Abschnitt .note.gnu.property an. x86-64-baseline generiert "GNU_PROPERTY_X86_ISA_1_BASELINE". x86-64-v2 generiert "GNU_PROPERTY_X86_ISA_1_V2". x86-64-v3 generiert "GNU_PROPERTY_X86_ISA_1_V3". x86-64-v4 generiert "GNU_PROPERTY_X86_ISA_1_V4". Wird für Linux/i386 und Linux/x86_64 unterstützt.

isa-level-report=none
isa-level-report=all
isa-level-report=needed
isa-level-report=used

Gibt an, wie die x86-64-ISA-Level in den Eingabe-Relokationsdateien gemeldet werden sollen. isa-level-report=none, was der Standardwert ist, verhindert, dass der Linker x86-64-ISA-Level in Eingabedateien meldet. isa-level-report=all bewirkt, dass der Linker die benötigten und verwendeten x86-64-ISA-Level in Eingabedateien meldet. isa-level-report=needed bewirkt, dass der Linker die benötigten x86-64-ISA-Level in Eingabedateien meldet. isa-level-report=used bewirkt, dass der Linker die verwendeten x86-64-ISA-Level in Eingabedateien meldet. Wird für Linux/i386 und Linux/x86_64 unterstützt.

Andere Schlüsselwörter werden zur Solaris-Kompatibilität ignoriert.

--gnu-tls-tag
--no-gnu-tls-tag
Fügt die Versions-Tag-Abhängigkeit "GLIBC\_ABI\_GNU\_TLS" in Ausgabeprogrammen und gemeinsam genutzten Bibliotheken hinzu, wenn die Eingabe-Relokations-Objektdateien "___tls_get_addr" aufrufen und gegen glibc verlinkt wird. Die Ausgabe kann zur Laufzeit nicht geladen und ausgeführt werden, wenn sie gegen glibc verlinkt wird, das das Versions-Tag "GLIBC_ABI_GNU_TLS" nicht definiert. Sofern nicht durch die Konfigurationsoption --disable-gnu-tls-tag zur Linker-Build-Zeit deaktiviert, fügt der Linker, wenn keine Optionen angegeben sind, die Versions-Tag-Abhängigkeit "GLIBC_ABI_GNU_TLS" hinzu, wenn die Eingabe "___tls_get_addr" aufruft und libc.so das Versions-Tag "GLIBC_ABI_GNU_TLS" definiert. Wird für Linux/i386 unterstützt.

--gnu2-tls-tag
--no-gnu2-tls-tag
Fügt die Versions-Tag-Abhängigkeit "GLIBC\_ABI\_GNU2\_TLS" in Ausgabeprogrammen und gemeinsam genutzten Bibliotheken hinzu, wenn die Eingabe-Relokations-Objektdateien die Relokationen "R_386_TLS_DESC_CALL" oder "R_X86_64_TLSDESC_CALL" aufweisen und gegen glibc verlinkt wird. Die Ausgabe kann zur Laufzeit nicht geladen und ausgeführt werden, wenn sie gegen glibc verlinkt wird, das das Versions-Tag "GLIBC_ABI_GNU2_TLS" nicht definiert. Sofern nicht durch die Konfigurationsoption --disable-gnu2-tls-tag zur Linker-Build-Zeit deaktiviert, fügt der Linker, wenn keine Optionen angegeben sind, die Versions-Tag-Abhängigkeit "GLIBC_ABI_GNU2_TLS" hinzu, wenn die Eingabe die Relokationen "R_386_TLS_DESC_CALL" oder "R_X86_64_TLSDESC_CALL" aufweist und libc.so das Versions-Tag "GLIBC_ABI_GNU2_TLS" definiert. Wird für Linux/i386 und Linux/x86_64 unterstützt.

- (archive -)
--start-group archive --end-group

Die Archive sollten eine Liste von Archivdateien sein. Diese können entweder explizite Dateinamen oder -l-Optionen sein.

Die angegebenen Archive werden wiederholt durchsucht, bis keine neuen nicht definierten Referenzen mehr gefunden werden. Normalerweise wird ein Archiv nur einmal in der Reihenfolge durchsucht, in der es in der Befehlszeile angegeben ist. Wenn ein Symbol in diesem Archiv benötigt wird, um ein nicht definiertes Symbol zu lösen, auf das in einem Archiv weiter unten in der Befehlszeile verwiesen wird, kann der Linker diese Referenz nicht auflösen. Durch das Gruppieren der Archive werden diese alle wiederholt durchsucht, bis alle möglichen Referenzen aufgelöst sind.

Die Verwendung dieser Option hat erhebliche Leistungseinbußen zur Folge. Es ist am besten, sie nur dann zu verwenden, wenn unvermeidliche zirkuläre Referenzen zwischen zwei oder mehr Archiven vorliegen.

--accept-unknown-input-arch
--no-accept-unknown-input-arch

Weist den Linker an, Eingabedateien zu akzeptieren, deren Architektur nicht erkannt werden kann. Es wird davon ausgegangen, dass der Benutzer weiß, was er tut, und diese unbekannten Eingabedateien absichtlich einbinden möchte. Dies war das Standardverhalten des Linkers vor Version 2.14. Das Standardverhalten ab Version 2.14 besteht darin, solche Eingabedateien abzulehnen, und daher wurde die Option --accept-unknown-input-arch hinzugefügt, um das alte Verhalten wiederherzustellen.

--as-needed
--no-as-needed

Diese Option beeinflusst die ELF DT_NEEDED-Tags für dynamische Bibliotheken, die in der Befehlszeile nach der Option --as-needed angegeben werden. Normalerweise fügt der Linker ein DT_NEEDED-Tag für jede in der Befehlszeile angegebene dynamische Bibliothek hinzu, unabhängig davon, ob die Bibliothek tatsächlich benötigt wird oder nicht. --as-needed bewirkt, dass ein DT_NEEDED-Tag nur dann für eine Bibliothek ausgegeben wird, wenn diese zu diesem Zeitpunkt in der Verknüpfung eine nicht-schwache, nicht definierte Symbolreferenz aus einer regulären Objektdatei erfüllt oder, wenn die Bibliothek nicht in den DT_NEEDED-Listen anderer benötigter Bibliotheken gefunden wird, eine nicht-schwache, nicht definierte Symbolreferenz aus einer anderen benötigten dynamischen Bibliothek. Objektdateien oder Bibliotheken, die in der Befehlszeile nach der betreffenden Bibliothek angegeben werden, haben keinen Einfluss darauf, ob die Bibliothek als benötigt betrachtet wird. Dies ähnelt den Regeln für die Extraktion von Objektdateien aus Archiven. --no-as-needed stellt das Standardverhalten wieder her.


Hinweis: Auf Linux-basierten Systemen hat die Option `--as-needed` auch Auswirkungen auf das Verhalten der Optionen `--rpath` und `--rpath-link`. Siehe die Beschreibung von `--rpath-link` für weitere Details.

--add-needed
--no-add-needed
Diese beiden Optionen sind veraltet, da ihre Namen den Optionen `--as-needed` und `--no-as-needed` zu ähnlich sind. Sie wurden durch `--copy-dt-needed-entries` und `--no-copy-dt-needed-entries` ersetzt.

-assert keyword
Diese Option wird zur SunOS-Kompatibilität ignoriert.

-Bdynamic
-dy
-call_shared
Mit dynamischen Bibliotheken verlinken. Dies ist nur auf Plattformen, die dynamische Bibliotheken unterstützen, sinnvoll. Diese Option ist normalerweise die Standardeinstellung auf solchen Plattformen. Die verschiedenen Varianten dieser Option dienen der Kompatibilität mit verschiedenen Systemen. Sie können diese Option mehrmals in der Befehlszeile verwenden: Sie beeinflusst die Bibliotheksuche für nachfolgende `-l`-Optionen.

-Bgroup
Setzt das Flag "DF_1_GROUP" im Eintrag "DT_FLAGS_1" im dynamischen Abschnitt. Dadurch wird bewirkt, dass die Laufzeitumgebung die Suche in diesem Objekt und seinen Abhängigkeiten nur innerhalb der Gruppe durchführt. `--unresolved-symbols=report-all` ist impliziert. Diese Option ist nur auf ELF-Plattformen, die dynamische Bibliotheken unterstützen, sinnvoll.

-Bstatic
-dn
-non_shared
-static
Nicht mit dynamischen Bibliotheken verlinken. Dies ist nur auf Plattformen, die dynamische Bibliotheken unterstützen, sinnvoll. Die verschiedenen Varianten dieser Option dienen der Kompatibilität mit verschiedenen Systemen. Sie können diese Option mehrmals in der Befehlszeile verwenden: Sie beeinflusst die Bibliotheksuche für nachfolgende `-l`-Optionen. Diese Option impliziert auch `--unresolved-symbols=report-all`. Diese Option kann mit `-shared` verwendet werden. Wenn dies der Fall ist, bedeutet dies, dass eine dynamische Bibliothek erstellt wird, aber alle externen Referenzen der Bibliothek durch das Einbinden von Einträgen aus statischen Bibliotheken aufgelöst werden müssen.

-Bsymbolic
Beim Erstellen einer dynamischen Bibliothek werden Referenzen auf globale Symbole an die Definition innerhalb der dynamischen Bibliothek gebunden, falls vorhanden. Normalerweise kann ein Programm, das mit einer dynamischen Bibliothek verlinkt ist, die Definition innerhalb der dynamischen Bibliothek überschreiben. Diese Option ist nur auf ELF-Plattformen, die dynamische Bibliotheken unterstützen, sinnvoll.

-Bsymbolic-functions
Beim Erstellen einer dynamischen Bibliothek werden Referenzen auf globale Funktionssymbole an die Definition innerhalb der dynamischen Bibliothek gebunden, falls vorhanden. Diese Option ist nur auf ELF-Plattformen, die dynamische Bibliotheken unterstützen, sinnvoll.

-Bno-symbolic
Diese Option kann zuvor angegebene `-Bsymbolic` und `-Bsymbolic-functions` aufheben.

--dynamic-list=dynamic-list-file
Gibt den Namen einer dynamischen Listendatei für den Linker an. Dies wird normalerweise beim Erstellen dynamischer Bibliotheken verwendet, um eine Liste globaler Symbole anzugeben, deren Referenzen nicht an die Definition innerhalb der dynamischen Bibliothek gebunden werden sollen, oder beim Erstellen dynamisch verknüpfter ausführbarer Dateien, um eine Liste von Symbolen anzugeben, die der Symboltabelle in der ausführbaren Datei hinzugefügt werden sollen. Diese Option ist nur auf ELF-Plattformen, die dynamische Bibliotheken unterstützen, sinnvoll.

Das Format der dynamischen Liste ist das gleiche wie die Version des Knotens ohne Bereich und Knotenname. Weitere Informationen finden Sie unter VERSION.

--dynamic-list-data

Schließt alle globalen Datensymbole in die dynamische Liste ein.

--dynamic-list-cpp-new

Stellt die integrierte dynamische Liste für die C++-Operatoren new und delete bereit. Dies ist hauptsächlich nützlich für das Erstellen von gemeinsamen libstdc++-Bibliotheken.

--dynamic-list-cpp-typeinfo

Stellt die integrierte dynamische Liste für die C++-Laufzeit-Typidentifikation bereit.

--check-sections
--no-check-sections

Veranlasst den Linker, nach der Zuweisung nicht zu überprüfen, ob es Überschneidungen in den Abschnitten gibt. Normalerweise führt der Linker diese Überprüfung durch, und wenn er Überschneidungen findet, gibt er entsprechende Fehlermeldungen aus. Der Linker kennt die Abschnitte in Überlagerungen und berücksichtigt diese. Das Standardverhalten kann durch die Verwendung des Befehlszeilen-Schalters --check-sections wiederhergestellt werden. Abschnittsüberlappungen werden normalerweise nicht für Relokierbarkeitsverknüpfungen überprüft. Sie können die Überprüfung in diesem Fall mit der Option --check-sections erzwingen.

--copy-dt-needed-entries
--no-copy-dt-needed-entries

Diese Option beeinflusst die Behandlung von dynamischen Bibliotheken, auf die in DT_NEEDED-Tags innerhalb von ELF-Dynamikbibliotheken verwiesen wird, die in der Befehlszeile erwähnt werden. Normalerweise fügt der Linker kein DT_NEEDED-Tag zur Ausgabebinärdatei für jede in einem DT_NEEDED-Tag in einer Eingabe-Dynamikbibliothek erwähnte Bibliothek hinzu. Wenn jedoch --copy-dt-needed-entries in der Befehlszeile angegeben ist, werden alle nachfolgenden Dynamikbibliotheken ihre DT_NEEDED-Einträge hinzufügen. Das Standardverhalten kann mit --no-copy-dt-needed-entries wiederhergestellt werden.

Diese Option hat auch Auswirkungen auf die Auflösung von Symbolen in dynamischen Bibliotheken. Mit --copy-dt-needed-entries werden die in der Befehlszeile erwähnten dynamischen Bibliotheken rekursiv durchsucht, wobei ihren DT_NEEDED-Tags zu anderen Bibliotheken übergegangen wird, um die für die Ausgabebinärdatei erforderlichen Symbole aufzulösen. Bei der Standardeinstellung wird jedoch die Suche von dynamischen Bibliotheken, die darauf folgen, mit der dynamischen Bibliothek selbst beendet. Es werden keine DT_NEEDED-Verknüpfungen durchlaufen, um Symbole aufzulösen.

--cref

Gibt eine Kreuzreferenztabelle aus. Wenn eine Linker-Map-Datei generiert wird, wird die Kreuzreferenztabelle in die Map-Datei gedruckt. Andernfalls wird sie auf die Standardausgabe gedruckt.

Das Format der Tabelle ist absichtlich einfach gehalten, so dass sie bei Bedarf von einem Skript verarbeitet werden kann. Die Symbole werden nach Namen sortiert ausgegeben. Für jedes Symbol wird eine Liste von Dateinamen angegeben. Wenn das Symbol definiert ist, ist die erste aufgeführte Datei der Speicherort der Definition. Wenn das Symbol als gemeinsamer Wert definiert ist, werden alle Dateien, in denen dies geschieht, als Nächstes angezeigt. Schließlich werden alle Dateien aufgelistet, die das Symbol referenzieren.


--ctf-variables
--no-ctf-variables

Das CTF-Debuginfo-Format unterstützt einen Abschnitt, der die Namen und Typen der Variablen im Programm kodiert, die nicht in einer Symboltabelle vorkommen. Diese Variablen können offensichtlich nicht durch herkömmliche Debugger anhand ihrer Adresse nachgeschlagen werden, sodass der für ihre Typen und Namen verwendete Speicherplatz in der Regel verschwendet wird: Die Typen sind normalerweise klein, aber die Namen sind oft nicht. --ctf-variables erzeugt einen solchen Abschnitt. Das Standardverhalten kann mit --no-ctf-variables wiederhergestellt werden.

--ctf-share-types=methode

Passen Sie die Methode an, mit der Typen zwischen Übersetzungseinheiten in CTF gemeinsam genutzt werden.

share-unconflicted

Alle Typen, die keine mehrdeutigen Definitionen haben, werden in das gemeinsam genutzte Wörterbuch verschoben, wo Debugger auch dann einfach darauf zugreifen können, wenn sie nur in einer Übersetzungseinheit vorkommen. Dies ist die Standardeinstellung.

share-duplicated

Es werden nur Typen, die in mehreren Übersetzungseinheiten vorkommen, in das gemeinsam genutzte Wörterbuch verschoben: Typen mit nur einer Definition werden in Wörterbücher pro Übersetzungseinheit verschoben. Typen mit mehrdeutigen Definitionen in mehreren Übersetzungseinheiten werden immer in Wörterbücher pro Übersetzungseinheit verschoben. Dies führt dazu, dass das CTF größer wird, kann aber die Menge an CTF im gemeinsam genutzten Wörterbuch reduzieren. Bei sehr großen Projekten kann dies das Öffnen des CTF beschleunigen und den Speicherverbrauch des CTF-Konsumenten zur Laufzeit reduzieren.

--no-define-common

Diese Option verhindert die Zuweisung von Adressen zu gemeinsamen Symbolen. Der Skriptbefehl "INHIBIT_COMMON_ALLOCATION" hat die gleiche Wirkung.

Die Option --no-define-common ermöglicht die Entkopplung der Entscheidung, Adressen gemeinsamen Symbolen zuzuweisen, von der Wahl des Ausgabe-Dateityps; andernfalls zwingt ein nicht-relokierbarer Ausgabetyp die Zuweisung von Adressen zu gemeinsamen Symbolen. Die Verwendung von --no-define-common ermöglicht es, dass gemeinsame Symbole, auf die von einer gemeinsam genutzten Bibliothek aus zugegriffen wird, nur im Hauptprogramm Adressen zugewiesen werden. Dadurch wird der unnötige doppelte Speicherplatz in der gemeinsam genutzten Bibliothek eliminiert und es werden mögliche Verwechslungen bei der Auflösung des falschen Duplikats vermieden, wenn viele dynamische Module mit speziellen Suchpfaden für die Laufzeitsymbolauflösung vorhanden sind.

--force-group-allocation

Diese Option bewirkt, dass der Linker die Mitglieder der Abschnittsgruppe wie normale Eingangsabschnitte platziert und die Abschnittsgruppen löscht. Dies ist das Standardverhalten für eine endgültige Verknüpfung, aber diese Option kann verwendet werden, um das Verhalten einer relokierbaren Verknüpfung (-r) zu ändern. Der Skriptbefehl "FORCE_GROUP_ALLOCATION" hat die gleiche Wirkung.

--defsym=symbol=ausdruck

Erstellen Sie ein globales Symbol in der Ausgabedatei, das die absolute Adresse enthält, die durch den Ausdruck angegeben wird. Sie können diese Option beliebig oft verwenden, um mehrere Symbole in der Befehlszeile zu definieren. Eine begrenzte Form der Arithmetik wird in diesem Zusammenhang für den Ausdruck unterstützt: Sie können eine hexadezimale Konstante oder den Namen eines vorhandenen Symbols angeben oder "+" und "-" verwenden, um hexadezimale Konstanten oder Symbole zu addieren oder zu subtrahieren. Wenn Sie komplexere Ausdrücke benötigen, sollten Sie die Linker-Skriptsprache verwenden. Hinweis: Es darf keine Leerzeichen zwischen Symbol, dem Gleichheitszeichen ("=") und dem Ausdruck geben.


Der Linker verarbeitet die Argumente --defsym und -T in der angegebenen Reihenfolge, wobei --defsym vor -T platziert wird, um das Symbol zu definieren, bevor das Linker-Skript von -T verarbeitet wird, während das Platzieren von --defsym nach -T das Symbol definiert, nachdem das Linker-Skript verarbeitet wurde. Dieser Unterschied hat Auswirkungen auf Ausdrücke innerhalb des Linker-Skripts, die die mit --defsym definierten Symbole verwenden, und welche Reihenfolge korrekt ist, hängt davon ab, was Sie erreichen möchten.

`--demangle[=style]`
`--no-demangle`

Diese Optionen steuern, ob Symbolnamen in Fehlermeldungen und anderen Ausgaben entmangled werden sollen. Wenn der Linker angewiesen wird, zu entmangeln, versucht er, Symbolnamen in einer lesbaren Form darzustellen: Er entfernt führende Unterstriche, falls diese vom Objektdateiformat verwendet werden, und wandelt C++-mangelnde Symbolnamen in für den Benutzer lesbare Namen um. Verschiedene Compiler haben unterschiedliche Mangling-Stile. Das optionale Demangling-Stil-Argument kann verwendet werden, um einen geeigneten Demangling-Stil für Ihren Compiler auszuwählen. Der Linker wird standardmäßig entmangeln, es sei denn, die Umgebungsvariable COLLECT_NO_DEMANGLE ist gesetzt. Diese Optionen können verwendet werden, um die Standardeinstellung zu überschreiben.

`-Ifile`
`--dynamic-linker=file`

Setzt den Namen des dynamischen Linkers. Dies ist nur für die Erstellung dynamisch verknüpfter ELF-Ausführungsdateien sinnvoll. Der Standard-Dynamik-Linker ist normalerweise korrekt; verwenden Sie diese Option nicht, es sei denn, Sie wissen, was Sie tun.

`--no-dynamic-linker`

Wenn eine Ausführungsdatei erstellt wird, wird die Anforderung, dass ein dynamischer Linker zur Laufzeit verwendet wird, weggelassen. Dies ist nur für ELF-Ausführungsdateien mit dynamischen Relokationen sinnvoll und erfordert normalerweise einen Einstiegspunktcode, der diese Relokationen verarbeiten kann.

`--embedded-relocs`

Diese Option ähnelt der Option --emit-relocs, mit dem Unterschied, dass die Relokationen in einer zielspezifischen Sektion gespeichert werden. Diese Option wird nur von den Zielen BFIN, CR16 und M68K unterstützt.

`--disable-multiple-abs-defs`

Verhindert mehrere Definitionen mit Symbolen, die in Dateinamen enthalten sind, die durch -R oder --just-symbols aufgerufen werden.

`--fatal-warnings`
`--no-fatal-warnings`

Behandelt alle Warnungen als Fehler. Das Standardverhalten kann mit der Option --no-fatal-warnings wiederhergestellt werden.

`-w`
`--no-warnings`

Unterdrückt alle Warn- oder Fehlermeldungen. Dies überschreibt --fatal-warnings, falls diese aktiviert wurde. Diese Option kann verwendet werden, wenn bekannt ist, dass die resultierende Binärdatei nicht funktionieren wird, aber dennoch eine Erstellung erforderlich ist.

`--force-exe-suffix`

Stellt sicher, dass eine Ausgabedatei das Suffix .exe hat.

Wenn eine erfolgreich erstellte, vollständig verknüpfte Ausgabedatei nicht das Suffix .exe oder .dll hat, erzwingt diese Option, dass der Linker die Ausgabedatei in eine Datei mit demselben Namen und dem Suffix .exe kopiert. Diese Option ist nützlich, wenn unveränderte Unix-Makefiles auf einem Microsoft Windows-Host verwendet werden, da einige Versionen von Windows ein Image nicht ausführen, es sei denn, es endet mit dem Suffix .exe.


--gc-sections
--no-gc-sections

Aktivieren Sie die Garbage Collection nicht verwendeter Eingabesektionen. Dies wird auf Zielen, die diese Option nicht unterstützen, ignoriert. Das Standardverhalten (keine Durchführung dieser Garbage Collection) kann durch Angabe von --no-gc-sections auf der Kommandozeile wiederhergestellt werden. Beachten Sie, dass die Garbage Collection für COFF- und PE-Format-Ziele unterstützt wird, die Implementierung wird jedoch derzeit als experimentell betrachtet.

--gc-sections entscheidet, welche Eingabesektionen verwendet werden, indem Symbole und Relokationen untersucht werden. Die Sektion, die das Einstiegssymbol enthält, und alle Sektionen, die Symbole enthalten, die auf der Kommandozeile undefiniert sind, werden beibehalten, ebenso wie Sektionen, die von dynamischen Objekten referenzierte Symbole enthalten. Beachten Sie, dass beim Erstellen von Shared Libraries der Linker davon ausgehen muss, dass jedes sichtbare Symbol referenziert wird. Sobald diese anfängliche Menge an Sektionen bestimmt wurde, markiert der Linker rekursiv alle Sektionen, die durch ihre Relokationen referenziert werden, als verwendet. Siehe --entry, --undefined und --gc-keep-exported.

Diese Option kann beim teilweisen Linken (aktiviert mit der Option -r) verwendet werden. In diesem Fall müssen die zu behaltenden Symbole explizit entweder durch eine der Optionen --entry, --undefined oder --gc-keep-exported oder durch einen Befehl "ENTRY" im Linker-Skript angegeben werden.

Als GNU-Erweiterung werden ELF-Eingabesektionen, die mit dem Flag "SHF_GNU_RETAIN" markiert sind, nicht durch die Garbage Collection entfernt.

--print-gc-sections
--no-print-gc-sections

Listet alle Sektionen auf, die durch die Garbage Collection entfernt wurden. Die Auflistung wird auf stderr ausgegeben. Diese Option ist nur wirksam, wenn die Garbage Collection über die Option --gc-sections aktiviert wurde. Das Standardverhalten (die nicht entfernten Sektionen nicht aufzulisten) kann durch Angabe von --no-print-gc-sections auf der Kommandozeile wiederhergestellt werden.

--gc-keep-exported

Wenn --gc-sections aktiviert ist, verhindert diese Option die Garbage Collection nicht verwendeter Eingabesektionen, die globale Symbole mit Standard- oder geschützter Sichtbarkeit enthalten. Diese Option ist für ausführbare Dateien gedacht, bei denen nicht referenzierte Sektionen andernfalls unabhängig von der externen Sichtbarkeit der enthaltenen Symbole durch die Garbage Collection entfernt würden. Diese Option hat keine Auswirkung beim Linken von Shared Objects, da dies bereits das Standardverhalten ist. Diese Option wird nur für ELF-Format-Ziele unterstützt.

--print-output-format

Gibt den Namen des Standardausgabeformats aus (möglicherweise beeinflusst durch andere Befehlszeilenoptionen). Dies ist die Zeichenkette, die in einem Befehl "OUTPUT_FORMAT" im Linker-Skript angezeigt würde.

--print-memory-usage

Gibt die verwendete Größe, die Gesamtgröße und die verwendete Größe der Speicherbereiche an, die mit dem Befehl MEMORY erstellt wurden. Dies ist nützlich für Embedded-Ziele, um einen schnellen Überblick über die verfügbare Speichermenge zu erhalten. Das Ausgabeformat hat eine Kopfzeile und eine Zeile pro Bereich. Hier ist ein Beispiel für eine Ausgabe:


Speicherbereich Größe Belegt % Belegt
ROM: 256 KB 1 MB 25,00 %
RAM: 32 B 2 GB 0,00 %

Hinweis: Wenn Sie mehr über die Speichernutzung des Linkers selbst erfahren möchten, verwenden Sie die Option --stats.

--help

Gibt eine Zusammenfassung der Befehlszeilenoptionen auf der Standardausgabe aus und beendet das Programm.

--target-help

Gibt eine Zusammenfassung aller zielspezifischen Optionen auf der Standardausgabe aus und beendet das Programm.

-Map=mapfile

Gibt eine Link-Map in die Datei mapfile aus. Siehe die Beschreibung der Option -M oben. Wenn mapfile nur das Zeichen "-" ist, wird die Map in stdout geschrieben.

Das Angeben eines Verzeichnisses als mapfile führt dazu, dass die Link-Map als Datei innerhalb des Verzeichnisses geschrieben wird. Normalerweise wird der Name der Datei innerhalb des Verzeichnisses als der Basisname der Ausgabedatei mit ".map" angehängt berechnet. Wenn jedoch das Sonderzeichen "%" verwendet wird, wird dies durch den vollständigen Pfad der Ausgabedatei ersetzt. Darüber hinaus, wenn nach dem %-Zeichen Zeichen vorhanden sind, wird ".map" nicht mehr angehängt.

-o foo.exe -Map=bar [Erstellt ./bar]
-o ../dir/foo.exe -Map=bar [Erstellt ./bar]
-o foo.exe -Map=../dir [Erstellt ../dir/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir [Erstellt ../dir/foo.exe.map]
-o foo.exe -Map=% [Erstellt ./foo.exe.map]
-o ../dir/foo.exe -Map=% [Erstellt ../dir/foo.exe.map]
-o foo.exe -Map=%.bar [Erstellt ./foo.exe.bar]
-o ../dir/foo.exe -Map=%.bar [Erstellt ../dir/foo.exe.bar]
-o ../dir2/foo.exe -Map=../dir/% [Erstellt ../dir/../dir2/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir/%.bar [Erstellt ../dir/../dir2/foo.exe.bar]

Es ist ein Fehler, mehr als ein "%"-Zeichen anzugeben.

Wenn die Map-Datei bereits vorhanden ist, wird sie durch diese Operation überschrieben.

--no-keep-memory

ld optimiert normalerweise für Geschwindigkeit und nicht für die Speichernutzung, indem es die Symboltabellen der Eingabedateien im Speicher zwischenspeichert. Diese Option weist ld an, stattdessen die Speichernutzung zu optimieren, indem die Symboltabellen bei Bedarf erneut gelesen werden. Dies kann erforderlich sein, wenn ld beim Verlinken einer großen ausführbaren Datei den Speicherplatz ausgeht.

--no-undefined
-z defs

Meldet ungelöste Symbolreferenzen aus regulären Objektdateien. Dies wird auch dann durchgeführt, wenn der Linker eine nicht-symbolische Shared Library erstellt. Die Option --[no-]allow-shlib-undefined steuert das Verhalten beim Melden ungelöster Referenzen, die in Shared Libraries gefunden werden, die verlinkt werden.

Die Auswirkungen dieser Option können durch die Verwendung von "-z undefs" rückgängig gemacht werden.

--allow-multiple-definition
-z muldefs

Normalerweise meldet der Linker einen fatalen Fehler, wenn ein Symbol mehrfach definiert ist. Diese Optionen ermöglichen mehrere Definitionen, und die erste Definition wird verwendet.

--allow-shlib-undefined
--no-allow-shlib-undefined

Erlaubt oder verbietet unbestimmte Symbole in Shared Libraries. Dieser Schalter ist ähnlich wie --no-undefined, außer dass er das Verhalten bestimmt, wenn sich die unbestimmten Symbole in einer Shared Library und nicht in einer regulären Objektdatei befinden. Er hat keinen Einfluss darauf, wie unbestimmte Symbole in regulären Objektdateien behandelt werden.


Das Standardverhalten besteht darin, Fehler für alle nicht definierten Symbole zu melden, auf die in gemeinsam genutzten Bibliotheken verwiesen wird, wenn der Linker zum Erstellen einer ausführbaren Datei verwendet wird, diese aber zuzulassen, wenn der Linker zum Erstellen einer gemeinsam genutzten Bibliothek verwendet wird.

Die Gründe für die Zulassung von nicht definierten Symbolreferenzen in gemeinsam genutzten Bibliotheken, die zur Linkzeit angegeben werden, sind:

Eine zur Linkzeit angegebene gemeinsam genutzte Bibliothek ist möglicherweise nicht dieselbe wie die, die zur Laufzeit verfügbar ist, sodass das Symbol möglicherweise zur Laufzeit aufgelöst werden kann.

Es gibt einige Betriebssysteme, z. B. BeOS und HPPA, bei denen nicht definierte Symbole in gemeinsam genutzten Bibliotheken normal sind.

Der BeOS-Kernel patcht beispielsweise gemeinsam genutzte Bibliotheken zur Laufzeit, um die am besten geeignete Funktion für die aktuelle Architektur auszuwählen. Dies wird beispielsweise verwendet, um eine geeignete memset-Funktion dynamisch auszuwählen.

--error-handling-script=scriptname

Wenn diese Option angegeben wird, ruft der Linker das Skript scriptname auf, wenn ein Fehler auftritt. Derzeit werden jedoch nur zwei Arten von Fehlern unterstützt: fehlende Symbole und fehlende Bibliotheken. Dem Skript werden zwei Argumente übergeben: das Schlüsselwort "undefined-symbol" oder "missing-lib" und der Name des nicht definierten Symbols oder der fehlenden Bibliothek. Es ist vorgesehen, dass das Skript dem Benutzer Vorschläge gibt, wo das Symbol oder die Bibliothek gefunden werden könnte. Nachdem das Skript ausgeführt wurde, wird die normale Fehlermeldung des Linkers angezeigt.

Die Verfügbarkeit dieser Option wird über eine Konfigurationszeit-Option gesteuert, sodass sie in bestimmten Implementierungen möglicherweise nicht vorhanden ist.

--no-undefined-version

Normalerweise ignoriert der Linker ein Symbol mit einer nicht definierten Version. Diese Option verhindert, dass Symbole mit nicht definierter Version verwendet werden, und es wird stattdessen ein schwerwiegender Fehler ausgegeben.

--default-symver

Erstellt und verwendet eine Standard-Symbolversion (den Sonamen) für nicht versionierte exportierte Symbole.

--default-imported-symver

Erstellt und verwendet eine Standard-Symbolversion (den Sonamen) für nicht versionierte importierte Symbole.

--no-warn-mismatch

Normalerweise gibt ld einen Fehler aus, wenn Sie versuchen, Eingabedateien zu verknüpfen, die aus irgendeinem Grund nicht zusammenpassen, möglicherweise weil sie für verschiedene Prozessoren oder für verschiedene Endianness-Einstellungen kompiliert wurden. Mit dieser Option wird ld angewiesen, solche potenziellen Fehler stillschweigend zuzulassen. Diese Option sollte nur mit Vorsicht verwendet werden, in Fällen, in denen Sie Maßnahmen ergriffen haben, die sicherstellen, dass die Linker-Fehler unangemessen sind.

--no-warn-search-mismatch

Normalerweise gibt ld eine Warnung aus, wenn während einer Bibliotheksuche eine inkompatible Bibliothek gefunden wird. Mit dieser Option wird die Warnung unterdrückt.

--no-whole-archive

Schaltet die Wirkung der Option --whole-archive für nachfolgende Archivdateien aus.


--noinhibit-exec

Behalte die ausführbare Ausgabedatei bei, wenn sie noch verwendbar ist. Normalerweise erstellt der Linker keine Ausgabedatei, wenn er während des Link-Prozesses Fehler findet; er beendet sich, ohne eine Ausgabedatei zu schreiben, wenn er einen Fehler meldet.

-nostdlib

Durchsuche nur die Bibliotheksverzeichnisse, die explizit in der Befehlszeile angegeben sind. Bibliotheksverzeichnisse, die in Linkerskripten angegeben sind (einschließlich der in der Befehlszeile angegebenen Linkerskripte), werden ignoriert.

--oformat=ausgabeformat
ld kann so konfiguriert werden, dass es mehr als ein Objektdatei-Format unterstützt. Wenn dein ld auf diese Weise konfiguriert ist, kannst du die Option `--oformat` verwenden, um das Binärformat für die Ausgabedatei anzugeben. Auch wenn ld so konfiguriert ist, dass es alternative Objektformate unterstützt, musst du dies normalerweise nicht angeben, da ld standardmäßig das auf jeder Maschine am häufigsten verwendete Format ausgeben sollte. `ausgabeformat` ist eine Textzeichenfolge, der Name eines bestimmten Formats, das von den BFD-Bibliotheken unterstützt wird. (Du kannst die verfügbaren Binärformate mit `objdump -i` auflisten). Der Skriptbefehl `OUTPUT_FORMAT` kann auch das Ausgabeformat angeben, aber diese Option überschreibt dies.

--out-implib datei

Erstelle eine Importbibliothek in der Datei, die der ausführbaren Datei entspricht, die der Linker generiert (z. B. eine DLL oder ein ELF-Programm). Diese Importbibliothek (die *.dll.a oder *.a für DLLs genannt werden sollte) kann verwendet werden, um Clients mit der generierten ausführbaren Datei zu verknüpfen; dieses Verhalten macht es möglich, einen separaten Schritt zur Erstellung der Importbibliothek (z. B. dlltool für DLLs) zu überspringen. Diese Option ist nur für die i386 PE- und ELF-Zielports des Linkers verfügbar.

-pie
--pic-executable

Erstelle eine positionsunabhängige ausführbare Datei. Dies wird derzeit nur auf ELF-Plattformen unterstützt. Positionsunabhängige ausführbare Dateien werden vom dynamischen Linker an die virtuelle Adresse neu positioniert, die das Betriebssystem für sie wählt, was sich zwischen den Aufrufen ändern kann. Sie sind als ET_DYN im ELF-Datei-Header gekennzeichnet, unterscheiden sich aber in vielerlei Hinsicht von gemeinsam genutzten Bibliotheken. Insbesondere können definierte Symbole in einer PIE standardmäßig nicht von einem anderen Objekt überschrieben werden, wie dies bei einer gemeinsam genutzten Bibliothek der Fall ist.

-no-pie

Erstelle eine positionsabhängige ausführbare Datei. Dies ist der Standard.

-qmagic

Diese Option wird zur Kompatibilität mit Linux ignoriert.

-Qy Diese Option wird zur Kompatibilität mit SVR4 ignoriert.

--relax
--no-relax

Eine Option mit maschinenabhängigen Auswirkungen. Diese Option wird nur auf wenigen Zielen unterstützt.

Auf einigen Plattformen führt die Option --relax zielspezifische, globale Optimierungen durch, die möglich werden, wenn der Linker die Adressierung im Programm auflöst, z. B. das Vereinfachen von Adressierungsmodi, das Synthetisieren neuer Anweisungen, das Auswählen kürzerer Versionen aktueller Anweisungen und das Kombinieren von Konstantenwerten.

Auf einigen Plattformen können diese Linkzeit-Globaloptimierungen das symbolische Debuggen der resultierenden ausführbaren Datei unmöglich machen. Dies ist bekanntermaßen der Fall für die Matsushita MN10200- und MN10300-Prozessorfamilien.

Auf Plattformen, auf denen die Funktion unterstützt wird, deaktiviert die Option --no-relax diese.

Auf Plattformen, auf denen die Funktion nicht unterstützt wird, werden sowohl --relax als auch --no-relax akzeptiert, aber ignoriert.

`--retain-symbols-file=dateiname`

Behält nur die in der Datei dateiname aufgeführten Symbole bei und verwirft alle anderen. dateiname ist einfach eine einfache Datei mit jeweils einem Symbolnamen pro Zeile. Diese Option ist besonders nützlich in Umgebungen (wie VxWorks), in denen eine große globale Symboltabelle schrittweise aufgebaut wird, um den Laufzeitspeicher zu schonen.

`--retain-symbols-file` verwirft keine undefinierten Symbole oder Symbole, die für Relokationen benötigt werden.

Sie können --retain-symbols-file nur einmal in der Befehlszeile angeben. Sie überschreibt -s und -S.

`-rpath=verzeichnis`

Fügt ein Verzeichnis zum Suchpfad für Laufzeitbibliotheken hinzu. Dies wird beim Verknüpfen einer ELF-Datei mit gemeinsam genutzten Objekten verwendet. Alle -rpath-Argumente werden verkettet und an den Laufzeit-Linker übergeben, der sie verwendet, um die gemeinsam genutzten Objekte zur Laufzeit zu finden.

Die Option -rpath wird auch zum Auffinden der gemeinsam genutzten Objekte verwendet, die explizit in die Verknüpfung einbezogen werden; siehe die Beschreibung der Option -rpath-link. Das Durchsuchen von -rpath wird nur von nativen Linkern und Cross-Linkern unterstützt, die mit der Option --with-sysroot konfiguriert wurden.

Wenn -rpath beim Verknüpfen einer ELF-Datei nicht verwendet wird, wird der Inhalt der Umgebungsvariablen LD_RUN_PATH verwendet, falls diese definiert ist.

Die Option -rpath kann auch auf SunOS verwendet werden. Standardmäßig bildet der Linker auf SunOS einen Laufzeit-Suchpfad aus allen -L-Optionen, die ihm gegeben werden. Wenn eine -rpath-Option verwendet wird, wird der Laufzeit-Suchpfad ausschließlich mit den -rpath-Optionen gebildet, wobei die -L-Optionen ignoriert werden. Dies kann nützlich sein, wenn gcc verwendet wird, das viele -L-Optionen hinzufügt, die sich möglicherweise auf NFS-montierten Dateisystemen befinden.

Zur Kompatibilität mit anderen ELF-Linkern wird, wenn der Option -R ein Verzeichnisname und nicht ein Dateiname folgt, dieser als Option -rpath behandelt.

`-rpath-link=verzeichnis`

Wenn ELF oder SunOS verwendet wird, kann eine gemeinsam genutzte Bibliothek eine andere benötigen. Dies geschieht, wenn ein mit ld -shared erstelltes gemeinsam genutztes Objekt eine andere gemeinsam genutzte Bibliothek als eine seiner Eingabedateien enthält.

Wenn der Linker bei einer nicht-gemeinsamen, nicht-relokierbaren Verknüpfung auf eine solche Abhängigkeit stößt, versucht er automatisch, die erforderliche gemeinsam genutzte Bibliothek zu finden und in die Verknüpfung einzubeziehen, falls diese nicht explizit einbezogen wurde. In diesem Fall werden mehrere Verzeichnisse wie unten beschrieben durchsucht. Die Option -rpath-link gibt die erste Menge von zu durchsuchenden Verzeichnissen an. Diese Option kann eine Folge von Verzeichnisnamen angeben, entweder durch Angabe einer durch Doppelpunkte getrennten Liste von Namen oder durch mehrfaches Auftreten.

Die Token $ORIGIN und $LIB können in diesen Suchverzeichnissen vorkommen. Sie werden durch den vollständigen Pfad zu dem Verzeichnis ersetzt, das das Programm oder die gemeinsam genutzte Datei enthält, im Fall von $ORIGIN, und entweder lib - für 32-Bit-Binärdateien - oder lib64 - für 64-Bit-Binärdateien - im Fall von $LIB.


Die alternative Form dieser Token – ${ORIGIN} und ${LIB} – kann ebenfalls verwendet werden. Das Token $PLATFORM wird nicht unterstützt.

Die Option --rpath-link sollte mit Vorsicht verwendet werden, da sie den Suchpfad überschreibt, der möglicherweise in eine gemeinsam genutzte Bibliothek kompiliert wurde. In einem solchen Fall ist es möglich, versehentlich einen anderen Suchpfad zu verwenden, als der dynamische Linker zur Laufzeit verwenden würde.

Wenn zusätzliche gemeinsam genutzte Bibliotheken erforderlich sind, durchsucht der Linker die Verzeichnisse in der unten aufgeführten Reihenfolge, um sie zu finden. Beachten Sie jedoch, dass dies nur für zusätzliche Bibliotheken gilt, die zum Auflösen bereits eingebundener gemeinsam genutzter Bibliotheken benötigt werden. Es gilt nicht für Bibliotheken, die über die Option -l auf der Befehlszeile eingebunden werden. Suchvorgänge für -l-Bibliotheken werden nur in Verzeichnissen durchgeführt, die durch die Option -L angegeben werden.

Alle durch die Option -rpath-link angegebenen Verzeichnisse.

Alle durch die Option -rpath angegebenen Verzeichnisse. Der Unterschied zwischen -rpath und -rpath-link besteht darin, dass die durch die Option -rpath angegebenen Verzeichnisse in die ausführbare Datei aufgenommen und zur Laufzeit verwendet werden, während die Option -rpath-link nur zur Linkzeit wirksam ist. Das Durchsuchen von -rpath auf diese Weise wird nur von nativen Linkern und Cross-Linkern unterstützt, die mit der Option --with-sysroot konfiguriert wurden.

Auf einem ELF-System durchsucht der native Linker, wenn die Optionen -rpath und -rpath-link nicht verwendet wurden, den Inhalt der Umgebungsvariablen „LD_RUN_PATH“.

Auf SunOS durchsucht der Linker, wenn die Option -rpath nicht verwendet wurde, alle mit den Optionen -L angegebenen Verzeichnisse.

Für einen nativen Linker wird der Inhalt der Umgebungsvariablen „LD_LIBRARY_PATH“ durchsucht.

Für einen nativen ELF-Linker werden die Verzeichnisse in „DT_RUNPATH“ oder „DT_RPATH“ einer gemeinsam genutzten Bibliothek nach gemeinsam genutzten Bibliotheken durchsucht, die diese benötigt. Die Einträge „DT_RPATH“ werden ignoriert, wenn „DT_RUNPATH“-Einträge vorhanden sind.

Für einen Linker für ein Linux-System, wenn die Datei /etc/ld.so.conf existiert, wird die Liste der in dieser Datei gefundenen Verzeichnisse durchsucht. Hinweis: Der Pfad zu dieser Datei wird mit dem Wert „sysroot“ versehen, falls dieser definiert ist, und dann mit einer Zeichenfolge „prefix“, falls der Linker mit der Option --prefix= konfiguriert wurde.

Für einen nativen Linker auf einem FreeBSD-System werden alle durch das Makro „_PATH_ELF_HINTS“ in der Header-Datei elf-hints.h angegebenen Verzeichnisse durchsucht.

Alle durch einen Befehl „SEARCH_DIR“ in einem Linker-Skript durchsuchten Verzeichnisse, die auf der Befehlszeile angegeben werden, einschließlich Skripte, die mit -T (aber nicht -dT) angegeben werden.

Die Standardverzeichnisse, normalerweise /lib und /usr/lib.

Alle durch ein Plugin LDPT_SET_EXTRA_LIBRARY_PATH angegebenen Verzeichnisse.

Alle durch einen Befehl „SEARCH_DIR“ in einem Standard-Linker-Skript durchsuchten Verzeichnisse.

Beachten Sie jedoch, dass es auf Linux-basierten Systemen eine zusätzliche Besonderheit gibt: Wenn die Option --as-needed aktiv ist und eine gemeinsam genutzte Bibliothek gefunden wird, die normalerweise die Suche erfüllen würde, und diese Bibliothek kein DT_NEEDED-Tag für libc.so hat, und es sich eine zweite gemeinsam genutzte Bibliothek weiter unten in der Menge der Suchverzeichnisse befindet, die ebenfalls die Suche erfüllt und ein DT_NEEDED-Tag für libc.so hat, dann wird die zweite Bibliothek anstelle der ersten ausgewählt.


Wenn die erforderliche gemeinsam genutzte Bibliothek nicht gefunden wird, gibt der Linker eine Warnung aus und setzt den Linkvorgang fort.

`--section-ordering-file=script`

Diese Option wird verwendet, um das aktuelle Linkerskript mit zusätzlichen Zuordnungen von Eingangsabschnitten zu Ausgangsabschnitten zu erweitern. Diese Datei muss die gleiche Syntax für "SECTIONS" verwenden wie normale Linkerskripte, sollte aber nichts anderes tun, als Eingangsabschnitte in Ausgangsabschnitte zu platzieren. @pxref{SECTIONS}

Eine weitere Einschränkung für das Abschnitts-Anordnungs-Skript besteht darin, dass es nur auf Ausgangsabschnitte verweisen kann, die bereits durch das aktuell verwendete Linkerskript definiert sind (d. h. das Standard-Linkerskript oder ein über die Kommandozeile angegebenes Skript). Der Vorteil des Abschnitts-Anordnungs-Skripts besteht jedoch darin, dass die Eingangsabschnitte an den Anfang der Ausgangsabschnitte zugeordnet werden, sodass die Anordnung der Abschnitte im Ausgangsabschnitt sichergestellt werden kann. Stellen Sie sich beispielsweise vor, das Standard-Linkerskript sieht wie folgt aus:

SECTIONS {
  .text : { *(.text.hot) ; *(.text .text.*) }
  .data : { *(.data.big) ; *(.data .data.*) }
}

Wenn dann eine Abschnitts-Anordnungsdatei wie diese verwendet wird:

.text : { *(.text.first) ; *(.text.z*) }
.data : { foo.o(.data.first) ; *(.data.small) }

Dies wäre äquivalent zu einem Linkerskript wie diesem:

SECTIONS {
  .text : { *(.text.first) ; *(.text.z*) ; *(.text.hot) ; *(.text .text.*) }
  .data : { foo.o(.data.first) ; *(.data.small) ; *(.data.big) ; *(.data .data.*) }
}

Der Vorteil der Abschnitts-Anordnungsdatei besteht darin, dass sie verwendet werden kann, um diejenigen Abschnitte anzuordnen, die für den Benutzer wichtig sind, ohne sich um andere Abschnitte, Speicherbereiche oder etwas anderes kümmern zu müssen.

`-shared`
`-Bshareable`

Erstellt eine gemeinsam genutzte Bibliothek. Dies wird derzeit nur auf ELF-, XCOFF- und SunOS-Plattformen unterstützt. Auf SunOS erstellt der Linker automatisch eine gemeinsam genutzte Bibliothek, wenn die Option -e nicht verwendet wird und undefinierte Symbole im Link vorhanden sind.

`--sort-common`
`--sort-common=ascending`
`--sort-common=descending`

Diese Option weist ld an, die gemeinsamen Symbole nach Ausrichtung in aufsteigender oder absteigender Reihenfolge zu sortieren, wenn sie in die entsprechenden Ausgangsabschnitte platziert werden. Die berücksichtigten Symbolausrichtungen sind sechzehn Byte oder größer, acht Byte, vier Byte, zwei Byte und ein Byte. Dies soll verhindern, dass aufgrund von Ausrichtungseinschränkungen Lücken zwischen den Symbolen entstehen. Wenn keine Sortierreihenfolge angegeben ist, wird standardmäßig die absteigende Reihenfolge verwendet.

`--sort-section=name`

Diese Option wendet "SORT_BY_NAME" auf alle Wildcard-Abschnittsmuster im Linkerskript an.


--sort-section=alignment

Diese Option wendet „SORT_BY_ALIGNMENT“ auf alle Wildcard-Abschnittsmuster in der Linkerskriptdatei an.

--spare-dynamic-tags=count

Mit dieser Option wird die Anzahl der leeren Slots angegeben, die im Abschnitt .dynamic von ELF-Shared-Objekten reserviert werden sollen. Leere Slots können von Nachbearbeitungswerkzeugen wie dem Prelinker benötigt werden. Der Standardwert ist 5.

--split-by-file[=size]

Ähnlich wie --split-by-reloc, erstellt aber einen neuen Ausgabeschnitt für jede Eingabedatei, wenn die Größe erreicht ist. Wenn keine Größe angegeben wird, ist der Standardwert 1.

--split-by-reloc[=count]

Versucht, zusätzliche Abschnitte in der Ausgabedatei zu erstellen, so dass kein einzelner Ausgabeschnitt in der Datei mehr als „count“-Relokationen enthält. Dies ist nützlich beim Erstellen großer, relocierbarer Dateien zum Herunterladen in bestimmte Echtzeit-Kernel mit dem COFF-Objektdateiformat, da COFF nicht mehr als 65535 Relokationen in einem einzelnen Abschnitt darstellen kann. Beachten Sie, dass dies nicht mit Objektdateiformaten funktioniert, die keine beliebigen Abschnitte unterstützen. Der Linker wird einzelne Eingabeschnitte nicht aufteilen und neu verteilen, so dass, wenn ein einzelner Eingabeschnitt mehr als „count“-Relokationen enthält, ein Ausgabeschnitt diese Anzahl an Relokationen enthalten wird. Der Standardwert für „count“ ist 32768.

--stats[=filename]

Berechnet und zeigt Statistiken über den Betrieb des Linkers an, wie z. B. Ausführungszeit und Speichernutzung.

Wenn das optionale Dateinamenargument nicht angegeben wird, werden nur grundlegende Informationen gemeldet und an den Standardfehler-Ausgabestrom gesendet. Wenn das Dateinamenargument angegeben wird, werden erweiterte Informationen in die angegebene Datei geschrieben. Wenn der Dateiname einfach auf das Symbol gesetzt ist, werden die erweiterten Informationen an den Standardausgabestrom gesendet. Wenn der Dateiname mit + beginnt, wird die Datei im Anfügemodus und nicht im Überschreibungsmodus geöffnet.

Wenn die Option -Map aktiviert wurde, werden die Informationen auch in der Map-Datei gespeichert. Beachten Sie: Wenn sowohl die Option --stats als auch die Option -Map Dateinamenargumente haben und diese übereinstimmen, werden die Informationen nur einmal ausgegeben, nicht zweimal.

Wenn die Umgebungsvariable „LD_STATS“ definiert ist, verhält sie sich wie die Option --stats. Wenn der Wert der Variablen eine Zeichenkette ist, wird diese als Name einer Datei verwendet, in die die Informationen geschrieben werden sollen. Andernfalls werden die Informationen an den Standardausgabestrom gesendet. Die Verwendung der Umgebungsvariable ermöglicht es, Statistiken aufzuzeichnen, ohne die Befehlszeile des Linkers ändern zu müssen. Beachten Sie: Wenn sowohl die Umgebungsvariable als auch die Option --stats verwendet werden, hat die Option --stats Vorrang.

Die gemeldeten erweiterten Informationen umfassen die CPU-Zeit und, falls die Systembibliothek „getrusage()“ verfügbar ist, wird auch die Speichernutzung erfasst. Diese Informationen werden für einzelne Teile des Linkvorgangs gemeldet, die als Phasen bezeichnet werden. Darüber hinaus werden die Informationen auch für eine spezielle Phase namens ALL gemeldet, die den gesamten Linkvorgang abdeckt. Beachten Sie, dass einzelne Phasen einander enthalten oder sich überschneiden können, so dass nicht davon ausgegangen werden sollte, dass die Gesamtressourcen, die vom Linker verwendet werden, die Summe der von den einzelnen Phasen verwendeten Ressourcen sind.


Zusätzlich werden, wenn detaillierte Informationen gemeldet werden, die Linker-Version, die Befehlszeilenargumente und die Linker-Startzeit ebenfalls angezeigt. Dies erleichtert die Handhabung von Situationen, in denen mehrere Links von einem Build-System aufgerufen werden, und ermöglicht die genaue Identifizierung, welche Argumente für die Erstellung der gemeldeten Statistiken verantwortlich waren.

Die detaillierte Ausgabe sieht in etwa so aus:

Stats: Linker-Version: (GNU Binutils) 2.44.50.20250401
Stats: Linker gestartet: Mi 02.04.2025 09:36:41
Stats: Argumente: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...]

Stats: Phase               CPU-Zeit    Speicher      Benutzerzeit    Systemzeit
Stats: Name                (Mikrosekunden)   (KiB)      (Sekunden)      (Sekunden)
Stats: GESAMT               390082    217740              0              0
Stats: CTF-Verarbeitung            12         0              0              0
Stats: Zeichenkettenzusammenführung            1324         0              0              0
Stats: Parsen                  349       288              0              0
Stats: Plugins                    1         0              0              0
Stats: Dateiverarbeitung      259616    214524              0              0
Stats: Schreiben                 116493         0              0              0

--no-stats

Deaktiviert die Berichterstattung von Nutzungsstatistiken, falls diese über die Befehlszeilenoption --stats oder die Umgebungsvariable LD_STATS aktiviert wurde.

--sysroot=verzeichnis

Verwendet das angegebene Verzeichnis als Speicherort des Sysroot und überschreibt den zur Konfigurationszeit festgelegten Standardwert. Diese Option wird nur von Linkern unterstützt, die mit --with-sysroot konfiguriert wurden.

--task-link

Dies wird von COFF/PE-basierten Zielen verwendet, um eine "task-linked" Objektdatei zu erstellen, bei der alle globalen Symbole in statische Symbole umgewandelt werden.

--traditional-format

Für einige Ziele unterscheidet sich die Ausgabe von ld in einigen Punkten von der Ausgabe anderer Linker. Mit dieser Option wird ld angewiesen, stattdessen das traditionelle Format zu verwenden.

Zum Beispiel kombiniert ld unter SunOS doppelte Einträge in der Symbol-String-Tabelle. Dies kann die Größe einer Ausgabedatei mit vollständigen Debugging-Informationen um über 30 Prozent reduzieren. Leider kann das SunOS-"dbx"-Programm das resultierende Programm nicht lesen ("gdb" hat damit keine Probleme). Die Option --traditional-format weist ld an, doppelte Einträge nicht zu kombinieren.

--section-start=sektionsname=org

Platziert eine Sektion in der Ausgabedatei an der absoluten Adresse, die durch "org" angegeben wird. Sie können diese Option beliebig oft verwenden, um mehrere Sektionen in der Befehlszeile zu platzieren. "org" muss eine einzelne hexadezimale Ganzzahl sein; zur Kompatibilität mit anderen Linkern können Sie das vorangestellte "0x", das normalerweise mit hexadezimalen Werten verbunden ist, weglassen. Hinweis: Es darf keinen Leerzeichen zwischen "sektionsname", dem Gleichheitszeichen ("=") und "org" geben.


--image-base=org

Wenn ELF verwendet wird, ist dies dasselbe wie -Ttext-segment, wobei beide Optionen effektiv die Basisadresse des ELF-Ausführbaren festlegen.

Wenn PE verwendet wird, verwenden Sie den Wert als Basisadresse Ihres Programms oder Ihrer DLL. Dies ist der niedrigste Speicherort, der beim Laden Ihres Programms oder Ihrer DLL verwendet wird. Um die Notwendigkeit der Neuzuordnung zu reduzieren und die Leistung Ihrer DLLs zu verbessern, sollte jede DLL eine eindeutige Basisadresse haben und sich nicht mit anderen DLLs überschneiden. Der Standardwert ist 0x400000 für ausführbare Dateien und 0x10000000 für DLLs.

-Tbss=org
-Tdata=org
-Ttext=org

Das Gleiche wie --section-start, wobei ".bss", ".data" oder ".text" der Sektionsname ist.

-Ttext-segment=org

Beim Erstellen einer ELF-Ausführbaren Datei wird damit die Adresse des ersten Bytes des ersten Segments festgelegt. Beachten Sie, dass, wenn -pie zusammen mit -Ttext-segment=org verwendet wird, die Ausgabedatei als ET_EXEC markiert wird, sodass die Adresse des ersten Bytes des Textsegments zur Laufzeit garantiert auf org gesetzt wird.

-Trodata-segment=org

Beim Erstellen einer ELF-Ausführbaren Datei oder eines gemeinsam genutzten Objekts für ein Ziel, bei dem die schreibgeschützten Daten in einem eigenen Segment getrennt vom ausführbaren Text gespeichert sind, wird damit die Adresse des ersten Bytes des schreibgeschützten Datensegments festgelegt.

-Tldata-segment=org

Beim Erstellen einer ELF-Ausführbaren Datei oder eines gemeinsam genutzten Objekts für das x86-64-Speichermodell mittlerer Größe wird damit die Adresse des ersten Bytes des ldata-Segments festgelegt.

--unresolved-symbols=methode

Bestimmt, wie mit nicht aufgelösten Symbolen umgegangen werden soll. Es gibt vier mögliche Werte für die Methode:

ignore-all

Melden Sie keine nicht aufgelösten Symbole.

report-all

Melden Sie alle nicht aufgelösten Symbole. Dies ist die Standardeinstellung.

ignore-in-object-files

Melden Sie nicht aufgelöste Symbole, die in gemeinsam genutzten Bibliotheken enthalten sind, ignorieren Sie sie jedoch, wenn sie aus regulären Objektdateien stammen.

ignore-in-shared-libs

Melden Sie nicht aufgelöste Symbole, die aus regulären Objektdateien stammen, ignorieren Sie sie jedoch, wenn sie aus gemeinsam genutzten Bibliotheken stammen. Dies kann nützlich sein, wenn eine dynamische Bibliothek erstellt wird und bekannt ist, dass alle gemeinsam genutzten Bibliotheken, auf die verwiesen werden soll, in der Befehlszeile des Linkers enthalten sind.

Das Verhalten für gemeinsam genutzte Bibliotheken kann auch mit der Option --[no-]allow-shlib-undefined gesteuert werden.

Normalerweise erzeugt der Linker eine Fehlermeldung für jedes gemeldete nicht aufgelöste Symbol, aber die Option --warn-unresolved-symbols kann dies in eine Warnung ändern.

--dll-verbose
--verbose[=ZAHL]

Zeigen Sie die Versionsnummer für ld an und listen Sie die vom Linker unterstützten Linker-Emulationen auf. Zeigen Sie an, welche Eingabedateien geöffnet werden können und welche nicht. Zeigen Sie das vom Linker verwendete Linker-Skript an. Wenn das optionale Argument ZAHL größer als 1 ist, werden auch Plugin-Symbolstatus angezeigt.

--version-script=versionsskriptdatei

Geben Sie den Namen eines Versionsskripts für den Linker an. Dies wird normalerweise beim Erstellen von gemeinsam genutzten Bibliotheken verwendet, um zusätzliche Informationen über die Versionhierarchie der erstellten Bibliothek anzugeben. Diese Option wird nur auf ELF-Plattformen, die gemeinsam genutzte Bibliotheken unterstützen, vollständig unterstützt; siehe VERSION. Sie wird teilweise auf PE-Plattformen unterstützt, die Versionsskripte verwenden können, um die Symbol-Sichtbarkeit im Auto-Export-Modus zu filtern: alle im Versionsskript als lokal gekennzeichneten Symbole werden nicht exportiert.


    --warn-common
    Warnt, wenn ein gebräuchliches Symbol mit einem anderen gebräuchlichen Symbol oder mit einer Symboldefinition kombiniert wird.
    Unix-Linker erlauben diese etwas unsaubere Praxis, aber Linker auf einigen anderen Betriebssystemen
    erlauben dies nicht. Diese Option ermöglicht es Ihnen, potenzielle Probleme durch die Kombination globaler Symbole zu finden.
    Leider verwenden einige C-Bibliotheken diese Praxis, sodass Sie möglicherweise einige Warnungen über Symbole
    in den Bibliotheken sowie in Ihren Programmen erhalten.

Es gibt drei Arten von globalen Symbolen, die hier durch C-Beispiele veranschaulicht werden:

    int i = 1;
    Eine Definition, die im initialisierten Datenbereich der Ausgabedatei gespeichert wird.

    extern int i;
    Eine undefinierte Referenz, die keinen Speicherplatz zuweist. Es muss entweder eine Definition
    oder ein gebräuchliches Symbol für die Variable irgendwo vorhanden sein.

    int i;
    Ein gebräuchliches Symbol. Wenn es nur (ein oder mehrere) gebräuchliche Symbole für eine Variable gibt, wird diese
    im nicht initialisierten Datenbereich der Ausgabedatei gespeichert. Der Linker fasst mehrere gebräuchliche
    Symbole für dieselbe Variable zu einem einzigen Symbol zusammen. Wenn diese unterschiedliche Größen haben,
    wählt er die größte Größe aus. Der Linker wandelt ein gebräuchliches Symbol in eine Deklaration um, wenn
    eine Definition derselben Variable vorhanden ist.

Die Option --warn-common kann fünf Arten von Warnungen erzeugen. Jede Warnung besteht aus einem Paar von Zeilen: Die erste beschreibt das gerade gefundene Symbol, und die zweite beschreibt das vorherige Symbol mit demselben Namen. Eines oder beide der beiden Symbole ist ein gebräuchliches Symbol.

              Ein gebräuchliches Symbol in eine Referenz umwandeln, weil bereits eine Definition für
    das Symbol vorhanden ist.

    <file>(<section>): warning: common of `<symbol>'
    wird durch Definition überschrieben
    <file>(<section>): warning: hier definiert

              Ein gebräuchliches Symbol in eine Referenz umwandeln, weil eine spätere Definition für das Symbol
    gefunden wird. Dies ist der gleiche Fall wie der vorherige, außer dass die Symbole
    in einer anderen Reihenfolge gefunden werden.

    <file>(<section>): warning: Definition von `<symbol>'
    überschreibt gebräuchliches Symbol
    <file>(<section>): warning: gebräuchliches Symbol ist hier

              Ein gebräuchliches Symbol mit einem vorherigen gleich großen gebräuchlichen Symbol zusammenführen.

    <file>(<section>): warning: mehrere gebräuchliche Symbole
    von `<symbol>'
    <file>(<section>): warning: vorheriges gebräuchliches Symbol ist hier

              Ein gebräuchliches Symbol mit einem vorherigen größeren gebräuchlichen Symbol zusammenführen.

    <file>(<section>): warning: gebräuchliches Symbol von `<symbol>'
    wird durch größeres gebräuchliches Symbol überschrieben
    <file>(<section>): warning: größeres gebräuchliches Symbol ist hier

              Ein gebräuchliches Symbol mit einem vorherigen kleineren gebräuchlichen Symbol zusammenführen. Dies ist der gleiche Fall wie der
    vorherige, außer dass die Symbole in einer anderen Reihenfolge gefunden werden.

<file>(<section>): Warnung: häufig von `<symbol>'
überschreibt kleinere häufigkeit
<file>(<section>): Warnung: kleinere häufigkeit ist hier

--warn-constructors
Warnen, wenn globale Konstruktoren verwendet werden. Dies ist nur für einige Objektdateiformate nützlich.
Für Formate wie COFF oder ELF kann der Linker die Verwendung globaler Konstruktoren nicht erkennen.

--warn-execstack
--warn-execstack-objects
--no-warn-execstack
Auf ELF-Plattformen kann der Linker Warnmeldungen generieren, wenn er aufgefordert wird, eine Ausgabedatei zu erstellen, die einen ausführbaren Stack enthält. Es gibt drei mögliche Zustände:

     Keine Warnungen generieren.

     Immer Warnungen generieren, auch wenn der ausführbare Stack über die Befehlszeilenoption -z execstack angefordert wird.

     Nur eine Warnung generieren, wenn eine Objektdatei einen ausführbaren Stack anfordert, aber nicht, wenn die Option -z execstack verwendet wird.

Der Standardzustand hängt davon ab, wie der Linker konfiguriert wurde, als er erstellt wurde. Die Option --no-warn-execstack versetzt den Linker immer in den Zustand ohne Warnungen. Die Option --warn-execstack versetzt den Linker in den Zustand "immer warnen". Die Option --warn-execstack-objects versetzt den Linker in den Zustand "nur für Objektdateien warnen".

Hinweis: ELF-Format-Eingabedateien können angeben, dass sie einen ausführbaren Stack benötigen, indem sie einen .note.GNU-stack-Abschnitt mit dem gesetzten ausführbaren Bit in seinen Abschnittsflags haben. Sie können angeben, dass sie keinen ausführbaren Stack benötigen, indem sie denselben Abschnitt verwenden, aber ohne das gesetzte ausführbare Bit. Wenn eine Eingabedatei keinen .note.GNU-stack-Abschnitt hat, ist das Standardverhalten zielspezifisch. Für einige Ziele impliziert das Fehlen eines solchen Abschnitts, dass ein ausführbarer Stack erforderlich ist. Dies ist oft ein Problem für manuell erstellte Assemblerdateien.

--error-execstack
--no-error-execstack
Wenn der Linker eine Warnmeldung über einen ausführbaren Stack generieren wird, wandelt die Option --error-execstack diese Warnung stattdessen in einen Fehler um. Beachten Sie, dass diese Option den Warnstatus des Linkers für ausführbare Stacks nicht ändert. Verwenden Sie --warn-execstack oder --warn-execstack-objects, um einen bestimmten Warnstatus festzulegen.

Die Option --no-error-execstack stellt das Standardverhalten zum Generieren von Warnmeldungen wieder her.

--warn-multiple-gp
Warnen, wenn mehrere globale Zeigerwerte in der Ausgabedatei erforderlich sind. Dies ist nur für bestimmte Prozessoren, wie z. B. Alpha, von Bedeutung. Insbesondere legen einige Prozessoren große Konstanten in einen speziellen Abschnitt. Ein spezielles Register (der globale Zeiger) zeigt auf die Mitte dieses Abschnitts, so dass Konstanten effizient über eine Basisregister-relative Adressierungsmethode geladen werden können. Da der Offset in der Basisregister-relativen Adressierung fest und relativ klein ist (z. B. 16 Bit), begrenzt dies die maximale Größe des Konstantenpools. Daher ist es in großen Programmen oft notwendig, mehrere globale Zeigerwerte zu verwenden, um alle möglichen Konstanten adressieren zu können. Diese Option bewirkt, dass eine Warnung ausgegeben wird, wenn dies der Fall ist.

--warn-once

Nur einmal für jedes undefinierte Symbol warnen, anstatt einmal pro Modul, das darauf verweist.

--warn-rwx-segments
--no-warn-rwx-segments

Warnen, wenn der Linker ein ladbares, nicht-null-großes Segment erstellt, das alle drei Berechtigungsflags (Lesen, Schreiben und Ausführen) gesetzt hat. Ein solches Segment stellt eine potenzielle Sicherheitslücke dar. Zusätzlich werden Warnungen generiert, wenn ein Thread-Lokaler-Speicher-Segment mit dem Ausführungsberechtigungsflag erstellt wird, unabhängig davon, ob die Lese- und/oder Schreibflags gesetzt sind.

Diese Warnungen sind standardmäßig aktiviert. Sie können über die Option --no-warn-rwx-segments deaktiviert und über die Option --warn-rwx-segments wieder aktiviert werden.

--error-rwx-segments
--no-error-rwx-segments

Wenn der Linker eine Warnmeldung über ein ausführbares, beschreibbares Segment oder ein ausführbares TLS-Segment generieren würde, wandelt die Option --error-rwx-segments diese Warnung in einen Fehler um. Die Option --no-error-rwx-segments stellt das Standardverhalten wieder her, bei dem nur eine Warnmeldung generiert wird.

Hinweis: Die Option --error-rwx-segments aktiviert nicht automatisch Warnungen über diese Segmente. Diese Warnungen sind entweder standardmäßig aktiviert, wenn der Linker so konfiguriert wurde, oder über die Befehlszeilenoption --warn-rwx-segments.

--warn-section-align

Warnen, wenn die Adresse eines Ausgabesegments geändert wird, weil eine Ausrichtung erforderlich ist. Normalerweise wird die Ausrichtung durch ein Eingabesegment festgelegt. Die Adresse wird nur dann geändert, wenn sie nicht explizit angegeben ist; das heißt, wenn der Befehl "SECTIONS" keine Startadresse für das Segment angibt.

--warn-textrel

Warnen, wenn der Linker DT_TEXTREL zu einem positionsunabhängigen ausführbaren Programm oder einer gemeinsam genutzten Bibliothek hinzufügt.

--warn-alternate-em

Warnen, wenn ein Objekt alternativen ELF-Maschinencode hat.

--warn-unresolved-symbols

Wenn der Linker ein nicht aufgelöstes Symbol meldet (siehe die Option --unresolved-symbols), generiert er normalerweise einen Fehler. Diese Option bewirkt, dass stattdessen eine Warnung generiert wird.

--error-unresolved-symbols

Dies stellt das Standardverhalten des Linkers wieder her, bei dem Fehler generiert werden, wenn nicht aufgelöste Symbole gemeldet werden.

--whole-archive

Für jede Archivdatei, die auf der Befehlszeile nach der Option --whole-archive angegeben wird, wird jede Objektdatei in dem Archiv in den Link einbezogen, anstatt das Archiv nach den erforderlichen Objektdateien zu durchsuchen. Dies wird normalerweise verwendet, um eine Archivdatei in eine gemeinsam genutzte Bibliothek umzuwandeln, wobei jede Objektdatei in die resultierende gemeinsam genutzte Bibliothek einbezogen wird. Diese Option kann mehr als einmal verwendet werden.

Zwei Hinweise bei der Verwendung dieser Option von gcc: Erstens kennt gcc diese Option nicht, daher müssen Sie -Wl,-whole-archive verwenden. Zweitens sollten Sie nicht vergessen, -Wl,-no-whole-archive nach Ihrer Liste von Archiven zu verwenden, da gcc seine eigene Liste von Archiven zu Ihrem Link hinzufügt und Sie dies möglicherweise nicht für diese Archiven wünschen.


--wrap=symbol

Verwende eine Wrapper-Funktion für Symbol. Jede undefinierte Referenz zu Symbol wird zu "__wrap_symbol" aufgelöst. Jede undefinierte Referenz zu "__real_symbol" wird zu Symbol aufgelöst.

Dies kann verwendet werden, um einen Wrapper für eine Systemfunktion bereitzustellen. Die Wrapper-Funktion sollte "__wrap_symbol" heißen. Wenn sie die Systemfunktion aufrufen möchte, sollte sie "__real_symbol" aufrufen.

Hier ist ein triviales Beispiel:

void *
__wrap_malloc (size_t c)
{
printf ("malloc wurde mit %zu aufgerufen\n", c);
return __real_malloc (c);
}

Wenn Sie andere Code mit dieser Datei unter Verwendung von --wrap malloc verknüpfen, werden alle Aufrufe von "malloc" stattdessen die Funktion "__wrap_malloc" aufrufen. Der Aufruf von "__real_malloc" in "__wrap_malloc" ruft die tatsächliche "malloc"-Funktion auf.

Möglicherweise möchten Sie auch eine Funktion "__real_malloc" bereitstellen, sodass Links ohne die Option --wrap erfolgreich sind. Wenn Sie dies tun, sollten Sie die Definition von "__real_malloc" nicht in derselben Datei wie "__wrap_malloc" platzieren; wenn Sie dies tun, kann der Assembler den Aufruf auflösen, bevor der Linker die Möglichkeit hat, ihn auf "malloc" zu mappen.

Nur undefinierte Referenzen werden vom Linker ersetzt. Daher werden translationseinheitinterne Referenzen auf Symbol nicht zu "__wrap_symbol" aufgelöst. Im nächsten Beispiel wird der Aufruf von "f" in "g" nicht zu "__wrap_f" aufgelöst.

int
f (void)
{
return 123;
}

int
g (void)
{
return f();
}

--eh-frame-hdr
--no-eh-frame-hdr
Fordern Sie (--eh-frame-hdr) oder unterdrücken Sie (--no-eh-frame-hdr) die Erstellung des Abschnitts ".eh\_frame\_hdr" und des ELF-Segments "PT_GNU_EH_FRAME".

--no-ld-generated-unwind-info
Fordern Sie die Erstellung von ".eh\_frame"-Unwind-Informationen für vom Linker generierte Codeabschnitte wie PLT an.

Diese Option ist standardmäßig aktiviert, wenn der Linker die Erstellung von Unwind-Informationen unterstützt. Diese Option steuert auch die Erstellung von ".sframe"-Stacktrace-Informationen für vom Linker generierte Codeabschnitte wie PLT.

--enable-new-dtags
--disable-new-dtags

Dieser Linker kann die neuen dynamischen Tags in ELF erstellen. Ältere ELF-Systeme unterstützen diese jedoch möglicherweise nicht. Wenn Sie --enable-new-dtags angeben, werden die neuen dynamischen Tags nach Bedarf erstellt, und ältere dynamische Tags werden weggelassen. Wenn Sie --disable-new-dtags angeben, werden keine neuen dynamischen Tags erstellt. Standardmäßig werden keine neuen dynamischen Tags erstellt. Beachten Sie, dass diese Optionen nur für ELF-Systeme verfügbar sind.

--hash-size=number

Legen Sie die Standardgröße der Hash-Tabellen des Linkers auf eine Primzahl nahe der angegebenen Zahl fest. Durch die Erhöhung dieses Wertes kann die Zeit, die der Linker für seine Aufgaben benötigt, verkürzt werden, auf Kosten eines erhöhten Speicherbedarfs des Linkers. In ähnlicher Weise kann die Verringerung dieses Wertes den Speicherbedarf reduzieren, auf Kosten der Geschwindigkeit. Der Standardwert ist unter normalen Umständen 4051 und 1021, wenn die Befehlszeilenoption --reduce-memory-overheads verwendet wird.


--hash-style=style
Legt den Typ der Hashtabelle(n) des Linkers fest. `style` kann entweder "sysv" für die klassische ELF-".hash"-Sektion, "gnu" für die neue GNU-".gnu.hash"-Sektion oder "both" für sowohl die klassische ELF-".hash"- als auch die neue GNU-".gnu.hash"-Hashtabelle sein. Der Standardwert hängt davon ab, wie der Linker konfiguriert wurde, aber für die meisten Linux-basierten Systeme ist er "both".

--compress-debug-sections=none
--compress-debug-sections=zlib
--compress-debug-sections=zlib-gnu
--compress-debug-sections=zlib-gabi
--compress-debug-sections=zstd
Auf ELF-Plattformen steuern diese Optionen, wie DWARF-Debug-Sektionen mit zlib komprimiert werden.

--compress-debug-sections=none komprimiert DWARF-Debug-Sektionen nicht.
--compress-debug-sections=zlib-gnu komprimiert DWARF-Debug-Sektionen und benennt sie so um, dass sie mit .zdebug beginnen, anstatt mit .debug. --compress-debug-sections=zlib-gabi komprimiert ebenfalls DWARF-Debug-Sektionen, benennt sie aber nicht um, sondern setzt das SHF_COMPRESSED-Flag in den Sektions-Headern.

Die Option --compress-debug-sections=zlib ist ein Alias für --compress-debug-sections=zlib-gabi.

--compress-debug-sections=zstd komprimiert DWARF-Debug-Sektionen mit zstd.

Beachten Sie, dass diese Option jegliche Komprimierung in eingehenden Debug-Sektionen überschreibt. Wenn also eine Binärdatei beispielsweise mit --compress-debug-sections=none verknüpft wird, werden alle komprimierten Debug-Sektionen in den Eingabedateien vor dem Kopieren in die Ausgabedatei dekomprimiert.

Das Standardverhalten der Komprimierung variiert je nach Ziel und den Konfigurationsoptionen, die zum Erstellen der Toolchain verwendet werden. Der Standardwert kann durch Überprüfen der Ausgabe der Option --help des Linkers ermittelt werden.

--reduce-memory-overheads
Diese Option reduziert den Speicherbedarf zur Laufzeit des ld, was jedoch mit einer Verringerung der Link-Geschwindigkeit verbunden ist. Sie wurde eingeführt, um den alten O(n^2)-Algorithmus für die Generierung der Link-Map-Datei anstelle des neuen O(n)-Algorithmus auszuwählen, der etwa 40 % mehr Speicher für die Symbolspeicherung benötigt.

Eine weitere Auswirkung des Schalters besteht darin, die Standard-Hashtabellengröße auf 1021 zu setzen, was ebenfalls Speicher spart, aber die Laufzeit des Linkers verlängert. Dies geschieht jedoch nicht, wenn der Schalter --hash-size verwendet wurde.

Der Schalter --reduce-memory-overheads kann auch verwendet werden, um in zukünftigen Versionen des Linkers weitere Kompromisse zu ermöglichen.

--max-cache-size=size
ld speichert normalerweise die Relokationsinformationen und Symboltabellen der Eingabedateien im Speicher mit unbegrenzter Größe. Mit dieser Option wird die maximale Cache-Größe auf `size` gesetzt. Beachten Sie, dass der Linker so fungiert, als ob die maximale Cache-Größe auf 0 gesetzt wäre, d. h. nichts wird beibehalten, wenn die Kommandozeilenoption --no-keep-memory verwendet wurde.

--build-id
--build-id=style
Fordert die Erstellung einer ELF-Noten-Sektion ".note.gnu.build-id" oder einer COFF-Sektion ".buildid" an. Die Inhalte der Notiz sind eindeutige Bits, die diese verknüpfte Datei identifizieren. `style` kann "uuid" sein, um 128 Zufallsbits zu verwenden; "sha1", um einen 160-Bit-SHA1-Hash zu verwenden; "md5", um einen 128-Bit-MD5-Hash zu verwenden; oder "xx", um einen 128-Bit-XXHASH auf den normativen Teilen des Ausgabedatei-Inhalts zu verwenden; oder "0xhexstring", um eine ausgewählte Bitzeichenfolge zu verwenden, die als eine gerade Anzahl von Hexadezimalziffern angegeben wird ("-" und ":" Zeichen zwischen Ziffernpaaren werden ignoriert). Wenn `style` weggelassen wird, wird "sha1" verwendet.

Die Stile „md5“, „sha1“ und „xx“ erzeugen eine Kennung, die in einer identischen Ausgabedatei immer gleich ist, aber fast sicher eindeutig für alle nicht identischen Ausgabedateien ist.

Sie ist nicht dazu gedacht, als Prüfsumme für den Inhalt der Datei verwendet zu werden. Eine verknüpfte Datei kann später von anderen Tools geändert werden, aber die Bitfolge der Build-ID, die die ursprüngliche verknüpfte Datei identifiziert, ändert sich nicht.

Wenn „none“ für den Stil übergeben wird, wird die Einstellung von allen vorherigen „--build-id“-Optionen in der Befehlszeile deaktiviert.

--package-metadata=JSON Fordert die Erstellung eines ELF-Notizabschnitts „.note.package“ an. Der Inhalt der Notiz ist im JSON-Format, wie in der Spezifikation für Metadaten von Paketen beschrieben. Weitere Informationen finden Sie unter: https://systemd.io/ELF_PACKAGE_METADATA/ Das JSON-Argument unterstützt Prozentkodierung und die folgende %[string]-Kodierung (wobei string sich auf den Namen in den benannten Zeichenreferenzen von HTML bezieht): %[Komma] für ,, %[geschweifte Klammer] für {, %[Anführungszeichen] für ", %[schließende geschweifte Klammer] für } und %[Leerzeichen] für das Leerzeichen. Wenn das JSON-Argument fehlt oder leer ist, wird die Erstellung der Metadaten-Notiz deaktiviert, falls sie durch ein vorheriges Auftreten der Option --package-metadata aktiviert wurde. Wenn der Linker mit libjansson erstellt wurde, wird die JSON-Zeichenfolge validiert.

Der i386-PE-Linker unterstützt die Option -shared, wodurch die Ausgabe eine dynamisch verknüpfte Bibliothek (DLL) anstelle einer normalen ausführbaren Datei wird. Sie sollten die Ausgabe bei der Verwendung dieser Option als „*.dll“ benennen. Darüber hinaus unterstützt der Linker vollständig die Standard-„*.def“-Dateien, die wie eine Objektdatei in der Linker-Befehlszeile angegeben werden können (tatsächlich sollten sie vor den Archiven stehen, aus denen sie Symbole exportiert, um sicherzustellen, dass diese wie eine normale Objektdatei verknüpft werden).

Zusätzlich zu den für alle Ziele üblichen Optionen unterstützt der i386-PE-Linker zusätzliche Befehlszeilenoptionen, die spezifisch für das i386-PE-Ziel sind. Optionen, die Werte annehmen, können durch ein Leerzeichen oder ein Gleichheitszeichen von ihren Werten getrennt werden.

--add-stdcall-alias

Wenn diese Option angegeben wird, werden Symbole mit dem Suffix „stdcall“ (@nn) so exportiert, wie sie sind, und auch ohne das Suffix. [Diese Option ist spezifisch für den i386-PE-Port des Linkers].

--base-file file

Verwenden Sie die Datei als Namen einer Datei, in der die Basisadressen aller Relokationen gespeichert werden, die zum Generieren von DLLs mit dlltool benötigt werden. [Dies ist eine i386-PE-spezifische Option].

--dll

Erstellen Sie eine DLL anstelle einer normalen ausführbaren Datei. Sie können auch -shared verwenden oder „LIBRARY“ in einer gegebenen „.def“-Datei angeben. [Diese Option ist spezifisch für den i386-PE-Port des Linkers].


--enable-long-section-names
--disable-long-section-names

Die PE-Varianten des COFF-Objektformats fügen eine Erweiterung hinzu, die die Verwendung von Abschnittsnamen mit mehr als acht Zeichen ermöglicht, was die normale Grenze für COFF ist. Standardmäßig sind diese Namen nur in Objektdateien zulässig, da vollständig verknüpfte ausführbare Images nicht die COFF-Stringtabelle enthalten, die zur Unterstützung der längeren Namen erforderlich ist. Als GNU-Erweiterung ist es möglich, ihre Verwendung auch in ausführbaren Images oder (wahrscheinlich sinnlos!) in Objektdateien mit diesen beiden Optionen zu erlauben. Ausführbare Images, die mit diesen langen Abschnittsnamen generiert wurden, sind leicht nicht standardkonform, da sie eine Stringtabelle enthalten, und können verwirrende Ausgaben erzeugen, wenn sie mit nicht-GNU-PE-fähigen Tools wie Datei-Viewern und Dumpprogrammen untersucht werden. GDB ist jedoch auf die Verwendung von PE-langen Abschnittsnamen angewiesen, um Debug-Informationen des Typs Dwarf-2 in einem ausführbaren Image zur Laufzeit zu finden. Wenn also keine der beiden Optionen in der Befehlszeile angegeben ist, aktiviert ld lange Abschnittsnamen und überschreibt das Standard- und technisch korrekte Verhalten, wenn es beim Verknüpfen eines ausführbaren Images Debug-Informationen findet und keine Symbole entfernt. [Diese Option gilt für alle PE-Zielports des Linkers]

--enable-stdcall-fixup
--disable-stdcall-fixup

Wenn der Linker ein Symbol findet, das er nicht auflösen kann, versucht er, eine „fuzzy“-Verknüpfung durchzuführen, indem er nach einem anderen definierten Symbol sucht, das sich nur in der Formatierung des Symbolnamens (cdecl vs. stdcall) unterscheidet, und dieses Symbol durch Verknüpfung mit der Übereinstimmung auflöst. Zum Beispiel könnte das undefinierte Symbol „_foo“ mit der Funktion „_foo@12“ oder das undefinierte Symbol „_bar@16“ mit der Funktion „_bar“ verknüpft werden. Wenn der Linker dies tut, gibt er eine Warnung aus, da er normalerweise mit einem Fehler beenden sollte, aber manchmal benötigen Importbibliotheken, die aus DLLs von Drittanbietern generiert wurden, diese Funktion, um verwendbar zu sein. Wenn Sie --enable-stdcall-fixup angeben, ist diese Funktion vollständig aktiviert und es werden keine Warnungen ausgegeben. Wenn Sie --disable-stdcall-fixup angeben, ist diese Funktion deaktiviert und solche Abweichungen werden als Fehler betrachtet. [Diese Option ist spezifisch für den i386-PE-Zielport des Linkers]

--leading-underscore
--no-leading-underscore

Für die meisten Ziele ist das Standardsymbolpräfix ein Unterstrich und ist in der Zielbeschreibung definiert. Mit dieser Option können Sie das Standard-Unterstrich-Symbolpräfix aktivieren oder deaktivieren.

--export-all-symbols
Wenn angegeben, werden alle globalen Symbole in den Objekten, die zum Erstellen einer DLL verwendet werden, von der DLL exportiert. Beachten Sie, dass dies die Standardeinstellung ist, wenn ansonsten keine Symbole exportiert würden. Wenn Symbole explizit über DEF-Dateien oder implizit über Funktionsattribute exportiert werden, ist die Standardeinstellung, dass nichts anderes exportiert wird, es sei denn, diese Option ist angegeben. Beachten Sie, dass die Symbole „DllMain@12“, „DllEntryPoint@0“, „DllMainCRTStartup@12“ und „impure_ptr“ nicht automatisch exportiert werden. Darüber hinaus werden keine Symbole importiert, die aus anderen DLLs importiert werden, erneut exportiert, noch werden Symbole, die das interne Layout der DLL angeben, wie z. B. solche, die mit „_head_“ beginnen oder mit „_iname“ enden, exportiert. Darüber hinaus werden keine Symbole aus „libgcc“, „libstd++“, „libmingw32“ oder „crtX.o“ exportiert. Symbole, deren Namen mit „__rtti_“ oder „__builtin_“ beginnen, werden ebenfalls nicht exportiert, um C++-DLLs zu unterstützen. Schließlich gibt es eine umfangreiche Liste von Cygwin-privaten Symbolen, die nicht exportiert werden (offensichtlich gilt dies, wenn DLLs für Cygwin-Ziele erstellt werden). Diese Cygwin-Ausschlüsse sind: „_cygwin_dll_entry@12“, „_cygwin_crt0_common@8“, „_cygwin_noncygwin_dll_entry@12“, „_fmode“, „_impure_ptr“, „cygwin_attach_dll“, „cygwin_premain0“, „cygwin_premain1“, „cygwin_premain2“, „cygwin_premain3“ und „environ“. [Diese Option ist spezifisch für den i386-PE-Zielport des Linkers]

--exclude-symbols symbol,symbol,...

Gibt eine Liste von Symbolen an, die nicht automatisch exportiert werden sollen. Die Symbolnamen können durch Kommas oder Doppelpunkte getrennt werden. [Diese Option ist spezifisch für die i386 PE-Zielversion des Linkers]

--exclude-all-symbols

Gibt an, dass keine Symbole automatisch exportiert werden sollen. [Diese Option ist spezifisch für die i386 PE-Zielversion des Linkers]

--file-alignment

Gibt die Dateiausrichtung an. Abschnitte in der Datei beginnen immer an Dateioffsets, die ein Vielfaches dieser Zahl sind. Standardmäßig ist dies 512. [Diese Option ist spezifisch für die i386 PE-Zielversion des Linkers]

--heap reserve
--heap reserve,commit

Gibt die Anzahl der Bytes Speicher an, die reserviert (und optional zugewiesen) werden sollen, um als Heap für dieses Programm verwendet zu werden. Standardmäßig sind dies 1 MB reserviert und 4 KB zugewiesen. [Diese Option ist spezifisch für die i386 PE-Zielversion des Linkers]

--kill-at

Wenn angegeben, werden die stdcall-Suffixe (@nn) vor der Exportierung aus den Symbolen entfernt. [Diese Option ist spezifisch für die i386 PE-Zielversion des Linkers]

--large-address-aware

Wenn angegeben, wird das entsprechende Bit im Feld „Eigenschaften“ des COFF-Headers gesetzt, um anzugeben, dass dieses ausführbare Programm virtuelle Adressen größer als 2 Gigabyte unterstützt. Dies sollte in Verbindung mit dem Schalter /3GB oder /USERVA=value Megabyte im Abschnitt „[Betriebssysteme]“ der Datei BOOT.INI verwendet werden. Andernfalls hat dieses Bit keine Wirkung. [Diese Option ist spezifisch für PE-Zielversionen des Linkers]

--disable-large-address-aware

Macht die Wirkung einer vorherigen Option --large-address-aware rückgängig. Dies ist nützlich, wenn --large-address-aware immer vom Compiler-Treiber festgelegt wird (z. B. Cygwin gcc) und die ausführbare Datei keine virtuellen Adressen größer als 2 Gigabyte unterstützt. [Diese Option ist spezifisch für PE-Zielversionen des Linkers]

--major-image-version value

Setzt die Hauptnummer der „Image-Version“. Standardmäßig ist dies 1. [Diese Option ist spezifisch für die i386 PE-Zielversion des Linkers]


--major-os-version value

Legt die Hauptnummer der „OS-Version“ fest. Standardmäßig 4. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--major-subsystem-version value

Legt die Hauptnummer der „Subsystem-Version“ fest. Standardmäßig 4. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--minor-image-version value

Legt die Nebenversion der „Image-Version“ fest. Standardmäßig 0. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--minor-os-version value

Legt die Nebenversion der „OS-Version“ fest. Standardmäßig 0. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--minor-subsystem-version value

Legt die Nebenversion der „Subsystem-Version“ fest. Standardmäßig 0. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--output-def file

Der Linker erstellt die Datei file, die eine DEF-Datei enthält, die der DLL entspricht, die der Linker generiert. Diese DEF-Datei (die „*.def“ heißen sollte) kann verwendet werden, um mit „dlltool“ eine Importbibliothek zu erstellen oder als Referenz, um Symbole automatisch oder implizit zu exportieren. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--enable-auto-image-base
--enable-auto-image-base=value

Wählt automatisch die Image-Basis für DLLs aus, optional beginnend mit dem Basiswert, es sei denn, eine wird mit dem Argument „--image-base“ angegeben. Durch die Verwendung eines Hashs, der aus dem DLL-Namen generiert wird, um eindeutige Image-Basen für jede DLL zu erstellen, werden Speicher-Kollisionen und Relokationen vermieden, was die Programmausführung verzögern könnte. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--disable-auto-image-base

Generiert keine eindeutige Image-Basis automatisch. Wenn keine benutzerdefinierte Image-Basis („--image-base“) vorhanden ist, wird die Standardeinstellung der Plattform verwendet. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--dll-search-prefix string

Wenn dynamisch mit einer DLL ohne Importbibliothek verlinkt wird, wird nach „.dll“ anstelle von „lib.dll“ gesucht. Dieses Verhalten ermöglicht eine einfache Unterscheidung zwischen DLLs, die für die verschiedenen „Subplattformen“ erstellt wurden: nativ, Cygwin, UWIN, PW usw. Beispielsweise verwenden Cygwin-DLLs typischerweise „--dll-search-prefix=cyg“. [Diese Option ist spezifisch für die i386 PE-Zielplattform des Linkers]

--enable-auto-import
Führt eine ausgeklügelte Verknüpfung von „_symbol“ mit „__imp__symbol“ für DATA-Importe aus DLLs
durch, wodurch es möglich wird, den DLL-Importmechanismus auf der Benutzerebene zu umgehen und
auf die nicht manipulierten Symbolnamen zu verweisen. [Diese Option ist spezifisch für die i386 PE-
Zielplattform des Linkers]

Die folgenden Bemerkungen beziehen sich auf die ursprüngliche Implementierung des Features und sind heute für Cygwin- und MinGW-Ziele veraltet.

Hinweis: Die Verwendung der Erweiterung „auto-import“ führt dazu, dass der Textabschnitt der
Image-Datei beschreibbar wird. Dies entspricht nicht der von Microsoft veröffentlichten PE-COFF-
Formatspezifikation.

Hinweis: Die Verwendung der Erweiterung „Auto-Import“ führt auch dazu, dass schreibgeschützte Daten, die normalerweise im Abschnitt .rdata platziert würden, stattdessen im Abschnitt .data platziert werden. Dies dient dazu, ein Problem mit Konstanten zu umgehen, das hier beschrieben wird: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html

Die Verwendung von „Auto-Import“ funktioniert im Allgemeinen einfach – manchmal sehen Sie jedoch diese Meldung:

„Variable '<var>' kann nicht automatisch importiert werden. Bitte lesen Sie die Dokumentation für die Option „--enable-auto-import“ von ld, um weitere Informationen zu erhalten.“

Diese Meldung tritt auf, wenn auf eine Adresse durch eine (Teil-)Ausdruck, die letztendlich die Summe zweier Konstanten ist, zugegriffen wird (Win32-Importtabellen erlauben nur eine). Dies kann beispielsweise beim Zugriff auf Felder von Strukturvariablen, die aus einer DLL importiert werden, oder bei der Verwendung eines konstanten Index in einer Array-Variable, die aus einer DLL importiert wird, auftreten. Jede mehrwortige Variable (Arrays, Strukturen, lange lange Ganzzahlen usw.) kann diesen Fehler auslösen. Unabhängig vom genauen Datentyp der problematischen exportierten Variable erkennt ld dies jedoch immer, gibt die Warnung aus und beendet das Programm.

Es gibt verschiedene Möglichkeiten, dieses Problem zu beheben, unabhängig vom Datentyp der exportierten Variable:

Eine Möglichkeit ist die Verwendung der Option --enable-runtime-pseudo-reloc. Dadurch wird die Aufgabe, die Referenzen in Ihrem Client-Code für die Laufzeitumgebung anzupassen, der Laufzeitumgebung überlassen, sodass diese Methode nur dann funktioniert, wenn die Laufzeitumgebung diese Funktion unterstützt.

Eine zweite Lösung besteht darin, eine der „Konstanten“ zu einer Variablen zu machen – das heißt, sie zur Kompilierzeit nicht mehr als bekannt und nicht optimierbar zu behandeln. Für Arrays gibt es zwei Möglichkeiten: a) die Indexvariable (die Adresse des Arrays) zu einer Variablen machen oder b) den „konstanten“ Index zu einer Variablen machen. Zum Beispiel:

extern type extern_array[];
extern_array[1] -->
{ volatile type *t=extern_array; t[1] }

oder

extern type extern_array[];
extern_array[1] -->
{ volatile int t=1; extern_array[t] }

Für Strukturen (und die meisten anderen mehrwortigen Datentypen) besteht die einzige Möglichkeit darin, die Struktur selbst (oder die lange lange Ganzzahl usw.) zu einer Variablen zu machen:

extern struct s extern_struct;
extern_struct.field -->
{ volatile struct s *t=&extern_struct; t->field }

oder

extern long long extern_ll;
extern_ll -->
{ volatile long long * local_ll=&extern_ll; *local_ll }

Eine dritte Methode zur Lösung dieses Problems besteht darin, „Auto-Import“ für das betreffende Symbol aufzugeben und es mit `__declspec(dllimport)` zu kennzeichnen. In der Praxis erfordert dies jedoch die Verwendung von Kompilierzeit-`#define`-Anweisungen, um anzugeben, ob Sie eine DLL erstellen, Client-Code erstellen, der mit der DLL verknüpft wird, oder lediglich eine statische Bibliothek erstellen/verknüpfen. Bei der Wahl zwischen den verschiedenen Methoden zur Behebung des Problems „direkte Adresse mit konstantem Offset“ sollten Sie die typische Verwendung in der Praxis berücksichtigen.

Original:

--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}

Lösung 1:

--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
/* Dieser Workaround ist für Win32 und Cygwin; nicht "optimieren"! */
volatile int *parr = arr;
printf("%d\n",parr[1]);
}

Lösung 2:

--foo.h
/* Hinweis: Automatischer Export wird angenommen (kein __declspec(dllexport)) */
#if (defined(_WIN32) || defined(__CYGWIN__)) && \
!(defined(FOO_BUILD_DLL) || defined(FOO_STATIC))
#define FOO_IMPORT __declspec(dllimport)
#else
#define FOO_IMPORT
#endif
extern FOO_IMPORT int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}

Eine vierte Möglichkeit, dieses Problem zu vermeiden, besteht darin, Ihre Bibliothek so umzugestalten, dass sie eine funktionale Schnittstelle anstelle einer Datenschnittstelle für die betreffenden Variablen verwendet (z. B. set_foo()- und get_foo()-Zugriffsfunktionen).

--disable-auto-import

Versuchen Sie nicht, eine ausgeklügelte Verknüpfung von "_symbol" mit "__imp__symbol" für DATA-Importe aus DLLs durchzuführen. [Diese Option ist spezifisch für den i386 PE-Zielport des Linkers]

--enable-runtime-pseudo-reloc

Wenn Ihr Code Ausdrücke enthält, die im Abschnitt --enable-auto-import beschrieben werden, d. h. DATA-Importe aus DLLs mit einem anderen Wert als Null, erstellt dieser Schalter einen Vektor von "Runtime-Pseudo-Relokationen", die von der Laufzeitumgebung verwendet werden können, um die Referenzen auf diese Daten in Ihrem Clientcode anzupassen. [Diese Option ist spezifisch für den i386 PE-Zielport des Linkers]

--disable-runtime-pseudo-reloc

Erstellen Sie keine Pseudo-Relokationen für DATA-Importe aus DLLs mit einem anderen Wert als Null. [Diese Option ist spezifisch für den i386 PE-Zielport des Linkers]

--enable-extra-pe-debug

Zeigen Sie zusätzliche Debug-Informationen im Zusammenhang mit der automatischen Import-Symbol-Thunking an. [Diese Option ist spezifisch für den i386 PE-Zielport des Linkers]

--section-alignment

Legt die Abschnittsausrichtung fest. Abschnitte im Speicher beginnen immer mit Adressen, die ein Vielfaches dieser Zahl sind. Standardmäßig 0x1000. [Diese Option ist spezifisch für den i386 PE-Zielport des Linkers]

--stack reserve
--stack reserve,commit

Geben Sie die Anzahl der Bytes des Speichers an, die reserviert (und optional zugewiesen) werden sollen, um als Stapel für dieses Programm verwendet zu werden. Standardmäßig 2 MB reserviert, 4 KB zugewiesen. [Diese Option ist spezifisch für den i386 PE-Zielport des Linkers]

--subsystem which
--subsystem which:major
--subsystem which:major.minor

Gibt das Subsystem an, unter dem Ihr Programm ausgeführt wird. Die zulässigen Werte für which sind "native", "windows", "console", "posix" und "xbox". Sie können optional auch die Subsystemversion festlegen. Für which werden auch numerische Werte akzeptiert. [Diese Option ist spezifisch für den i386 PE-Zielport des Linkers]

Die folgenden Optionen setzen Flags im Feld "DllCharacteristics" des PE-Datei-Headers: [Diese Optionen sind spezifisch für PE-Zielports des Linkers]


--high-entropy-va
--disable-high-entropy-va

Das Image ist kompatibel mit 64-Bit-Adressraum-Layout-Randomisierung (ASLR). Diese Option ist standardmäßig für 64-Bit-PE-Images in MinGW-Zielen aktiviert.

Diese Option impliziert auch --dynamicbase und --enable-reloc-section.

--dynamicbase
--disable-dynamicbase

Die Basisadresse des Images kann mithilfe der Adressraum-Layout-Randomisierung (ASLR) neu positioniert werden. Diese Funktion wurde mit MS Windows Vista für i386-PE-Ziele eingeführt. Diese Option ist standardmäßig für MinGW-Ziele aktiviert, kann aber über die Option --disable-dynamicbase deaktiviert werden. Diese Option impliziert auch --enable-reloc-section.

--forceinteg
--disable-forceinteg

Code-Integritätsprüfungen werden erzwungen. Diese Option ist standardmäßig deaktiviert.

--nxcompat
--disable-nxcompat

Das Image ist mit der Data Execution Prevention kompatibel. Diese Funktion wurde mit MS Windows XP SP2 für i386-PE-Ziele eingeführt. Die Option ist standardmäßig für MinGW-Ziele aktiviert.

--no-isolation
--disable-no-isolation

Obwohl das Image Isolation unterstützt, soll es nicht isoliert werden. Diese Option ist standardmäßig deaktiviert.

--no-seh
--disable-no-seh

Das Image verwendet kein SEH. Von diesem Image dürfen keine SE-Handler aufgerufen werden. Diese Option ist standardmäßig deaktiviert.

--no-bind
--disable-no-bind

Dieses Image soll nicht gebunden werden. Diese Option ist standardmäßig deaktiviert.

--wdmdriver
--disable-wdmdriver

Der Treiber verwendet das MS Windows Driver Model. Diese Option ist standardmäßig deaktiviert.

--tsaware
--disable-tsaware

Das Image ist Terminal Server-fähig. Diese Option ist standardmäßig deaktiviert.

--insert-timestamp
--no-insert-timestamp

Es wird ein echter Zeitstempel in das Image eingefügt. Dies ist das Standardverhalten, da es mit älterem Code übereinstimmt und bedeutet, dass das Image mit anderen proprietären Tools funktioniert. Das Problem bei diesem Standard ist, dass bei jeder Erstellung von Binärdateien aus identischen Quellen leicht unterschiedliche Images erzeugt werden. Die Option --no-insert-timestamp kann verwendet werden, um einen Wert von Null für den Zeitstempel einzufügen, wodurch sichergestellt wird, dass Binärdateien, die aus identischen Quellen erstellt wurden, identisch sind.

Wenn --insert-timestamp aktiv ist, ist die eingefügte Zeit entweder die Zeit, zu der die Verknüpfung stattfindet, oder, falls die Umgebungsvariable "SOURCE_DATE_EPOCH" definiert ist, die Anzahl der Sekunden seit der Unix-Epoche, wie in dieser Variablen angegeben.

--enable-reloc-section
--disable-reloc-section

Erstellen Sie die Basisspeichertabelle, die erforderlich ist, wenn das Image an einer anderen Imagebasis als in der PE-Header angegeben geladen wird. Diese Option ist standardmäßig aktiviert.

Das C6X uClinux-Ziel verwendet ein Binärformat namens DSBT, um freigegebene Bibliotheken zu unterstützen. Jede freigegebene Bibliothek im System benötigt einen eindeutigen Index; alle ausführbaren Dateien verwenden einen Index von 0.

--dsbt-size size

Diese Option setzt die Anzahl der Einträge in der DSBT der aktuellen ausführbaren Datei oder freigegebenen Bibliothek auf die angegebene Größe. Standardmäßig wird eine Tabelle mit 64 Einträgen erstellt.


    --dsbt-index index

Diese Option setzt den DSBT-Index der aktuellen ausführbaren Datei oder gemeinsam genutzten Bibliothek auf index. Der Standardwert ist 0, was für die Generierung von ausführbaren Dateien geeignet ist. Wenn eine gemeinsam genutzte Bibliothek mit einem DSBT-Index von 0 generiert wird, werden die „R_C6000_DSBT_INDEX“-Relokationen in die Ausgabedatei kopiert.

Der Schalter --no-merge-exidx-entries deaktiviert das Zusammenführen benachbarter Exidx-Einträge in den Frame-Unwind-Informationen.

    --branch-stub

Diese Option aktiviert die Linker-Verzweigungsrelaxation, indem bei Bedarf Verzweigungs-Stub-Abschnitte eingefügt werden, um den Bereich der Verzweigungen zu erweitern. Diese Option ist normalerweise nicht erforderlich, da C-SKY Befehle zum Springen und Aufrufen unterstützt, die auf den gesamten Speicherbereich zugreifen können, und die Verzweigungsrelaxation normalerweise vom Compiler oder Assembler behandelt wird.

    --stub-group-size=N

Mit dieser Option können Sie die Erstellung von Linker-Verzweigungs-Stubs genauer steuern. Sie setzt die maximale Größe einer Gruppe von Eingabeabschnitten, die von einem Stub-Abschnitt verarbeitet werden können. Ein negativer Wert von N platziert die Stub-Abschnitte nach ihren Verzweigungen, während ein positiver Wert es den Stub-Abschnitten ermöglicht, entweder vor oder nach den Verzweigungen zu erscheinen. Werte von 1 oder -1 geben an, dass der Linker geeignete Standardwerte wählen soll.

Die Linker für 68HC11 und 68HC12 unterstützen spezifische Optionen, um die Speicherbank-Umschalt-Zuordnung und die Trampolin-Code-Generierung zu steuern.

    --no-trampoline

Diese Option deaktiviert die Generierung von Trampolinen. Standardmäßig wird für jede entfernte Funktion, die mit einer „jsr“-Anweisung aufgerufen wird (dies geschieht, wenn ein Zeiger auf eine entfernte Funktion genommen wird), ein Trampolin generiert.

    --bank-window name

Mit dieser Option wird dem Linker der Name der Speicherregion in der MEMORY-Spezifikation angegeben, die das Speicherbank-Fenster beschreibt. Die Definition dieser Region wird dann vom Linker verwendet, um Paging und Adressen innerhalb des Speicherfensters zu berechnen.

Die folgenden Optionen werden unterstützt, um die GOT-Generierung beim Linken für 68K-Ziele zu steuern.

    --got=type

Mit dieser Option wird dem Linker mitgeteilt, welches GOT-Generierungsschema verwendet werden soll. type sollte einer der Werte „single“, „negative“, „multigot“ oder „target“ sein. Weitere Informationen finden Sie im Info-Eintrag für ld.

Die folgenden Optionen werden unterstützt, um die MicroMIPS-Befehlsgenerierung und die Überprüfungen der Verzweigungsrelaxation für ISA-Modusübergänge beim Linken für MIPS-Ziele zu steuern.

    --insn32
    --no-insn32

Diese Optionen steuern die Auswahl der MicroMIPS-Befehle, die vom Linker generierten Code verwendet, z. B. in der PLT oder in den Lazy-Binding-Stubs oder in der Relaxation. Wenn --insn32 verwendet wird, verwendet der Linker nur 32-Bit-Befehlsencodierungen. Standardmäßig oder wenn --no-insn32 verwendet wird, werden alle Befehlsencodierungen verwendet, einschließlich 16-Bit-Encodierungen, wo dies möglich ist.

    --ignore-branch-isa
    --no-ignore-branch-isa

Diese Optionen steuern die Überprüfungen der Verzweigungsrelaxation auf ungültige ISA-Modusübergänge. Wenn --ignore-branch-isa verwendet wird, akzeptiert der Linker alle Verzweigungsrelokationen und jeder erforderliche ISA-Modusübergang geht bei der Relokationsberechnung verloren, mit Ausnahme einiger Fälle von „BAL“-Anweisungen, die die Relaxationsbedingungen erfüllen und in äquivalente „JALX“-Anweisungen konvertiert werden, da die zugehörige Relokation berechnet wird. Standardmäßig oder wenn --no-ignore-branch-isa verwendet wird, wird eine Überprüfung durchgeführt, die dazu führt, dass der Verlust eines ISA-Modusübergangs einen Fehler verursacht.


    --compact-branches
    --no-compact-branches

Diese Optionen steuern die Generierung kompakter Anweisungen durch den Linker in den PLT-Einträgen für MIPS R6.

Für das pdp11-aout-Ziel können drei Varianten des Ausgabeformats erzeugt werden, die durch die folgenden Optionen ausgewählt werden. Die Standardvariante für pdp11-aout ist die Option --omagic, während für andere Ziele --nmagic die Standardeinstellung ist. Die Option --imagic ist nur für das pdp11-aout-Ziel definiert, während die anderen hier als sie für das pdp11-aout-Ziel gelten, beschrieben werden.

    -N
    --omagic

Markiert die Ausgabe im a.out-Header als "OMAGIC" (0407), um anzuzeigen, dass das Textsegment nicht schreibgeschützt und gemeinsam genutzt werden soll. Da die Text- und Datensektionen sowohl lesbar als auch schreibbar sind, wird die Datensektion direkt nach dem Textsegment zugewiesen. Dies ist das älteste Format für PDP11-ausführbare Programme und die Standardeinstellung für ld auf PDP11-Unix-Systemen von Anfang an bis einschließlich 2.11BSD.

    -n
    --nmagic

Markiert die Ausgabe im a.out-Header als "NMAGIC" (0410), um anzuzeigen, dass beim Ausführen der Ausgabedatei der Textbereich schreibgeschützt und für alle Prozesse, die dieselbe Datei ausführen, gemeinsam genutzt wird. Dies beinhaltet das Verschieben der Datenbereiche bis zur ersten möglichen 8-KB-Byte-Seite nach dem Ende des Textes. Diese Option erstellt ein reines ausführbares Format.

    -z
    --imagic

Markiert die Ausgabe im a.out-Header als "IMAGIC" (0411), um anzuzeigen, dass beim Ausführen der Ausgabedatei die Programmtexte und -datenbereiche in separate Adressräume geladen werden, wobei die Split-Anweisungs- und Datenraufunktion der Speicherverwaltungseinheit in größeren Modellen des PDP11 verwendet wird. Dadurch wird der für das Programm verfügbare Adressraum verdoppelt. Das Textsegment ist wieder rein, schreibgeschützt und gemeinsam genutzt. Der einzige Unterschied im Ausgabeformat zwischen dieser Option und den anderen besteht, abgesehen von der magischen Zahl, darin, dass sowohl der Text- als auch der Datensektion an der Position 0 beginnen. Die Option -z verwendete dieses Format in 2.11BSD. Diese Option erstellt ein separates ausführbares Format.

    --no-omagic

Entspricht --nmagic für pdp11-aout.

UMGEBUNG

Sie können das Verhalten von ld mit den Umgebungsvariablen "GNUTARGET", "LDEMULATION" und "COLLECT_NO_DEMANGLE" ändern.

    "GNUTARGET" bestimmt das Eingabedateiobjektformat, wenn Sie nicht -b (oder sein Synonym
    --format) verwenden. Der Wert sollte einer der BFD-Namen für ein Eingabeformat sein. Wenn keine
    "GNUTARGET" in der Umgebung vorhanden ist, verwendet ld das natürliche Format des Ziels. Wenn
    "GNUTARGET" auf "default" gesetzt ist, versucht BFD, das Eingabeformat zu ermitteln, indem
    binäre Eingabedateien untersucht werden; diese Methode ist oft erfolgreich, aber es gibt
    potenzielle Mehrdeutigkeiten, da es keine Möglichkeit gibt, sicherzustellen, dass die zur
    Angabe von Objektdateiformaten verwendete magische Zahl eindeutig ist. Die Konfigurationsprozedur
    für BFD auf jedem System platziert jedoch das konventionelle Format für dieses System zuerst in
    der Suchliste, so dass Mehrdeutigkeiten zugunsten der Konventionen aufgelöst werden.

„LDEMULATION“ bestimmt die Standardemulation, wenn Sie die Option -m nicht verwenden. Die Emulation kann verschiedene Aspekte des Linkerverhaltens beeinflussen, insbesondere das Standard-Linkerskript. Sie können die verfügbaren Emulationen mit den Optionen --verbose oder -V auflisten. Wenn die Option -m nicht verwendet wird und die Umgebungsvariable „LDEMULATION“ nicht definiert ist, hängt die Standardemulation davon ab, wie der Linker konfiguriert wurde.

Normalerweise demangelt der Linker Symbole. Wenn jedoch „COLLECT_NO_DEMANGLE“ in der Umgebung gesetzt ist, demangelt er Symbole nicht. Diese Umgebungsvariable wird auf ähnliche Weise vom Linker-Wrapper-Programm „gcc“ verwendet. Der Standard kann mit den Optionen --demangle und --no-demangle überschrieben werden.

Wenn die PE/COFF-spezifische Option --insert-timestamp aktiv ist und die Umgebungsvariable SOURCE_DATE_EPOCH definiert ist, wird der in dieser Variablen enthaltene Zeitstempelwert anstelle der aktuellen Zeit in den COFF-Header eingefügt.

Wenn die Umgebungsvariable „LD_STATS“ definiert ist, werden Linker-Ressourcennutzungsinformationen protokolliert, als ob die Option --stats verwendet worden wäre. Wenn die Variable „LD_STATS“ einen String-Wert hat, wird dieser als Name einer Datei verwendet, in die die Informationen gespeichert werden sollen. Andernfalls werden die Informationen an den Standardausgabestream gesendet.

SIEHE AUCH

ar(1), nm(1), objcopy(1), objdump(1), readelf(1) und die Info-Einträge für binutils und ld.

URHEBERRECHT

Copyright (c) 1991-2025 Free Software Foundation, Inc.

Es wird die Erlaubnis erteilt, dieses Dokument unter den Bedingungen der GNU Free Documentation License, Version 1.3 oder einer späteren Version, die von der Free Software Foundation veröffentlicht wurde, zu kopieren, zu verteilen und/oder zu modifizieren; ohne unveränderliche Abschnitte, ohne Texte auf dem Umschlag und ohne Texte auf der Rückseite. Eine Kopie der Lizenz ist in dem Abschnitt mit dem Titel „GNU Free Documentation License“ enthalten.