Perl/Postgresql:plperl.so未定义符号:Perl_sv_2bool_flags



这是我在这里的第一篇文章,如果我第一次没有提供所需的所有信息,很抱歉!

我的老板和我一直试图在我们的一台服务器(Centos 6.5、postgres 9.2.1、Perl 5.10.1)上的postgres安装上安装plperl,但我们一直遇到同样的问题,如下所示:

ERROR:  could not load library "/opt/PostgreSQL/9.2/lib/postgresql/plperl.so": 
/opt/PostgreSQL/9.2/lib/postgresql/plperl.so: undefined symbol: Perl_sv_2bool_flags

当我们尝试通过SQL或使用PgAdmin III GUI安装该语言(创建语言plperl;)时,会返回此错误。

我已经检查了我们在/opt/PostgreSQL/9.2/lib/postgresql/中是否有一个lperl.so文件,并像大多数关于这个问题的帖子所建议的那样寻找libperl.so。我试过把libperl.so放在很多不同的地方,因为每个人和他的狗对它应该放在哪里都有不同的建议。

运行ldd /opt/PostgreSQL/9.2/lib/postgresql/plperl.so返回以下内容:

ldd /opt/PostgreSQL/9.2/lib/postgresql/plperl.so
        linux-vdso.so.1 =>  (0x00007fff2d9b7000)
        libperl.so => /lib64/libperl.so (0x00007f8ab5c11000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8ab59f3000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f8ab565f000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f8ab5445000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f8ab522b000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f8ab5027000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f8ab4da3000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f8ab4b6b000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f8ab4968000)
        /lib64/ld-linux-x86-64.so.2 (0x00000034aa800000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f8ab46f1000)

我不认为Postgres和Perl的版本是个问题,因为我们有另一台运行Centos 6.5、Postgres 9.3和Perl5.10.1的服务器,pl/Perl运行得很好(我也试过看看那里发生了什么来解决这个问题,但无法解决)。

据我所知,Postgres希望libperl.so在/lib64中,但当安装Perl时,它安装在其他地方。目前Postgres是唯一一个将使用libperl.so 的东西

不幸的是,我不知道这台服务器上的所有东西是如何安装的,因为我的老板在我加入公司之前就已经设置好了,他只是刚刚决定我们真的需要让它工作起来。

从我们的两台服务器来看,我看不出安装和配置有任何差异,这会导致一台工作,一台不工作。

我对此束手无策(这是我们安装Postgres时需要解决的最后一个问题),所以任何建议都将不胜感激。

干杯

您是否使用安装有包管理器的二进制包来正确控制依赖关系?你自己在编译库吗?虽然可以强制二进制包使用GUI"管理"工具安装,或者将文件放置在PostgreSQL能够找到它们的位置,但如果它们没有在相当相似的平台上编译/链接,则不应该期望它们正常工作。

看起来您使用的Perl版本使用的标志或选项与您安装的plperl.so文件不同。看看perl -V的输出,看看perl是如何编译的——线程选项的一致使用很重要。

/opt/PostgreSQL/9.2/lib/postgresql/plperl.so告诉你它的一个符号是未定义的。这可能是由于编译选项的原因,也可能意味着您需要更新版本的Perl和libperl.so(5.10.1相当旧)。PotgreSQL和plperl的最新版本通常需要比您引用的版本更新的perl

libperl.so应该安装在一个一致的位置,以便您的平台和其他已编译/链接使用它的应用程序使用——您不需要四处移动它。事实上,如果您的系统上有许多libperl.so的副本,plperl在加载时可能会发现libperl.so的版本已过时。

为了进行比较,这里是您在我的一个系统上运行的命令的输出:

/usr/local/lib/postgresql/plperl.so:
       libperl.so => /usr/local/lib/perl5/5.16/mach/CORE/libperl.so (0x801214000)
       libthr.so.3 => /lib/libthr.so.3 (0x80158f000)
       libc.so.7 => /lib/libc.so.7 (0x80081b000)
       libm.so.5 => /lib/libm.so.5 (0x8017b2000)
       libcrypt.so.5 => /lib/libcrypt.so.5 (0x8019d3000)
       libutil.so.9 => /lib/libutil.so.9 (0x801bf2000)

符号存在:

strings /usr/local/lib/perl5/5.16/mach/CORE/libperl.so | grep 2bool
 Perl_sv_2bool_flags
 Perl_sv_2bool

很可能在堆栈中的某个位置有一个perlXS模块或一个指向错误位置的.so文件。也许缓存库在系统级别存在一些混淆。。。我相信ldconfig是您在Linux上用来管理此问题的工具。

相关内容

  • 没有找到相关文章