linux动态库修改名称(修改库文件内容)
发布日期:2021-06-30 21:33:42 浏览次数:3 分类:技术文章

本文共 1400 字,大约阅读时间需要 4 分钟。

  在linux系统下,当系统中存在多个相同命名的动态库(.so)时,ldconfig只为执行程序链接最后找到的库,而之后找到的库虽然通过“ifconfig -p”可以看到库路径信息,但不会被链接到执行程序。

  在实际编程中,如果多个项目都用到某个动态库(比如libteaa.so,存在有多个并且在不同路径下),而且libteaa.so内的某个函数实现不同,部分程序编译或执行时将会出现异常情况。

举两个简单例子:

  1. a程序需要调用libteaa.so内的add函数为int add(int a, int b),而b程序需要调用libteaa.so内的函数为int add(int a)。
  2. a程序需要调用libteaa.so内的add函数内部为return a + b,而b程序需要调用libteaa.so内add函数内部为return a + a + b。

  上述示例执行ldconfig后,如果链接的是a程序的libteaa.so库,那么b程序将会出错。针对这种情况,我们可以通过修改动态库名称来达到同时链接多个库,比如b程序的libteaa.so改为libtebb.so。

接下来,我们通过以下内容了解如何修改动态库名称

1. 查看系统中相同命名的动态库

在这里插入图片描述

图1 ldconfig -p查看同名称库路径

参考图1, 执行ldconfig -p | grep libteaa,可以看到两个libteaa.so,但只有下面这个会被链接到执行程序(图2)。

在这里插入图片描述

图2 ldd 程序名查看链接库路径

2. 查看库文件中是否包含库名称

在这里插入图片描述

图3 查看库文件内容

  首先执行hexdump -C libteaa.so > tmp,把文件内容保存入tmp文件中,然后vim打开文件可以看到文件偏移量、字节的十六进制、ASCII字符内容,参考图3。

  在文件中,搜索libteaa,在ASCll字符信息中如果有libteaa.so(库名称),表示动态库可以通过修改名称成为另一个动态库(解决同名问题)。

3. 修改库文件名称

  修改库文件中的名称需要考虑对齐的情况,比如libteaa可以修改teaa内容,也就是四个字节,比如改为libtebb或libaabb。如果修改后的名称少于或超出原名称长度将会损坏名称之后的内容,造成库执行失败的情况。

  库名称修改方式为: sed -i “s/libteaa/libtebb/” libteaa.so,表示把libteaa.so中的libteaa替换为libtebb。这种情况只能在hexdump -C可以查到库名称的情况下完成修改,否则无效(未替换)。

在这里插入图片描述

图4 再次通过 ldconfig -p查看库路径

  库名称修改完成后,执行sudo ldconfig,可以看到libtebb.so库和库路径,但还没结束。现在的libtebb.so属于软连接文件,它链接的还是原来的libteaa.so。

  接下来执行 mv libteaa.so libtebb.so,把库名称与库文件内的名称同步,然后可以通过 -ltebb加载这个libtebb.so库了。

4. 遇到的问题

  测试过程中,遇到部分库文件内未找到库名称的情况,一般发生在直接用gcc编译动态库。针对这个问题,可以通过Cmake脚本编译动态库。

在这里插入图片描述

图5 使用新库执行程序

  经过后续的测试,改名后的库与原来的库不冲突,算是解决同名库的一种方式吧!

转载地址:https://lkyof.blog.csdn.net/article/details/107969050 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:一起学习C语言:函数(三)
下一篇:三十岁,真的是人生的分水岭吗

发表评论

最新留言

很好
[***.229.124.182]2024年04月13日 15时21分50秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章