7
votes

GNU LD supprime la section

J'écris un script de démarrage pour un appareil basé sur ARM-Cortex M3. Si je compile le script de démarrage de l'assembleur et le code d'application C, puis combinez les fichiers d'objet et les transférez sur mon appareil tout fonctionne.

Cependant, si j'utilise AR pour créer une archive (libboot. a) et combiner cette archive avec l'application C Il y a un problème:

J'ai mis le code de démarrage dans une section: xxx

i ' J'ai trouvé que ld des bandes de la finale binaire (la section "démarrage" n'est pas disponible). Ceci est tout à fait naturel car il n'y a pas de dépendance à ce sujet que ld sait, mais il provoque la démarrage du périphérique de ne pas démarrer correctement.

Donc, ma question est la suivante: quel est le meilleur moyen Pour forcer ce code à inclure?


0 commentaires

5 Réponses :


4
votes

Je pense que vous voulez transmettre l'option - no-gc-sections forte> sur la liaison. De Documentation GNU LD :

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

Enable garbage collection of unused input sections.

`--gc-sections' decides which input sections are used
by examining symbols and relocations. The section
containing the entry symbol and all sections containing symbols
undefined on the command-line will be kept, as will sections
containing symbols referenced by dynamic objects.
Note that when building shared libraries, the linker must
assume that any visible symbol is referenced. Once this initial
set of sections has been determined, the linker recursively marks
as used any section referenced by their relocations.
See `--entry' and `--undefined'.


0 commentaires

2
votes

Le linker n'extrait d'archiver que les objets nécessaires pour résoudre des symboles explicitement référencés. Votre code de démarrage n'est pas explicitement référencé car il est invoqué via le vecteur de réinitialisation.

Si votre code de démarrage comprend plusieurs modules, vous devez créer un fichier objet lié ​​partiellement lié à l'aide de LD et du - R / -Relocatable Option , ceci combinera les objets dans un seul objet sans qu'il soit nécessaire de résoudre tous les symboles (tels que le principal ( ) par example). Cela peut ensuite être utilisé dans un lien complet avec votre code d'application. Si ce n'est qu'un seul fichier d'objet, il n'y a aucun avantage réel dans la création d'une archive dans tout cas (et comme vous l'avez trouvé, cela ne fonctionnera pas).

Notez que la start-up d'exécution traditionnellement GNU C est fournie dans un fichier appelé CRT0.O (pas une archive) vraisemblablement pour la même raison.


0 commentaires

1
votes

Vous pouvez utiliser l'option LD - Whole-Archive pour tirer dans des symboles non référencés. Ce page Options LD a ceci pour l'archive entière --Whole-Archive

pour chaque archive mentionnée sur le ligne de commande après la --whaole-archive option, inclure chaque fichier d'objet dans l'archive dans le lien, plutôt que rechercher les archives pour le besoin fichiers d'objet. Ceci est normalement utilisé pour Tourner un fichier d'archive en un partagé bibliothèque, forçant chaque objet à être inclus dans le partage résultant bibliothèque. Cette option peut être utilisée plus qu'une fois.
Deux notes lors de l'utilisation de cette option de GCC: PREMIER, GCC ne sait pas à propos de cette option, vous devez donc utiliser -Wl, -whaole-archive. Deuxièmement, n'oubliez pas d'utiliser -wl, -NO-entiers-Archive Après votre liste d'archives, parce que GCC ajoutera sa propre liste d'archives à votre lien et vous ne voulez peut-être pas que cela drapeau pour affecter aussi ces personnes.

Voir aussi cette question sur la pile débordement, Utilisations de l'option d'archivage entière < / a>


0 commentaires

10
votes

Essayez d'ajouter quelque chose comme: xxx

dans le script ld ld Pour dire à la liaison de conserver la section . < / p>

Cependant, je ne suis pas sûr que cela suffit à causer ld pour tirer dans n'importe quel objet de l'archive figurant dans la section .boot Cela pourrait ne pas envisager un objet à moins que certains symboles de cet objet ne soient tirés à cet objet. Si ceci est un problème, spécifiez _start comme point d'entrée (en utilisant --e _start < / code> sur la ligne de commande LD ou à l'aide d'une entrée (_start) dans le script de liaison) peut être la solution.


0 commentaires

2
votes

Vous pouvez utiliser - une archive globale lors de la liaison, mais c'est un gros pistolet d'éléphant. La page d'homme revendique:

Pour chaque archive mentionnée sur la ligne de commande après l'option - ARCHIVE , inclure chaque fichier d'objet dans l'archive dans le lien, plutôt que de rechercher dans l'archive des fichiers d'objet requis. < / p>


0 commentaires