我试图了解有关Linux中库版本控制的更多信息,以及如何使它们全部正常工作。这里是上下文:
-我有两个版本的动态库,它们公开了相同的一组接口,例如libsome1.so
和libsome2.so
。
-应用程序链接到libsome1.so
。
-此应用程序用于libdl.so
动态加载另一个模块,例如libmagic.so
。
-现在libmagic.so
链接libsome2.so
。显然,在不使用链接程序脚本隐藏其中的符号的情况下libmagic.so
,在运行时,所有对接口的调用libsome2.so
都解析为libsome1.so
。可以通过libVersion()
对照宏的值检查返回的值来确认LIB_VERSION
。
-所以我接下来尝试编译并链接libmagic.so
一个链接描述文件,该脚本隐藏除其中定义libmagic.so
和导出的3个符号以外的所有符号。这行得通...或至少libVersion()
和LIB_VERSION
值匹配(并且报告版本2不是1)。
-但是,当某些数据结构序列化到磁盘时,我注意到了一些损坏。在应用程序目录中,如果我删除libsome1.so
并在其指向的位置创建一个软链接libsome2.so
,则一切都会按预期工作,并且不会发生相同的损坏。
我忍不住认为这可能是由于运行时链接程序的符号解析中的某些冲突引起的。我尝试了很多事情,例如尝试链接,libsome2.so
以便所有符号都被链接到symbol@@VER_2
(我仍然感到困惑,因为该命令nm -CD libsome2.so
仍将符号列为symbol
and而不是symbol@@VER_2
)……似乎没有任何作用!!!救命!!!!!!
RTLD_LOCAL
和RTLD_DEEPBIND
dlopen标志。我现在没有时间对其进行测试,但是它应该可以根据手册进行工作。