Вышла fc29, и у меня опять возник вопрос несовместимых по ABI модулей:
# perl -MNet::SSLeay -e0
SSLeay.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
При ручной инсталляции модуля (например через cpan), он устанавливается в site каталоги:
# perl -V:"installsite.*"
installsitearch='/usr/local/lib64/perl5';
installsitebin='/usr/local/bin';
installsitehtml1dir='';
installsitehtml3dir='';
installsitelib='/usr/local/share/perl5';
installsiteman1dir='/usr/local/share/man/man1';
installsiteman3dir='/usr/local/share/man/man3';
installsitescript='/usr/local/bin';
Обычные модули (не XS) при переходне на новую версию perl продолжают работать,
а вот с XS модулями возникают проблемы. Решение - реинсталляция несовместимых
модулей, например командой cpan -f.
Несколько проблем:
1. cpan сам может зависеть от таких модулей.
2. Надо найти несовместимые модули
Для упрощения работы я написал
небольшой скрипт,
а здесь примеры работы с ним:
cpan не запускается
Сам по себе cpan - системная утилита, и, минимально, она зависит только
от стандарных модулей идущих в дистрибутиве перла, которые обновляются вместе с ним.
Но некоторые модули могли быть установлены локально, либо быть нестандартными (у меня таких
оказалось несколько: Digest::SHA, CPAN::SQLite, etc.)
# cpan
...
SHA.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
#
В данном случае всё ясно: SHA устарел, и его надо удалить из локальных каталогов.
# sudo packlist -r SHA
Select for SHA:
1) Digest::SHA 2) Digest::SHA3
?# 1
packlist info: removed 6 files
#
Было найдено два похожих модуля, и предложено выбрать. Опция -r даёт указание удалить все файлы модуля, без неё будет просто напечатан список файлов установленного модуля.
Повторять до тех пор, пока cpan не будет запускаться без ошибок.
В сложных случаях, когда невозможно определить название модуля, можно использовать утилиту strace:
# cpan -f CPAN::SQLite
...
XS.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
# strace -e trace=open -e trace=openat cpan -f CPAN::SQLite
...
openat(AT_FDCWD, "/usr/local/lib64/perl5/auto/Cpanel/JSON/XS/XS.so", O_RDONLY|O_CLOEXEC) = 9
XS.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
+++ exited with 1 +++
# sudo packlist -r Cpanel/JSON/XS
Select for Cpanel/JSON/XS: Cpanel/JSON/XS
packlist info: removed 10 files
#
Список несовместимых модулей
1. Список всех модулей:
# packlist
...
Alien::Base
Alien::FFI
Import::Base
XSLoader
2. Список несовместимых модулей:
# packlist | while read mod; do perl -M$mod -e0 >|/dev/null 2>&1 || print $mod; done
...
Type::Tiny::XS
Type::Tiny
FileHandle::Fmode
Alien::Base::ModuleBuild
Теперь их можнолибо удалить, либо переинсталлировать. Либо посмотреть, какие модули есть в репоситории вашей os, и использовать их, во избежании неприятностей.
Например, для Fedora:
# packlist | sed -e "s#::#-#g" -e "s#^#perl-#" | xargs dnf list
...
perl-indirect.x86_64 0.38-5.fc29 fedora
perl-lexical-underscore.noarch 0.004-6.fc29 fedora
perl-lib-relative.noarch 0.002-4.fc29 fedora
perl-multidimensional.x86_64 0.014-3.fc29 fedora
perl-prefork.noarch 1.04-27.fc29 fedora
ps. наверное, надо будет добавить в скрипт определитель бинарности модуля.