操纵动态库加载的符号解析顺序

Manipulating the symbol resolution order for dynamic library loading

本文关键字:顺序 符号 动态 加载 操纵      更新时间:2023-10-16

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

我正在尝试获得动态加载的解释器库"libmyint"。因此,链接到共享对象库"libmylib"中的函数"message_from_library"。而不是"libmylib"。这是链接到应用程序"myapp",这是我目前拥有的。

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.

我希望有人能告诉我如何在这个例子中得到所需的输出。

谢谢。

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