2017-09-05 1 views
1

Ich möchte den Vorschlag in de GNU Linker Handbuch Seite 40, d. H. INPUT (srr.o), verwenden und somit Objekt Mitglieder in einer Skriptdatei angeben. Schließlich möchte ich alle Objekt-Mitglieder meines Programms angeben, die der Linker verwenden muss.GNU Linker Objekte durch INPUT

Die Skriptdatei sieht wie folgt aus (nur die Dateien Teile gezeigt)

SEARCH_DIR(../lib) 

STARTUP(boot.o) 
ENTRY(_start) 

GROUP (libkernel.a libkflib.a) 

INPUT (
    lowcore.o 
    init.o 
    kfalloc.o 
    kflog.o 
    kfprintf.o 
) 

Der Linker antwortet mit:

attempt to open boot.o failed 
attempt to open ../lib/boot.o failed 
m68k-rtems4.11-ld: cannot find boot.o 

ich den Suchpfad angegeben haben, die Bibliotheken und eine Liste der Objektmitglieder; Die Objektmitglieder befinden sich definitiv in den Bibliotheken. Ich war der Linker zu suchen nach Objekt-Mitglieder im Arbeitsverzeichnis und wenn nicht dort mit dem Suchpfad und Bibliotheken. Offensichtlich stimmt etwas nicht, aber ich kann es nicht herausfinden.

Vorschläge sind willkommen, um die gewünschte Art der Verknüpfung zu erreichen: das Spezifizieren aller Objekte, um eine nicht mehr als das zu verknüpfen.

Dank

Ben

Antwort

0

Sie haben the manual falsch verstanden:

INPUT (Datei-Datei ...)

Der INPUT-Befehl weist den Linker die angegebenen Dateien in die einschließen Link, , als ob sie in der Befehlszeile benannt wurden.

...

Falls ein sysroot Präfix konfiguriert ist, und der Dateiname beginnt mit dem Zeichen /, und das Skript verarbeitet wird, wurde innerhalb des sysroot prefix befindet, der Dateiname wird in dem gesucht werden Sysroot-Präfix. Andernfalls versucht der Linker , die Datei im aktuellen Verzeichnis zu öffnen. Wenn es nicht gefunden wird, durchsucht der Linker den Suchpfad der Archivbibliothek. Siehe die Beschreibung von -L in Befehlszeilenoptionen.

Wenn Sie INPUT (-file) verwenden, wird ld den Namen in libfile.a umwandeln, wie bei das Befehlszeilenargument -l.

...

GROUP (Datei-Datei ...)

Der GROUP-Befehl ist wie INPUT, mit der Ausnahme, dass die genannten Dateien alle Archive sein sollte, und sie werden wiederholt, bis keine neuen undefined gesucht Referenzen werden erstellt.

STARTUP (Dateiname)

Der Befehl STARTUP ist genau wie der INPUT-Befehl, mit der Ausnahme, dass Dateiname wird die erste Eingang wird Datei verknüpft werden, als ob es erste Zeile auf dem Befehl angegeben wurde

Oder vielleicht haben Sie eine andere Dokumentation gelesen, die fehlerhaft ist.

Sie haben falsch bekamen den Eindruck, dass GROUP(libboo.a...) komplementär zu INPUT(foo.o...) und STARTUP(bar.o), mit dem Effekt gebieten, daß bar.o, foo.o... Dateien werden in Archiven libboo.a... und durchsucht werden - falls vorhanden - wird aus dem Archiv extrahiert werden und zu dem Verknüpfung.

INPUT(foo.o) hat die gleiche Wirkung wie foo.o auf der Linker Kommandozeile spezifiziert, außer dass, wenn nicht im aktuellen Verzeichnis gefunden wird es in der gleichen Art und Weise durchsucht werden, dass eine statische Bibliothek mit dem würde -l Option angegeben, mit jedem SEARCH_DIR(path) Befehle im Linker-Skript haben den gleichen Einfluss wie Kommandozeilenoptionen -Lpath.

STARTUP(bar.o) hat die gleiche Wirkung wie bar.oersten im Linker Kommandozeile angibt.

GROUP(libboo.a...) hat die gleiche Wirkung wie die Kommandozeilenoptionen

--start-group -lboo.a... --end-group 

wieder mit irgendwelchen SEARCH_DIR(path) Befehle actiing wie -Lpath.

INPUT(foo.o) und STARTUP(bar.o) sind nicht verbunden mit GROUP(libboo.a...), ebenso wie in den Kommandozeilen-Optionen:

bar.o --start-group -lboo.a... --end-group foo.o 

bar.o und foo.o sind ein Eingang mit --start-group -lboo.a... --end-group nicht verbundenen Dateien.

Der Linker sucht in statischen Bibliotheken nie nach einer Eingabeobjektdatei, die sonst nicht finden kann.

Also dieser Befehl:

INPUT (
    lowcore.o 
    init.o 
    kfalloc.o 
    kflog.o 
    kfprintf.o 
) 

in Ihrer Linker-Skript erfordert den Linker die Objektdateien im aktuellen Verzeichnis oder in ../lib, und sie sind nicht dort zu finden. Ähnlich für STARTUP(boot.o). Daher die Verknüpfungsfehler.

Diese Objektdateien sind nicht da, aber statische Bibliotheken libkernel.a und libkflib.asind, und Sie sagen uns, sie enthalten alle diese alle Objektdateien als Mitglieder. In diesem Fall Sie brauchen einfach nicht:

INPUT (
    lowcore.o 
    init.o 
    kfalloc.o 
    kflog.o 
    kfprintf.o 
) 

, da der Linker statische Bibliotheken suchen Objektdateien zu finden, die Definitionen aller Symbole geben, für die Definitionen für durch Verweise in Objektdateien aufgerufen werden, dass es hat bereits verlinkt. Sie müssen nicht zu sagen.

aber der Linker keinen Grund zu geben, eine statische Bibliothek auf alles, was Sie suchen sie gesagt haben, müssen einige Objektdatei, die zu einem gewissen undefinierten Symbol verweist (n) bevor sie der Auffassung ist die statische Bibliothek zu verknüpfen.

Das ist der Grund, warum, auf der Kommandozeile, Sie Objektdateien platzieren müssen, bevor die Bibliotheken, auf die sie sich beziehen, und es ist, warum in einem in sich geschlossenen Linker-Skript, wenn Sie Bibliotheken auf die Verknüpfung mit GROUP(libboo.a...) hinzufügen oder Mit INPUT (-lboo...), müssen Sie auch eine zu verknüpfende Objektdatei angeben zuerst, mit einem STARTUP Befehl. So

während INPUT fehlgeschlagenen Befehl ist nicht erforderlich und kann nur sein gelöscht, Ihre STARTUP(boot.o) versagt bleiben muss, jede Verbindung zu initiieren. Und darf nicht versagen.

Um STARTUP(boot.o) erfolgreich zu sein, müssen Sie boot.o selbst an einem Ort, der Objektdatei setzen, wo das Skript den Linker um es zu suchen erzählen, entweder das aktuelle Verzeichnis oder ../lib. Vermutlich das aktuelle Verzeichnis.

Und wenn Sie das tun, wird es sinnlos, boot.o als Mitglied einer Ihrer statischen Bibliotheken zu bleiben, da es nicht innerhalb von einem verknüpft werden kann. Am besten löschen Sie es aus welcher Bibliothek Sie haben es in. Es zu verlassen ist ähnlich zu setzen die main Funktion eines Programms in eine der Bibliotheken, die Sie wird es mit verknüpfen.

+0

Die Linker verhalten sich wie erklärt und damit wie angegeben; jetzt werde ich das außerhalb des Linker-Skripts lösen. So etwas wie das Bereitstellen aller Objektelemente im Arbeitsverzeichnis vor dem Aufruf des Linkers. – BenJ

+0

@BenJ Hallo. Das wäre ein direkter Weg. Vielleicht möchten Sie sehen [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Https://stackoverflow.com/help/someone-answers) –