¿Cómo fuerzo a gcc a llamar a una función directamente en el código PIC?
Considere la siguiente función:
extern void test1(void);
extern void test2(void) {
test1();
}
Este es el código que genera gcc sin-fpic
en amd64 Linux:
test2:
jmp test1
Cuando compilo con-fpic
, gcc llama explícitamente a través del PLT para habilitar la interposición de símbolos:
test2:
jmp test1@PLT
Sin embargo, esto no es estrictamente necesario para el código independiente de la posición y podría omitirse si no quiero admitirlo. Si es necesario, el vinculador reescribe el objetivo de salto al símbolo PLT de todos modos.
¿Cómo puedo, sin cambiar el código fuente y sin hacer que el código compilado no sea adecuado para una biblioteca compartida, hacer que las llamadas a funciones vayan directamente a sus destinos en lugar de pasar explícitamente por el PLT?