Как заставить gcc вызывать функцию непосредственно в коде PIC?
Рассмотрим следующую функцию:
extern void test1(void);
extern void test2(void) {
test1();
}
Это код, который генерирует GCC без-fpic
на amd64 Linux:
test2:
jmp test1
Когда я собираю с-fpic
gcc явно вызывает через PLT, чтобы включить вставку символов:
test2:
jmp test1@PLT
Это, однако, не является строго необходимым для позиционно-независимого кода и может быть опущено, если я не хочу поддерживать. При необходимости компоновщик переписывает цель перехода в любом случае на символ PLT.
Как я могу, не изменяя исходный код и не делая скомпилированный код неподходящим для разделяемой библиотеки, заставить вызовы функций идти непосредственно к своим целям вместо того, чтобы явно проходить через PLT?