Subject: base-relative relocations
To: None <tech-toolchain@netbsd.org>
From: Charles M. Hannum <mycroft@mit.edu>
List: tech-toolchain
Date: 08/06/1998 04:21:31
As some of you know, I've been looking at the disgusting hacks in the
arm32 version of ld(1) and ld.so(1).  I more or less have all of the
problems fixed, but there's one unresolved issue...

Our version of gas on other a.out platforms outputs base-relative
relocations with addends that are symbol-relative, whereas BFD (and
thus the new gas) outputs addends that are base-relative.  The linker
(both ld and ld.so) expect the symbol-relative addends.

There are a couple of solutions to this:

1) Change the linker to deal with the base-relative addends, only on
   the ARM platform.  The easy way to do this would be to adjust the
   addend on input and output; unfortunately this is not so easy given
   the structure of the linker, because part of the information needed
   to do the base-relative fixup is thrown away too early.  (I need to
   know what the offset of the symbol was in the input file.)

   The current arm32 patch has a different approach to this which
   causes the symbol-relative offset to be removed, which has great
   lossage potential.

   Obviously this can only be done for arm32 (and new platforms), or
   it will break compatibility with old libraries and object files.

2) Change BFD/gas to grok the symbol-relative addends.  I stared at
   the code for quite a while, and I couldn't figure it out.  Maybe
   someone else can.

   This is going to be necessary to use the new BFD/gas on other a.out
   ports, so it has to be done eventually anyway.  In addition, since
   other changes necessitate breaking compatibility on the arm32 port,
   it doesn't hurt there.


Other than that, I have the arm32 code more or less working (doing
run-time copies of data items and everything) without any changes in
the MI code.


Could someone who groks BFD figure out how to make it DTRT here?