Линковка XS-модулей

30 окт 2015 14:46


Похоже мало кто озабочен линковкой XS-модулей с libperl.so. Поэтому ситуация с неопределёнными символами считается вполне нормальной:

$ ldd -r /usr/lib/perl5/auto/Algorithm/Diff/XS/XS.so
    linux-vdso.so.1 =>  (0x00007ffc51549000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f76236b6000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7623c7f000)
undefined symbol: PL_thr_key	(/usr/lib/perl5/auto/Algorithm/Diff/XS/XS.so)
undefined symbol: Perl_xs_version_bootcheck	(/usr/lib/perl5/auto/Algorithm/Diff/XS/XS.so)
undefined symbol: Perl_sv_setref_pv	(/usr/lib/perl5/auto/Algorithm/Diff/XS/XS.so)
undefined symbol: Perl_sv_2iv_flags	(/usr/lib/perl5/auto/Algorithm/Diff/XS/XS.so)
undefined symbol: Perl_newRV_noinc	(/usr/lib/perl5/auto/Algorithm/Diff/XS/XS.so)
...

Ну и действительно, зачем парится, если при загрузке расширения разделяемая библиотека libperl.so уже наверняка загружена в памяти и символы успешно разрешатся. Веселье с фейрверком SIGSEGV начинается когда такое расширение будет загружаться в процесс, в котором libperl.so немного с другим ABI (например, установлен новый perl 5.22.0).

↓↓↓↓↓↓↓↓

В Debian/Ubuntu похоже придумали искусственную зависимость вида perlapi-5.18.1, которая добавляется при сборке всем xs-модулям, чтобы нельзя было поставить в систему модуль, собранный с отличной от установленной в системе версии perl.

В ALTLinux все XS-модули линкуются с -lperl, поэтому никаких искусственных зависимостей не требуется, все модули получают явную зависимость на текущий рабочий сонейм libperl.so, например,

$ ldd -r /usr/lib64/perl5/auto/arybase/arybase.so 
        linux-vdso.so.1 (0x00007ffccabd4000)
        libperl-5.20.so => /usr/lib64/libperl-5.20.so (0x00007f25182e4000)
...

Поэтому такой модуль нельзя загрузить под другой версией perl — получим внятную ошибку об отсутствующей библиотеке. При сборке это автоматически попадает в зависимости rpm-пакета и надёжный конфликт против установки неправильной версии обеспечен.

Правда, приходится сталкиваться с модулями, которые носят с собой свою обвязку для сборки и линковки, например, Wx::Scintilla включает в inc модуль Module::Build::Scintilla, который управляет сборкой. Из-за этого каждый раз после сборки нового Perl этот модуль оставался непересобранным и начинал тихо сегфолтится. Сегодня, наконец, я его отловил и пофиксил ;)

Теги: perl xs

Обновлён: 2015-10-30 14:48


Оставить комментарий