[Fwd: Re: [linker] relaxation question]

Nick Clifton nickc@redhat.com
Tue Aug 11 10:25:00 GMT 2009


Hi Swami,

> Any hint to get the relocs for .uleb128 also ?

These are much harder to handle.  (Which is probably why the mn10300 
port does not do anything special for them at the moment).

The problem is that LEB128 values are variable in length.  In theory the 
correct thing to do is:

   * If linker relaxation is not enabled then emit the LEB128 value
     as normal.

   * If the expression does not involve any symbols then emit the
     LEB128 value as normal.

   * If the expression is the difference of two symbols which are
     in the same section and this sections will not be relaxed then
     emit the LEB128 value as normal.

   * Otherwise emit a LEB128 value which is the maximum possible
     length for the target architecture.  (Ie: 16-bit, 32-bit or
     64-bit).  Then also emit one or two relocations to indicate
     that an LEB128 value needs to be handled at this location.
     (You will probably have to create new relocations for this).
     Emit one relocation if there is only one symbol in the original
     expression.  Emit two relocations if the original expression
     is the difference of two symbols.

   * In the linker you must make sure that in addition to relaxing
     the normal sections you also relax any section that contains
     any of the LEB128 relocations.  Ie you relax the LEB128 values.

   * Finally in the linker, when you are processing relocations
     you must add code to handle these LEB128 values and compute
     the correct value to be placed into the binary.  (You may
     actually choose to do this computation and insertion at the
     same time as you relax the LEB128 relocations, but
     conceptually there are two separate operations).

Cheers
   Nick




More information about the Binutils mailing list