相关疑难解决方法(0)

Linux、GNU GCC、ld、版本脚本和 ELF 二进制格式——它是如何工作的?

我正在尝试更多地了解 Linux 中的库版本控制以及如何将其全部投入使用。这是上下文:

-- 我有两个版本的动态库,它们公开了相同的接口集,比如libsome1.solibsome2.so

- 应用程序链接到libsome1.so.

-- 此应用程序用于libdl.so动态加载另一个模块,例如libmagic.so.

——现在libmagic.so是联防libsome2.so。很显然,在不使用连接器脚本隐藏符号libmagic.so,在运行时在接口的所有调用libsome2.so决心libsome1.so。这可以通过检查 返回libVersion()的值与宏的值来确认LIB_VERSION

-- 所以我接下来尝试编译和链接libmagic.so一个链接器脚本,该链接器脚本隐藏了除 3 之外的所有符号,这些符号在其中定义libmagic.so并由它导出。这有效......或者至少libVersion()LIB_VERSION值匹配(并且它报告版本2而不是1)。

-- 但是,当一些数据结构被序列化到磁盘时,我注意到一些损坏。在应用程序的目录中,如果我删除libsome1.so并在其指向的位置创建一个软链接libsome2.so,一切都按预期工作,并且不会发生相同的损坏。

我不禁想到这可能是由于运行时链接器对符号的解析存在一些冲突造成的。我已经尝试了很多东西,比如尝试链接libsome2.so以便所有符号都被别名化symbol@@VER_2(我仍然对此感到困惑,因为该命令nm -CD libsome2.so仍然将符号列为symbol和不列出symbol@@VER_2)......似乎没有任何效果!!!帮助!!!!!!

gcc dynamic-linking elf

13
推荐指数
1
解决办法
6685
查看次数

标签 统计

dynamic-linking ×1

elf ×1

gcc ×1