linux动态库修改名称(修改库文件内容)

  在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 使用新库执行程序

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__0809 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值