Es ist kein Fehler, weil ld
verhält sich wie seine Spezifikation. Die Manpage von ld
2.28 liest:
Wenn der Linker das Format einer Objektdatei nicht erkennen kann, nimmt er an, dass es sich um ein Linker-Skript handelt. Ein auf diese Weise spezifiziertes Skript erweitert das Haupt-Linker-Skript, das für den Link verwendet wird (entweder das Standard-Linker-Skript oder das mit -T angegebene). Diese Funktion erlaubt es dem Linker, mit einer Datei zu verknüpfen, die ein Objekt oder ein Archiv zu sein scheint, aber tatsächlich nur einige Symbolwerte definiert oder "INPUT" oder "GROUP" verwendet, um andere Objekte zu laden. Die Angabe eines Skripts auf diese Weise erweitert lediglich das Haupt-Linker-Skript, wobei die zusätzlichen Befehle nach dem Hauptskript platziert werden; Verwenden Sie die Option -T, um das standardmäßige Linker-Skript vollständig zu ersetzen, aber beachten Sie die Auswirkungen des Befehls "INSERT".
TL;DR ☺. Kurz gesagt:In den meisten Fällen ist den Benutzern nicht bewusst, welches Linker-Skript sie verwenden, da ein „Hauptskript“ (=Standardskript ) wird von der Toolkette bereitgestellt. Das Hauptskript bezieht sich stark auf die Eigenheiten der vom Compiler generierten Abschnitte, und Sie müssen lernen, wie man es ändert. Die meisten Benutzer nicht.
Der übliche Ansatz, um Ihr eigenes Skript bereitzustellen, ist über -T
Möglichkeit. Auf diese Weise wird das Haupt-Linker-Skript ignoriert und Ihr Skript übernimmt die Kontrolle über die Verknüpfung. Aber man muss alles von Grund auf neu schreiben.
Wenn Sie nur ein kleines Feature hinzufügen möchten, können Sie Ihre Spezifikationen in eine Datei schreiben und den Dateinamen an die Befehlszeile von ld
anhängen (oder gcc / g++) ohne die -T
Möglichkeit. Auf diese Weise erledigt das Haupt-Linker-Skript immer noch die Hauptarbeit, aber Ihre Datei erweitert es. Wenn Sie diesen Ansatz verwenden, erhalten Sie die Nachricht im Header dieses Threads, um Sie darüber zu informieren, dass Sie möglicherweise unbeabsichtigt ein fehlerhaftes Objekt bereitgestellt haben.
Die Quelle dieser Verwirrung liegt darin, dass es keine Möglichkeit gibt, die Rolle der zusätzlichen Datei anzugeben. Dies könnte leicht gelöst werden, indem eine weitere Option zu ld
hinzugefügt wird genau wie die -dT
Option für „d efault scriptfile”:Führen Sie einen -sT
ein Option für „s ergänzende Skriptdatei“.
Es ist ein Fehler in bestimmten LD-Versionen. Ignorieren Sie es einfach vorerst oder sehen Sie nach, ob Ihre Distribution ein Update für Ihr LD hat. (Paket binutils)
http://www.freepascal.org/faq.var#unix-ld219