Perl の make 時に miniperl でエラーになる場合の対処方法
急遽、会社で構築中のサーバの Perl のをリコンパイルする必要がでました。RHEL 3.0 - X86_64 - Update 7 を使っているのですが、どうにも Perl 5.8.6 のコンパイルが通らないんですよ。こりゃ困った。
`sh cflags "optimize='-O2'" opmini.o` -DPERL_EXTERNAL_GLOB opmini.c clude/gdbm -O2 -Wall gcc -L/usr/local/lib -o miniperl \ miniperlmain.o opmini.o libperl.a opmini.o(.text+0xc19): In function `Perl_scalar': : undefined reference to `pthread_getspecific' 〜中略〜 libperl.a(pp_pack.o)(.text+0x50b1): In function `S_pack_rec': : undefined reference to `floor' collect2: ld はステータス 1 で終了しました make: *** [miniperl] エラー 1
同じPJの技術者に応援を頼んで情報収集。どうやら ./Configure 時にうまく情報を取得できていないため、./config.sh の内容が不完全な状態で生成されるのがエラーの原因っぽいことが判明。
具体的には、./config.sh の情報を以下のように書き換える。ちなみに、初期状態では、ld='ld' で libs、perllibs は空白になっていると思います。これを修正。
ld='gcc' libs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
書き換えたら、make すればコンパイルが正常の通るようになると思います。ちなみに、うちの環境の場合、64 bit な OS なので、デフォルトでは glibc-devel の i386 版が入ってませんでした。これも必要なので rpm でぶち込む必要がありました。
さて、ちなみに perl -V で今はいっている Perl がどんなオプションでコンパイルされた物かを知ることができます。先ほど修正した内容ってのは、rpm なりで初めからバンドルされた状態の Perl の状態を参考に、引数の情報を作っています。
perl -v で version 情報は良く見てましたが、-V ってオプションは正直はじめて知りました。ちなみに、RHEL 3.0 x86-64 にバンドルされる Perl -V はこんな感じ。Compiler と Linker の部分が重要。
Summary of my perl5 (revision 5.0 version 8 subversion 0) configuration: Platform: osname=linux, osvers=2.6.9-22.18.bz155725.elsmp, archname=x86_64-linux-thread-multi uname='linux hs20-bc1-3.build.redhat.com 2.6.9-22.18.bz155725.elsmp #1 smp thu nov 17 15:34:08 est 2005 x86_64 x86_64 x86_64 gnulinux ' config_args='-des -Doptimize=-O2 -g -pipe -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dprivlib=/usr/lib/perl5/5.8.0 -Dsitelib=/usr/lib/perl5/site_perl/5.8.0 -Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.0 -Darchlib=/usr/lib64/perl5/5.8.0/x86_64-linux-thread-multi -Dsitearch=/usr/lib64/perl5/site_perl/5.8.0 -Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.0/x86_64-linux-thread-multi -Darchname=x86_64-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Dotherlibdirs=/usr/lib/perl5/5.8.0 -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr' hint=recommended, useposix=true, d_sigaction=define usethreads=define use5005threads=undef useithreads=define usemultiplicity=define useperlio=define d_sfio=undef uselargefiles=define usesocks=undef use64bitint=define use64bitall=define uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm', optimize='-O2 -g -pipe', cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -I/usr/include/gdbm' ccversion='', gccversion='3.2.3 20030502 (Red Hat Linux 3.2.3-54)', gccosandvers='' intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16 ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=8, prototype=define Linker and Libraries: ld='gcc', ldflags ='' libpth=/usr/local/lib64 /lib64 /usr/lib64 libs=-lnsl -lgdbm -ldb -ldl -lm -lpthread -lc -lcrypt -lutil perllibs=-lnsl -ldl -lm -lpthread -lc -lcrypt -lutil libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, libperl=libperl.so gnulibc_version='2.3.2' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic -Wl,-rpath,/usr/lib64/perl5/5.8.0/x86_64-linux-thread-multi/CORE' cccdlflags='-fPIC', lddlflags='-shared' Characteristics of this binary (from libperl): Compile-time options: DEBUGGING MULTIPLICITY USE_ITHREADS USE_64_BIT_INT USE_64_BIT_ALL USE_LARGE_FILES PERL_IMPLICIT_CONTEXT Locally applied patches: MAINT18379 Built under linux Compiled at Dec 13 2005 16:25:46 @INC: /usr/lib64/perl5/5.8.0/x86_64-linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib64/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.0
コメントやシェアをお願いします!