This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Prevent broken sysv-style hash table when --hash-style=both


> please submit patches in the unified diff format. ?this is easy to do by default

thanks, it's the unified diff format for this patch

Index: layout.cc
===================================================================
RCS file: /cvs/src/src/gold/layout.cc,v
retrieving revision 1.222
diff -u -p -r1.222 layout.cc
--- layout.cc	19 Oct 2011 15:05:58 -0000	1.222
+++ layout.cc	17 Jan 2012 21:08:27 -0000
@@ -3832,16 +3832,16 @@ Layout::create_dynamic_symtab(const Inpu

   // Create the hash tables.

-  if (strcmp(parameters->options().hash_style(), "sysv") == 0
+  if (strcmp(parameters->options().hash_style(), "gnu") == 0
       || strcmp(parameters->options().hash_style(), "both") == 0)
     {
       unsigned char* phash;
       unsigned int hashlen;
-      Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount,
+      Dynobj::create_gnu_hash_table(*pdynamic_symbols, local_symcount,
 				    &phash, &hashlen);

       Output_section* hashsec =
-	this->choose_output_section(NULL, ".hash", elfcpp::SHT_HASH,
+	this->choose_output_section(NULL, ".gnu.hash", elfcpp::SHT_GNU_HASH,
 				    elfcpp::SHF_ALLOC, false,
 				    ORDER_DYNAMIC_LINKER, false);

@@ -3856,23 +3856,28 @@ Layout::create_dynamic_symtab(const Inpu
 	{
 	  if (dynsym != NULL)
 	    hashsec->set_link_section(dynsym);
-	  hashsec->set_entsize(4);
-	}

-      if (odyn != NULL)
-	odyn->add_section_address(elfcpp::DT_HASH, hashsec);
+	  // For a 64-bit target, the entries in .gnu.hash do not have
+	  // a uniform size, so we only set the entry size for a
+	  // 32-bit target.
+	  if (parameters->target().get_size() == 32)
+	    hashsec->set_entsize(4);
+
+	  if (odyn != NULL)
+	    odyn->add_section_address(elfcpp::DT_GNU_HASH, hashsec);
+	}
     }

-  if (strcmp(parameters->options().hash_style(), "gnu") == 0
+  if (strcmp(parameters->options().hash_style(), "sysv") == 0
       || strcmp(parameters->options().hash_style(), "both") == 0)
     {
       unsigned char* phash;
       unsigned int hashlen;
-      Dynobj::create_gnu_hash_table(*pdynamic_symbols, local_symcount,
+      Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount,
 				    &phash, &hashlen);

       Output_section* hashsec =
-	this->choose_output_section(NULL, ".gnu.hash", elfcpp::SHT_GNU_HASH,
+	this->choose_output_section(NULL, ".hash", elfcpp::SHT_HASH,
 				    elfcpp::SHF_ALLOC, false,
 				    ORDER_DYNAMIC_LINKER, false);

@@ -3887,16 +3892,11 @@ Layout::create_dynamic_symtab(const Inpu
 	{
 	  if (dynsym != NULL)
 	    hashsec->set_link_section(dynsym);
-
-	  // For a 64-bit target, the entries in .gnu.hash do not have
-	  // a uniform size, so we only set the entry size for a
-	  // 32-bit target.
-	  if (parameters->target().get_size() == 32)
-	    hashsec->set_entsize(4);
-
-	  if (odyn != NULL)
-	    odyn->add_section_address(elfcpp::DT_GNU_HASH, hashsec);
+	  hashsec->set_entsize(4);
 	}
+
+      if (odyn != NULL)
+	odyn->add_section_address(elfcpp::DT_HASH, hashsec);
     }
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]