Linux下包含相同符号表的两个库的冲突问题(郁闷)

KeyTyu 2010-06-10 12:34:13
这个问题烦扰我很长时间了,特上来请教各位大侠。
假设存在两个库 libA.so, libB.so, 内部有相同的内部函数名 TestFunc, 但是各自实现不一样。

在libA.so中, 函数 ComputeA 使用到了 TestFunc
在libB.so中, 函数 ComputeB 使用到了 TestFunc

其中函数ComputeA, ComputeB都在可执行程序 program中使用到。program是采用下面这种方式生成的:

g++ -L./ -g -o program program.o -Wl,-rpath=./ -lA -lB

然后在实际运行program过程中发现:
在调用函数 ComputeB 用到了居然是 libA.so中的 TestFunc, 而不是 libB.so中的 TestFunc, 以至于程序就崩溃了。

也就是说, 两个包含相同函数的库,在链接时,会先在第一个链接库中查找,如果查找到了就不会去 下一个库中查找。

在不修改libA.so, 和 libB.so 两个库的情况下, 让 program程序查找符号表时,优先在各自的库中查找?

谢谢
...全文
2006 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
yutouzhong 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

如果可以修改libA.so, libB.so的话,是有办法处理符号表冲突的问题,即

在编译链接生成libA.so, libB.so时, 加上链接选项: -Wl,-Bsymbolic

就可解决这个问题。 但是 如果这个库是 不能修改的, 那该如何解决呢? 谢谢
[/Quote]

是的,谢谢这个好办法。
KeyTyu 2010-06-13
  • 打赏
  • 举报
回复
帖子加分到100,继续求救!!谢谢大家
KeyTyu 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 woso 的回复:]
两个已经编译过的so, 符号表都已经写死了,除了调整搜索顺序,就没有别的办法了。
我觉的,还是试试dlopen的RTL_DEEPBIND, 并在需要的地方才打开这个库,肯能不能临时性的解决。
[/Quote]

用dlopen是可以的,但是在调用方式上必须改变。

RTL_DEEPBIND是不是在ld中有对应的链接选项啥的?
ronliu 2010-06-11
  • 打赏
  • 举报
回复
想必大多数人都以为你说的是C语言的问题。:) 命名空间,好东西!
不过如果是C语言中有这种问题,还是不好解决啊。
有一个方法,不知可行否。
将你的libA.so和libB.so加一个壳,比如libA.so加一个壳为libMyA.so,对libA.so中TestFunc函数的调用由壳libMyA.so中的A_TestFun来完成。同样,libB.so中的TestFunc也由它的壳libMyB.so中的B_TestFun来完成。以后,在你的程序中就可以显式的表明调用的TestFun是哪一个库中的。
yanjinbin0 2010-06-11
  • 打赏
  • 举报
回复
晕,C写多了,忘了命名空间这茬...............
KeyTyu 2010-06-11
  • 打赏
  • 举报
回复
先谢谢了,我正在加你。
pope_key 2010-06-11
  • 打赏
  • 举报
回复
加我QQ641402697
KeyTyu 2010-06-11
  • 打赏
  • 举报
回复
命名空间可以解决这个问题?函数的链接可以通过命名空间?

如何查询?关键字?
pope_key 2010-06-11
  • 打赏
  • 举报
回复
google去
KeyTyu 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hqin6 的回复:]

引用 12 楼 pope_key 的回复:
即然是c++可以用命名空间分隔啊
对啊~~~用名字空间啊
[/Quote]

命名空间可以解决这个问题?函数的链接可以通过命名空间?

能够详细的说明么?谢谢
太乙 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pope_key 的回复:]
即然是c++可以用命名空间分隔啊
[/Quote]对啊~~~用名字空间啊
pope_key 2010-06-11
  • 打赏
  • 举报
回复
即然是c++可以用命名空间分隔啊
yanjinbin0 2010-06-11
  • 打赏
  • 举报
回复

如果你不能修改,最好把这个当做一个Bug提交到库的提供者.

当然你也可以把这个Bug提交到gcc的作者邮箱,这样的问题如果有人遇到过会提供解决方法,如果没人遇到过,那么它更加回解决.

如果你想在你自己的程序里面解决,暂时没有更好多方法.
ronliu 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 keytyu 的回复:]
我和ronliu讨论过了,在不修改A库和B库实现的前提下,用namespace
是无法实现我的需求的。

继续求助。

如何给这个贴加多点分啊?
[/Quote]
帖子的顶部和尾部,都有一个“管理菜单”的按钮
woso 2010-06-11
  • 打赏
  • 举报
回复 1
两个已经编译过的so, 符号表都已经写死了,除了调整搜索顺序,就没有别的办法了。
我觉的,还是试试dlopen的RTL_DEEPBIND, 并在需要的地方才打开这个库,肯能不能临时性的解决。
pope_key 2010-06-11
  • 打赏
  • 举报
回复
退回去,叫第三方厂商增加一个命名空间
KeyTyu 2010-06-11
  • 打赏
  • 举报
回复
我和ronliu讨论过了,在不修改A库和B库实现的前提下,用namespace
是无法实现我的需求的。

继续求助。

如何给这个贴加多点分啊?
ronliu 2010-06-11
  • 打赏
  • 举报
回复
命名空间的问题,楼上那位留QQ号的那位兄弟应该精通啊。

不知道能否将libA.so和libB.so以静态形式链接到一个程序中?这样就能够知道哪些函数冲突了。
如果不行,反汇编这两个库,比较符号表,哪些冲突了。beyondcompare
KeyTyu 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 ronliu 的回复:]

想必大多数人都以为你说的是C语言的问题。:) 命名空间,好东西!
不过如果是C语言中有这种问题,还是不好解决啊。
有一个方法,不知可行否。
将你的libA.so和libB.so加一个壳,比如libA.so加一个壳为libMyA.so,对libA.so中TestFunc函数的调用由壳libMyA.so中的A_TestFun来完成。同样,libB.so中的TestFunc也由它的壳libMyB……
[/Quote]

如果是C++,该怎么使用namespace呢?如果我不知道A,B库里都有哪些同名函数该怎么处理?
KeyTyu 2010-06-10
  • 打赏
  • 举报
回复
如果可以修改libA.so, libB.so的话,是有办法处理符号表冲突的问题,即

在编译链接生成libA.so, libB.so时, 加上链接选项: -Wl,-Bsymbolic

就可解决这个问题。 但是 如果这个库是 不能修改的, 那该如何解决呢? 谢谢
加载更多回复(9)

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧