* [devel] DynaLoader.a
@ 2005-06-01 18:11 Alexey Tourbin
2005-06-01 18:38 ` Sergey Vlasov
2005-06-01 21:05 ` Michael Shigorin
0 siblings, 2 replies; 8+ messages in thread
From: Alexey Tourbin @ 2005-06-01 18:11 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 5003 bytes --]
On Wed, Jun 01, 2005 at 08:11:13PM +0400, Dmitry V. Levin wrote:
> On Wed, Jun 01, 2005 at 07:55:13PM +0400, Alexey Tourbin wrote:
> > Теперь признавайтесь, кто линкуется с DynaLoader.a.
>
> [beehive@basalt success]$ fgrep -l DynaLoader.a *
> apache-1.3.33rusPL30.20-alt2
> exim-4.51-alt1
> gaim-1.3.0-alt1
> ices-0.4-alt3.2
> inn-2.4.1-alt7
> irssi-0.8.10-alt0.3
> mmc-4.1-alt2
> net-snmp-5.2-alt1
> openldap-2.2.26-alt1
> perl-1:5.8.7-alt0.1
> perl-CGI-SpeedyCGI-2.22-alt1
> postgresql-7.4.8-alt1
> postgresql8.0-8.0.3-alt1
> vim-4:6.3.074-alt1
> weechat-0.1.1-alt1
> xchat-2.4.3-alt1
Спасибо.
Попробую объяснить суть проблемы, насколько я сам её понял.
Есть два типа приложений, которые используют perlapi(1) и,
соответственно, perl ABI. Первый тип -- это compiled extensions,
которые сам перл, т.е. /usr/bin/perl, умеет подгружать при помощи
DynaLoader. Это все perl-*.i586.rpm пакеты, в которых имеется *.so
файл и соответствующий ему *.pm файл.
Механизм загрузки модулей следующий: $name.pm файл подгружает
DynaLoader.pm, а DynaLoader.pm подгружает соответствующий $name.so файл.
DynaLoader фактически является оберткой над dlopen(3) и dlsym(3).
Второй тип приложений -- это приложения, которые имеют внутри себя
встроенный интерпретатор перла, то есть имеют внутри себя некий типичный
кусок кода, похожий на кусок кода из /usr/bin/perl. Встроенный
интерпретатор линкуется с libperl.so + DynaLoader.a и не нуждается в
/usr/bin/perl. Последний, кстати, тоже слинкован с libperl.so +
DynaLoader.a. Подробности встраивания описаны в perlembed(1).
Сейчас речь идет только о втором типе приложений, именно они перечислены
в списке.
Сам DynaLoader оформлен в виде DynaLoader.pm и DynaLoader.a файлов,
последний из которых содержит функцию (символ) boot_DynaLoader. Если
встраиваемый интерпретатор поддерживает загрузку компилируемых модулей,
то при инициализации этого интерпретатора должен выполняться код:
extern void boot_DynaLoader(); /* K&R */
newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
newXS заворачивает "сишную" (XS) функцию в структуру CV и вклеивает её
внутрь перлового пространства имен (gv_stashpv). Если этого не сделать,
то сам DynaLoader.pm не сможет загрузиться, т.к. при инициализации
выполняется boot_DynaLoader(), который будет недоступен.
Ближе к делу, сейчас *любой* встроенный интерпретатор перла линкуется с
libperl.so + DynaLoader.a. Помимо дублирования кода, возникает проблема
несовместимости между DynaLoader.pm и DynaLoader.a, которая никак не
учитывается. На самом деле требуется, чтобы версии DynaLoader.pm и
DynaLoader.a совпадали (версия DynaLoader.a задается на стадии
компиляции). Проведем эксперимент: отредактируем $DynaLoader::VERSION
и попробуем его загрузить:
$ diff /usr/lib/perl5/i386-linux/DynaLoader.pm{~,}
20c20
< $VERSION = '1.05'; # avoid typo warning
---
> $VERSION = '1.06'; # avoid typo warning
$ perl -MDynaLoader -e1
DynaLoader object version 1.05 does not match $DynaLoader::VERSION 1.06 at /usr/lib/perl5/i386-linux/DynaLoader.pm line 106.
Compilation failed in require.
BEGIN failed--compilation aborted.
$
То есть все встроенные интерпретаторы, слинкованные с DynaLoader.a,
совместимы с DynaLoader.pm с точностью до версии. Это описано в
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=247291 -- при
обновлении perl-5.8.3 -> perl-5.8.4 все встроенные интерпретаторы
стали неспособны загрузить компилируемые модули.
Решение этой проблемы для меня более-менее очевидно:
1) влинковать DynaLoader.a в libperl.so.
Т.к. libperl.so и DynaLoader.pm находятся в одном пакете (perl-base),
то версия DynaLoader.a и DynaLoader.pm всегда будет одинаковой.
2) при сборке libperl.so специально пометить новые функции:
DynaLoader {
boot_DynaLoader;
XS_DynaLoader_dl_error;
XS_DynaLoader_dl_find_symbol;
XS_DynaLoader_dl_install_xsub;
XS_DynaLoader_dl_load_file;
XS_DynaLoader_dl_undef_symbols;
XS_DynaLoader_dl_unload_file;
};
Тогда у пакетов, которые используют boot_DynaLoader, появится
зависимость на libperl.so.5.8(DynaLoader).
3) исключить DynaLoader.a из флагов компиляции:
$ perl -MExtUtils::Embed -e ldopts
-rdynamic -Wl,-O1 -Wl,-O1 -L/usr/local/lib64 -L/usr/local/lib /usr/lib/perl5/i386-linux/auto/DynaLoader/DynaLoader.a -L/usr/lib/perl5/i386-linux/CORE -lperl -ldl -lm -lpthread -lc -lcrypt
$
DynaLoader.a здесь быть не должно.
4) не паковать DynaLoader.a в perl-devel.
После всего остается только один вопрос: почему вообще используется
такая странная схема линковки встроенного интерпретатора: libperl.so +
DynaLoader.a. Я не знаю точного ответа на этот вопрос. Насколько я
предполагаю или смутно помню, это связано с особенностями загрузки
разделяемых библиотек и с работой dlopen() на некоторых экзотических
платформах. А также на некоторых экзотических платформах dlopen()
просто не существует.
Если есть какие-нибудь соображения -- пишите.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] DynaLoader.a
2005-06-01 18:11 [devel] DynaLoader.a Alexey Tourbin
@ 2005-06-01 18:38 ` Sergey Vlasov
2005-06-01 19:43 ` [devel] DynaLoader.a Alexey Tourbin
2005-06-01 21:10 ` Alexey Tourbin
2005-06-01 21:05 ` Michael Shigorin
1 sibling, 2 replies; 8+ messages in thread
From: Sergey Vlasov @ 2005-06-01 18:38 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 719 bytes --]
On Wed, Jun 01, 2005 at 10:11:41PM +0400, Alexey Tourbin wrote:
> 3) исключить DynaLoader.a из флагов компиляции:
>
> $ perl -MExtUtils::Embed -e ldopts
> -rdynamic -Wl,-O1 -Wl,-O1 -L/usr/local/lib64 -L/usr/local/lib /usr/lib/perl5/i386-linux/auto/DynaLoader/DynaLoader.a -L/usr/lib/perl5/i386-linux/CORE -lperl -ldl -lm -lpthread -lc -lcrypt
> $
>
> DynaLoader.a здесь быть не должно.
>
> 4) не паковать DynaLoader.a в perl-devel.
Сучествуют ли программы, которые явно ищут DynaLoader.a (а не берут
его из опций сборки, которые сообщает сам perl)? Если да - вероятно,
имеет смысл вместо полного удаления DynaLoader.a положить на это место
пустую библиотеку (ar rcs DynaLoader.a) для совместимости.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [devel] Re: DynaLoader.a
2005-06-01 18:38 ` Sergey Vlasov
@ 2005-06-01 19:43 ` Alexey Tourbin
2005-06-01 21:10 ` Alexey Tourbin
1 sibling, 0 replies; 8+ messages in thread
From: Alexey Tourbin @ 2005-06-01 19:43 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 1701 bytes --]
On Wed, Jun 01, 2005 at 10:38:09PM +0400, Sergey Vlasov wrote:
> Сучествуют ли программы, которые явно ищут DynaLoader.a (а не берут
> его из опций сборки, которые сообщает сам perl)? Если да - вероятно,
> имеет смысл вместо полного удаления DynaLoader.a положить на это место
> пустую библиотеку (ar rcs DynaLoader.a) для совместимости.
Спасибо за подсказку. На самом деле, существуют даже программы, которые
рассчитывают на DynaLoader.a в опциях сборки, которые сообщает сам perl.
Так, irssi у меня теперь не пересобирается.
$ grep DynaLoader irssi-0.8.10/configure.in
DYNALOADER_A=`echo $PERL_LDFLAGS | $perlpath -pe 's/^(.* )*([[^ ]]*DynaLoader\.a).*/\2/'`
PERL_LDFLAGS=`echo $PERL_LDFLAGS | $perlpath -pe 's/^(.* )*[[^ ]]*DynaLoader\.a/\1libperl_dynaloader.la/'`
$ grep -i DynaLoader irssi-0.8.10/Makefile
DYNALOADER_A = -rdynamic -Wl,-O1 -Wl,-O1 -L/usr/local/lib64 -L/usr/local/lib -L/usr/lib/perl5/i386-linux/CORE -lperl -ldl -lm -lpthread -lc -lcrypt
$ make -C irssi-0.8.10
...
make[3]: Entering directory `/home/at/RPM/BUILD/irssi-0.8.10/src/perl'
if [ ! -d .libs ]; then mkdir .libs; fi
rm -f .libs/DynaLoader.a
ln -s -rdynamic -Wl,-O1 -Wl,-O1 -L/usr/local/lib64 -L/usr/local/lib -L/usr/lib/perl5/i386-linux/CORE -lperl -ldl -lm -lpthread -lc -lcrypt .libs/DynaLoader.a
ln: invalid option -- r
Try `ln --help' for more information.
make[3]: *** [.libs/DynaLoader.a] Error 1
...
$
Это всё конечно безобразие и детский сад, и чинить эти скрипты у меня
желания нет. Надо попробовать ещё что-нибудь пересобрать. Скорее
всего, придётся остановиться на промежуточном варианте, т.е. оставить
DynaLoader.a в опциях сборки, но сам DynaLoader.a сделать пустым.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [devel] Re: DynaLoader.a
2005-06-01 18:38 ` Sergey Vlasov
2005-06-01 19:43 ` [devel] DynaLoader.a Alexey Tourbin
@ 2005-06-01 21:10 ` Alexey Tourbin
1 sibling, 0 replies; 8+ messages in thread
From: Alexey Tourbin @ 2005-06-01 21:10 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 728 bytes --]
On Wed, Jun 01, 2005 at 10:38:09PM +0400, Sergey Vlasov wrote:
> Сучествуют ли программы, которые явно ищут DynaLoader.a (а не берут
> его из опций сборки, которые сообщает сам perl)? Если да - вероятно,
> имеет смысл вместо полного удаления DynaLoader.a положить на это место
> пустую библиотеку (ar rcs DynaLoader.a) для совместимости.
И ещё вопрос: как проверить, что затеянное удалось?
А то ведь make может случайно что-нибудь пересобрать.
Пока вот что вставил после `make install':
# check DynaLoader
%__nm -D %buildroot%_libdir/lib%name.so.%sover |%__grep ' T boot_DynaLoader'
%__nm -D %buildroot%_bindir/perl |%__grep ' U boot_DynaLoader'
! %__ar tv %buildroot%autolib/DynaLoader/DynaLoader.a |%__grep .
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [devel] Re: DynaLoader.a
2005-06-01 18:11 [devel] DynaLoader.a Alexey Tourbin
2005-06-01 18:38 ` Sergey Vlasov
@ 2005-06-01 21:05 ` Michael Shigorin
2005-06-01 21:27 ` Alexey Tourbin
1 sibling, 1 reply; 8+ messages in thread
From: Michael Shigorin @ 2005-06-01 21:05 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 364 bytes --]
On Wed, Jun 01, 2005 at 10:11:41PM +0400, Alexey Tourbin wrote:
> > > Теперь признавайтесь, кто линкуется с DynaLoader.a.
> > apache-1.3.33rusPL30.20-alt2
> Попробую объяснить суть проблемы, насколько я сам её понял.
Дохтуры, а мне-то что скажете делать?
--
---- WBR, Michael Shigorin <mike@altlinux.ru>
------ Linux.Kiev http://www.linux.kiev.ua/
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [devel] Re: DynaLoader.a
2005-06-01 21:05 ` Michael Shigorin
@ 2005-06-01 21:27 ` Alexey Tourbin
2005-06-02 0:09 ` Alexey Tourbin
0 siblings, 1 reply; 8+ messages in thread
From: Alexey Tourbin @ 2005-06-01 21:27 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 594 bytes --]
On Thu, Jun 02, 2005 at 12:05:40AM +0300, Michael Shigorin wrote:
> > > apache-1.3.33rusPL30.20-alt2
> > Попробую объяснить суть проблемы, насколько я сам её понял.
> Дохтуры, а мне-то что скажете делать?
По идее, ничего. The change is transparent. Просто у всех,
кто линкуется с DynaLoader.a и использует boot_DynaLoader,
должна появиться зависимость на libperl.so.5.8(DynaLoader).
Но mod_perl, насколько я понял, не использует boot_DynaLoader,
что очень странно. Возможно, я чего-то не понял. Хотелось бы
проконсультироваться со специалистом по mod_perl (вроде, был один?).
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [devel] Re: DynaLoader.a
2005-06-01 21:27 ` Alexey Tourbin
@ 2005-06-02 0:09 ` Alexey Tourbin
2005-06-02 0:20 ` Alexey Tourbin
0 siblings, 1 reply; 8+ messages in thread
From: Alexey Tourbin @ 2005-06-02 0:09 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 1024 bytes --]
On Thu, Jun 02, 2005 at 01:27:34AM +0400, Alexey Tourbin wrote:
> Но mod_perl, насколько я понял, не использует boot_DynaLoader,
> что очень странно. Возможно, я чего-то не понял. Хотелось бы
> проконсультироваться со специалистом по mod_perl (вроде, был один?).
Пардон, всё чики-пуки.
Файл с вызовом boot_DynaLoader генерируется автоматически.
$ pwd
/home/at/RPM/BUILD/apache-1.3.33rusPL30.20-alt1/apache-mod_perl_1.3.33/src/modules/perl
$ grep boot_DynaLoader *.c
perlxsi.c:EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
perlxsi.c: newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
$ rm -fv perlxsi.c
removed `perlxsi.c'
$ make perlxsi.c
/usr/bin/perl5.8.7 -MExtUtils::Embed -e xsinit -- -o perlxsi.c -std Apache Apache::Constants Apache::ModuleConfig Apache::Log Apache::URI Apache::Util Apache::Connection Apache::Server Apache::File Apache::Table
$
$ rpm -qpR ~/RPM/RPMS/apache-mod_perl-1.3.33rusPL30.20-alt1.i686.rpm |grep libperl
libperl.so.5.8
libperl.so.5.8(DynaLoader)
$
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [devel] Re: DynaLoader.a
2005-06-02 0:09 ` Alexey Tourbin
@ 2005-06-02 0:20 ` Alexey Tourbin
0 siblings, 0 replies; 8+ messages in thread
From: Alexey Tourbin @ 2005-06-02 0:20 UTC (permalink / raw)
To: ALT Devel discussion list
[-- Attachment #1: Type: text/plain, Size: 1186 bytes --]
On Thu, Jun 02, 2005 at 04:09:59AM +0400, Alexey Tourbin wrote:
> Пардон, всё чики-пуки.
> Файл с вызовом boot_DynaLoader генерируется автоматически.
>
> $ pwd
> /home/at/RPM/BUILD/apache-1.3.33rusPL30.20-alt1/apache-mod_perl_1.3.33/src/modules/perl
> $ grep boot_DynaLoader *.c
> perlxsi.c:EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
> perlxsi.c: newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
> $ rm -fv perlxsi.c
> removed `perlxsi.c'
> $ make perlxsi.c
> /usr/bin/perl5.8.7 -MExtUtils::Embed -e xsinit -- -o perlxsi.c -std Apache Apache::Constants Apache::ModuleConfig Apache::Log Apache::URI Apache::Util Apache::Connection Apache::Server Apache::File Apache::Table
> $
>
> $ rpm -qpR ~/RPM/RPMS/apache-mod_perl-1.3.33rusPL30.20-alt1.i686.rpm |grep libperl
> libperl.so.5.8
> libperl.so.5.8(DynaLoader)
> $
Я даже понял, почему мне не удалось добиться этого результата сразу же.
На самом деле нельзя удалять DynaLoader.a из флагов компиляции; потому
что тогда не будет генерироваться вызов boot_DynaLoader() в xsinit.
То есть у меня был установлен кривой perl, и из-за этого у меня получалcя
также кривой mod_perl. Тема закрыта.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2005-06-02 0:20 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-06-01 18:11 [devel] DynaLoader.a Alexey Tourbin
2005-06-01 18:38 ` Sergey Vlasov
2005-06-01 19:43 ` [devel] DynaLoader.a Alexey Tourbin
2005-06-01 21:10 ` Alexey Tourbin
2005-06-01 21:05 ` Michael Shigorin
2005-06-01 21:27 ` Alexey Tourbin
2005-06-02 0:09 ` Alexey Tourbin
2005-06-02 0:20 ` Alexey Tourbin
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git