Perl: Поиск и удаление несовместимых по ABI модулей

Nov 03, 2018 15:48

Вышла 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. наверное, надо будет добавить в скрипт определитель бинарности модуля.



perl

Previous post Next post
Up