/* gcc -Wall -c perl-embed.c `perl -MExtUtils::Embed -e ccopts` gcc -Wall perl-embed.o `perl -MExtUtils::Embed -e ldopts` -o perl-embed */ #include #include static PerlInterpreter *my_perl; EXTERN_C void xs_init _((pTHX)); EXTERN_C void boot_DynaLoader _((pTHX_ CV* cv)); EXTERN_C void xs_init(pTHX) { dXSUB_SYS; newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__); } int main(int argc, char **argv, char **env) { char *embedding[] = { "", "-e" }; SV *my_sv; double (*my_symbol)(double, double); my_perl = perl_alloc(); perl_construct(my_perl); perl_parse(my_perl, xs_init, 3, embedding, (char **)NULL); perl_run(my_perl); my_sv = eval_pv( "use DynaLoader;" "my $h = DynaLoader::dl_load_file(\"libm.so\");" "DynaLoader::dl_find_symbol($h, \"pow\");", TRUE ); my_symbol = (void *)SvIV(my_sv); printf( "Symbol %p, (*my_symbol)(4,4) = %f\n", my_symbol, (*my_symbol)(4,4) ); perl_destruct(my_perl); perl_free(my_perl); return 0; }