From 29e11421774bceff6b4d895d7b133bc02850e4f6 Mon Sep 17 00:00:00 2001 From: Doug Kwan Date: Wed, 26 May 2010 18:53:46 +0000 Subject: [PATCH] 2010-05-27 Doug Kwan * 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. --- gold/ChangeLog | 6 ++++++ gold/object.cc | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 3dba1975d78..ef47e8ea2b1 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2010-05-27 Doug Kwan + + * 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. + 2010-05-26 Rafael Espindola PR 11604 diff --git a/gold/object.cc b/gold/object.cc index 9581fd8774d..24fd5862960 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -1827,7 +1827,12 @@ Sized_relobj::do_finalize_local_symbols(unsigned int index, const Output_section_data* posd = os->find_relaxed_input_section(this, shndx); if (posd != NULL) - lv.set_output_value(posd->address()); + { + Address relocatable_link_adjustment = + relocatable ? os->address() : 0; + lv.set_output_value(posd->address() + - relocatable_link_adjustment); + } else lv.set_output_value(os->address()); } @@ -1835,9 +1840,14 @@ Sized_relobj::do_finalize_local_symbols(unsigned int index, { // 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. + Address adjusted_start = + relocatable ? start - os->address() : start; Merged_symbol_value* msv = - new Merged_symbol_value(lv.input_value(), start); + new Merged_symbol_value(lv.input_value(), + adjusted_start); lv.set_merged_symbol_value(msv); } } -- 2.30.2