问题描述
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>
在这种特殊情况下,我可以不用-fPIC
进行编译并获得内联,因为这是一个简单的示例,但是我的理解是,总的来说,如果没有-fPIC
我就不能编译共享库。 / p>
所以我的问题是,如何在共享库中允许代码的内部内联?
我愿意接受我无法从外部替换功能(与其他共享库中的功能相同,例如,LD_PRELOAD
),但我仍然希望能够调用它
示例在Ubuntu 18.04(x86_64)上使用g ++-9.3
解决方法
非常有趣的clang优化了此功能,但GCC却没有: https://godbolt.org/z/8hrEjd
也许值得向海湾合作委员会报告吗?