On Wed, Jun 11, 2003 at 01:25:42PM +0400, Alexey Tourbin wrote: > > > Если libperl и perl ОБА слинковать с -lpthread, то программа работает. > > > Если с -lpthread слинковать ТОЛЬКО libperl, то программа зависает (в read(2)). > > > Хотя данный конкретный случай может иметь какую-то другую основу. > > OK, вечером я попробую сделать testcase (на основе perl из Daedalus'а). > Мне просто интересно разобраться, в чем тут дело. Ума не приложу, > почему программа виснет в syscall'е в зависимости от тонкостей линковки > с -lpthread. По предварительным данным, взвис происходит где-то на > уровне popen(). So here goes the testcase. $ rpm -Uvh ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/Daedalus/SRPMS.daedalus/perl-5.8.1-alt0.3.pre19733.src.rpm $ rpm -bc ~/RPM/SPECS/perl58.spec ... $ cd ~/RPM/BUILD/perl $ cat > fail.t use threads; threads->new( sub { print "thread\n"; } )->join; open PS, "ps -f |"; print "ok\n"; ^D $ cc -o perl perlmain.o lib/auto/DynaLoader/DynaLoader.a -L. -lperl $ LD_BIND_NOW=1 LD_LIBRARY_PATH=$PWD PERL5LIB=$PWD/lib ./perl fail.t thread ^C $ cc -o perl perlmain.o lib/auto/DynaLoader/DynaLoader.a -L. -lperl -lpthread $ LD_BIND_NOW=1 LD_LIBRARY_PATH=$PWD PERL5LIB=$PWD/lib ./perl fail.t thread ok $ Короче, в первом случае висим, а во втором -- нормально работает. Я постарался максимально свести проблему с уровня перла до уровня glibc и всех-этих-дел. ldv, можешь посмотреть?