PATCH: Add _bfd_elf_provide_symbol

H. J. Lu hjl@lucon.org
Wed Mar 23 09:33:00 GMT 2005


On Tue, Mar 22, 2005 at 09:11:09PM -0500, Daniel Jacobowitz wrote:
> On Wed, Mar 23, 2005 at 12:34:57PM +1030, Alan Modra wrote:
> > On Tue, Mar 22, 2005 at 02:44:22PM -0800, H. J. Lu wrote:
> > > Here is an upated patch. _bfd_elf_provide_symbol should presever
> > > st_other. Also it needs to set forced_local to 1. Otherwise, we will
> > > get global hidden symbols. We don't need those array symbols for
> > > shared libraries.
> > 
> > Looks good.  OK for mainline, and the branch too unless Daniel
> > disagrees.
> 
> That's fine.

This is the patch I checked in. I changed

gld${EMULATION_NAME}_provide_array_symbols

to

gld${EMULATION_NAME}_provide_bound_symbols

since it can be used to provide section start/end symbols.

It won't apply to 2.16 since it depends on some other changes in
mainline.


H.J.
----
bfd/

2005-03-22  H.J. Lu  <hongjiu.lu@intel.com>

	* bfd-in.h (_bfd_elf_provide_symbol): New.
	* bfd-in2.h: Regenerated.

	* elf32-ppc.c (set_linker_sym): Moved to elflink.c.
	(ppc_elf_set_sdata_syms): Call _bfd_elf_provide_symbol instead
	of set_linker_sym.

	* elflink.c (_bfd_elf_provide_symbol): New. Moved and renamed
	from elf32-ppc.c.

ld/

2005-03-22  H.J. Lu  <hongjiu.lu@intel.com>

	* emultempl/elf32.em (gld${EMULATION_NAME}_provide_bound_symbols): New
	(gld${EMULATION_NAME}_finish): Call
	gld${EMULATION_NAME}_provide_bound_symbols to provide
	__preinit_array_start, __preinit_array_end, __init_array_start,
	__init_array_end, __fini_array_start and __fini_array_end.

	* scripttempl/elf.sc: Don't provide __preinit_array_start,
	__preinit_array_end, __init_array_start, __init_array_end,
	__fini_array_start nor __fini_array_end.

--- binutils/bfd/bfd-in.h.provide	2005-02-21 11:10:29.000000000 -0800
+++ binutils/bfd/bfd-in.h	2005-03-22 12:52:00.000000000 -0800
@@ -694,6 +694,9 @@ extern int bfd_get_sign_extend_vma
 extern struct bfd_section *_bfd_elf_tls_setup
   (bfd *, struct bfd_link_info *);
 
+extern void _bfd_elf_provide_symbol
+  (struct bfd_link_info *, const char *, bfd_vma);
+
 extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs
   (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **);
 
--- binutils/bfd/elf32-ppc.c.provide	2005-03-22 07:14:43.000000000 -0800
+++ binutils/bfd/elf32-ppc.c	2005-03-22 12:52:00.000000000 -0800
@@ -4545,26 +4545,6 @@ ppc_elf_relax_section (bfd *abfd,
   return FALSE;
 }
 
-/* Set SYM_NAME to VAL if the symbol exists and is undefined.  */
-
-static void
-set_linker_sym (struct ppc_elf_link_hash_table *htab,
-		const char *sym_name,
-		bfd_vma val)
-{
-  struct elf_link_hash_entry *h;
-  h = elf_link_hash_lookup (&htab->elf, sym_name, FALSE, FALSE, FALSE);
-  if (h != NULL && h->root.type == bfd_link_hash_undefined)
-    {
-      h->root.type = bfd_link_hash_defined;
-      h->root.u.def.section = bfd_abs_section_ptr;
-      h->root.u.def.value = val;
-      h->def_regular = 1;
-      h->type = STT_OBJECT;
-      h->other = STV_HIDDEN;
-    }
-}
-
 /* Set _SDA_BASE_, _SDA2_BASE, and sbss start and end syms.  They are
    set here rather than via PROVIDE in the default linker script,
    because using PROVIDE inside an output section statement results in
@@ -4599,19 +4579,19 @@ ppc_elf_set_sdata_syms (bfd *obfd, struc
 	val = s->vma + 32768;
       lsect->sym_val = val;
 
-      set_linker_sym (htab, lsect->sym_name, val);
+      _bfd_elf_provide_symbol (info, lsect->sym_name, val);
     }
 
   s = bfd_get_section_by_name (obfd, ".sbss");
   val = 0;
   if (s != NULL)
     val = s->vma;
-  set_linker_sym (htab, "__sbss_start", val);
-  set_linker_sym (htab, "___sbss_start", val);
+  _bfd_elf_provide_symbol (info, "__sbss_start", val);
+  _bfd_elf_provide_symbol (info, "___sbss_start", val);
   if (s != NULL)
     val += s->size;
-  set_linker_sym (htab, "__sbss_end", val);
-  set_linker_sym (htab, "___sbss_end", val);
+  _bfd_elf_provide_symbol (info, "__sbss_end", val);
+  _bfd_elf_provide_symbol (info, "___sbss_end", val);
   return TRUE;
 }
 
--- binutils/bfd/elflink.c.provide	2005-03-22 07:14:45.000000000 -0800
+++ binutils/bfd/elflink.c	2005-03-22 14:31:19.054207031 -0800
@@ -9754,3 +9754,24 @@ _bfd_elf_section_already_linked (bfd *ab
   /* This is the first section with this name.  Record it.  */
   bfd_section_already_linked_table_insert (already_linked_list, sec);
 }
+
+/* Set NAME to VAL if the symbol exists and is undefined.  */
+
+void
+_bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name,
+			 bfd_vma val)
+{
+  struct elf_link_hash_entry *h;
+  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_defined;
+      h->root.u.def.section = bfd_abs_section_ptr;
+      h->root.u.def.value = val;
+      h->def_regular = 1;
+      h->type = STT_OBJECT;
+      h->other = STV_HIDDEN | (h->other & ~ ELF_ST_VISIBILITY (-1));
+      h->forced_local = 1;
+    }
+}
--- binutils/ld/emultempl/elf32.em.provide	2005-03-22 07:15:14.000000000 -0800
+++ binutils/ld/emultempl/elf32.em	2005-03-22 14:43:13.316089374 -0800
@@ -1428,6 +1428,29 @@ if test x"$LDEMUL_FINISH" != xgld"$EMULA
 cat >>e${EMULATION_NAME}.c <<EOF
 
 static void
+gld${EMULATION_NAME}_provide_bound_symbols (const char *sec,
+					    const char *start,
+					    const char *end)
+{
+  asection *s;
+  bfd_vma start_val, end_val;
+
+  s = bfd_get_section_by_name (output_bfd, sec);
+  if (s != NULL)
+    {
+      start_val = s->vma;
+      end_val = start_val + s->size;
+    }
+  else
+    {
+      start_val = 0;
+      end_val = 0;
+    }
+  _bfd_elf_provide_symbol (&link_info, start, start_val);
+  _bfd_elf_provide_symbol (&link_info, end, end_val);
+}
+
+static void
 gld${EMULATION_NAME}_finish (void)
 {
   if (bfd_elf_discard_info (output_bfd, &link_info))
@@ -1472,6 +1495,34 @@ gld${EMULATION_NAME}_finish (void)
 		  }
 	    }
 	}
+
+      /* If not building shared library, provide
+
+	 __preinit_array_start
+	 __preinit_array_end
+	 __init_array_start
+	 __init_array_end
+	 __fini_array_start
+	 __fini_array_end
+
+	 They are set here rather than via PROVIDE in the linker
+	 script, because using PROVIDE inside an output section
+	 statement results in unnecessary output sections.  Using
+	 PROVIDE outside an output section statement runs the risk of
+	 section alignment affecting where the section starts.  */
+
+      if (!link_info.shared)
+	{
+	  gld${EMULATION_NAME}_provide_bound_symbols
+	    (".preinit_array", "__preinit_array_start",
+	     "__preinit_array_end");
+	  gld${EMULATION_NAME}_provide_bound_symbols
+	    (".init_array", "__init_array_start",
+	     "__init_array_end");
+	  gld${EMULATION_NAME}_provide_bound_symbols
+	    (".fini_array", "__fini_array_start",
+	     "__fini_array_end");
+	}
     }
 }
 EOF
--- binutils/ld/scripttempl/elf.sc.provide	2005-03-21 13:13:41.000000000 -0800
+++ binutils/ld/scripttempl/elf.sc	2005-03-22 12:52:00.000000000 -0800
@@ -333,22 +333,9 @@ cat <<EOF
   .tdata	${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
   .tbss		${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
 
-  /* Ensure the __preinit_array_start label is properly aligned.  We
-     could instead move the label definition inside the section, but
-     the linker would then create the section even if it turns out to
-     be empty, which isn't pretty.  */
-  ${RELOCATING+. = ALIGN(${ALIGNMENT});}
-  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_start = .);}}
   .preinit_array   ${RELOCATING-0} : { KEEP (*(.preinit_array)) }
-  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}}
-
-  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}}
   .init_array   ${RELOCATING-0} : { KEEP (*(.init_array)) }
-  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}}
-
-  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}}
   .fini_array   ${RELOCATING-0} : { KEEP (*(.fini_array)) }
-  ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}}
 
   ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
   ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}



More information about the Binutils mailing list