2016-10-06 3 views
2

J'ai donc ce fichier d'assemblage, que j'assemble avec GNU as et un lien avec GNU ld à l'aide d'un script d'éditeur de liens.Le script Linker n'oublie pas les octets comme prévu

scénario Linker (boot.ld):

INPUT(boot.o) 
OUTPUT(boot.out) 
ENTRY(boot_start) 

SECTIONS { 
     . = 0x7c00; 
     .text : { *(.text) } 
     .data : { *(.data) } 
     . = 0x7dfe; 
     .boot_end : { *(.boot_end) } 
} 

Comme vous le voyez, j'essaie de rendre le fichier exactement 512 octets que nécessaire pour un bootloader en faisant . = 0x7cdfe. .boot_end contient la signature de démarrage et remplit ainsi les deux octets restants.

je crée le bootloader comme suit:

m4 boot.S | as -o boot.o 
ld -T boot.ld 
objcopy -O binary boot.out boot.img 

boot.out contient les sections déjà avec des adresses absolues et tout semble bien. .boot_end est à 0x7dfe et je m'attends à ce que les trous soient remplis de zéros, mais non, boot.img est un total de 55 octets. Le truc, pour moi, bizarre est que le fichier ne contient même pas la signature de démarrage. C'est juste .text et .data sans .boot_end ou les octets sautés.

Comment déplacer ld pour ignorer ces octets? Et où est ma signature de démarrage?

+0

Quels noms de section avez-vous utilisés pour les parties manquantes et quels drapeaux avez-vous définis (que fournissez-vous dans 'as')? Que vous utilisiez ELF ou COFF ou n'importe quel format d'objet peut également avoir de l'importance. – tofro

+0

@tofro '.boot_end' est la section qui me manque et j'ai assemblé avec' as' comme écrit dans ma question. J'utilise ELF. – Downvoter

+0

Et vous n'avez toujours pas dit quels drapeaux '.section' vous donniez dans le code' as'. Le point est, si aucun drapeau de section n'est donné à 'as 'dans ELF pour un nom de section non standard (pas' .text' ou '.data' ou similaire), la section ne sera pas allouée. Essayez de remplacer votre directive '.section boot_end' nue (vraisemblablement) dans l'entrée' as' par '.section boot_end," a "' (ou plus de drapeaux, par exemple pour la rendre exécutable, selon vos besoins) et réessayez . – tofro

Répondre

2

Il vous manque probablement un drapeau de section. Point est, si aucun drapeaux de section sont donnés à as lorsque vous liez plus tard à ELF pour un nom de section non standard (pas .text ou .data ou similaire), la section ne sera pas allouée dans le vidage (c'est à dire, être silencieusement ignoré par objcopy, notez que ce se comporte différemment lors de la production coff fichiers)

Essayez de remplacer votre (probablement) nu

.section boot_end 

directive dans votre fichier d'entrée assembleur avec

.section boot_end,"a" 

(ou plusieurs indicateurs, par exemple pour le rendre exécutable, selon ce dont vous avez besoin) et réessayez.

Le flag "a" fait la section allocatable, à savoir à la fois dit ld et objcopy que vous voulez dans votre binaire.