我试图在运行时加载动态库时操纵(或至少更好地理解)符号解析顺序。在我的示例中,我在 Linux 操作系统上使用 dlopen。
我试图让动态加载的解释器库“libmyint.so”与共享对象库“libmylib.so”中的函数“message_from_library”链接,而不是与链接到我当前拥有的应用程序“myapp”的“libmylib.a”链接。
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/