Doug,

In the good old days of DECUS[1], I chaired the VMS Internals Working
Group (for about 8 years, from 1981 through 1989, glory, halcyon days).

During each DECUS Symposium, on Thursday night, we ran a magic session, 
handing out a prize for the best magic (decided by a panel of VMS 
internals wizards  using an online voting system, in hex).

I'm sure your solution would have won a prize. Congratulations!

And, I'm still ROFLMAOPIMP.

Carl Friedberg
[EMAIL PROTECTED]
www.comets.com

[1] DECUS == Digital Equipment Corporation Users Society, which held
symposia twice a year for many, many years.

> -----Original Message-----
> From: doug brann [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, October 18, 2006 4:15 AM
> To: Craig A. Berry; vmsperl@perl.org
> Subject: Re: Help building a Perl Module that works under HP-UX and
> Linux but not under VMS
> 
> Well, we got it working. I should probably let all of you know what I
> ended up doing to get this thing going, just in case someone else
> wants to try something as weird as this project has been.
> 
> Basically, I have a FORTRAN program that calls persist.c, which is
> pretty much straight out of the perlembed documentation for a
> persistent perl. So, persistent.c calls persistent.pl (which is
> pretty much also right out of the documentation). This routine in
> turn calls a perl script that has in it a line:
> 
> use PerlInterface;
> 
> which has several routines that call FORTRAN routines, some with
> arguments some that without. The trick was getting the
> PerlInterface.XS code to find .OBJ files that were not linked to the
> PerlInterface module in any way.
> 
> The solution was a bit of a hack, but in may ways anything like this
> project is destined to be a bit of a hack (if not more than 'a bit').
> What I did was get the FORTRAN code calling persistent.c to pass an
> array of integers to persistent.c. Those integers corresponded to
> addresses in memory where the FORTRAN routines resided. Then,
> persistent.c used sprintf to turn those addresses into character
> strings, which were in turn passed to persistent.pl.
> 
> Next, PerlInterface.XS took over. A routine in the BEGIN block called
> the XS code, which in turn took those integers and treated them as
> addresses and assigned pointers to callback routines to those
> addresses. After that, everything worked.
> 
> There was an added advantage of this method that any script doing a
> 'use PerlInterface;' call will not run unless it is run from a
> "PERSISTENT" executable, since the callbacks in the XS code point to
> NULL without proper initialization. This turns out to be an added
> security measure since scripts running this code can do dangerous
> things that we can prevent from PERSISTENT.
> 
> This whole thing sounds and looks a bit ugly, and it was completely
> unnecessary on HP-UX or Linux, but I'm glad it got working and felt
> like somebody somewhere might want to know about it.
> 
> -Doug
> 
> "Craig A. Berry" <[EMAIL PROTECTED]> wrote:
> 
>       At 3:50 AM -0700 10/16/06, doug brann wrote:
> 
>       >I don't know if I'm sending this e-mail to the right place,
> but I am stuck on a weird problem building a Perl module.
> 
>       vmsperl is the right place. I believe vmsperl-help is just for
> help
>       with the mailing list, not for help with Perl or VMS.
> 
>       >
>       >I have a persistent perl executable based on the code found in
> the "perldoc perlembed" example, and this executable will be running
> scripts that use a Perl module that has a C extension that is making
> a call to an .obj that contains FORTRAN code (how's that for
> confusing?). The .obj file is known PersistentPerl, but is not known
> to PerlInterface. PerlInterface.XS contains a prototype of the call
> to the FORTRAN routine, and a routine in PerlInterface.XS contains
> the call to the routine.
>       >
>       >Believe it or not, the PerlInterface and PersistentPerl
> actually work as desired under *NIX systems. That is, when a script
> with 'use PerlInterface' is run under the PersistentPerl executable,
> a call to the FORTRAN routine behaves exactly the way it's supposed
> to. If that same script is run by just typing "perl [script].pl", the
> script can't compile. This is exactly what I need this thing to do.
> You can do a 'perl Makefile.PL' and a 'make install', (but not 'make
> test' obviously), and after that, PersistentPerl and PerlInterface
> work perfectly.
>       >
>       >When I ported the whole thing over to VMS, everything worked.
> Almost. PERSISTENTPERL compiled, and successfully linked all the
> FORTRAN .obj files.
> 
>       What did it link them into? Did it create a shareable image
> (aka dynamic library)?
> 
>       >I did a 'perl MAKEFILE.PL' and it created a DESCRIP.MMS for
> PERLINTERFACE. Then I did an 'mms install' and got a headace.
>       >
>       >%LINK-W-USEUNDEF UNDEFINED SYMBOL REFERRED IN MODULE
> PERLINTERFACE fiile [....path to .olb file]PERLINTERFACE.OLB
>       >
>       >%MMS-F-ABORT PL_PERLINTERFACE.EXE CLI RETURNED ABORT STATUS
> %X10648268
>       >
>       >I'm a real VMS novice, and mms is new to me as well, so I have
> no idea what is going on here. It looks to me as though I'm missing
> some sort of explicit call in my MAKEFILE.PL to ensure that my module
> doesn't try to resolve the lack of the actual code the call is trying
> to make.
>       >
>       >Thanks for any help you can give me.
> 
>       Is there any code in PerlInterface that is expected to know how
> to
>       locate a dynamic library at run-time, i.e., any dlopen() calls
> or
>       similar?
> 
>       --
>       ________________________________________
>       Craig A. Berry
>       mailto:[EMAIL PROTECTED]
> 
>       "... getting out of a sonnet is much more
>       difficult than getting in."
>       Brad Leithauser
> 
> 
> 
> ________________________________
> 
> Get your email and more, right on the new Yahoo.com
> <http://us.rd.yahoo.com/evt=42973/*http://www.yahoo.com/preview>

Reply via email to