Pokouším se propojit některé soubory. Tady je můj příkaz:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Každopádně se mi zobrazí tato chyba:
/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
Zahrnul jsem argument -fPIC
, dal jsem ho jen na špatné místo? Nebyl jsem schopen najít nic pro syntaxi tohoto příznaku. Děkuji!
Komentáře
Odpovědět
Vaše boot.o
má .multiboot
elfskou sekci, která je nekompatibilní s -fPIC
. Můžete zkusit sestavit boot.o
s -fPIC
, ale to by mělo selhat.
Viz https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format pro záhlaví.
Na druhou stranu nemá smysl vytvářet zaváděcí objekt pomocí -fPIC
. I kdyby existoval „dynamický zavaděč“, nemůže existovat nic, s čím by se bylo možné dynamicky spojit během procesu zavádění.
Komentáře
- Dokázal jsem najít pouze informace o záhlaví a hodnotě příznaku a shodoval se s mým boot.s. BTW boot.o je objektový soubor, nekompilovatelný, protože by měl být boot.s.
- čeho se snažíte dosáhnout kompilací / propojením .bin s -fPIC?
-fPIC
možnost musí být použita během fáze kompilace (příkaz, který generuje soubory objektů), myslím – spíše než fáze propojení, jak ukazuješgcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra