代码之家  ›  专栏  ›  技术社区  ›  x-yuri

LD\u LIBRARY\u PATH对无效LibXML.so文件

  •  2
  • x-yuri  · 技术社区  · 7 年前

    XML::LibXML 是一个Perl库。 LibXML.so 是图书馆的一部分。我在试着 XML::LibXML 使用定制 libxml2 . 但是提供 LD_LIBRARY_PATH 没什么区别:

    $ ldd ./blib/arch/auto/XML/LibXML/LibXML.so | grep libxml2
        libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007f66af5e9000)
    
    $ LD_LIBRARY_PATH=/home/yuri/_/libxml2/.libs ldd ./blib/arch/auto/XML/LibXML/LibXML.so | grep libxml2
        libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007f2d26ae3000)
    
    $ ldd /usr/lib/python3.7/site-packages/libxml2mod.so | grep libxml2
        libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007f878cbc8000)
    
    $ LD_LIBRARY_PATH=/home/yuri/_/libxml2/.libs ldd /usr/lib/python3.7/site-packages/libxml2mod.so | grep libxml2
        libxml2.so.2 => /home/yuri/_/libxml2/.libs/libxml2.so.2 (0x00007f6f8f5d8000)
    

    我做错什么了?有办法处理吗?目标是让Perl脚本使用定制的 库xml2 (调查一些问题)。

    升级版

    $ find /usr/lib -name libxml2.so.2
    /usr/lib/libxml2.so.2
    /usr/lib/vmware-installer/2.1.0/lib/lib/libxml2.so.2
    /usr/lib/vmware-installer/2.1.0/lib/lib/libxml2.so.2/libxml2.so.2
    /usr/lib/vmware-vmrc/5.5/lib/libxml2.so.2
    /usr/lib/vmware-vmrc/5.5/lib/libxml2.so.2/libxml2.so.2
    
    $ find /usr/local/lib -name libxml2.so.2
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   x-yuri    7 年前

    太长,读不下去了

    ExtUtils::MakeMaker RPATH 报关进口 .dynamic 部分。但是你可以预先加载所需的库,

    $ LD_PRELOAD=path/to/custom/libxml2/.libs/libxml2.so.2 ldd ./blib/arch/auto/XML/LibXML/LibXML.so
    

    或者让加载程序忽略 路径 进入,

    $ LD_LIBRARY_PATH=path/to/custom/libxml2/.libs /usr/lib/ld-linux-x86-64.so.2 --inhibit-rpath /abs/path/to/LibXML.so /abs/path/to/perl ./1.pl
    

    或转换 路径 进入 RUNPATH 一个,

    $ chrpath --convert blib/arch/auto/XML/LibXML/LibXML.so
    

    进入,

    $ chrpath --delete blib/arch/auto/XML/LibXML/LibXML.so
    

    或指定 XMLPREFIX 变量,

    $ perl Makefile.PL XMLPREFIX=path/to/custom/libxml2/build
    

    在引擎盖下

    ExtUtils::Liblist::ext() 获取要链接的库的列表,如 -lxml2 -lz -llzma -licui18n -licuuc -licudata -lm -ldl ,并将其转化为 four five variables ,它们进入了 Makefile . 其中之一就是 LD_RUN_PATH . 它包含找到库的所有路径。

    $is_dyna 如果库是动态的(不是 ends 具有 .a $is_perl built 具有 it ,和 %ld_run_path_seen LD\u运行路径

    那部分 calculates ,生成部分Makefile variable ,以及传递给 linker

    后果

    LD\u运行路径 路径

    -rpath=目录 这在将ELF可执行文件与共享对象链接时使用。将所有-rpath参数串联起来并传递给运行时链接器,后者使用它们在运行时定位共享对象。-rpath选项也用于定位链接中显式包含的共享对象所需的共享对象;请参阅-rpath-link选项的描述。

    https://jlk.fjfi.cvut.cz/arch/manpages/man/core/binutils/ld.1.en

    如果共享对象依赖项不包含斜杠,则按以下顺序搜索:

    o使用 二进制文件的动态节属性(如果存在)和DT\u运行路径属性不存在。不推荐使用DT\u RPATH。

    o使用环境变量 LD\库\路径

    https://jlk.fjfi.cvut.cz/arch/manpages/man/core/man-pages/ld.so.8.en

    $ perl Makefile.PL
    $ make
    

    结果,

    $ readelf --dynamic ./blib/arch/auto/XML/LibXML/LibXML.so | grep RPATH
     0x000000000000000f (RPATH)              Library rpath: [/usr/lib]
    
    $ objdump -x ./blib/arch/auto/XML/LibXML/LibXML.so | egrep RPATH
      RPATH                /usr/lib
    
    $ LD_LIBRARY_PATH=path/to/custom/libxml2/.libs ldd ./blib/arch/auto/XML/LibXML/LibXML.so | grep libxml2
        libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007f6cfabb2000)
    

    --dynamic -显示的内容 .动态 第节, -x -显示所有标题。

    解决这个问题的一种方法是预加载所需的 libxml2

    $ LD_PRELOAD=path/to/custom/libxml2/.libs/libxml2.so.2 ldd ./blib/arch/auto/XML/LibXML/LibXML.so | grep libxml2
        path/to/custom/libxml2/build/lib/libxml2.so.2 (0x00007fe183aeb000)
    

    另一个是说 Makefile.PL 搜索 库xml2 在所需的位置(编译时)。

    $ perl Makefile.PL XMLPREFIX=path/to/custom/libxml2/build
    $ make
    

    $ readelf --dynamic ./blib/arch/auto/XML/LibXML/LibXML.so | grep RPATH
     0x000000000000000f (RPATH)              Library rpath: [path/to/custom/libxml2/build/lib:/usr/lib]
    
    $ objdump -x ./blib/arch/auto/XML/LibXML/LibXML.so | egrep RPATH
      RPATH                path/to/custom/libxml2/build/lib:/usr/lib
    
    $ ldd ./blib/arch/auto/XML/LibXML/LibXML.so | grep libxml2
        libxml2.so.2 => path/to/custom/libxml2/build/lib/libxml2.so.2 (0x00007fe183aeb000)
    

    要调试吗 XML::LibXML ,您可以使用 OPTIMIZE -B 如果图书馆已经建好了,就要重建一切),

    $ make OPTIMIZE='-g3 -O0'
    

    -O2 ,没有 -g LDDLFLAGS ,但不确定这是否重要。

    或者, WriteMakeFile 参数,以便可以添加一行 here ,

    'OPTIMIZE' => '-g3 -O0'
    

    或者可以添加变量 here 生成文件.PL ,

    $ perl Makefile.PL OPTIMIZE='-g3 -O0'
    
        2
  •  -1
  •   Nathan Mills    7 年前

    如果在中安装自定义的libxml版本 /usr/local/lib /usr/lib (假设您有sudoers或root权限安装它)。

    不过,我不知道为什么Python对库使用的查找路径似乎与Perl不同。可能libxml库的完整路径是用XML::libxml的硬编码的LibXML.so?如果XML::LibXML模块与-l/usr/lib/libxml2.so链接,而不是与-lxml2链接,那就是问题所在。