Jag försöker länka några filer. Här är mitt kommando:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Hur som helst får jag det här felet:
/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
Jag har inkluderat argumentet -fPIC
, har jag bara lagt det på fel ställe? Jag har inte kunnat hitta något för syntaxen för den här flaggan. Tack!
Kommentarer
Svar
Din boot.o
har en .multiboot
alvsektion, vilket är oförenligt med -fPIC
. Du kan försöka kompilera boot.o
med -fPIC
men det skulle misslyckas.
Se https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format för rubriken.
Å andra sidan är det lite meningsfullt att skapa ett startbart objekt med -fPIC
. Även om det fanns en ”dynamisk laddare” kan det inte finnas något att dynamiskt länka mot under startprocessen.
Kommentarer
- Jag kunde bara hitta information om rubriken och flaggvärdet, och det matchade min boot.s. BTW boot.o är en objektfil, som inte kan kompileras, som den borde vara boot.s.
- Vad försöker du uppnå genom att kompilera / länka din. Bin med -fPIC?
-fPIC
alternativet måste tillämpas under kompileringsfasen (kommandot som genererar objektfilerna) tror jag – snarare än länkfasen, som du visargcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra