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

  • O -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á mostrando
  • Não ' parece funcionar. Eu tentei compilar o código GAS (não um arg) e o comando que gera o arquivo de objeto. Parece não funcionar. gcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra
  • (1) Meu primeiro palpite (e é apenas um palpite) foi que é um problema de ordem da linha de comando. Você já tentou alterar a ordem do comando linha? (2) Na verdade, ler o erro “recompilar com -fPIC” me faz duvidar do meu primeiro palpite e acreditar que @steeldriver tem a ideia certa.… (Cont.)
  • (Cont.)… (3) As pessoas dirão que esta questão está fora do tópico aqui e pertence ao Stack Overflow . Acredito que esteja no tópico aqui, mas Concordo que é provável que a resposta seja mais rápida e precisa no Stack Overflow . Se você não obtiver uma resposta aqui e a pergunta não for migrada, sugiro que você a sinalize e peça para movê-la. Por favor, não repita a questão.
  • Sim, tentei alterar a ordem.

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?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *