* target-reloc.h (Default_scan_relocatable_relocs): Only discard
authorIan Lance Taylor <ian@airs.com>
Fri, 12 Dec 2008 16:33:05 +0000 (16:33 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 12 Dec 2008 16:33:05 +0000 (16:33 +0000)
r_type == 0 for a local symbol with r_sym == 0.
(scan_relocatable_relocs): Pass r_sym to
local_non_section_strategy.
* reloc.cc (Emit_relocs_strategy::local_non_section_strategy): Add
r_sym parameter.

gold/ChangeLog
gold/reloc.cc
gold/target-reloc.h

index 17e3b41e134ac9ab4bf45915386951ac855307d4..3e1b99f7a872c9fff51b994aae1dc9952911db27 100644 (file)
@@ -1,5 +1,12 @@
 2008-12-12  Ian Lance Taylor  <iant@google.com>
 
+       * target-reloc.h (Default_scan_relocatable_relocs): Only discard
+       r_type == 0 for a local symbol with r_sym == 0.
+       (scan_relocatable_relocs): Pass r_sym to
+       local_non_section_strategy.
+       * reloc.cc (Emit_relocs_strategy::local_non_section_strategy): Add
+       r_sym parameter.
+
        * configure.ac: Update test for TLS descriptors: they are
        supported as of glibc 2.9.
        * configure: Rebuild.
index 9a444a266d3e68e46dd3cf9c0fce84d053fa8f60..f6bef1d973a6bb347b9a9341a2872d2ecc8cf286 100644 (file)
@@ -368,7 +368,7 @@ class Emit_relocs_strategy
  public:
   // A local non-section symbol.
   inline Relocatable_relocs::Reloc_strategy
-  local_non_section_strategy(unsigned int, Relobj*)
+  local_non_section_strategy(unsigned int, Relobj*, unsigned int)
   { return Relocatable_relocs::RELOC_COPY; }
 
   // A local section symbol.
index 3205e3666d8ef7fee1639e9591aa0d5c1cae06ba..b9ecf9fd6dab2907089ae614152d94b9afc0cc55 100644 (file)
@@ -308,11 +308,11 @@ class Default_scan_relocatable_relocs
   // Return the strategy to use for a local symbol which is not a
   // section symbol, given the relocation type.
   inline Relocatable_relocs::Reloc_strategy
-  local_non_section_strategy(unsigned int r_type, Relobj*)
+  local_non_section_strategy(unsigned int r_type, Relobj*, unsigned int r_sym)
   {
     // We assume that relocation type 0 is NONE.  Targets which are
     // different must override.
-    if (r_type == 0)
+    if (r_type == 0 && r_sym == 0)
       return Relocatable_relocs::RELOC_DISCARD;
     return Relocatable_relocs::RELOC_COPY;
   }
@@ -322,10 +322,6 @@ class Default_scan_relocatable_relocs
   inline Relocatable_relocs::Reloc_strategy
   local_section_strategy(unsigned int r_type, Relobj* object)
   {
-    // We assume that relocation type 0 is NONE.  Targets which are
-    // different must override.
-    if (r_type == 0)
-      return Relocatable_relocs::RELOC_DISCARD;
     if (sh_type == elfcpp::SHT_RELA)
       return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_RELA;
     else
@@ -352,14 +348,8 @@ class Default_scan_relocatable_relocs
   // Return the strategy to use for a global symbol, given the
   // relocation type, the object, and the symbol index.
   inline Relocatable_relocs::Reloc_strategy
-  global_strategy(unsigned int r_type, Relobj*, unsigned int)
-  {
-    // We assume that relocation type 0 is NONE.  Targets which are
-    // different must override.
-    if (r_type == 0)
-      return Relocatable_relocs::RELOC_DISCARD;
-    return Relocatable_relocs::RELOC_COPY;
-  }
+  global_strategy(unsigned int, Relobj*, unsigned int)
+  { return Relocatable_relocs::RELOC_COPY; }
 };
 
 // Scan relocs during a relocatable link.  This is a default
@@ -429,7 +419,8 @@ scan_relocatable_relocs(
                  strategy = Relocatable_relocs::RELOC_DISCARD;
                }
              else if (lsym.get_st_type() != elfcpp::STT_SECTION)
-               strategy = scan.local_non_section_strategy(r_type, object);
+               strategy = scan.local_non_section_strategy(r_type, object,
+                                                          r_sym);
              else
                {
                  strategy = scan.local_section_strategy(r_type, object);