【问题标题】:Is there a way to build a libxml2 without text relocations on Linux?有没有办法在 Linux 上构建一个没有文本重定位的 libxml2?
【发布时间】:2009-11-17 16:10:11
【问题描述】:

下午好,

我在使用 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 编译 [...]

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

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

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

感谢任何帮助!

问候, 斯蒂芬

【问题讨论】:

    标签: linux libxml2 selinux


    【解决方案1】:

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

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

    【讨论】:

    • 据我了解重定位 -fPIC 需要转到 libxml2 的 Makefile,还是我错了?
    • 是的,或者您可以尝试先执行export CFLAGS=-fPIC,但这可能会清除现有的重要 CFLAGS。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 是的!我只有一个静态 libz 的事实给我带来了麻烦。一旦动态 libz.so 可用,问题就消失了! :-)
    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多