linux - 如何解析 dlopen 库中的外部变量

标签 linux g++ dlopen

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

我已将其声明为外部,但当应用加载并尝试使用它时,出现 undefined symbol 错误。

我在加载库时将标志设置为 RTLD_LAZY | RTLD_GLOBAL。

最佳答案

你必须构建你的应用程序,其中你有一个全局变量和 g++-rdynamic 选项。此选项指示链接器 (ld) 将所有符号(而不仅仅是使用过的符号)添加到应用程序的动态符号表中。

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

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

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

If you use "dlopen" to load a dynamic object which needs to refer back to the symbols defined by the program, rather than some other dynamic object, then you will probably need to use this option when linking the program itself.

有用的链接:

关于linux - 如何解析 dlopen 库中的外部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924966/

相关文章:

regex - grep 文件内完整的资源 url

linux - 在顺序编号的目录之间插入新的编号目录

c++ - g++ 错误从 ‘void*’ 到 ‘info*’ 的无效转换 [-fpermissive],错误 : invalid conversion from ‘void*’ to ‘void* (*)(void*)’ [-fpermissive]

检查 C/C++ 中动态加载的共享库中的变量类型

c - LD_PRELOAD 和联动

linux - Bash,来自带有 STDIN 的文件的 Cowsay 命令

linux - 将每个目录的名称添加到linux中相应目录内的文件中

c++ - 如何访问 MacBook 上的网络摄像头?

c++ - fnaf奇怪的表现

c++ - 动态库和主程序中的静态类变量