This is the mail archive of the binutils@sources.redhat.com 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] PPC small data symbols in shared libraries.


I'm about to commit this for the _SDA_BASE_ problem.  It's rather more
complicated than Paul's fix via add_symbol_hook, but should result in
better execution time.

	* elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Ignore dynamic
	_SDA_BASE_ and _SDA2_BASE_ symbols.
	* elflink.c (_bfd_elf_provide_symbol): Correct comment.  Define
	sym if not def_regular.
	(_bfd_elf_provide_section_bound_symbols): Similarly.

Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.165
diff -u -p -r1.165 elf32-ppc.c
--- bfd/elf32-ppc.c	29 Jun 2005 13:16:43 -0000	1.165
+++ bfd/elf32-ppc.c	30 Jun 2005 06:11:33 -0000
@@ -3945,6 +3945,24 @@ ppc_elf_adjust_dynamic_symbol (struct bf
   /* This is a reference to a symbol defined by a dynamic object which
      is not a function.  */
 
+  /* First, a fudge for old shared libs that export some symbols they
+     should not.  */
+  if (!h->def_regular
+      && (strcmp (h->root.root.string, "_SDA_BASE_") == 0
+	  || strcmp (h->root.root.string, "_SDA2_BASE_") == 0))
+    {
+      /* These symbols will be defined later, as if they were defined in
+	 a linker script.  We don't want to use a definition in a shared
+	 object.  */
+      const struct elf_backend_data *bed;
+
+      bed = get_elf_backend_data (htab->elf.dynobj);
+      (*bed->elf_backend_hide_symbol) (info, h, TRUE);
+      h->root.type = bfd_link_hash_undefined;
+      h->root.u.undef.abfd = htab->elf.dynobj;
+      return TRUE;
+    }
+
   /* If we are creating a shared library, we must presume that the
      only references to the symbol are via the global offset table.
      For such cases we need not do anything here; the relocations will
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.171
diff -u -p -r1.171 elflink.c
--- bfd/elflink.c	29 Jun 2005 14:05:19 -0000	1.171
+++ bfd/elflink.c	30 Jun 2005 06:11:38 -0000
@@ -9836,8 +9836,9 @@ bfd_elf_set_symbol (struct elf_link_hash
   h->forced_local = 1;
 }
 
-/* Set NAME to VAL if the symbol exists and is undefined.  If val is NULL
-   it is an absolute symbol, otherwise it is relative to that section.  */
+/* Set NAME to VAL if the symbol exists and is not defined in a regular
+   object file.  If S is NULL it is an absolute symbol, otherwise it is
+   relative to that section.  */
 
 void
 _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name,
@@ -9847,13 +9848,12 @@ _bfd_elf_provide_symbol (struct bfd_link
 
   h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE,
 			    FALSE);
-  if (h != NULL && (h->root.type == bfd_link_hash_undefined
-		    || h->root.type == bfd_link_hash_undefweak))
+  if (h != NULL && !h->def_regular)
     bfd_elf_set_symbol (h, val, s);
 }
 
-/* Set START and END to boundaries of SEC if they exist and are
-   undefined.  */
+/* Set START and END to boundaries of SEC if they exist and are not
+   defined in regular object files.  */
 
 void
 _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info,
@@ -9868,15 +9868,11 @@ _bfd_elf_provide_section_bound_symbols (
   /* Check if we need them or not first.  */
   hs = elf_link_hash_lookup (elf_hash_table (info), start, FALSE,
 			     FALSE, FALSE);
-  do_start = (hs != NULL
-	      && (hs->root.type == bfd_link_hash_undefined
-		  || hs->root.type == bfd_link_hash_undefweak));
+  do_start = hs != NULL && !hs->def_regular;
 
   he = elf_link_hash_lookup (elf_hash_table (info), end, FALSE,
 			     FALSE, FALSE);
-  do_end = (he != NULL
-	    && (he->root.type == bfd_link_hash_undefined
-		|| he->root.type == bfd_link_hash_undefweak));
+  do_end = he != NULL && !he->def_regular;
 
   if (!do_start && !do_end)
     return;

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


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