[comp.unix.ultrix] What is 'jump relocation out-of-range' ?

elsen@esat.kuleuven.ac.be (02/19/90)

       I have an applications which 'Makes' it without any problems
in the VAX Ultrix environment (UWS 2.1) but fails on my DECstation 3100
(same UWS) with : 


----------------final output from Make (everything else runs fine)--------------

cc -O -DBSD4_2 -o cifp ciftype.o cifpars.o transform.o showcells.o cifsym.o allo
c.o color.o powerpack.o plotpack.o ambigcomp.o plotio.o cifp.o call.o  -lm
ld:
/lib/libc.a(_exit.o): jump relocation out-of-range, bad object file produced, ca
n't jump from 0x412d28 to 0x1000334c (abort)
*** Error code 1
--------------------------------------------------------------------------------


    So , what the h... does   'jump relocation....' mean ?


-- 


  Marc Elsen (System Manager/Software Engineer)
  Katholieke Universiteit Leuven
  Dep. E.S.A.T.
  Kard. Mercierlaan 94
  3030 HEVERLEE
  Belgium
              tel. 32(0)16220931(ext. 1080)

               EMAIL : elsen@esat.kuleuven.ac.be

                       ...!kulcs!kulesat!elsen (UUCP)
                       elsen%kulesat.uucp@blekul60 (BITNET)
                       psi%02062166012::elsen  (PSI MAIL)

chris@mimsy.umd.edu (Chris Torek) (03/08/90)

In article <2468.25dfeb50@esat.kuleuven.ac.be> elsen@esat.kuleuven.ac.be
asks what

>/lib/libc.a(_exit.o): jump relocation out-of-range, bad object 
>file produced, can't jump from 0x412d28 to 0x1000334c (abort)
>*** Error code 1

means.

The MIPS compiler/linker puts code at addresses 0x00400000 upward,
and puts data at 0x10000000 upward.  If you accidentally try to invoke
data as code, the compiler generates `jump' (actually jalr, Jump And
Link Register) instructions from code locations (_exit, 0x412d28) to data
locations (abort, 0x1000334c), but this is too far away (more than 2^26)
for the jalr instruction's address field, so that the linker complains.
This is better than on the VAX, where the linker makes the subroutine
call go to the data location, and then the program explodes at runtime.

What you have done is name a global variable `abort'.  The C library
_exit() routine calls abort() under some (unknown) circumstances.  When
it wants to call abort(), it will instead try to call your abort variable.
Who knows what will happen then. . . .
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain:	chris@cs.umd.edu	Path:	uunet!mimsy!chris