/* compiled with cc -Wall -pedantic -ansi -rpath . -L. `perl -MExtUtils::Embed -e ccopts -e ldopts` -fPIC -shared -soname perl_test1.so -o perl_test1.so -lc perl_test1.c */ #include #include #include #ifndef PERL_NO_SHORT_NAMES #define PERL_NO_SHORT_NAMES #endif void pprint(void); static void xs_init(pTHX); EXTERN_C void boot_DynaLoader(pTHX_ CV* cv); static PerlInterpreter *perl; EXTERN_C void xs_init(pTHX) { char *file = __FILE__; newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); } void pprint(void) { int argc = 0; char **argv = NULL; char **env = NULL; SV *retval; STRLEN n_a; char *embedding[] = { "", "-e", "0" }; PL_origalen = 1; PERL_SYS_INIT3(&argc, &argv, &env); perl = perl_alloc(); perl_construct(perl); perl_parse(perl, xs_init, 3, embedding, NULL); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_run(perl); eval_pv("use Data::Dumper qw(Dumper);" "local $Data::Dumper::Terse = 1;" "local $Data::Dumper::Quotekeys = 0;" "local $Data::Dumper::Indent = 0;" "local $Data::Dumper::Useqq = 1;", TRUE); retval = eval_pv("my $code='\"this is a string\"';my $ret=eval $code;return(Dumper($ret));", TRUE); printf("%s", SvPV(retval, n_a)); perl_destruct(perl); perl_free(perl); PERL_SYS_TERM(); exit(0); } #### /* compiled with cc -Wall -pedantic -ansi -rpath . -L. -o perl_test2 perl_test2.c */ #include #include #include int main(void) { void *mod = NULL; void (*func)(void); if((mod = dlopen("perl_test1.so", (RTLD_LAZY | RTLD_LOCAL))) == NULL) { fprintf(stderr, "Failed loading module: %s\n", dlerror()); exit(-1); } if((func = (void *)dlsym(mod, "pprint")) == NULL) { fprintf(stderr, "Failed locating symbol: %s\n", dlerror()); dlclose(mod); } else { (*func)(); } exit(0); }