diff options
-rw-r--r-- | gold/ChangeLog | 6 | ||||
-rw-r--r-- | gold/object.cc | 16 |
2 files changed, 19 insertions, 3 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 3dba197..ef47e8e 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +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. + 2010-05-26 Rafael Espindola <espindola@google.com> PR 11604 diff --git a/gold/object.cc b/gold/object.cc index 9581fd8..24fd586 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -1827,7 +1827,12 @@ Sized_relobj<size, big_endian>::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<size, big_endian>::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<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); } } |