ocehb: (Default)
[personal profile] ocehb
Вышла 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. наверное, надо будет добавить в скрипт определитель бинарности модуля.


Date: 2018-11-09 07:26 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Моё решение:

1. Билдим обновления на чистой машине (я вообще использую CI)

2. Каждое обновление это репа бинарных пекеджей, make install зло (см. половые трудности с npm). Помимо прочего получаем автоприбивание пекеджей гвоздями на проде и стейджинге, т.е. воспроизводимость окружения.

3. При обновлении всё сносим и ставим заново из новой репы п.2. Т.е. если какое-то обновление забыли забилдить - будет ошибка вместо неопределённого поведения. К сожалению не всегда, т.к. опциональные зависимости меняющие поведения - зло, но в CPAN их полно

Profile

ocehb: (Default)
ocehb

January 2021

S M T W T F S
     12
345 6789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 7th, 2025 10:40 am
Powered by Dreamwidth Studios