2013-09-26 3 views
1

Déjà lu mais ne peut pas résoudre mon problème.Le fichier binaire brut généré par objcopy est trop grand

huge binary files with objcopy

Pour certains ont besoin de tests. Je dois ajouter le script de lien suivant lorsque le lien.

.section_test 0x11323000: { *(.section_test) } 

Cette section auto-définie doit débuter à une grande adresse 0x11323000.

Utilisez ensuite objcopymips pour générer le fichier binaire

objcopymips -O binary vxWorks.st E0122.bin  

Cette étape rend le fichier binaire final, le fichier bin, trop grand. de 27 Mo à plus de 270 Mo. De cette façon, il ne peut pas être chargé dans notre machine qui ne dispose que d'environ 64 Mo de mémoire physique. Est-ce que je peux réduire la taille sans enlever aucune section et la laisser toujours être exécutable?

Répondre

1

objcopy -O binary produit l'image mémoire du programme, en fonction de l'adresse de chargement des sections. Dans votre cas, le chargement et l'adresse d'exécution de .section_test sont les mêmes, c'est-à-dire que l'adresse de chargement est 0x11323000, ce qui explique la taille importante du fichier.

La solution habituelle consiste à créer un exécutable avec une image de chargement compact et à demander au programme de copier les parties nécessaires de leur adresse de chargement à leur adresse d'exécution avant de les utiliser.

Exemple:

.section_test 0x11323000 : AT(some-small-address) { *(.section_test) } 

ou

.section_test 0x11323000 : { *(.section_test) } AT> some-region-name 

Cocher cette page ainsi: https://sourceware.org/binutils/docs/ld/Output-Section-LMA.html#Output-Section-LMA

+0

réponse parfaite, merci beaucoup! J'ai vérifié ce manuel avant mais ai manqué cette partie .... – oyss

+0

Je comprends la réponse, mais pourquoi la section de bss n'est pas incluse dans le gros dossier? (dans l'exemple du lien ci-dessus) - La section bss n'a pas de "AT" – ransh