A questão é específica (mas não limitada a) um código Risc-V bare-metal, estou tentando entender o que seria necessário para compilar um binário de firmware independente de posição. Tentei compilar um código simples com -fpie
passado para gcc
e -static-pie
passado para o vinculador, e parece que o binário produzido é um executável independente de posição autocontido, contendo seções , e referências aparentemente onlu .got
-relativas no código. A documentação é bastante obscura, e a opção específica raramente é mencionada. A maior parte da documentação / discute realocações dinâmicas . Estou correto que com esta opção o binário produzido é um verdadeiro executável independente de posição, que não requer nenhuma lógica de realocação especial do carregador (ou de qualquer carregador, assumindo que ele esteja de alguma forma abrindo caminho para a memória executável, é claro). Ou estou esquecendo de algo?.got.plt
pc
-static-pie
pie
pic
O manual do GCC parece bastante claro:
Para se certificar de que seu
-static-pie
programa não requer um vinculador/carregador dinâmico, você pode usar o fato de que um programa ELF que requer um tem que ter umINTERP
cabeçalho de programa que nomeie o requerido. Assim:que se reflete em:
e em tempo de execução:
O vinculador dinâmico começa primeiro e termina por último.
Enquanto:
O vinculador dinâmico não está lá.