Sto cercando di collegare alcuni file. Ecco il mio comando:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Tuttavia, ottengo questo errore:
/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
Ho incluso largomento -fPIC
, lho appena messo nel posto sbagliato? Non sono riuscito a trovare nulla per la sintassi di questo flag. Grazie!
Commenti
Risposta
La tua boot.o
ha una .multiboot
sezione elf, che non è compatibile con -fPIC
. Puoi provare a compilare boot.o
con -fPIC
ma dovrebbe fallire.
Vedi https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format per lintestazione.
Daltra parte, ha poco senso creare un oggetto avviabile con -fPIC
. Anche se fosse presente un “caricatore dinamico”, non può “esserci nulla a cui collegarsi dinamicamente durante il processo di avvio.
Commenti
- Sono riuscito a trovare solo informazioni sullintestazione e sul valore del flag, e corrispondeva al mio boot.s. A proposito, boot.o è un file oggetto, non compilabile, come dovrebbe essere boot.s.
- Cosa stai cercando di ottenere compilando / collegando il tuo .bin con -fPIC?
-fPIC
lopzione deve essere applicata durante la fase di compilazione (il comando che genera i file oggetto) penso – piuttosto che la fase di collegamento, come stai mostrandogcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra