允许通过fPIC内联到共享库中

问题描述

所以,我有一个简单的cpp程序

int f() {
    return 1;
}

int g() {
    return f();
}

int main() {
    return 1; 
}

我用 g++ a.cpp -O3,随着objdump -Cd a.out的出现,我看到以下内容

00000000000005f0 <f()>:
 5f0:   b8 01 00 00 00          mov    $0x1,%eax
 5f5:   c3                      retq
 5f6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
 5fd:   00 00 00

0000000000000600 <g()>:
 600:   b8 01 00 00 00          mov    $0x1,%eax
 605:   c3                      retq
 606:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,1)
 60d:   00 00 00

也就是说,f()g()都被编译为突出返回1。到目前为止,还不错。

现在,我想在新的共享库中同时提供f()g()作为公共功能

我用g++ -shared a.cpp -O3 -fPIC编译相同的文件并得到:

00000000000005e0 <f()>:
 5e0:   b8 01 00 00 00          mov    $0x1,%eax
 5e5:   c3                      retq
 5e6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,1)
 5ed:   00 00 00

00000000000005f0 <g()>:
 5f0:   e9 fb fe ff ff          jmpq   4f0 <f()@plt>

现在调用g()并不是最佳方法-它需要跳转plt表,等等

在这种特殊情况下,我可以不用-fPIC进行编译并获得内联,因为这是一个简单的示例,但是我的理解是,总的来说,如果没有-fPIC我就不能编译共享库。 / p>

所以我的问题是,如何在共享库中允许代码的内部内联? 我愿意接受我无法从外部替换功能(与其他共享库中的功能相同,例如,LD_PRELOAD),但我仍然希望能够调用

示例在Ubuntu 18.04(x86_64)上使用g ++-9.3

解决方法

非常有趣的clang优化了此功能,但GCC却没有: https://godbolt.org/z/8hrEjd

也许值得向海湾合作委员会报告吗?