Jeg prøver at linke nogle filer. Her er min kommando:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Men jeg får denne fejl:
/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
Jeg har medtaget -fPIC
argumentet, har jeg bare sat det forkert sted? Jeg har ikke kunnet finde nogen ting til syntaksen for dette flag. Tak!
Kommentarer
Svar
Din boot.o
har en .multiboot
alvesektion, som er uforenelig med -fPIC
. Du kan prøve at kompilere boot.o
med -fPIC
men det skulle mislykkes.
Se https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format til overskriften.
På den anden side er der ringe mening med at oprette et bootbart objekt med -fPIC
. Selvom der var en “dynamisk loader”, kan der ikke være noget at dynamisk linke mod under opstartsprocessen.
Kommentarer
- Jeg kunne kun finde oplysninger om overskriften og flagværdien, og det matchede min boot.s. BTW boot.o er en objektfil, der ikke kan kompileres, som den burde være boot.s.
- Hvad forsøger du at opnå ved at kompilere / linke din .bin med -fPIC?
-fPIC
-indstillingen skal anvendes under kompileringsfasen (kommandoen, der genererer objektfilerne), tror jeg – snarere end linkfasen, som du visergcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra