2

仅在 HP 平台上强制执行 LD_PRELOAD,而不在其他 unix 风格(AIX、Linux 和 Solaris)上强制执行。

我在所有 Unix 风格上构建了 Perl 模块XML::LibXML::Common 。我必须专门为 HP 平台上的 libcl.2 库执行 LD_PRELOAD。而在其他 unix 平台上则不需要这样的东西。

这是操作系统行为还是 HP 加载器/编译器中真正缺少的东西?

我正在运行一个 perl 脚本,它只是创建一个“XML::LibXML::SAX”的新对象

use XML::LibXML::SAX;
$x = XML::LibXML::SAX->new();

它抱怨

无法为模块 XML::LibXML::Common 加载“site_perl/5.8.8/PA-RISC2.0-thread-multi/auto/XML/LibXML/Common/Common.sl”:执行格式错误

当我为 libcl.2 执行 LD_PRELOAD 时,错误消失了,Perl 是为多线程支持而构建的。

4

4 回答 4

2

我想你是在问为什么你必须使用它。如果您正在运行 Perl 多线程,则您正在调用的库之一是在 libc 之前加载的,它可能是单线程的。作为其依赖处理的一部分,它试图在您的环境中加载多线程库。通过使用 LD_PRELOAD 我认为您正在使用库插入原理来强制该库在加载不安全库之前加载。插入的概念是一个复杂的概念,您可能会从以下链接中获得一些好处:

摘抄:

要使用库插入,您需要创建一个特殊的共享库并设置 LD_PRELOAD 环境变量。设置 LD_PRELOAD 后,动态链接器在搜索共享库时将优先使用指定的库。

于 2009-04-21T06:32:45.210 回答
1

您的问题不清楚...为什么必须使用 LD_PRELOAD?

是不是因为 HP-UX 使用 SHLIB_PATH 而不是 LD_LIBRARY_PATH,所以您设置了错误的环境变量?

它在其他平台上也有其他拼写 - Solaris 和 Linux 恰好共享相同的一组 env。瓦尔斯。MacOS X 使用 DYLIB_LIBRARY_PATH;我相信 AIX 使用使用 LIBPATH。

于 2009-04-15T16:51:24.590 回答
1

虽然这是一个古老的主题,但我现在在 HP-UX 上看到了类似的东西。在我的例子中,它不是 Perl,但是在构建 Python 的 sqlite3 绑定时,/usr/lib/libcl.2 的动态加载失败了。

我已经使用 --with-libs='-lcl' 运行了配置脚本。尽管将其链接到二进制文件和使用 LD_PRELOAD 并不相同,但在加载 /usr/lib/libcl.2 时两者都会发生变化。既然它解决了我的问题,那就试试吧。

于 2013-04-03T20:58:08.733 回答
0

我不确定这是否相关,但可能是。HP-UX 包含的 Perl 不是标准 Perl,而是 ActiveState Perl 的副本——以及可能包含的任何奇怪之处。如果您发现 Perl 在 HP-UX 上的行为与其他所有环境不同,请检查 ActiveState Perl 是否有问题。

于 2009-06-04T06:24:11.503 回答