Исходник Perl 5.14 - ошибка примера программы - PullRequest
3 голосов
/ 06 декабря 2011

Источник Perl 5.14 - ошибка примера программы

Я пытаюсь выполнить приведенную ниже программу в Linux 64 с libperl.so, созданным с источником 5.14, и получаю прерывание в расположении

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 

Не могли бы вы помочь мне сузить проблему?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

У меня тоже есть, я получил 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 из embed он работает как положено

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

$ power.exe
3 to the 4th power is 81.
0 голосов
/ 08 января 2012

Проблема заключалась в том, что при компиляции исходного кода я не указал новое расположение файлов заголовков 5.14.2.Я скопировал оба файла c и perl в папку, содержащую новый заголовочный файл 5.14.2, и компиляция с указанными ниже параметрами позволила решить проблему

g ++ -o test_perl test_perl.c -I.-Л.-g perl -MExtUtils::Embed -e ccopts -e ldopts LD_LIBRARY_PATH = .: LD_LIBRARY_PATH; экспорт LD_LIBRARY_PATH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...