LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1662|回复: 10

找到了在gaim中不能使用SCIM的GTK输入模块的可能原因了,供参考

[复制链接]
发表于 2004-8-10 23:20:18 | 显示全部楼层 |阅读模式
我的系统 Debian unstable。
参看
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=129868
在gaim中一直不能使用SCIM 的GTK输入法模块,错误原因与上面一样。

把scim的源代码下过来看了一下,发现scim载入动态模块用的是libltdl,而且是自带的(src/ltdl.*),其实不少Linux系统配合libtool都提供了libltdl动态库,比如Debian中的包libltdl3,它提供了lt_dlopen等lt_*系列函数,因此在scim中其实也可以使用系统自带的libltdl。
不巧的是,现在在Linux下有些其他的库也自带了libltdl,如果一个程序同时使用了这几个库,那这时会发生什么情况呢?程序运行时碰到有相同的函数symbol名时,Linux好像只会使用最先载入的那一个。
在/usr/lib中查了一下
hzhr@debian:/usr/lib$ strings -f lib*.so* | grep lt_dlopen
libartsc.so: lt_dlopen
libartsc.so: lt_dlopen_flag
libartsc.so: lt_dlopenext
libartsc.so.0: lt_dlopen
libartsc.so.0: lt_dlopen_flag
libartsc.so.0: lt_dlopenext
libartsc.so.0.0.0: lt_dlopen
libartsc.so.0.0.0: lt_dlopen_flag
libartsc.so.0.0.0: lt_dlopenext
libgcj.so: lt_dlopen
libgcj.so: lt_dlopenext
libgcj.so.4: lt_dlopen
libgcj.so.4: lt_dlopenext
libgcj.so.4.0.0: lt_dlopen
libgcj.so.4.0.0: lt_dlopenext
libguile-ltdl.so.1: scm_lt_dlopenext
libguile-ltdl.so.1.0.0: scm_lt_dlopenext
libguile.so.12: scm_lt_dlopenext
libguile.so.12.3.0: scm_lt_dlopenext
libImlib2.so.1: lt_dlopenext
libImlib2.so.1: lt_dlopen
libImlib2.so.1.1.0: lt_dlopenext
libImlib2.so.1.1.0: lt_dlopen
libltdl.so: lt_dlopen
libltdl.so: lt_dlopenext
libltdl.so.3: lt_dlopen
libltdl.so.3: lt_dlopenext
libltdl.so.3.1.0: lt_dlopen
libltdl.so.3.1.0: lt_dlopenext
libMagick.so.0: lt_dlopen
libMagick.so.0: lt_dlopenext
libMagick.so.0.0.0: lt_dlopen
libMagick.so.0.0.0: lt_dlopenext
libMagick.so.6: lt_dlopen
libMagick.so.6: lt_dlopenext
libMagick.so.6.0.3: lt_dlopen
libMagick.so.6.0.3: lt_dlopenext
libodbcinst.so.1: lt_dlopen
libodbcinst.so.1.0.0: lt_dlopen
libodbc.so.1: lt_dlopen
libodbc.so.1.0.0: lt_dlopen
strings: 'libqttestrunner.so': No such file
libscim-1.0.so: lt_dlopenext
libscim-1.0.so: lt_dlopen
libscim-1.0.so.0: lt_dlopenext
libscim-1.0.so.0: lt_dlopen
libscim-1.0.so.0.4.0: lt_dlopenext
libscim-1.0.so.0.4.0: lt_dlopen
strings: 'libswigchicken.so': No such file
strings: 'libswigguilescm.so': No such file
strings: 'libswigguile.so': No such file
libtemplate.so.1: lt_dlopen
libtemplate.so.1.0.0: lt_dlopen

gaim运行时,首先会载入arts声音模块,libartsc.so自带有lt_dlopen,当scim的gtk模块载入时,因为在运行中lt_dlopen符号已经找到引用了,所以当scim模块运行时,程序就不会使用scim自带的lt_dlopen,转而用上libartsc.so的了,估计arts用的libltdl很老了,致使scim老是不能成功载入自己的模块。
为了验证是否正确,试了一些其他程序如bmp播放器(带arts输出),发现情况跟gaim一样。

解决起来倒是个麻烦事,一开始看来似乎不是gaim就是scim的问题,结果出来却让人大跌眼镜,扯到一个几乎毫不相干的arts上了。那到底由谁来改才合适呢?就上面说的情况,不知道在
Linux下有没有办法强制让scim模块使用自己的lt_dlopen呢?如果这行不通,那只有改源代码,重新编译了,估计更新一下arts的libltdl就可以了。
最终解决方案应该是大家都开始使用系统提供的libltdl,但现在似乎libltdl用的不广,好像不是所有的系统都缺省带libltdl。

当然最简单的方法是,譬如我不用KDE,干脆删掉arts就了事了,问题解决。
发表于 2004-8-11 05:12:31 | 显示全部楼层
嗯,很有道理。

实际上 /usr/lib/libartsc.so.0 是 libartsc0 里的,gaim 并没有对 libartsc0 的直接依赖关系,而是 gaim 依赖于 libao2,libao2 又建议 libartsc0。估计 /usr/lib/libartsc.so.0 是 /usr/lib/libao.so.2 动态打开的(libao.so.2 并不动态链接到 libartsc.so.0)。

多谢 hzhr 兄的研究。
发表于 2004-8-11 08:26:11 | 显示全部楼层
I do not think so

nearly all kde apps rely on arts, but I can use scim under kde apps without any problems
发表于 2004-8-11 08:43:23 | 显示全部楼层
最初由 liuspider 发表
I do not think so

nearly all kde apps rely on arts, but I can use scim under kde apps without any problems

But libartsc.so.0 is the C wrapper of arts.  Since all KDE apps are C++, I suppose they won't use libartsc.so.0?
发表于 2004-8-11 09:00:50 | 显示全部楼层
不管怎样。感谢你的报告。我已经在 CVS 里面修正了你说的这个问题。现在,SCIM 无论如何都会使用自己的 lt_dlopen 系列函数。
发表于 2004-8-11 11:26:30 | 显示全部楼层
:thank
 楼主| 发表于 2004-8-11 15:04:14 | 显示全部楼层
最初由 james_su 发表
不管怎样。感谢你的报告。我已经在 CVS 里面修正了你说的这个问题。现在,SCIM 无论如何都会使用自己的 lt_dlopen 系列函数。

看了一下cvs,这样改也好,省得和别人冲突,估计将ltdl.c更名为ltdl.cpp就可以,不一定要用namespace scim。
其实这不是scim的问题,但是估计要将其他库都切换到libltdl还需要一段时间,scim未来可以考虑一下用libltdl动态库。
发表于 2004-8-11 15:20:07 | 显示全部楼层
这是个很好的消息,今天晚上试试从cvs编译一个archlinux的包,看看在我系统上与firefox的问题有没有解决。^_^。
发表于 2004-8-11 19:14:10 | 显示全部楼层
我按照主页上的说明:
Install from CVS
First, checkout the source from CVS

    $ export CVS_RSH="ssh"
    $ cvs -z3 -d:ext:anoncvs@savannah.nongnu.org:/cvsroot/scim checkout -P scim-lib
    $ cd scim-lib

After checking out the source:

    $ ./bootstrap
    $ ./configure --prefix=/usr --sysconfdir=/etc
    $ make
    # make install


但是得到的是:
cvs [checkout aborted]: cannot exec ssh: No such file or directory
cvs [checkout aborted]: received broken pipe signal

能不能帮我一下。
谢谢。
发表于 2004-8-11 19:18:30 | 显示全部楼层
Solved after installing openssh, sorry for bothering.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表