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 J'ai mis le code de démarrage dans une section: p> i ' J'ai trouvé que Donc, ma question est la suivante: quel est le meilleur moyen Pour forcer ce code à inclure? p> p> AR code> pour créer une archive (libboot. a) et combiner cette archive avec l'application C Il y a un problème: p>
ld code> 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 code> sait, mais il provoque la démarrage du périphérique de ne pas démarrer correctement. P>
5 Réponses :
Je pense que vous voulez transmettre l'option --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'.
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. P>
Si votre code de démarrage comprend plusieurs modules, vous devez créer un fichier objet lié partiellement lié em> à 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). P>
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. P>
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 p>
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. P> blockQuote>Voir aussi cette question sur la pile débordement, Utilisations de l'option d'archivage entière < / a> p>
Essayez d'ajouter quelque chose comme: dans le script code> ld code> ld code> Pour dire à la liaison de conserver la section Cependant, je ne suis pas sûr que cela suffit à causer code>. < / p>
ld code> pour tirer dans n'importe quel objet de l'archive figurant dans la section
.boot code> 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 code> comme point d'entrée (en utilisant
--e _start < / code> sur la ligne de commande LD ou à l'aide d'une entrée
(_start) code> dans le script de liaison) peut être la solution. P> P>
Vous pouvez utiliser Pour chaque archive mentionnée sur la ligne de commande après l'option - une archive globale code> lors de la liaison, mais c'est un gros pistolet d'éléphant. La page d'homme revendique: P>
- ARCHIVE CODE>, 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>
blockQuote>