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

  • -fPIC opcja musi być zastosowana podczas fazy kompilacji (polecenie, które generuje pliki obiektowe) Myślę – raczej niż w fazie łączenia, jak pokazujesz
  • Nie ' t wydaje się działać. Próbowałem tego podczas kompilowania kodu GAS (nie argumentu) i polecenia, które generuje plik obiektowy. Wydaje się, że nie działa. gcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra
  • (1) Moje pierwsze przypuszczenie (i jest to tylko przypuszczenie) było takie, że jest to problem z kolejnością w wierszu poleceń. Czy próbowałeś zmienić kolejność poleceń line? (2) Faktycznie odczytanie błędu „rekompiluj z -fPIC” sprawia, że wątpię w moje pierwsze przypuszczenie i wierzę, że @steeldriver ma dobry pomysł.… (ciąg dalszy)
  • (ciąg dalszy)… (3) Ludzie powiedzą, że to pytanie jest tutaj niezwiązane z tematem i należy do przepełnienia stosu . Uważam, że jest tutaj na temat, ale Zgadzam się, że odpowiedź prawdopodobnie zostanie udzielona szybciej i dokładniej na przepełnieniu stosu . Jeśli nie dostaniesz tutaj odpowiedzi, a pytanie nie zostanie przeniesione, proponuję zgłosić je i poprosić o przeniesienie. Nie przesyłaj ponownie pytania.
  • Tak, próbowałem zmienić kolejność.

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?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *