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: [gold patch] Fix gold to match .data.rel.ro sections more carefully


> Sorry, I committed this without noticing a couple of testsuite
> failures. Adding the "." here caused sections named ".data.rel.ro" to
> match the next entry in the table, which maps ".data.*" to ".data". I
> need to make the mapping a bit smarter...

This patch adds a couple of entries to the table that require an exact
match (setting fromlen to 0 as a flag).

There's probably a better way to do this -- maybe just drop the
trailing dot in all cases, and check for either "." or "\0" after the
matched part. It wasn't clear to me that that strategy would apply
universally, though.

Tested (and looked at the results this time) on x86_64.

OK as is? Or does a different approach look better?

-cary


2012-05-23  Cary Coutant  <ccoutant@google.com>

	* gold/layout.cc (Layout::section_name_mapping): Add rules to handle
	exact match on .data.rel.ro.local or .data.rel.ro.
	(Layout::output_section_name): Check for exact matches.


commit 699a0be246948f5696dfb6c2f1d41f18a5e12d4b
Author: Cary Coutant <ccoutant@google.com>
Date:   Wed May 23 15:53:19 2012 -0700

    Fix to handle .data.rel.ro correctly.

diff --git a/gold/layout.cc b/gold/layout.cc
index e9aeef5..c7ca322 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -4569,12 +4569,15 @@ Layout::set_dynamic_symbol_size(const
Symbol_table* symtab)
 // based on the GNU linker default ELF linker script.

 #define MAPPING_INIT(f, t) { f, sizeof(f) - 1, t, sizeof(t) - 1 }
+#define MAPPING_INIT_EXACT(f, t) { f, 0, t, sizeof(t) - 1 }
 const Layout::Section_name_mapping Layout::section_name_mapping[] =
 {
   MAPPING_INIT(".text.", ".text"),
   MAPPING_INIT(".rodata.", ".rodata"),
   MAPPING_INIT(".data.rel.ro.local.", ".data.rel.ro.local"),
+  MAPPING_INIT_EXACT(".data.rel.ro.local", ".data.rel.ro.local"),
   MAPPING_INIT(".data.rel.ro.", ".data.rel.ro"),
+  MAPPING_INIT_EXACT(".data.rel.ro", ".data.rel.ro"),
   MAPPING_INIT(".data.", ".data"),
   MAPPING_INIT(".bss.", ".bss"),
   MAPPING_INIT(".tdata.", ".tdata"),
@@ -4613,6 +4616,7 @@ const Layout::Section_name_mapping
Layout::section_name_mapping[] =
   MAPPING_INIT(".gnu.linkonce.armexidx.", ".ARM.exidx"),
 };
 #undef MAPPING_INIT
+#undef MAPPING_INIT_EXACT

 const int Layout::section_name_mapping_count =
   (sizeof(Layout::section_name_mapping)
@@ -4664,10 +4668,21 @@ Layout::output_section_name(const Relobj*
relobj, const char* name,
   const Section_name_mapping* psnm = section_name_mapping;
   for (int i = 0; i < section_name_mapping_count; ++i, ++psnm)
     {
-      if (strncmp(name, psnm->from, psnm->fromlen) == 0)
+      if (psnm->fromlen > 0)
 	{
-	  *plen = psnm->tolen;
-	  return psnm->to;
+	  if (strncmp(name, psnm->from, psnm->fromlen) == 0)
+	    {
+	      *plen = psnm->tolen;
+	      return psnm->to;
+	    }
+	}
+      else
+	{
+	  if (strcmp(name, psnm->from) == 0)
+	    {
+	      *plen = psnm->tolen;
+	      return psnm->to;
+	    }
 	}
     }


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