可能重复:
Linux, GNU GCC, ld, version scripts and the ELF binary format — How does it work??
我正在尝试更多地了解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
仍然将符号列为{{1}而不是symbol
),但似乎没有任何效果。
我做错了什么?