Ik probeer enkele bestanden te koppelen. Hier is mijn commando:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Maar ik krijg deze foutmelding:
/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
Ik heb het -fPIC
argument toegevoegd, heb ik het gewoon op de verkeerde plaats gezet? Ik heb “niets kunnen vinden voor de syntaxis voor deze vlag. Bedankt!
Reacties
- De
-fPIC
optie moet worden toegepast tijdens de compilatiefase (de opdracht die de objectbestanden genereert) denk ik – in plaats van de linkfase, zoals je laat zien - Het doet niet ' t lijkt te werken. Ik heb het geprobeerd bij het compileren van de GAS-code (geen arg) en het commando dat het objectbestand genereert. Het lijkt niet te werken.
gcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra
- (1) Mijn eerste gok (en het is slechts een gok) was dat het een opdrachtregelprobleem is. Heb je geprobeerd de volgorde van de opdracht te veranderen? regel? (2) Als ik de “recompile with -fPIC” -fout eigenlijk lees, twijfel ik aan mijn eerste gok en geloof ik dat @steeldriver het juiste idee heeft. … (vervolg)
- (vervolg) … (3) Mensen zullen zeggen dat deze vraag hier niet over het onderwerp gaat, en thuishoort op Stack Overflow . Ik denk dat het hier een onderwerp is, maar Ik ben het ermee eens dat het waarschijnlijk sneller en nauwkeuriger wordt beantwoord op Stack Overflow . Als u hier geen antwoord krijgt en de vraag niet wordt gemigreerd, raad ik u aan deze te markeren en te vragen om deze te laten verplaatsen. Stel de vraag niet opnieuw in.
- Ja, ik heb geprobeerd de volgorde te wijzigen.
Antwoord
Uw boot.o
heeft een .multiboot
elf-sectie, die niet compatibel is met -fPIC
. Je kunt proberen boot.o
te compileren met -fPIC
maar dat zou moeten mislukken.
Zie https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format voor de header.
Aan de andere kant heeft het weinig zin om een opstartbaar object te maken met -fPIC
. Zelfs als er een “dynamische lader” was, kan er “niets zijn om dynamisch naar te linken tijdens het opstartproces.
Opmerkingen
- Ik kon alleen informatie vinden over de header en de vlagwaarde, en het kwam overeen met mijn boot.s. Trouwens, de boot.o is een objectbestand, niet compileerbaar, zoals het zou moeten zijn boot.s.
- Wat probeer je te bereiken door je .bin te compileren / koppelen aan -fPIC?