GNU/Linux >> Tutoriels Linux >  >> Linux

Mon chargeur de démarrage ne peut pas être compilé avec gcc 4.6 et 4.7 ... seulement 4.5

En compilant un fichier C trivial avec les drapeaux que vous avez fournis, entre gcc-4.5 et gcc-4.6 , et en utilisant objdump -h pour examiner la sortie, il semble que le .eh_frame la section est introduite dans gcc-4.6 .

Le ld le script que vous avez fourni ne s'occupe pas de cette section, et il devrait probablement le faire. Vous pouvez utiliser strip -R .eh_frame -R .eh_frame_hdr pour supprimer cette section et d'autres des fichiers objets avant la liaison.

Quoi qu'il en soit, puisque l'éditeur de liens est le même pour les deux versions de gcc, objdump -h sur les fichiers objets indiquera la différence qui cause ce problème.


Existe-t-il un argument de ligne de commande qui désactivera une fonctionnalité susceptible de produire des sections plus grandes

Oui :si vous vous souciez de la taille, vous devriez construire avec -Os . Le -O3 permet explicitement des optimisations qui pourraient conduire à une taille de code plus grande. Étant donné que le chargeur de démarrage s'exécute une fois , en utilisant -O3 car c'est presque certainement faux.

Modifier :

"L'optimisation de l'assemblage n'a pas de sens...
... et d'autres objets ici..."

Est tout de ton code en assembleur ? Si tel est le cas, le niveau d'optimisation n'a en effet aucun sens, mais vous devriez alors pouvoir simplement comparer la sortie de readelf -S vga_pm.S.o construit avec les deux compilateurs, et voir exactement quel les sections sont différentes.

Mais il semble plus probable que certains de vos objets ne le soient pas en assemblage, auquel cas la différence entre -O3 et -Os sera assez significatif.


GCC ajoute des sections de débogage indésirables à sa sortie binaire (utilisez objdump -h <file> pour les voir), j'ai l'habitude de mettre ceux que je ne veux pas dans un /DISCARD/ rule dans mes scripts ld pour s'en débarrasser :

/DISCARD/ : {
        *(.debug_*)
        *(.note*)
        *(.indent)
        *(.comment)
        *(.stab)
        *(.stabstr)
        *(.eh_frame)
}

Linux
  1. `find` avec plusieurs `-name` et `-exec` n'exécute que les dernières correspondances de `-name` ?

  2. Couper avec Lvm et Dm-crypt ?

  3. Exécution du script avec ". » Et avec « source » ?

  4. Pouvez-vous utiliser des ancres ^ $ avec Ls ?

  5. Pourquoi puis-je me connecter avec des mots de passe partiels ? ?

Tutoriel de commande Linux which et whoami pour les débutants (avec exemples)

Que pouvez-vous faire avec un VPS et un serveur cloud ?

Comment puis-je contrôler le clavier et la souris avec Python ?

Comment puis-je vérifier quels ports sont occupés et quels ports sont libres sur ma machine Linux ?

Impossible de renommer un fichier dont le nom commence par un trait d'union

Linux :Est-il possible de savoir avec quelles options une installation a été configurée et compilée ?