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?
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
@tofro '.boot_end' est la section qui me manque et j'ai assemblé avec' as' comme écrit dans ma question. J'utilise ELF. – Downvoter
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