Jeg prøver å koble noen filer. Her er kommandoen min:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
Hva som helst, jeg får denne feilen:
/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
Jeg har tatt med -fPIC
argumentet, har jeg bare satt det på feil sted? Jeg har ikke klart å finne noen ting for syntaksen for dette flagget. Takk!
Kommentarer
Svar
Din boot.o
har en .multiboot
alvdel, som er uforenlig med -fPIC
. Du kan prøve å kompilere boot.o
med -fPIC
men det skulle mislykkes.
Se https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format for overskriften.
På den annen side er det lite fornuftig å lage et oppstartbart objekt med -fPIC
. Selv om det var en «dynamisk laster», kan det ikke være noe å dynamisk lenke mot under oppstartsprosessen.
Kommentarer
- Jeg kunne bare finne informasjon om overskriften og flaggverdien, og den stemte overens med min boot.s. BTW boot.o er en objektfil, som ikke kan kompileres, slik den burde være boot.s.
- Hva prøver du å oppnå ved å kompilere / koble .bin med -fPIC?
-fPIC
-alternativet må brukes under kompileringsfasen (kommandoen som genererer objektfilene) tror jeg – i stedet for koblingsfasen, som du visergcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra