2

我有一些旧的 perl 代码最近停止在 FreeBSD 机器上工作。失败的代码(以最简单的形式)如下所示:

#!/usr/local/bin/perl -w

use strict;
use DBI;

my $datasource = "DBI:mysql:dbname:hostname.domain.com";
my $user = "username";
my $pass = "password";

DBI->connect($datasource, $user, $pass);

这失败并出现以下错误:

/libexec/ld-elf.so.1: /usr/local/lib/mysql/libmysqlclient.so.15: Undefined symbol "gethostbyname_r"

如果我将数据源更改为引用“localhost”,则代码成功。

我已经从端口重新安装了 mysql-client、DBI 和 DBD-mysql;没有效果。

此服务器上的其他应用程序(PHP、命令行工具)能够通过主机名访问 mysql 数据库而不会遇到麻烦。

有关如何解决此问题的建议?

编辑添加:我注意到我的盒子有libmysqlclient.so.15libmysqlclient_r.so.15。问题可能是 DBD::mysql 在应该使用 libmysqlclient_r 时尝试使用 libmysqlclient 吗?如果是这样,如何解决?

4

6 回答 6

2

盲目猜测:

gethostbyname _r表明 Perl 使用解析器代码的“可重入”(也称为线程/多线程)版本。似乎有什么不对劲。

从端口树编译依赖项时,您通常可以打开或关闭多线程。您可以make config从每个端口应用程序目录更改您之前的选择。

如果您安装了二进制包,则其中某处可能存在版本不匹配。

于 2008-12-27T21:05:36.283 回答
1

作为一种解决方法,尝试将 hostname.domain.com 添加到 /etc/hosts,或者在 Perl 代码中显式查找 IP 地址并改用它。

于 2008-12-29T01:49:03.247 回答
1

'gethostbyname_r' 是 GNU 扩展,不是 POSIX 标准的一部分。尽管如此,在我的 Freebsd 7 机器上,我的 libc 包含它:

nm /usr/lib/libc.a | grep gethostbyname_r
00000eb0 T gethostbyname_r

您的 libc 是否包含此符号?

于 2008-12-27T21:06:20.993 回答
1

您的 libmysqlclient 版本对于您的操作系统版本已过期。由于它在 /usr/local 中,我假设它是从源代码编译的,而不是安装的。您可能可以通过重新编译来修复它,但您可能想查看是否有可以通过 OSes 包管理器安装的受支持版本的 mysql。

于 2008-12-27T21:15:18.150 回答
1

/usr/local/lib/mysql/libmysqlclient.so.15暂时移动并/usr/local/lib/mysql/libmysqlclient.a移开(重命名或其他)后,尝试从端口重新安装 DBD-mysql 。这可能会强制 DBD-mysql 与libmysqlclient_r.

于 2008-12-27T21:48:09.410 回答
0
# ldd libmysqlclient.so.15
libmysqlclient.so.15:
        libcrypt.so.3 => /lib/libcrypt.so.3 (0x281bf000)
        libm.so.4 => /lib/libm.so.4 (0x281d7000)
        libz.so.3 => /lib/libz.so.3 (0x281ed000)

FreeBSD 6.4-p3,从端口安装的 mysql-client,重新安装无济于事;(

ldd 输出中没有 libc ;(

但mysql编译正确:

# ldd mysql
mysql:
        libreadline.so.6 => /lib/libreadline.so.6 (0x28089000)
        libncursesw.so.6 => /lib/libncursesw.so.6 (0x280b9000)
        libmysqlclient.so.15 => /usr/local/lib/mysql/libmysqlclient.so.15 (0x28102000)
        libcrypt.so.3 => /lib/libcrypt.so.3 (0x2815c000)
        libz.so.3 => /lib/libz.so.3 (0x28174000)
        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x28185000)
        libm.so.4 => /lib/libm.so.4 (0x28250000)
        libc.so.6 => /lib/libc.so.6 (0x28266000)
        libncurses.so.6 => /lib/libncurses.so.6 (0x2834d000)
于 2009-09-30T11:53:47.837 回答