2011-12-06 33 views
3

的Perl 5.14源 - 示例程序未能的Perl 5.14源 - 示例程序失敗

我試圖用5.14來源 建libperl.so在Linux上執行64以下程序和我得到的中止位置

Program terminated with signal 11, Segmentation fault. 
#0 0x00002abdc0eb2656 in Perl_sv_2mortal() from ./libperl.so 
(gdb) where 
#0 0x00002abdc0eb2656 in Perl_sv_2mortal() from ./libperl.so 
#1 0x00000000004010ed in PerlPower() 
#2 0x0000000000401335 in main() 
(gdb) 

我的程序:

#include <EXTERN.h> 
#include <perl.h> 
#include <stdio.h> 

static PerlInterpreter *my_perl; 
static void PerlPower(int a, int b) 
{ 
    dSP;   /* initialize stack pointer */ 
    ENTER;   /* everything created after here */ 
    SAVETMPS;  /* ...is a temporary variable. */ 
    PUSHMARK(SP);  /* remember the stack pointer */ 
    XPUSHs(sv_2mortal(newSViv(a))); /* push the base onto the stack */ 
    XPUSHs(sv_2mortal(newSViv(b))); /* push the exponent onto stack */ 
    PUTBACK;  /* make local stack pointer global */ 
    call_pv("expo", G_SCALAR); /* call the function */ 
    SPAGAIN;  /* refresh stack pointer * 
        /* pop the return value from stack */ 
    printf("%d to the %dth power is %d.\n", a, b, POPi); 
    PUTBACK; 
    FREETMPS;  /* free that return value */ 
    LEAVE;   /* ...and the XPUSHed "mortal" args. */ 
} 

int main(int argc, char **argv, char **env) 
{ 
    char *my_argv[] = { "", "power.pl" }; 

    PERL_SYS_INIT3(&argc, &argv, &env); 
    my_perl = perl_alloc(); 
    perl_construct(my_perl); 

    perl_parse(my_perl, NULL, 2, my_argv, (char **)NULL); 
    PL_exit_flags |= PERL_EXIT_DESTRUCT_END; 
    perl_run(my_perl); 

    PerlPower(3, 4); 
      /*** Compute 3 ** 4 ***/ 

    perl_destruct(my_perl); 
    perl_free(my_perl); 
    PERL_SYS_TERM(); 
} 

power.pl包含以下語句

sub expo { 
my ($a, $b) = @_; 
return $a ** $b; 
} 

上述樣品C和Perl程序從鏈接採取http://perldoc.perl.org/perlembed.html#Evaluating-a-Perl-statement-from-your-C-program

我使用下面的編譯選項

編譯:

cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -pipe -Wdeclaration-after-statement -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', 
optimize='-O2 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -g -Wall -pipe', 
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -pipe -Wdeclaration-after-statement' 
ccversion='', gccversion='4.1.2 20070115 (prerelease) (SUSE Linux)', 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 

能否請你幫我縮小解決問題?

+0

請編輯您的問題以包含'power.pl'的內容。 –

回答

2

我有一個太,我的win32相當於Faulting application power.exe, version 0.0.0.0, faulting module perl514.dll, version 0.0.0.0, fault address 0x000c155f. 但我也得到一個錯誤信息:)

$ power.exe 
Can't open perl script "power.pl": No such file or directory 

從嵌入它工作正常複製power.pl後

$ cat power.pl 
sub expo { 
    my ($a, $b) = @_; 
    return $a ** $b; 
} 

$ power.exe 
3 to the 4th power is 81. 
0

問題出在編譯源時,我沒有指定新的5.14.2頭文件位置。我將c和perl文件複製到包含5.14.2新頭文件的文件夾中,並使用以下選項編譯解決問題

g ++ -o test_perl test_perl.c -I。 -L。 -g perl -MExtUtils::Embed -e ccopts -e ldopts LD_LIBRARY_PATH = .: LD_LIBRARY_PATH; export LD_LIBRARY_PATH