This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH][GOLD] Use offsets within output sections during a relocatable link.
- From: Ian Lance Taylor <iant at google dot com>
- To: Doug Kwan (éæå) <dougkwan at google dot com>
- Cc: binutils <binutils at sourceware dot org>
- Date: Wed, 26 May 2010 10:32:59 -0700
- Subject: Re: [PATCH][GOLD] Use offsets within output sections during a relocatable link.
- References: <AANLkTikMMZEq9TdvwPx4ytpfQRMMG4QUlTPVizVZzhI9@mail.gmail.com>
"Doug Kwan (éæå)" <dougkwan@google.com> writes:
> 2010-05-27 Doug Kwan <dougkwan@google.com>
>
> * object.cc (Sized_relobj::do_finalize_local_symbols): Use offset
> from start of output section instead of address for a local symbol
> in a merged or relaxed section when doing a relocatable link.
Thanks for finding this.
> --- gold/object.cc 26 May 2010 15:47:39 -0000 1.123
> +++ gold/object.cc 26 May 2010 15:57:55 -0000
> @@ -1827,7 +1827,12 @@ Sized_relobj<size, big_endian>::do_final
> const Output_section_data* posd =
> os->find_relaxed_input_section(this, shndx);
> if (posd != NULL)
> - lv.set_output_value(posd->address());
> + {
> + uint64_t relocatable_link_adjustment =
> + relocatable ? os->address() : 0;
> + lv.set_output_value(posd->address()
> + - relocatable_link_adjustment);
> + }
This is a template function. The variable relocation_link_adjustment
should have type Address (a typedef in Sized_relobj), not uint64_t.
> @@ -1835,9 +1840,14 @@ Sized_relobj<size, big_endian>::do_final
> {
> // We have to consider the addend to determine the
> // value to use in a relocation. START is the start
> - // of this input section.
> + // of this input section. If we are doing a relocatable
> + // link, use offset from start output section instead of
> + // address.
> + uint64_t adjusted_start =
> + relocatable ? start - os->address() : start;
> Merged_symbol_value<size>* msv =
> - new Merged_symbol_value<size>(lv.input_value(), start);
> + new Merged_symbol_value<size>(lv.input_value(),
> + adjusted_start);
> lv.set_merged_symbol_value(msv);
> }
> }
Here too, for the variable adjusted_start.
This is OK with those changes.
Thanks.
Ian