Estou tentando vincular alguns arquivos. Aqui está meu comando:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
No entanto, recebo este erro:
/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
Incluí o argumento -fPIC
, acabei de colocá-lo no lugar errado? Não consegui encontrar nada para a sintaxe deste sinalizador. Obrigado!
Comentários
Resposta
Sua boot.o
tem uma .multiboot
seção elf, que é incompatível com -fPIC
. Você pode tentar compilar boot.o
com -fPIC
, mas deve falhar.
Veja https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format para o cabeçalho.
Por outro lado, não faz sentido criar um objeto inicializável com -fPIC
. Mesmo se houvesse um “carregador dinâmico”, não pode haver nada para vincular dinamicamente durante o processo de inicialização.
Comentários
- Eu só consegui encontrar informações sobre o cabeçalho e o valor do sinalizador, e combinou com meu boot.s. BTW, o boot.o é um arquivo objeto, não compilável, como deveria ser boot.s.
- O que você está tentando alcançar compilando / vinculando seu .bin com -fPIC?
-fPIC
a opção deve ser aplicada durante a fase de compilação (o comando que gera os arquivos de objeto) eu acho – ao invés da fase de link, como você está mostrandogcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra