Como forço o gcc a chamar uma função diretamente no código PIC?
Considere a seguinte função:
extern void test1(void);
extern void test2(void) {
test1();
}
Este é o código que o gcc gera sem-fpic
no amd64 Linux:
test2:
jmp test1
Quando eu compilar com-fpic
, o gcc chama explicitamente por meio do PLT para ativar a interposição de símbolos:
test2:
jmp test1@PLT
No entanto, isso não é estritamente necessário para o código independente de posição e pode ser deixado de fora se eu não quiser dar suporte. Se necessário, o vinculador reescreve o alvo de salto no símbolo PLT de qualquer maneira.
Como posso, sem alterar o código-fonte e sem tornar o código compilado inadequado para uma biblioteca compartilhada, fazer chamadas de função ir diretamente para seus destinos em vez de passar explicitamente pelo PLT?