我使用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的构造函数和方法包含在主机二进制文件中?
答案 0 :(得分:3)
如果您至少没有定义对象,则带有内联方法定义的类定义不会生成任何符号。 因此,如果您想确保其可见性,请不要将这些方法定义为内联...
答案 1 :(得分:0)
为了生成动态加载的库,您可以使用以下命令构建它:
$ gcc -shared -fPIC -o lib1.so lib1.c
-fPIC 用于告诉GCC生成位置独立代码 - 共享用于表示它是共享对象
要链接到您的库test.so您可以使用以下内容:
$ gcc -L$(pwd) -Wl,-rpath=$(pwd) --enable-new-dtags -o test main.c -l1 -l2
使用 -rpath = / my / location ,您可以告诉链接器备用位置列表
要验证二进制文件的动态部分,您可以使用:$ readelf -d test