c++ - 操作动态库加载的符号解析顺序

标签 c++ linux

我试图在运行时加载动态库时操纵(或至少更好地理解)符号解析顺序。在我的示例中,我在 Linux 操作系统上使用 dlopen。

我试图让动态加载的解释器库“libmyint.so”与共享对象库“libmylib.so”中的函数“message_from_library”链接,而不是与链接到我当前拥有的应用程序“myapp”的“libmylib.a”链接。

code.tar.gz

1包含一个简单示例的存档,可以更好地理解这一点。以下是有关如何构建示例并运行它的说明。

构建说明:

tar xzf code.tar.gz
mkdir app-build int-build lib-build
cd lib-build
cmake ../lib
make
cd ../int-build
cmake ../int
make
cd ../app-build
cmake ../app
make

./myapp

实际输出:

Call to statically linked interpreter function.
This message is from a static interpreter library object.
This message is from a static library object.
Call to dynamically loaded function in interpreter library.
This message is from a *shared* interpreter library object.
This message is from a static library object.

期望的输出:

Call to statically linked interpreter function.
This message is from a static interpreter library object.
This message is from a static library object.
Call to dynamically loaded function in interpreter library.
This message is from a *shared* interpreter library object.
This message is from a *shared* library object.

我希望有人能告诉我如何在此示例中获得所需的输出。

谢谢。

最佳答案

动态库用于在运行时解析未解析的引用。任何在链接时已解决的内容都不会产生 Unresolved 引用。无论您的动态链接器尝试什么,如果没有未解析的引用 Foo,那么它根本无法解析它。

关于c++ - 操作动态库加载的符号解析顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24822779/

相关文章:

c++ - 决定它是否是文件的非确定性行为?

c++ - 理解 C++ new 运算符

python - 如何以编程方式确定 linux 中的默认应用程序

linux - 在 EC2 实例 (Linux) 中安装并使用 Cloud Custodian?

coredump 重定向到文件

c++ - 跨多个函数访问类指针

C++ strcat 创建无限循环

C++ 风格的 vector - 指针数组还是数组?

linux - EPOLLET 行为不正确?

linux - 用sed分隔一个文本文件