Re: Perl 5.12.1 build report

[email protected] ("Craig A. Berry") Thu, 24 Jun 2010 19:15:10 -0500
Newsgroups perl.vmsperl
Message-ID <[email protected]>
On Jun 24, 2010, at 5:54 PM, John E. Malmberg wrote:

> On 6/24/2010 2:03 PM, Mark Berryman wrote:
>>
>> Link /NoTrace/NoMap/Trace/Exe=MINIPERL.EXE miniperlmain.obj,  
>> libperlmini.olb/Library/Include=globals  ,[]crtl.opt/Options
>> %ILINK-W-NOSUCHMOD, module GLOBALS not found
>>         in library USERS:[BERRYMAN.PERL-5_12_1]LIBPERLMINI.OLB;1
>> %ILINK-W-NUDFSYMS, 8 undefined symbols:
>> %ILINK-I-UDFSYM,        lib$find_image_symbol
>> %ILINK-I-UDFSYM,        lib$initialize
>> %ILINK-I-UDFSYM,        lib$rename_file
>> %ILINK-I-UDFSYM,        sys$filescan
>> %ILINK-I-UDFSYM,        sys$get_security
>> %ILINK-I-UDFSYM,        sys$getdviw
>> %ILINK-I-UDFSYM,        sys$set_security
>> %ILINK-I-UDFSYM,        sys$sigprc
>
> Those undefined symbols should be easy to fix, they just need to be  
> declared in upper case in the source file.  I am trying to remember  
> if I submitted a patch to do that before.
>
> Unfortunately the system header files for defining those routines is  
> generated by a program that has not been updated to properly  
> generate function prototypes from the source file it uses.  That is  
> why I never use that file, and instead manually prototype the system  
> services.  The proper prototypes make several common programming  
> errors to be detected by the compiler.
>

Well, whatever the "proper" prototypes are, several of the prototypes  
in [.vms]vms.c have type mismatches compared to the prototypes in the  
system-supplied headers.  The only reason we don't see the mismatches  
all the time is because the system headers have #defines to make the  
routine names upper case as seen by the compiler and vms.c doesn't.   
If we add #defines like that in vms.c, then the compiler sees that the  
functions are the same ones already prototyped in lib$routines.h or  
starlet.h and knows that we're providing incompatible prototypes.

So I think these home-rolled prototypes have to go.  It's the system's  
job to prototype system-supplied routines in the system-supplied  
headers.  Trying to second guess that just makes the code more  
fragile.  I don't know of any way to undo a prototype the compiler has  
already seen, and I'm not about to take on the maintenance burden of  
keeping up our own versions of starlet.h and lib$routines.h so that we  
can prevent the compiler from seeing the system-supplied prototypes.

> The code that currently uses LIB$FIND_IMAGE_SYMBOL needs to be  
> updated to do the following:
>
> 1. If the symbol is over 31 characters:
>   a. Try loading it in exact case but CRC shortened the way the
>      C compiler does.
>   b. Try loading it in upper case but CRC shortened the way the
>      C compiler does.
>   c. Try loading it in exact case but truncated to 31 characters.
>   d. Try loading it in upper case but truncated to 31 characters.
> 2. For symbols 31 characters or less, try looking for it in exact case
>   first and then in all upper case.

We have complete control over how the symbols are created at build  
time.  I can't see any good reason to add this level of complexity and  
processing at run time.

________________________________________
Craig A. Berry
mailto:[email protected]

"... getting out of a sonnet is much more
  difficult than getting in."
                  Brad Leithauser