Perl/Postgresql: plperl.so неопределенный символ: Perl_sv_2bool_flags
Это мой первый пост здесь, извините, если я не предоставляю всю необходимую информацию с первого раза!
Мой босс и я пытались установить plperl при нашей установке postgres на одном из наших серверов (Centos 6.5, Postgres 9.2.1, Perl 5.10.1), и мы продолжаем сталкиваться с той же проблемой, которая заключается в следующем:
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
Эта ошибка возвращается, когда мы пытаемся установить язык (создаем язык plperl;) либо через SQL, либо с помощью графического интерфейса PgAdmin III.
Я проверил, что у нас есть lperl.so
файл в /opt/PostgreSQL/9.2/lib/postgresql/
а также ищет 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 и Perl 5.10.1 с pl/perl, который работает отлично (я также пытался посмотреть, что там происходит, чтобы исправить это) это, но не могу решить это).
Из того, что я могу сказать, Postgres ожидает, что libperl.so будет в /lib64, однако, когда Perl был установлен, он был установлен где-то еще. На данный момент Postgres - это единственное, что будет использовать libperl.so
К сожалению, я не знаю, как все было установлено на этом сервере, так как мой начальник все настроил до того, как я присоединился к компании, и он только решил, что нам действительно нужно, чтобы он работал.
Глядя на оба наших сервера, я не вижу никаких различий в установках и конфигурациях, из-за которых один работает, а другой - нет.
Я почти сошел с ума с этим (это последняя проблема, которую нам нужно исправить с помощью установки Postgres), поэтому любые предложения будут оценены.
ура
1 ответ
Используете ли вы бинарные пакеты, установленные с менеджером пакетов, который должным образом контролирует зависимости? Собираете библиотеки сами? Хотя можно принудительно установить бинарные пакеты с помощью инструмента "admin" с графическим интерфейсом пользователя или поместить файлы в место, где 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
Скорее всего где-то в вашем стеке есть perl
Модуль XS или .so
файл, указывающий на неправильное место. Возможно, на системном уровне есть некоторая путаница с кэшированными библиотеками... Я считаю, ldconfig
это инструмент, который вы используете для управления этим в Linux.