2010-05-27 Doug Kwan <dougkwan@google.com>
authorDoug Kwan <dougkwan@google.com>
Wed, 26 May 2010 18:53:46 +0000 (18:53 +0000)
committerDoug Kwan <dougkwan@google.com>
Wed, 26 May 2010 18:53:46 +0000 (18:53 +0000)
* 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
gold/object.cc

index 3dba1975d7829b3b1c418602932835196a1e0187..ef47e8ea2b1befcbd7f643726749f134f62b0b36 100644 (file)
@@ -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
index 9581fd8774daef1a7190b2fa695ada09b0d01438..24fd58629604e0065599e61f007136dbf1675608 100644 (file)
@@ -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);
                }
            }