This is the mail archive of the binutils@sourceware.cygnus.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: bug(?) in ppc relocations


Ian Lance Taylor wrote:
> 
>    Date: Mon, 20 Mar 2000 23:02:18 +0200
>    From: Momchil Velikov <velco@fadata.bg>
> 
>                addend -= (sdata->sym_hash->root.u.def.value
>                           + sdata->sym_hash->root.u.def.section->output_section->vma
>                           + sdata->sym_hash->root.u.def.section->output_offset);
> 
>    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>              }                                   |
>              break;                              |
>                                  This looks somewhat suspicious.
>    sdata->sym_hash is the _SDA_BASE_ symbol and its value,
>    as far as I can understand, should not be affected by output_offset,
>    right ?
> 
> You are incorrect.  It should be affected by output_offset.  Any time
> you look at section->output_section->vma, you need to look at
> output_offset.
Yep, for ordinary symbols, but _SDA_BASE_ is not quite normal, is it ?

> 
>    Consider the following scenario:
>     1. The linker creates a linker section .sdata and _SDA_BASE_ with
>    offset 32768
>     2. The linker outputs to the output .sdata some input .sdata
>     3. The linker appends the linker .sdata to output .sdata
>    Now data items in the first .sdata are at offset < -32768 relative to
>    _SDA_BASE_ and the linker exits with relocation overflow error.
> 
>    If the above analisys is correct one can think of (at least) two
>    options:
>      (a) make sure the linker section is output first, or
>      (b) remove the underlined line above.
> 
> I don't understand your analysis.
> 
> Are you assuming that output_offset changes during the final linking
> phase?  It doesn't.
Nope, I don't assume that. I see the output offset of the linker .sdata
secton being greater than zero, so the value of _SDA_BASE_ in the
output file is == (the address of .sdata + something greater than
32768), thus
the data items near the beginning of .sdata cannot be addressed with
signed 16-bit offset from _SDA_BASE_.

Regards,
-velco

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]