2

FreeBSD ボックスで最近動作を停止した古い perl コードがいくつかあります。失敗するコードは (最も単純な形式で) 次のようになります。

#!/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.15追加するために編集: 私のボックスにはとの両方があることに気付きましたlibmysqlclient_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 にあるので、インストールではなくソースからコンパイルされていると思います。おそらく再コンパイルすることで修正できますが、OS パッケージ マネージャーを介してインストールできる、サポートされているバージョンの 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 に答える