ddh@hare.cdc.com (Dan Horsfall) (11/06/90)
This subject was beaten to death my myself and James Craig Burley a
while back, with not much resolved between us. For those who have
the following problem, here is a potential solution.
Problem: How to load a BLOCK DATA subprogram from a LIBRARY.
(This can be a problem since you can't CALL a block data subprogram
in the usual sense, thus the loader/linker process ofmatching
external references to entry points frequently does not work.)
Flash of insight here: Thinking that a good optimizing compiler does
NOT allocate storage for a variable which appears ONLY in a type
declaration statement, perhaps some compilers also do not generate
external references for symbols that appear ONLY in EXTERNAL statements.
To force an external reference, the symbol must be USED in a manner
that forces it to exist.
Therefore, to those of you who wish to load block data from a library,
try this:
PROGRAM FOO
EXTERNAL BDATA <- same as before
...
CALL INIT( BDATA ) <- pass address to some routine
... etc
SUBROUTINE INIT <- the called routine need not have an
[ or SUBROUTINE INIT() ] argument, but could have one for
[ or SUBROUTINE INIT( BD ) ] cosmetics, depending on your style
requirements and compiler.
Now, the compiler thinks that the address of bdata must in fact be passed
to init -- which may or may not eve define the argument, and obviously
shouldn't reference it/them. This works on MIPS-based f77, and is worth
a try on others.
No flames, please, if this doesn't work for you.
--
Horse
+ Control Data Corporation
Dan Horsfall +1-612-482-4622 + 4201 Lexington Ave North
Internet ddh@dash.udev.cdc.com + Arden Hills MN 55126 USA