Marc Mettes <[EMAIL PROTECTED]> writes:
>I'm working on a project embedding and extending perl into a CAD API.  
>The API allows for an external executable that communicates through 
>an RPC mechanism, or a shared library loaded dynamically.  The choice 
>is made at link time by the selection of the appropriate library.
>
>I've had great success on Solaris8/gcc with the external executable 
>using a statically built perl 

Can you send us the perl -V of that perl?

If you can only run scripts with it then 

use Config;
print Config::myconfig()

does same job.

And if you have "customized" the link step can you explain what you did?

>nd everything runs as expected.  The 
>shared library method using the same perl has caused some problems 
>when using C based perl modules.
>
>When using this 'go.pl':
>  use Data::Dumper;
>  print "hello world", "\n";
>
>I get the following error message:
>
>Can't load '/usr/perl/lib/5.6.1/sun4-solaris/auto/Data/Dumper/Dumper.so' 
> for module Data::Dumper: ld.so.1: /opt/pro/sun4_solaris/obj/pro: fatal: 
> relocation error: file
>/usr/perl/lib/5.6.1/sun4-solaris/auto/Data/Dumper/Dumper.so: 
> symbol main: referenced symbol not found at
>/usr/perl/lib/5.6.1/sun4-solaris/XSLoader.pm line 75.
> at /usr/perl/lib/5.6.1/sun4-solaris/Data/Dumper.pm line 27
>Compilation failed in require at go.pl line 5.
>BEGIN failed--compilation aborted at go.pl line 5.

That is not a failure mode that I remember. 
I do seem to recall having to define a main() for some dynamic loaded
thing on Solaris a few years back - but not the details.
The SunPro run-time and/or C++ was involved in some way ...

>
>
>With just the print statement, the script runs just fine.  Can someone 
>give me some suggestions on resolving this problem?

Dynamic loading and embedded perls is a little tricky but you seem 
to have got past the first few hurdles (as you are getting messages 
from XSLoader

>
>
>Thanks,
>
>Marc
>
>-----------------------------------------------------------------------
>
>
>My embedded perl looks like this, which contains code mostly from 
>perlmain.c, but also from 'perl -MO=C' out of desperation.  The 
>entry point is user_initialize(), which is called by the API:
>
>#include "EXTERN.h"
>#include "perl.h"
>#include "XSUB.h"
>#include "ProToolkit.h"
>#include "ProMessage.h"
>EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
>static void xs_init (pTHX);
>static void dl_init (pTHX);
>static PerlInterpreter *my_perl;
>
>int user_initialize(int argc, char **argv) {
>
>    int exitstatus;
>    char *argv1[] = { "", "go.pl" };
>    char **env_new=NULL, *args[] = { NULL };
>    int i,argc1=2;
>
>#ifdef PERL_GLOBAL_STRUCT
>#define PERLVAR(var,type) /**/
>#define PERLVARA(var,type) /**/
>#define PERLVARI(var,type,init) PL_Vars.var = init;
>#define PERLVARIC(var,type,init) PL_Vars.var = init;
>#include "perlvars.h"
>#undef PERLVAR
>#undef PERLVARA
>#undef PERLVARI
>#undef PERLVARIC
>#endif
>
>    printf("Start user_initialize\n");
>    /* PERL_SYS_INIT3(&argc,&argv,&env); */
>    PERL_SYS_INIT3(&argc1,&argv1,&env_new);
>
>    if (!PL_do_undump) {
>        my_perl = perl_alloc();
>        if (!my_perl)
>            exit(1);
>        perl_construct(my_perl);
>        PL_perl_destruct_level = 0;
>    }
>
>    /* exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL); */
>    exitstatus = perl_parse(my_perl, xs_init, argc1, argv1, (char **)NULL);
>    if (!exitstatus) {
>        dl_init(aTHX);
>        exitstatus = perl_run(my_perl);
>    }
>
>  printf("End user_initialize\n");
>  return(0);
>}
>
>
>void user_terminate() {
>  printf("Start: User Terminate\n");
>  perl_destruct(my_perl);
>  perl_free(my_perl);
>  PERL_SYS_TERM();
>  printf("End:   User Terminate\n");
>}
>
>
>static void
>xs_init(pTHX)
>{
>        char *file = __FILE__;
>        dXSUB_SYS;
>        {
>        /* DynaLoader is a special case */
>        newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
>        }
>}
>
>static void
>dl_init(pTHX)
>{
>    char *file = __FILE__;
>    dTARG;
>    dSP;
>/* Dynamicboot strapping code*/
>        SAVETMPS;
>        targ=sv_newmortal();
>        FREETMPS;
>/* end Dynamic bootstrapping code */
>}
>
>
>-----------------------------------------------------------------------
>
>
>My Makefile contains this:
>
># Executable names
>EXE = properl
>EXE_DLL = properl.dll
>
># Include File Paths
>INCS = -I. -Iincludes 
>PERL_INCS=-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 
>-I/usr/perl/lib/5.6.1/sun4-solaris/CORE
>
># Compiler Flags
>CC = gcc
>MACH = -DPRO_MACHINE=19 -DPRO_OS=3 -DSOLARIS
>CCFLAGS = -c -fPIC
>CFLAGS = $(CCFLAGS) $(MACH) $(INCS) $(PERL_INCS)
>
># Link Flags
>LD = ld
>LDFLAGS = -G -Bsymbolic 
>
># Libraries
>SYSLIBS = -lsocket -lnsl -lw -lm -ldl -lc
>PTCLIBS = ./protoolkit.a
>PTCLIBS_DLL = ./protk_dll.a
>PERL_LIBS = /usr/perl/lib/5.6.1/sun4-solaris/auto/DynaLoader/DynaLoader.a \
>            -L/usr/perl/lib/5.6.1/sun4-solaris/CORE -lperl \
>            -L/opt/gcc-2.95.3/lib/gcc-lib/sparc-sun-solaris2.6/2.95.3 -lgcc \
>
># Object files
>OBJS = properl.o
>
>$(EXE):  $(OBJS) $(PTCLIBS)
>        $(CC) -o $(EXE) $(OBJS) $(PTCLIBS) $(SYSLIBS) $(PERL_LIBS)
>
>$(EXE_DLL):  $(OBJS) $(PTCLIBS_DLL)
>        $(LD) $(LDFLAGS) -o $(EXE_DLL) $(OBJS) $(PTCLIBS_DLL) $(PERL_LIBS)
>$(SYSLIBS)
>
># object dependencies
>properl.o:  properl.c
>        $(CC) $(CFLAGS) properl.c
>
>dll: $(EXE_DLL)
>
>
>
>
>
>Marc
-- 
Nick Ing-Simmons
http://www.ni-s.u-net.com/

Reply via email to