如何从dlopen'd库中解析extern变量

时间:2014-05-29 02:50:38

标签: linux g++ dlopen

是否可以在应用程序中定义全局变量,由已加载dlopen()的共享库访问?

我将它声明为extern但是当应用程序加载并尝试使用它时,我得到一个未定义的符号错误。

我正在使用设置为RTLD_LAZY |的标志加载库RTLD_GLOBAL。

1 个答案:

答案 0 :(得分:1)

您需要构建一个应用程序,其中包含-rdynamic g++选项的全局变量。此选项指示链接器(ld)将所有符号(不仅是已使用的符号)添加到应用程序的动态符号表中。

这是我如何构建加载共享库的测试C ++应用程序的示例。共享库使用main.cpp中的全局变量。所以我在构建我的-rdynamic应用程序时添加了main

g++ -rdynamic  -m64 -g main.cpp -o main -ldl

g++找到-rdynamic时,它会将标记-export-dynamic传递给ELF链接器(ld)。 这来自man ld(实际上创建了动态符号表):

  

如果您使用" dlopen"加载需要引用的动态对象   到程序定义的符号,而不是其他一些动态   对象,然后您可能需要在链接时使用此选项   程序本身。

有用的链接: