考虑以下函数:
extern void test1(void);
extern void test2(void) {
test1();
}
在amd64 Linux上,如果没有使用-fpic
,gcc生成的代码如下:
test2:
jmp test1
当我使用
-fpic
编译时,gcc会显式地通过PLT进行调用以启用符号重定位:test2:
jmp test1@PLT
对于位置无关代码,这并不是必需的,如果我不想支持,可以省略。如果必要,链接器仍会将跳转目标重写为PLT符号。
如何在不更改源代码且不使编译后的代码不适用于共享库的情况下,使函数调用直接到达它们的目标,而不是显式地通过PLT进行?
-fpic
选项,链接器会自动将对符号的引用重写为PLT引用(如果适当/必需)。这就是我想要的行为,即编译器生成对所有函数的普通调用,而链接器重写去往另一个共享对象的调用。 - fuz-fno-semantic-interposition
这个选项是否符合您的需求?另请参阅 https://dev59.com/QpHea4cB1Zd3GeqPtcHI。这个问题是否与其中任何一个重复? - Peter Cordes