有没有办法在Linux上没有文本重定位的情况下构建libxml2?

时间:2009-11-17 16:10:11

标签: linux libxml2 selinux

下午好,

我在使用libxml2时遇到了困难。

我尝试构建Perl模块XML-LibXML,它是我们标准运行时环境的一部分。但是,这次在RHEL5盒子上的安装失败了,因为构建过程抱怨缺少libxml2:

$> perl Makefile.PL LIB=/foo/lib/perl PREFIX=/foo INSTALLDIRS=site
enable native perl UTF8
running xml2-config...ok (2.7.6)
looking for -lxml2... no
looking for -llibxml2... no
libxml2 not found

但是,该文件可用。使用

开始构建
perl Makefile.PL LIB=/usr/inform/target/lib/perl PREFIX=/usr/inform/target INSTALLDIRS=site

导致了更多真实问题的证据:

[...]
Can't load 'blib/arch/auto/Conftest/Conftest.so' for module Conftest: /usr/inform/target/lib/libxml2.so.2: cannot restore segment prot after reloc: Permission denied at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/DynaLoader.pm line 230.
 at test.pl line 2
[...]

经过一些调查后,我发现问题似乎是libxml2.so是通过文本重定位创建的:

[tess91@INF-AW] lib$ eu-findtextrel libxml2.so.2.7.6
the file containing the function 'get_crc_table' is not compiled with -fpic/-fPIC
the file containing the function 'crc32' is not compiled with -fpic/-fPIC
the file containing the function 'gzerror' is not compiled with -fpic/-fPIC
[...]

Ans因为我们在目标机器上运行了SElinux,因此链接libxml.2失败了!

是否有可能正确创建libxml2,或者我是否必须要求管理员扭转SElinux以允许重新定位?

我真的不敢相信我是在Linux上运行SElinux时遇到此问题的人。我错过了什么?

任何帮助都很高兴!

此致 斯蒂芬

2 个答案:

答案 0 :(得分:1)

最简单的方法是让您的管理员yum install libxml2-devel甚至yum install perl-XML-LibXML。否则,看看您是否可以-fPICMakefile.PL添加到CFLAGS。

我假设您使用的是32位x86,如果没有-fPIC,任何其他架构都无法运行。

答案 1 :(得分:1)

我刚刚找到了一个可能的解释:

在构建libxml2期间,确实使用了编译器标志-fPIC,因此代码创建位置无关,但是

创建共享库时,静态libz与其链接。这是我问题的根源吗?包括共享可执行文件中的静态库,通过引入不可重定位的代码来玷污库?

符号eu-findtextrel应该已经指向了我这个方向的事实,因为crc32get_crc_table等看起来像加密为中心的代码......