高分,在线--linux 下.so文件加载,同名函数,加载错

whslovexyp 2010-07-01 04:25:11
问题如下:

我程序用dlopen("a.so", RTLD_LAZY),然后dlsym(.,"functionA");
a.so中的函数functionA中又如下:
functionA{
...
dlopen("b.so", RTLD_LAZY);
dlsym(.,"functionB");
...
}

问题是a.so和b.so中都有函数functionC,而b.so中的functionB调用了functionC,本来希望是调用b.so中的functionC,
但是现在缺调用了a.so中的functionC,help.................................................................
...全文
264 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
whslovexyp 2010-07-02
  • 打赏
  • 举报
回复
多谢,用了下-bsymbolic解决问题。但是又多了其他问题
屎带芬 2010-07-02
  • 打赏
  • 举报
回复
如果可以修改a.so, b.so的话,是有办法处理符号表冲突的问题,即

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

就可解决这个问题。
whslovexyp 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hqin6 的回复:]

引用 15 楼 whslovexyp 的回复:

引用 13 楼 hqin6 的回复:

lz请查看我的博客:
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx

还没仔细看,多谢
。。。。。。那当我啥也没说。。。
[/Quote]

呵呵,还真是
太乙 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 whslovexyp 的回复:]

引用 13 楼 hqin6 的回复:

lz请查看我的博客:
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx

还没仔细看,多谢
[/Quote]。。。。。。那当我啥也没说。。。
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
明天要试下这个选项

加上链接选项: -Wl,-Bsymbolic
deviosyan 2010-07-01
  • 打赏
  • 举报
回复
看 看13楼
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hqin6 的回复:]

lz请查看我的博客:
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx
[/Quote]
还没仔细看,多谢
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 akirya 的回复:]

引用 10 楼 whslovexyp 的回复:

这个不是的,我突然想到,应该是这样的。

program加载a.so时,a.so中的functionC符号也被加载进到进程中了,当b.so再加载进来时,b.so会找functionC的符号定义,这时,这个定义已经加载了,因此b.so中的functionC不再被加载。

有个参数可以解决这个问题
仔细看看 dlopen的 第二个参数
……
[/Quote]

这个试过,不可以
太乙 2010-07-01
  • 打赏
  • 举报
回复
lz请查看我的博客:
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx
icydrop 2010-07-01
  • 打赏
  • 举报
回复
RTLD_LOCAL
The object's symbols shall not be made available for the relocation processing of any other object.
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 whslovexyp 的回复:]

这个不是的,我突然想到,应该是这样的。

program加载a.so时,a.so中的functionC符号也被加载进到进程中了,当b.so再加载进来时,b.so会找functionC的符号定义,这时,这个定义已经加载了,因此b.so中的functionC不再被加载。
[/Quote]
有个参数可以解决这个问题
仔细看看 dlopen的 第二个参数
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
这个不是的,我突然想到,应该是这样的。

program加载a.so时,a.so中的functionC符号也被加载进到进程中了,当b.so再加载进来时,b.so会找functionC的符号定义,这时,这个定义已经加载了,因此b.so中的functionC不再被加载。
kingstarer 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 whslovexyp 的回复:]
引用 3 楼 kingstarer 的回复:

你的意思是b.so里面调用了a.so的函数?

这是不可能的 因为b.so编译时根本看不到a.so

你看看是不是看错了 或者其它问题


编译是不会出问题的,都是动态加载的。没有看错哦。同名函数才会这样
[/Quote]
我的意思是编译时b.so调用的是b.so内部的函数 已经是确定了
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 soulzbg 的回复:]

友情帮顶一下,Linux下不是很清楚
[/Quote]

继续顶下,不知道怎么解决。sos.........................................................
soulzbg 2010-07-01
  • 打赏
  • 举报
回复
友情帮顶一下,Linux下不是很清楚
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
改名字,好主意,多谢兄台。
还是寻求其他方法。
happy_c 2010-07-01
  • 打赏
  • 举报
回复
改个名字吧...哈哈 不明原因
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingstarer 的回复:]

你的意思是b.so里面调用了a.so的函数?

这是不可能的 因为b.so编译时根本看不到a.so

你看看是不是看错了 或者其它问题
[/Quote]

编译是不会出问题的,都是动态加载的。没有看错哦。同名函数才会这样
kingstarer 2010-07-01
  • 打赏
  • 举报
回复
你的意思是b.so里面调用了a.so的函数?

这是不可能的 因为b.so编译时根本看不到a.so

你看看是不是看错了 或者其它问题
whslovexyp 2010-07-01
  • 打赏
  • 举报
回复
ls的换头像换的好快,
加载更多回复(1)

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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