扩展Perl正在打破动态加载

前端之家收集整理的这篇文章主要介绍了扩展Perl正在打破动态加载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试将一个XS编译到perl [ed(ikegami))中:这就是说他正在使用:: MakeMaker的make perl来创建一个静态链接的C供应商库的perl,但是当我这样做时,新版本的perl不支持动态加载模块.任何时候我尝试运行像使用Socket(或任何其他模块)的Perl代码,我得到:
Can't load module Socket,dynamic loading not available in this perl.

有没有编译器/链接器开关我正在设置不正确或什么?所有这一切都是在1998年再次在2004年在不同的盒子(PA-RISC上的老版本)上编译的,但是我们正在转向一个新的盒子(hpux11 itanium),我正在墙上.

这是我的Makefile.PL:

use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
    'NAME'      => 'Udtutil','VERSION_FROM' => 'Udtutil.pm',# finds $VERSION
    'LIBS'      => '-L/usr/ud/PFUSION/Udtutil -L/usr/ud/lib -lapidummy ' .
                   '-lshare -ludsql -ludmach -lbasic ' .
                   '-lperf -lret1 -lides -lpipe -lfunc -lndx -lrep -lshm ' .
                   '-lmglm -lulc -lglm -ltpmem2 -lcmn ' .
                   '-llicn -ludus -lunix -lbci -lunirpc -lxmldl -leda ' .
                   '-lsslU2097e -lcryptoU2097e ' .
                   '-lodbc -lstd_v2 -lstream -lCsup -lpthread -lm -lcl ' .
                   '-ldld ' .
                   '-lnfaclnt -lodsdummy -lcl ' .
                   '-lCsup -lcl -lelf -lm -lcurses -lsec -lpam ','INC'       => '-I/usr/ud/include',# e.g.,'-I/usr/include/other' 
    'OPTIMIZE'  => '-O -Ae +DD64 -q -z +u4 -w ','LINKTYPE'  => 'dynamic','OBJECT'    => '$(BASEEXT)$(OBJ_EXT) funchead.o interfunc.o callcf.o efs_init.o',);

这是我的.xs文件,Udtutil.xs

#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "/usr/ud/include/share.h"
#include "/opt/iibase/PFUSION/Udtutil/udtutil.h"
#ifdef __cplusplus
}
#endif

extern int U_IGNSIGSET;

extern int Iflags[2];

#if OS_NT

#define U_backsig(ignsigcnt) { if (((U_IGNSIGSET=(ignsigcnt)) == 0) && (Iflags[0] || Iflags[1])) U_sig_resend(); if (!U_IGNSIGSET && pU_sigflags && U_sigflags) NT_sig_kill(); }

#else

#define U_backsig(ignsigcnt) { if (((U_IGNSIGSET=(ignsigcnt)) == 0) && (Iflags[0] || Iflags[1])) U_sig_resend(); }

#endif

MODULE = Udtutil                PACKAGE = Udtutil

int startudt(value1,value2)
    int value1
    int value2

    CODE:
    int jmpret,sat;

    U_SET_JMP(jmpret,sat);
    if (jmpret) {
            /* proceed with initialization */
            udtcallbasic_init(value1,value2);
            RETVAL = 1;
    } else {
            /* shutdown unibasic and return unsuccessful value */
            udtcallbasic_done(1);
            RETVAL = 0;
    }

    OUTPUT:
    RETVAL

void stopudt(status)
    int status

    CODE:
    udtcallbasic_done(status);

void calludt(progname,argcount,...)
    char * progname
    int argcount

    PPCODE:
    char * returnval;
    int paramspassed = 0;
    int status = 0;
    char ** arglist = NULL;
    int i;

    if (argcount + 2 == items) {
            /* build the C array from the Perl array */
            paramspassed = 1;
            arglist = (char **)malloc(argcount);
            for (i = 0; i < argcount; i++) {
                    arglist[i] = (char *)malloc(sv_len(ST(i+2))+1);
                    strcpy(arglist[i],SvPV(ST(i+2),PL_na));
            }

            /* make the call into the database */
            status = U_callbas(&returnval,progname,arglist);

            for (i = 0; i < argcount; i++) {
                    free(arglist[i]);
            }
            free(arglist);

            /* EXTEND(sp,2); */
            XPUSHs(sv_2mortal(newSViv(paramspassed)));
            XPUSHs(sv_2mortal(newSViv(status)));

            if (status == 0) {
                    /* EXTEND(sp,1); */
                    XPUSHs(sv_2mortal(newSVpv(returnval,0)));
                    free(returnval);
            }
    } else {
            /* EXTEND(sp,1); */
            XPUSHs(sv_2mortal(newSViv(paramspassed)));
    }

当我运行perl Makefile.PL,一切都看起来不错:

> perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for Udtutil
Writing MYMeta.yml

当我运行make或make perl,一切顺利,它创建一个新的本地perl二进制文件.

但是,当我执行./perl mytest.pl,如果mytest.pl *使用*的任何模块,我得到:

Can't load module Socket,dynamic loading not available in this perl.

有关如何编译这个新的Perl并仍然保持动态加载工作的任何建议?

附加信息:

这里是从旧盒子(可以工作的)的配置数据:

> perl -V:usedl
 usedl='define';

 > perl -V
 Summary of my perl5 (5.0 patchlevel 4 subversion 4) configuration:   Platform:
     osname=hpux,osvers=10,archname=PA-RISC2.0
     uname='hp-ux autocrft b.10.20 u 9000893 341130351 unlimited-user license '
     hint=recommended,useposix=true,d_sigaction=define
     bincompat3=y useperlio=undef d_sfio=undef   Compiler:
     cc='cc',optimize='-O',gccversion=
     cppflags='-D_HPUX_SOURCE -Aa'
     ccflags ='-D_HPUX_SOURCE -Aa'
     stdchar='unsigned char',d_stdstdio=define,usevfork=false
     voidflags=15,castflags=0,d_casti32=define,d_castneg=define
     intsize=4,alignbytes=8,usemymalloc=y,prototype=define   Linker and Libraries:
     ld='ld',ldflags ='-L/usr/local/lib -L/usr/ud/lib'
     libpth=/usr/local/lib /usr/lib/pa1.1 /usr/ud/lib /lib /usr/lib /usr/ccs/lib
     libs=-lnet -lnsl_s -lndbm -ldld -lm -lc -lndir -lcrypt
     libc=/lib/libc.sl,so=sl
     useshrplib=false,libperl=libperl.a
     Dynamic Linking:
     dlsrc=dl_hpux.xs,dlext=sl,d_dlsymun=undef,ccdlflags='-Wl,-E -Wl,-B,deferred '
     cccdlflags='+z',lddlflags='-b -L/usr/local/lib -L/usr/ud/lib'


 Characteristics of this binary (from libperl):    Built under hpux  
 Compiled at May  7 1998 13:59:51   @INC:
     /opt/perl5/lib/PA-RISC2.0/5.00404
     /opt/perl5/lib
     /opt/perl5/lib/site_perl/PA-RISC2.0
     /opt/perl5/lib/site_perl
     .

…这里是新框中的配置数据(不工作的):

> ./perl -V:usedl
 usedl='define';

 > ./perl -V
 Summary of my perl5 (revision 5 version 14 subversion 2) configuration:
       Platform:
     osname=hpux,osvers=11.31,archname=IA64.ARCHREV_0-LP64
     uname='hp-ux autocrft b.11.31 u ia64 1650208369 unlimited-user license '
     config_args=''
     hint=prevIoUs,d_sigaction=define
     useithreads=undef,usemultiplicity=undef
     useperlio=define,d_sfio=undef,uselargefiles=define,usesocks=undef
     use64bitint=define,use64bitall=define,uselongdouble=undef
     usemymalloc=n,bincompat5005=undef   Compiler:
     cc='cc',ccflags ='+DD64 -Ae -D_HPUX_SOURCE -Wl,+vnocompatwarnings -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',optimize='+O2 +Onolimit',cppflags='-Aa -D__STDC_EXT__ -D_HPUX_SOURCE +DD64 -Ae -D_HPUX_SOURCE -Wl,+vnocompatwarnings -I/usr/local/include +DD64 -Ae -D_HPUX_SOURCE -Wl,+vnocompatwarn ings -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
     ccversion='B3910B',gccversion='',gccosandvers=''
     intsize=4,longsize=8,ptrsize=8,doublesize=8,byteorder=87654321
     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='/usr/bin/ld',ldflags =' -L/usr/lib/hpux64'
     libpth=/usr/lib/hpux64
     libs=-L/usr/lib/hpux64 -lnsl -lnm -ldl -ldld -lm -lsec -lc
     perllibs=-lnsl -lnm -ldl -ldld -lm -lsec -lc
     libc=/usr/lib/hpux64/libc.so,so=so,useshrplib=false,libperl=libperl.a
     gnulibc_version=''
     Dynamic Linking:
     dlsrc=dl_hpux.xs,dlext=so,deferred '
     cccdlflags='+DD64',lddlflags='-b +vnocompatwarnings'


 Characteristics of this binary (from libperl):
 Compile-time options: PERL_DONT_CREATE_GVSV PERL_MALLOC_WRAP
                         PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT
                         USE_LARGE_FILES USE_PERLIO USE_PERL_ATOF   Built under hpux
 Compiled at Apr 13 2012 09:27:33
   @INC:
     /opt/iibase/perl/lib/site_perl/5.14.2/IA64.ARCHREV_0-LP64
     /opt/iibase/perl/lib/site_perl/5.14.2
     /opt/iibase/perl/lib/5.14.2/IA64.ARCHREV_0-LP64
     /opt/iibase/perl/lib/5.14.2
     .

解决方法

我不知道在电子邮件中是否有任何有用的东西,作为Perl DBD :: Informix模块背景信息的一部分收集和保存.
Date: Wed,13 Aug 1997 13:02:04 -0500 (CDT)
From: "Kent S. Gordon" [email deleted]
Subject: Re: Easy way to force static Informix libraries with DBD:Informix

>> "kgor" == Kent S Gordon <kgor@inetspace.com> wrote:
> Is there a easy way to create a DBD:Informix that uses static Informix
> libraries,but dynamic system libraries for everything else.

I have succeeded in building a perl with DBD:Informix that uses dynamic
loading for everything except DBD:Informix and DBI.  I got a runtime error of
not being able to find the symbol of boot_DBI if DBI was also not
statically built into perl.  Here is a short discription of what I did.

1)  Built perl 5.004_2 normally.
2)  Installed perl.
3)  Built DBI statically (make static).
4)  Installed DBI (make install).  This is not just the install of the perl
    binary,since DBI.a is needed later.
5)  Changed DBD Makefile.pl to call esql -static and esql -static -libs
    instead of esql and esql -libs.
6)  Created DBD Makefile using perl Makefile.PL.
7)  Built DBD statically (make static and make perl,etc.)
8)  The make test_static Failed,due to wanting to create a dynamic object
    (Informix.sl Failed due to trying fixup a symbol)
9)  Installed with make -k install to get pass error creating Informix.sl,while still installing Informix.pm (could not find a special install
    for static perl.
10) Installed new perl executable.  It seems to work after some initial
    test.

Kent S. Gordon
Senior Software Engineer
iNetSpace Co.
[Phone and email deleted]

笔者在当时注意到,由于引用Informix.sl,肯特必须建立在HP-UX上.我认为在这里没有什么有用的,但它是唯一额外的信息,我建立静态链接版本的Perl.正如你所看到的,它已经接近15岁了.

我不知道Perl 5.14.x是否仍然完全支持和测试静态链接的模块?

猜你在找的Perl相关文章