Как мне решить эту проблему с gethostbyname_r и DBI или DBD :: MySQL на FreeBSD? - PullRequest
2 голосов
/ 27 декабря 2008

У меня есть какой-то старый 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.15, и libmysqlclient_r.so.15. Может ли быть проблема в том, что DBD :: mysql пытается использовать libmysqlclient, когда он должен использовать libmysqlclient_r? И если да, то как решить?

Ответы [ 6 ]

2 голосов
/ 28 декабря 2008

выстрел в темноте:

gethostbyname _r указывает, что Perl использует «реентерабельную» (также называемую многопоточную) версию кода преобразователя. Кажется, с этим что-то не так.

При компиляции зависимостей из дерева портов вы часто можете включать или отключать многопоточность. Вы можете изменить свой предыдущий выбор с помощью make config из каждого каталога приложений портов.

Если вы установили бинарные пакеты, вероятно, где-то там несоответствие версий.

1 голос
/ 29 декабря 2008

В качестве обходного пути попробуйте добавить hostname.domain.com в / etc / hosts или явно посмотреть IP-адрес в вашем коде Perl и использовать его вместо этого.

1 голос
/ 28 декабря 2008

Попробуйте переустановить DBD-mysql из портов после временного перемещения /usr/local/lib/mysql/libmysqlclient.so.15 и /usr/local/lib/mysql/libmysqlclient.a с пути (переименуйте его или что-то). Это может заставить DBD-mysql связываться с libmysqlclient_r.

1 голос
/ 28 декабря 2008

Ваша версия libmysqlclient устарела для вашей версии операционной системы. Поскольку он находится в / usr / local, я предполагаю, что он скомпилирован из исходного кода, а не установлен. Вы можете исправить это, перекомпилировав, но вы можете посмотреть, есть ли поддерживаемая версия mysql, которую можно установить через менеджер пакетов вашей операционной системы.

1 голос
/ 28 декабря 2008

'gethostbyname_r' является расширением GNU и не является частью стандарта POSIX. Тем не менее, в моей коробке Freebsd 7 мой libc включает это:

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

Содержит ли ваш libc этот символ?

0 голосов
/ 30 сентября 2009
# 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-клиент установлен из портов, переустановка не помогает с проблемой; (

нет libc в выводе ldd; (

но 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)
...