2017-09-05 1 views
1

Je souhaite utiliser la suggestion faite dans le manuel de l'éditeur de liens GNU page 40, c'est-à-dire INPUT (subr.o), spécifiant ainsi les membres de l'objet dans un fichier de script. Finalement, je veux spécifier tous les membres de mon programme que l'éditeur de liens doit utiliser.L'éditeur de liens GNU obtient des objets via INPUT

Le fichier de script ressemble à ceci (uniquement les parties de fichiers est affiché)

SEARCH_DIR(../lib) 

STARTUP(boot.o) 
ENTRY(_start) 

GROUP (libkernel.a libkflib.a) 

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

L'éditeur de liens répond avec:

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

J'ai indiqué le chemin de recherche, les bibliothèques et une liste de les membres de l'objet; les membres d'objet sont définitivement dans les bibliothèques. J'attendais l'éditeur de liens pour rechercher des membres d'objets dans le répertoire de travail et sinon, j'utilise le chemin de recherche et les bibliothèques. De toute évidence, il y a quelque chose qui ne va pas, mais je ne peux pas le comprendre.

Les suggestions sont les bienvenues afin de réaliser la méthode de liaison désirée: en spécifiant tous les objets à lier au plus.

Merci

Ben

Répondre

0

Vous avez mal interprété the manual:

INPUT (fichier fichier ...)

La commande INPUT dirige l'éditeur de liens pour inclure les fichiers nommés dans le lien, comme s'ils étaient nommés sur la ligne de commande.

...

Dans le cas où un préfixe sysroot est configuré, et le nom du fichier commence par le caractère /, et le script en cours de traitement est situé à l'intérieur du préfixe sysroot, le nom du fichier sera recherchée dans la préfixe sysroot. Sinon, l'éditeur de liens tentera d'ouvrir le fichier dans le répertoire en cours. S'il n'est pas trouvé, l'éditeur de liens effectuera une recherche dans le chemin de recherche de la bibliothèque d'archives. Voir la description de -L dans Options de ligne de commande. Si vous utilisez INPUT (-lfile), ld transformera le nom en libfile.a, comme pour l'argument de ligne de commande -l.

...

GROUP (fichier fichier ...)

La commande GROUP est comme INPUT, sauf que les fichiers nommés doivent tous être archives, et ils sont recherchés à plusieurs reprises jusqu'à ce qu'aucune nouvelle non définie les références sont créées.

STARTUP (nom de fichier)

La commande STARTUP est comme la commande INPUT, sauf que le nom de fichier sera devenir le premier fichier d'entrée à lier, comme si elle était spécifiée d'abord sur la ligne de commande

Ou peut-être avez-vous lu une autre documentation erronée.

Vous avez tort l'impression que le commandement GROUP(libboo.a...) est complémentaire INPUT(foo.o...) et STARTUP(bar.o), avec l'effet que fichiers bar.o, foo.o... seront recherchées dans les archives libboo.a... et - si trouvés - seront extraites des archives et ajoutés à la lien.

INPUT(foo.o) a le même effet que la spécification foo.o sur l'éditeur de liens commandline sauf que si elle est introuvable dans le répertoire courant, il sera recherché pour de la même manière qu'une bibliothèque statique spécifiée avec l'option -l serait, avec tout SEARCH_DIR(path) Les commandes du script de liaison ont la même influence que les options de ligne de commande -Lpath.

STARTUP(bar.o) a le même effet que la spécification bar.opremier dans l'éditeur de liens commandline.

GROUP(libboo.a...) a le même effet que les options en ligne de commande

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

à nouveau avec toutes les commandes SEARCH_DIR(path) actiing comme -Lpath.

INPUT(foo.o) et STARTUP(bar.o) sont sans lien avec GROUP(libboo.a...), comme dans les options en ligne de commande:

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

bar.o et foo.o sont des fichiers d'une entrée sans lien avec --start-group -lboo.a... --end-group.

L'éditeur de liens ne regarde jamais dans les bibliothèques statiques pour un fichier d'objet en entrée qu'il ne trouve pas par ailleurs .

donc cette commande:

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

dans votre script linker nécessite l'éditeur de liens pour trouver les fichiers objet dans le répertoire en cours ou dans ../lib, et ils ne sont pas là. De même pour STARTUP(boot.o). Par conséquent les erreurs de liaison.

Ces fichiers objets ne sont pas là, mais les bibliothèques statiques libkernel.a et libkflib.asont, et vous nous dire qu'ils contiennent tous les fichiers objet en tant que membres. Dans ce cas simplement vous ne avez pas besoin:

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

parce que l'éditeur de liens recherche bibliothèques statiques pour trouver les fichiers d'objets qui fournissent les définitions des symboles pour lesquels les définitions sont nécessaires par des références dans les objets qu'il a déjà lié. Vous n'êtes pas obligé de le dire à .

Mais pour donner l'éditeur de liens aucune raison de rechercher une bibliothèque statique à tout ce que vous doit avoir dit à relier certains fichier objet qui fait référence à un symbole non défini (s) avant qu'elle ne considère la bibliothèque statique.

C'est la raison pour laquelle, sur la ligne de commande, vous devez placer les fichiers d'objet avant que les bibliothèques auxquelles ils se réfèrent et il est pourquoi, dans un script de liaison autonome, si vous ajoutez les bibliothèques à la liaison avec GROUP(libboo.a...) ou avec INPUT (-lboo...), vous devez également spécifier un fichier objet à lier d'abord, avec une commande STARTUP .

Ainsi, alors que votre commande ne INPUT est inutile et peut-être supprimé, votre défaut STARTUP(boot.o) doit rester, pour initier tout lien. Et ne doit pas échouer.

Pour STARTUP(boot.o) réussir, vous devez mettre le fichier objet boot.o se dans un endroit où le script racontera l'éditeur de liens pour chercher, soit le répertoire courant ou ../lib. Vraisemblablement, le répertoire actuel.

Et lorsque vous faites cela, il devient inutile d'avoir boot.o comme membre de l'une de vos bibliothèques statiques, car il ne peut pas être lié à partir d'un seul. Meilleur le supprimer de n'importe quel libary vous l'avez en. Laisser il est similaire à mettre la fonction main d'un programme dans l'une des bibliothèques que vous le liera avec.

+0

L'éditeur de liens se comporte comme expliqué et comme spécifié; maintenant je vais résoudre cela en dehors du script de l'éditeur de liens. Quelque chose comme rendre tous les membres de l'objet disponibles dans le répertoire de travail avant d'appeler l'éditeur de liens. – BenJ

+0

@BenJ Bonjour. Ce serait une façon simple d'aller. Vous voudrez peut-être voir [Que dois-je faire quand quelqu'un répond à ma question?] (Https://stackoverflow.com/help/someone-answers) –