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
- スポンサーリンク -