0

下午好,

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

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

$> perl Makefile.PL LIB=/foo/lib/perl PREFIX=/foo INSTALLDIRS=site
启用本机 perl UTF8
运行 xml2-config...ok (2.7.6)
正在寻找 -lxml2... 不
正在寻找 -llibxml2... 不
未找到 libxml2

但是,该文件是可用的。开始构建

perl Makefile.PL LIB=/usr/inform/target/lib/perl PREFIX=/usr/inform/target INSTALLDIRS=site

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

[...]
无法为模块 Conftest 加载“blib/arch/auto/Conftest/Conftest.so”:/usr/inform/target/lib/libxml2.so.2:reloc 后无法恢复段 prot:/usr/lib 的权限被拒绝/perl5/5.8.8/i386-linux-thread-multi/DynaLoader.pm 第 230 行。
 在 test.pl 第 2 行
[...]

经过一番调查,我发现问题似乎libxml2.so是由文本重定位造成的:

[tess91@INF-AW] lib$ eu-findtextrel libxml2.so.2.7.6
包含函数 'get_crc_table' 的文件未使用 -fpic/-fPIC 编译
包含函数 'crc32' 的文件未使用 -fpic/-fPIC 编译
包含函数“gzerror”的文件未使用 -fpic/-fPIC 编译
[...]

Ans 因为我们在目标机器上激活了 SElinux,所以链接 libxml.2 失败了!

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

我真的不敢相信我是唯一一个在 SElinux 处于活动状态的 Linux 上遇到这个问题的人。我错过了什么?

任何帮助表示赞赏!

问候,斯特凡

4

2 回答 2

1

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

我假设您使用的是 32 位 x86,没有-fPIC.

于 2009-11-17T16:17:53.573 回答
1

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

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

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

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

于 2009-11-18T08:40:04.763 回答