Încerc să leg unele fișiere. Iată comanda mea:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
De câte ori primesc această eroare:
/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
Am inclus argumentul -fPIC
, tocmai l-am pus într-un loc greșit? Nu am reușit să găsesc nimic pentru sintaxa acestui flag. Mulțumesc!
Comentarii
Răspunde
boot.o
are o secțiune .multiboot
elf, care este incompatibilă cu -fPIC
. Puteți încerca să compilați boot.o
cu -fPIC
, dar ar trebui să eșueze.
Consultați https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format pentru antet.
Pe de altă parte, nu are sens să creăm un obiect bootabil cu -fPIC
. Chiar dacă a existat un „încărcător dinamic”, nu poate exista nimic cu care să se conecteze dinamic în timpul procesului de boot.
Comentarii
- Am putut găsi doar informații despre antet și valoarea steagului și s-au potrivit cu boot-ul meu. BTW boot.o este un fișier obiect, necompilabil, așa cum ar trebui să fie boot.s.
- Ce încercați să realizați prin compilarea / legarea .bin-ului cu -fPIC?
-fPIC
opțiunea trebuie aplicată în timpul fazei de compilare (comanda care generează fișierele obiect) cred – mai degrabă decât în faza de legătură, așa cum arătațigcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra