用GCC导出c++类的符号

Export symbols of C++ class with GCC

本文关键字:符号 c++ GCC 导出      更新时间:2023-10-16

我正在使用dlopen来合并动态加载的库及其宿主的符号,并且在宿主中我有一个类:

class Foo {
public:
    Foo() {/* ... */}
    void bar() {/* ... */}
};
int main() {
    // Foo foo;
    return 0;
}

我用g++ -Wl,--export-dynamic -o test test.cpp编译这个,用nm -g test检查符号。我希望符号_ZN3FooC1Ev_ZN3FooC2Ev存在于可执行文件中,因为动态库需要它们,但是除非我通过取消注释来使用它们,否则它们不会出现。我相信它正在被优化,因为GCC认为它是不需要的。

如何强制Foo的构造函数和方法包含在主机二进制文件中?

带有内联方法定义的类定义至少在不定义对象的情况下不会生成任何符号。因此,如果你想确保方法的可见性,就不要将方法定义为内联的…

为了生成动态加载的库,你必须使用:

$ gcc -shared -fPIC -o lib1.so lib1.c

-fPIC用于告诉GCC生成位置无关代码。
shared表示它是一个共享对象

链接到您的库测试。因此,您可以使用以下命令:

$ gcc -L$(pwd) -Wl,-rpath=$(pwd) --enable-new-dtags -o test main.c -l1 -l2

使用-rpath=/my/location告诉链接器备用位置的列表
要验证二进制文件的动态部分,您可以使用:$ readelf -d test