Upgrading to 3003 on an RS/6000

Jim Hudgens hudgens at sun13.SCRI.FSU.EDU
Sun Mar 24 00:36:26 AEST 1991


In article <?P{=7=C at rpi.edu> borchers at aix01.aix.rpi.edu (Brian T. Borchers) writes:

   We recently upgrades to 3003.  I have a collection of Fortran and C
   routines called grafic (a simple scientific plotting package).  When
   I tried to link with this library after the upgrade, ld reported that
   .#SYSTEM and .#ABORT were undefined.  I took this to mean that I should
   recompile everything.  After I recompiled the library and the main
   program, I still had the undefined symbols.  

Interesting, cause I am dealing with the same problem, a program with
lots of C and fortran routines.  Previous to this upgrade, the fortran
compiler, when given code like:

      call signal(...)
      call system(...)
      call abort(...)
      call getenv(...)

(and undoubtedly others, as well.) would produce the names in the 
object module of the form:
         U .#ABORT
         U .#GETENV
         U .#SIGNAL
         U .#SYSTEM

However, under 3003, these names were converted into:
         U .abort
         U .getenv
         U .signal
         U .system

With programs which link in C and fortran, and do similar type
operations (getenv, signal, abort, etc.) now find that the names given
by the fortran and C compilers are identical, and are apparently
freely interlinkable, even though the arguments are quite different.
What we are seeing is that the programs link without error, and
instantly die, if the C version of the program uses one of these
routines.  Probably, the C reference to {getenv, signal, system,
abort} are getting linked to the fortran library routines of the same
name:

nm /usr/lib/libxlf.a | grep ..... | grep T
00001b90 T .getenv
00000000 T .getenv       
00009b58 T .abort        
00000000 T .signal       
00000000 T .system       

nm /lib/libc.a | grep ..... | grep T
000066c8 T .getenv        
00020884 T .signal       
00026cec T .system       
00016898 T .abort        

Since the C getenv routine takes one argument, and returns a 
string, and the fortran getenv takes two arguments, mayhem results
if the fortran libraries' getenv actually satisfies the .getenv call in the
C module. 

Actually, I understand the reason for making this change to the
fortran compiler.  Someone probably had a fortran routine they wrote 
called signal or abort, and bitterly complained that it wasn't getting called,
and that signal (or abort) was a perfectly valid fortran routine name.
But still, I feel compelled to complain.   :-)

What I am curious about, is what is an easy workaround to get the 
original behavior back.  Also, where is there a detailed description
of how the ld program actually works.  I am almost certain that there
is some flag which might exert some control over this process.  And the 
frequent duplication of identical names in the libraries (note the 
two getenv's in the fortran library namelist above) makes me wonder.
Anyone have any pointers to the relevent document inside info?


JHH
--

Jim Hudgens		Supercomputer Computations Research Institute
hudgens at sun13.scri.fsu.edu



More information about the Comp.unix.aix mailing list