符号存在时,无法在.so文件中链接符号

时间:2014-10-21 14:09:49

标签: unix dynamic-linking shared-libraries

我想在我的unix系统中安装lxml模块,但它不起作用。问题是未能引用符号:

Python 2.6.4 (r264:75706, Sep 12 2010, 18:46:30) [C] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ld.so.1: isapython2.6: fatal: relocation error: file lxml/etree.so: symbol __xmlStructuredErrorContext: referenced symbol not found

但是,ldd命令的输出是:

$ ldd lxml/etree.so
        libxslt.so.1 =>  /usr/lib/libxslt.so.1
        libexslt.so.0 =>         /usr/lib/libexslt.so.0
        libxml2.so.2 =>  /lib/libxml2.so.2
        libz.so.1 =>     /lib/libz.so.1
        libm.so.2 =>     /lib/libm.so.2
        libpython2.6.so.1.0 =>   /usr/lib/libpython2.6.so.1.0
        libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
        libpthread.so.1 =>       /lib/libpthread.so.1
        libsocket.so.1 =>        /lib/libsocket.so.1
        libnsl.so.1 =>   /lib/libnsl.so.1
        libc.so.1 =>     /lib/libc.so.1
        libdl.so.1 =>    /lib/libdl.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1

并发现:

$ nm /lib/libxml2.so.2 | grep __xmlStructuredErrorContext
000a99e8 t __xmlStructuredErrorContext
这让我感到恶心。有一个符号,为什么它只是无法链接?我缺少什么吗?

2 个答案:

答案 0 :(得分:2)

确定。这个问题来自很久以前。我发现了原因:

通知:

$ nm /lib/libxml2.so.2 | grep __xmlStructuredErrorContext
000a99e8 t __xmlStructuredErrorContext

此符号的属性为t,属于本地,不会被导出。它发生的原因是图书馆太旧了。

但遗憾的是,如果您正在使用solaris系统,如果您尝试通过从源代码编译来更新libxml2,则会因为编译器或源代码中的错误而失败。进一步参考:http://blog.gmane.org/gmane.comp.gnome.lib.xslt/month=20110201

实际上有一个捷径可以使用lxml安装openCSW预编译包:

pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i python27 py_lxml

它会起作用。

答案 1 :(得分:0)

Solaris Sparc(5.11)上的Python3遇到相同的问题。 lxml的OpenCSW版本仅适用于Python 2,因此必须执行以下操作:

  • 从OpenCSW获取libxml2和libz1(在我的情况下为libz1-1.2.8,REV = 2013.09.23-SunOS5.10-sparc-CSW和libxml2_2-2.9.3.REV = 2016.02.16-SunOS5.10 -sparc-CSW,可从openCSW下载:https://mirror.opencsw.org/opencsw/
  • 从这些软件包中提取相应的SO文件(不是sparcv9版本)
  • 创建符号链接
libxml2.so.2 -> libxml2.so.2.9.3
libxml2.so.2.9.3
libz.so.1 -> libz.so.1.2.8
libz.so.1.2.8
  • 在.bashrc的LD_LIBRARY_PATH变量中添加此文件夹的路径