nicht erkannt. Ich versuche, einige Dateien zu verknüpfen. Hier ist mein Befehl:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Ich erhalte jedoch folgende Fehlermeldung:
/usr/bin/ld: boot.o: relocation R_X86_64_32 against `.multiboot" can not be used when making a PIE object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output
Ich habe das Argument -fPIC
eingefügt. Habe ich es einfach an der falschen Stelle platziert? Ich konnte nichts für die Syntax dieses Flags finden. Danke!
Kommentare
- Die iv id = „ff5ede853f“ Die Option
muss während der Kompilierungsphase (dem Befehl, der die Objektdateien generiert) angewendet werden – und nicht während der Verknüpfungsphase, wie Sie
gcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra
Antwort
Ihre boot.o
hat einen .multiboot
elf-Abschnitt, der nicht mit -fPIC
. Sie können versuchen, boot.o
mit -fPIC
zu kompilieren, dies sollte jedoch fehlschlagen.
Siehe https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format für den Header.
Andererseits macht es wenig Sinn, ein bootfähiges Objekt mit -fPIC
. Selbst wenn es einen „dynamischen Loader“ gab, kann während des Startvorgangs nichts dynamisch verknüpft werden.
Kommentare
- Ich konnte nur Informationen zum Header und zum Flag-Wert finden und sie stimmten mit meinen boot.s überein. Übrigens ist die boot.o eine Objektdatei, die nicht kompilierbar ist, da sie boot.s. sein sollte.
- Was möchten Sie erreichen, indem Sie Ihre .bin mit -fPIC kompilieren / verknüpfen?