Próbuję połączyć kilka plików. Oto moje polecenie:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Jednak pojawia się ten błąd:
/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
Dodałem argument -fPIC
, czy po prostu umieściłem go w niewłaściwym miejscu? Nie udało mi się znaleźć nic dla składni tej flagi. Dzięki!
Komentarze
Odpowiedź
Twoja boot.o
ma sekcję .multiboot
elf, która jest niezgodna z -fPIC
. Możesz spróbować skompilować boot.o
z -fPIC
, ale to powinno się nie udać.
Zobacz https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format dla nagłówka.
Z drugiej strony, nie ma sensu tworzyć bootowalnego obiektu z -fPIC
. Nawet jeśli istniał „dynamiczny moduł ładujący”, „nie może istnieć nic, z czym można by łączyć się dynamicznie podczas procesu uruchamiania.
Komentarze
- Mogłem znaleźć tylko informacje o nagłówku i wartości flagi, które pasowały do mojego pliku boot.s. BTW, boot.o jest plikiem obiektowym, niekompilowalnym, ponieważ powinien być boot.s.
- Co próbujesz osiągnąć, kompilując / łącząc plik .bin z -fPIC?
-fPIC
opcja musi być zastosowana podczas fazy kompilacji (polecenie, które generuje pliki obiektowe) Myślę – raczej niż w fazie łączenia, jak pokazujeszgcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra