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]

__init_array_start and similar symbols


Now that we have stripping of empty output sections, even when they
contain symbols, a lot of special purpose code can be removed.  Simply
defining symbols in the linker script should work.  This patch does
that and also fixes some cases where PowerPC SDA relocs were
mishandled.

bfd/
	* elf32-ppc.c (struct elf_linker_section): Replace sym_val field
	with sym.
	(ppc_elf_relocate_section): Adjust for above.
	(create_sdata_sym): New function.
	(ppc_elf_create_linker_section): Call it.
	(ppc_elf_check_relocs): Correct has_sda_refs and non_got_refs.
	Create sdata syms for all SDA relocs.
	(ppc_elf_adjust_dynamic_symbol): Don't special case _SDA_BASE_
	and _SDA2_BASE_.
	(ppc_elf_set_sdata_syms): Delete.
	* elflink.c (bfd_elf_size_dynamic_sections): Don't create DT_INIT
	and DT_FINI tags unless associated section has input.
	(bfd_elf_set_symbol, _bfd_elf_provide_symbol): Delete.
	(_bfd_elf_provide_section_bound_symbols): Delete.
	* bfd-in.h (_bfd_elf_provide_symbol): Delete.
	(_bfd_elf_provide_section_bound_symbols): Delete.
	* bfd-in2.h: Regenerate.
ld/
	* ldemul.c (ldemul_do_assignments, do_assignments_default): Delete.
	* ldemul.h (ldemul_do_assignments, do_assignments_default): Delete.
	(struct ld_emulation_xfer_struct): Remove do_assignments field.
	* ldlang.c (lang_do_assignments): Don't call ldemul_do_assignments.
	* emulparams/elf32ppc.sh (SDATA_START_SYMBOLS): New.
	(SDATA2_START_SYMBOLS, SBSS_START_SYMBOLS, SBSS_END_SYMBOLS): New.
	* emultempl/aix.em (ld_*_emulation): Delete do_assignments init.
	* emultempl/armcoff.em: Likewise.
	* emultempl/beos.em: Likewise.
	* emultempl/generic.em: Likewise.
	* emultempl/gld960.em: Likewise.
	* emultempl/gld960c.em: Likewise.
	* emultempl/linux.em: Likewise.
	* emultempl/lnk960.em: Likewise.
	* emultempl/m68kcoff.em: Likewise.
	* emultempl/pe.em: Likewise.
	* emultempl/sunos.em: Likewise.
	* emultempl/ticoff.em: Likewise.
	* emultempl/vanilla.em: Likewise.
	* emultempl/elf32.em: Likewise.
	(gld*_provide_bound_symbols): Delete.
	(gld*_provide_init_fini_syms): Delete.
	(gld*_before_allocation): Don't call ldemul_do_assignments.
	* emultempl/ppc32elf.em (ppc_do_assignments): Delete.
	(LDEMUL_DO_ASSIGNMENTS): Delete.
	* scripttempl/elf.sc: Provide init/fini syms.  Add SBSS_START_SYMBOLS,
	SBSS_END_SYMBOLS, SDATA2_START_SYMBOLS.

Index: bfd/bfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in.h,v
retrieving revision 1.108
diff -u -p -r1.108 bfd-in.h
--- bfd/bfd-in.h	4 Aug 2005 01:19:05 -0000	1.108
+++ bfd/bfd-in.h	4 Aug 2005 03:53:07 -0000
@@ -702,12 +702,6 @@ 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, struct bfd_section *);
-
-extern void _bfd_elf_provide_section_bound_symbols
-  (struct bfd_link_info *, struct bfd_section *, const char *, const char *);
-
 extern void _bfd_fix_excluded_sec_syms
   (bfd *, struct bfd_link_info *);
 
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.178
diff -u -p -r1.178 elf32-ppc.c
--- bfd/elf32-ppc.c	2 Aug 2005 23:32:52 -0000	1.178
+++ bfd/elf32-ppc.c	4 Aug 2005 03:53:16 -0000
@@ -1668,8 +1668,8 @@ typedef struct elf_linker_section
   const char *bss_name;
   /* Associated symbol name.  */
   const char *sym_name;
-  /* Value of symbol.  */
-  bfd_vma sym_val;
+  /* Associated symbol.  */
+  struct elf_link_hash_entry *sym;
 } elf_linker_section_t;
 
 /* Linked list of allocated pointer entries.  This hangs off of the
@@ -2734,6 +2734,20 @@ ppc_elf_add_symbol_hook (bfd *abfd,
   return TRUE;
 }
 
+static bfd_boolean
+create_sdata_sym (struct ppc_elf_link_hash_table *htab,
+		  elf_linker_section_t *lsect)
+{
+  lsect->sym = elf_link_hash_lookup (&htab->elf, lsect->sym_name,
+				     TRUE, FALSE, TRUE);
+  if (lsect->sym == NULL)
+    return FALSE;
+  if (lsect->sym->root.type == bfd_link_hash_new)
+    lsect->sym->non_elf = 0;
+  lsect->sym->ref_regular = 1;
+  return TRUE;
+}
+
 /* Create a special linker section.  */
 
 static bfd_boolean
@@ -2760,7 +2774,7 @@ ppc_elf_create_linker_section (bfd *abfd
     return FALSE;
   lsect->section = s;
 
-  return TRUE;
+  return create_sdata_sym (htab, lsect);
 }
 
 /* Find a linker generated pointer with a given addend and type.  */
@@ -3090,6 +3104,11 @@ ppc_elf_check_relocs (bfd *abfd,
 	  if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
 						  h, rel))
 	    return FALSE;
+	  if (h != NULL)
+	    {
+	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
+	      h->non_got_ref = TRUE;
+	    }
 	  break;
 
 	  /* Indirect .sdata2 relocation.  */
@@ -3106,12 +3125,65 @@ ppc_elf_check_relocs (bfd *abfd,
 	  if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
 						  h, rel))
 	    return FALSE;
+	  if (h != NULL)
+	    {
+	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
+	      h->non_got_ref = TRUE;
+	    }
 	  break;
 
 	case R_PPC_SDAREL16:
+	  if (info->shared)
+	    {
+	      bad_shared_reloc (abfd, r_type);
+	      return FALSE;
+	    }
+	  if (htab->sdata[0].sym == NULL
+	      && !create_sdata_sym (htab, &htab->sdata[0]))
+	    return FALSE;
+	  if (h != NULL)
+	    {
+	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
+	      h->non_got_ref = TRUE;
+	    }
+	  break;
+
 	case R_PPC_EMB_SDA2REL:
+	  if (info->shared)
+	    {
+	      bad_shared_reloc (abfd, r_type);
+	      return FALSE;
+	    }
+	  if (htab->sdata[1].sym == NULL
+	      && !create_sdata_sym (htab, &htab->sdata[1]))
+	    return FALSE;
+	  if (h != NULL)
+	    {
+	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
+	      h->non_got_ref = TRUE;
+	    }
+	  break;
+
 	case R_PPC_EMB_SDA21:
 	case R_PPC_EMB_RELSDA:
+	  if (info->shared)
+	    {
+	      bad_shared_reloc (abfd, r_type);
+	      return FALSE;
+	    }
+	  if (htab->sdata[0].sym == NULL
+	      && !create_sdata_sym (htab, &htab->sdata[0]))
+	    return FALSE;
+	  if (htab->sdata[1].sym == NULL
+	      && !create_sdata_sym (htab, &htab->sdata[1]))
+	    return FALSE;
+	  if (h != NULL)
+	    {
+	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
+	      h->non_got_ref = TRUE;
+	    }
+	  break;
+
 	case R_PPC_EMB_NADDR32:
 	case R_PPC_EMB_NADDR16:
 	case R_PPC_EMB_NADDR16_LO:
@@ -3123,11 +3195,7 @@ ppc_elf_check_relocs (bfd *abfd,
 	      return FALSE;
 	    }
 	  if (h != NULL)
-	    {
-	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
-	      /* We may need a copy reloc.  */
-	      h->non_got_ref = TRUE;
-	    }
+	    h->non_got_ref = TRUE;
 	  break;
 
 	case R_PPC_PLT32:
@@ -4046,24 +4114,6 @@ 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
@@ -5259,52 +5309,6 @@ ppc_elf_relax_section (bfd *abfd,
   return FALSE;
 }
 
-/* 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
-   unnecessary output sections.  Using PROVIDE outside an output section
-   statement runs the risk of section alignment affecting where the
-   section starts.  */
-
-void
-ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info)
-{
-  struct ppc_elf_link_hash_table *htab;
-  unsigned i;
-  asection *s;
-  bfd_vma val;
-
-  htab = ppc_elf_hash_table (info);
-
-  for (i = 0; i < 2; i++)
-    {
-      elf_linker_section_t *lsect = &htab->sdata[i];
-
-      s = lsect->section;
-      if (s != NULL)
-	s = s->output_section;
-      if (s == NULL)
-	s = bfd_get_section_by_name (obfd, lsect->name);
-      if (s == NULL)
-	s = bfd_get_section_by_name (obfd, lsect->bss_name);
-
-      if (s)
-	{
-	  /* VxWorks executables are relocatable, so the sdata base symbols
-	     must be section-relative.  */
-	  val = 32768;
-	  lsect->sym_val = val + s->vma;
-	}
-      else
-	{
-	  val = 0;
-	  lsect->sym_val = 0;
-	}
-
-      _bfd_elf_provide_symbol (info, lsect->sym_name, val, s);
-    }
-}
-
 /* What to do when ld finds relocations against symbols defined in
    discarded sections.  */
 
@@ -6348,6 +6352,7 @@ ppc_elf_relocate_section (bfd *output_bf
 	case R_PPC_SDAREL16:
 	  {
 	    const char *name;
+	    struct elf_link_hash_entry *sh;
 
 	    BFD_ASSERT (sec != NULL);
 	    name = bfd_get_section_name (abfd, sec->output_section);
@@ -6364,7 +6369,10 @@ ppc_elf_relocate_section (bfd *output_bf
 		   howto->name,
 		   name);
 	      }
-	    addend -= htab->sdata[0].sym_val;
+	    sh = htab->sdata[0].sym;
+	    addend -= (sh->root.u.def.value
+		       + sh->root.u.def.section->output_offset
+		       + sh->root.u.def.section->output_section->vma);
 	  }
 	  break;
 
@@ -6372,6 +6380,7 @@ ppc_elf_relocate_section (bfd *output_bf
 	case R_PPC_EMB_SDA2REL:
 	  {
 	    const char *name;
+	    struct elf_link_hash_entry *sh;
 
 	    BFD_ASSERT (sec != NULL);
 	    name = bfd_get_section_name (abfd, sec->output_section);
@@ -6390,7 +6399,10 @@ ppc_elf_relocate_section (bfd *output_bf
 		ret = FALSE;
 		continue;
 	      }
-	    addend -= htab->sdata[1].sym_val;
+	    sh = htab->sdata[1].sym;
+	    addend -= (sh->root.u.def.value
+		       + sh->root.u.def.section->output_offset
+		       + sh->root.u.def.section->output_section->vma);
 	  }
 	  break;
 
@@ -6400,6 +6412,7 @@ ppc_elf_relocate_section (bfd *output_bf
 	  {
 	    const char *name;
 	    int reg;
+	    struct elf_link_hash_entry *sh;
 
 	    BFD_ASSERT (sec != NULL);
 	    name = bfd_get_section_name (abfd, sec->output_section);
@@ -6409,14 +6422,20 @@ ppc_elf_relocate_section (bfd *output_bf
 		     && (name[5] == 0 || name[5] == '.'))))
 	      {
 		reg = 13;
-		addend -= htab->sdata[0].sym_val;
+		sh = htab->sdata[0].sym;
+		addend -= (sh->root.u.def.value
+			   + sh->root.u.def.section->output_offset
+			   + sh->root.u.def.section->output_section->vma);
 	      }
 
 	    else if (strncmp (name, ".sdata2", 7) == 0
 		     || strncmp (name, ".sbss2", 6) == 0)
 	      {
 		reg = 2;
-		addend -= htab->sdata[1].sym_val;
+		sh = htab->sdata[1].sym;
+		addend -= (sh->root.u.def.value
+			   + sh->root.u.def.section->output_offset
+			   + sh->root.u.def.section->output_section->vma);
 	      }
 
 	    else if (strcmp (name, ".PPC.EMB.sdata0") == 0
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.186
diff -u -p -r1.186 elflink.c
--- bfd/elflink.c	4 Aug 2005 01:19:03 -0000	1.186
+++ bfd/elflink.c	4 Aug 2005 03:53:19 -0000
@@ -5032,6 +5032,7 @@ bfd_elf_size_dynamic_sections (bfd *outp
       asection *dynstr;
       struct bfd_elf_version_tree *t;
       struct bfd_elf_version_expr *d;
+      asection *s;
       bfd_boolean all_defined;
 
       *sinterpptr = bfd_get_section_by_name (dynobj, ".interp");
@@ -5235,7 +5236,8 @@ bfd_elf_size_dynamic_sections (bfd *outp
 	    return FALSE;
 	}
 
-      if (bfd_get_section_by_name (output_bfd, ".preinit_array") != NULL)
+      s = bfd_get_section_by_name (output_bfd, ".preinit_array");
+      if (s != NULL && s->linker_has_input)
 	{
 	  /* DT_PREINIT_ARRAY is not allowed in shared library.  */
 	  if (! info->executable)
@@ -5263,13 +5265,15 @@ bfd_elf_size_dynamic_sections (bfd *outp
 	      || !_bfd_elf_add_dynamic_entry (info, DT_PREINIT_ARRAYSZ, 0))
 	    return FALSE;
 	}
-      if (bfd_get_section_by_name (output_bfd, ".init_array") != NULL)
+      s = bfd_get_section_by_name (output_bfd, ".init_array");
+      if (s != NULL && s->linker_has_input)
 	{
 	  if (!_bfd_elf_add_dynamic_entry (info, DT_INIT_ARRAY, 0)
 	      || !_bfd_elf_add_dynamic_entry (info, DT_INIT_ARRAYSZ, 0))
 	    return FALSE;
 	}
-      if (bfd_get_section_by_name (output_bfd, ".fini_array") != NULL)
+      s = bfd_get_section_by_name (output_bfd, ".fini_array");
+      if (s != NULL && s->linker_has_input)
 	{
 	  if (!_bfd_elf_add_dynamic_entry (info, DT_FINI_ARRAY, 0)
 	      || !_bfd_elf_add_dynamic_entry (info, DT_FINI_ARRAYSZ, 0))
@@ -9841,55 +9845,6 @@ _bfd_elf_section_already_linked (bfd *ab
   bfd_section_already_linked_table_insert (already_linked_list, sec);
 }
 
-static void
-bfd_elf_set_symbol (struct elf_link_hash_entry *h, bfd_vma val,
-		    struct bfd_section *s)
-{
-  h->root.type = bfd_link_hash_defined;
-  h->root.u.def.section = s ? s : 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;
-}
-
-/* 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,
-			 bfd_vma val, struct bfd_section *s)
-{
-  struct elf_link_hash_entry *h;
-
-  bfd_elf_record_link_assignment (info, name, TRUE);
-
-  h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE);
-  if (h != NULL
-      && !(h->root.type == bfd_link_hash_defined
-	   && h->root.u.def.section != NULL
-	   && h->root.u.def.section != h->root.u.def.section->output_section))
-    bfd_elf_set_symbol (h, val, s);
-}
-
-/* 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,
-					asection *sec,
-					const char *start,
-					const char *end)
-{
-  bfd_vma val = 0;
-  _bfd_elf_provide_symbol (info, start, val, sec);
-  if (sec != NULL)
-    val = sec->size;
-  _bfd_elf_provide_symbol (info, end, val, sec);
-}
-
 bfd_boolean
 _bfd_elf_common_definition (Elf_Internal_Sym *sym)
 {
Index: ld/ldemul.c
===================================================================
RCS file: /cvs/src/src/ld/ldemul.c,v
retrieving revision 1.22
diff -u -p -r1.22 ldemul.c
--- ld/ldemul.c	4 Aug 2005 01:19:09 -0000	1.22
+++ ld/ldemul.c	4 Aug 2005 03:55:20 -0000
@@ -80,12 +80,6 @@ ldemul_before_allocation (void)
 }
 
 void
-ldemul_do_assignments (void)
-{
-  ld_emulation->do_assignments ();
-}
-
-void
 ldemul_set_output_arch (void)
 {
   ld_emulation->set_output_arch ();
@@ -222,11 +216,6 @@ before_allocation_default (void)
 }
 
 void
-do_assignments_default (void)
-{
-}
-
-void
 finish_default (void)
 {
   if (!link_info.relocatable)
Index: ld/ldemul.h
===================================================================
RCS file: /cvs/src/src/ld/ldemul.h,v
retrieving revision 1.16
diff -u -p -r1.16 ldemul.h
--- ld/ldemul.h	4 Aug 2005 01:19:09 -0000	1.16
+++ ld/ldemul.h	4 Aug 2005 03:53:38 -0000
@@ -35,8 +35,6 @@ extern void ldemul_after_allocation
   (void);
 extern void ldemul_before_allocation
   (void);
-extern void ldemul_do_assignments
-  (void);
 extern void ldemul_set_output_arch
   (void);
 extern char *ldemul_choose_target
@@ -79,7 +77,7 @@ extern void after_allocation_default
   (void);
 extern void before_allocation_default
   (void);
-extern void do_assignments_default
+extern void finish_default
   (void);
 extern void finish_default
   (void);
@@ -123,9 +121,6 @@ typedef struct ld_emulation_xfer_struct 
   /* Run before allocating output sections.  */
   void   (*before_allocation) (void);
 
-  /* Run to set special symbols at the same time as link script syms.  */
-  void   (*do_assignments) (void);
-
   /* Return the appropriate linker script.  */
   char * (*get_script) (int *isfile);
 
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.194
diff -u -p -r1.194 ldlang.c
--- ld/ldlang.c	3 Aug 2005 05:09:48 -0000	1.194
+++ ld/ldlang.c	4 Aug 2005 03:53:40 -0000
@@ -3056,9 +3056,7 @@ strip_excluded_output_sections (void)
 {
   lang_output_section_statement_type *os;
 
-  /* Run lang_size_sections (if not already done) to ensure that all
-     symbols defined in the linker script are put in the bfd hash
-     table.  */
+  /* Run lang_size_sections (if not already done).  */
   if (expld.phase != lang_mark_phase_enum)
     {
       expld.phase = lang_mark_phase_enum;
@@ -4591,7 +4589,6 @@ lang_do_assignments (void)
 {
   lang_statement_iteration++;
   lang_do_assignments_1 (statement_list.head, abs_output_section, NULL, 0);
-  ldemul_do_assignments ();
 }
 
 /* Fix any .startof. or .sizeof. symbols.  When the assemblers see the
Index: ld/emulparams/elf32ppc.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32ppc.sh,v
retrieving revision 1.17
diff -u -p -r1.17 elf32ppc.sh
--- ld/emulparams/elf32ppc.sh	3 Aug 2005 05:09:49 -0000	1.17
+++ ld/emulparams/elf32ppc.sh	4 Aug 2005 03:53:40 -0000
@@ -23,6 +23,17 @@ PLT=".plt          ${RELOCATING-0} : SPE
 GOTPLT="${PLT}"
 OTHER_TEXT_SECTIONS="*(.glink)"
 EXECUTABLE_SYMBOLS='PROVIDE (__stack = 0); PROVIDE (___stack = 0);'
+if test -z "${CREATE_SHLIB}"; then
+  SDATA_START_SYMBOLS="PROVIDE (_SDA_BASE_ = 32768);"
+  SDATA2_START_SYMBOLS="PROVIDE (_SDA2_BASE_ = 32768);"
+  SBSS_START_SYMBOLS="PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);"
+  SBSS_END_SYMBOLS="PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);"
+else
+  unset SDATA_START_SYMBOLS
+  unset SDATA2_START_SYMBOLS
+  unset SBSS_START_SYMBOLS
+  unset SBSS_END_SYMBOLS
+fi
 OTHER_END_SYMBOLS="__end = .;"
 OTHER_RELRO_SECTIONS="
   .fixup        ${RELOCATING-0} : { *(.fixup) }
Index: ld/emultempl/aix.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/aix.em,v
retrieving revision 1.40
diff -u -p -r1.40 aix.em
--- ld/emultempl/aix.em	4 Aug 2005 01:19:09 -0000	1.40
+++ ld/emultempl/aix.em	4 Aug 2005 03:53:41 -0000
@@ -1339,7 +1339,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   gld${EMULATION_NAME}_set_output_arch,
   gld${EMULATION_NAME}_choose_target,
   gld${EMULATION_NAME}_before_allocation,
-  do_assignments_default,
   gld${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/armcoff.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/armcoff.em,v
retrieving revision 1.22
diff -u -p -r1.22 armcoff.em
--- ld/emultempl/armcoff.em	4 Aug 2005 01:19:09 -0000	1.22
+++ ld/emultempl/armcoff.em	4 Aug 2005 03:53:41 -0000
@@ -261,7 +261,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   set_output_arch_default,
   ldemul_default_target,
   gld${EMULATION_NAME}_before_allocation,
-  do_assignments_default,
   gld${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/beos.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/beos.em,v
retrieving revision 1.32
diff -u -p -r1.32 beos.em
--- ld/emultempl/beos.em	4 Aug 2005 01:19:09 -0000	1.32
+++ ld/emultempl/beos.em	4 Aug 2005 03:53:41 -0000
@@ -766,7 +766,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   set_output_arch_default,
   ldemul_default_target,
   gld_${EMULATION_NAME}_before_allocation,
-  do_assignments_default,
   gld_${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.154
diff -u -p -r1.154 elf32.em
--- ld/emultempl/elf32.em	4 Aug 2005 01:19:09 -0000	1.154
+++ ld/emultempl/elf32.em	4 Aug 2005 03:53:43 -0000
@@ -57,7 +57,6 @@ Foundation, Inc., 51 Franklin Street - F
 /* Declare functions used by various EXTRA_EM_FILEs.  */
 static void gld${EMULATION_NAME}_before_parse (void);
 static void gld${EMULATION_NAME}_after_open (void);
-static void gld${EMULATION_NAME}_provide_init_fini_syms (void);
 static void gld${EMULATION_NAME}_before_allocation (void);
 static bfd_boolean gld${EMULATION_NAME}_place_orphan
   (lang_input_statement_type *file, asection *s);
@@ -1040,47 +1039,6 @@ if test x"$LDEMUL_BEFORE_ALLOCATION" != 
   fi
 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_get_section_by_name (output_bfd, sec);
-  _bfd_elf_provide_section_bound_symbols (&link_info, s, start, end);
-}
-
-/* If not building a 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.  */
-
-static void
-gld${EMULATION_NAME}_provide_init_fini_syms (void)
-{
-  if (!link_info.relocatable && link_info.executable)
-    {
-      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");
-    }
-}
-
 /* This is called after the sections have been attached to output
    sections, but before any sizes or addresses have been set.  */
 
@@ -1098,8 +1056,6 @@ gld${EMULATION_NAME}_before_allocation (
      referred to by dynamic objects.  */
   lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
 
-  ldemul_do_assignments ();
-
   /* Let the ELF backend work out the sizes of any sections required
      by dynamic linking.  */
   rpath = command_line.rpath;
@@ -1881,7 +1837,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
   ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation},
-  ${LDEMUL_DO_ASSIGNMENTS-gld${EMULATION_NAME}_provide_init_fini_syms},
   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/generic.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/generic.em,v
retrieving revision 1.18
diff -u -p -r1.18 generic.em
--- ld/emultempl/generic.em	4 Aug 2005 01:19:10 -0000	1.18
+++ ld/emultempl/generic.em	4 Aug 2005 03:53:43 -0000
@@ -128,7 +128,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
   ${LDEMUL_BEFORE_ALLOCATION-before_allocation_default},
-  ${LDEMUL_DO_ASSIGNMENTS-do_assignments_default},
   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/gld960.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/gld960.em,v
retrieving revision 1.18
diff -u -p -r1.18 gld960.em
--- ld/emultempl/gld960.em	4 Aug 2005 01:19:10 -0000	1.18
+++ ld/emultempl/gld960.em	4 Aug 2005 03:53:43 -0000
@@ -134,7 +134,6 @@ struct ld_emulation_xfer_struct ld_gld96
   gld960_set_output_arch,
   gld960_choose_target,
   before_allocation_default,
-  do_assignments_default,
   gld960_get_script,
   "960",
   "",
Index: ld/emultempl/gld960c.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/gld960c.em,v
retrieving revision 1.20
diff -u -p -r1.20 gld960c.em
--- ld/emultempl/gld960c.em	4 Aug 2005 01:19:10 -0000	1.20
+++ ld/emultempl/gld960c.em	4 Aug 2005 03:53:43 -0000
@@ -149,7 +149,6 @@ struct ld_emulation_xfer_struct ld_gld96
   gld960_set_output_arch,
   gld960_choose_target,
   before_allocation_default,
-  do_assignments_default,
   gld960_get_script,
   "960coff",
   "",
Index: ld/emultempl/linux.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/linux.em,v
retrieving revision 1.19
diff -u -p -r1.19 linux.em
--- ld/emultempl/linux.em	4 Aug 2005 01:19:10 -0000	1.19
+++ ld/emultempl/linux.em	4 Aug 2005 03:53:43 -0000
@@ -189,7 +189,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   set_output_arch_default,
   ldemul_default_target,
   gld${EMULATION_NAME}_before_allocation,
-  do_assignments_default,
   gld${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/lnk960.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/lnk960.em,v
retrieving revision 1.19
diff -u -p -r1.19 lnk960.em
--- ld/emultempl/lnk960.em	4 Aug 2005 01:19:10 -0000	1.19
+++ ld/emultempl/lnk960.em	4 Aug 2005 03:53:43 -0000
@@ -269,7 +269,6 @@ struct ld_emulation_xfer_struct ld_lnk96
   lnk960_set_output_arch,
   lnk960_choose_target,
   before_allocation_default,
-  do_assignments_default,
   lnk960_get_script,
   "lnk960",
   "",
Index: ld/emultempl/m68kcoff.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/m68kcoff.em,v
retrieving revision 1.15
diff -u -p -r1.15 m68kcoff.em
--- ld/emultempl/m68kcoff.em	4 Aug 2005 01:19:10 -0000	1.15
+++ ld/emultempl/m68kcoff.em	4 Aug 2005 03:53:43 -0000
@@ -222,7 +222,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   set_output_arch_default,
   ldemul_default_target,
   before_allocation_default,
-  do_assignments_default,
   gld${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/pe.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pe.em,v
retrieving revision 1.109
diff -u -p -r1.109 pe.em
--- ld/emultempl/pe.em	4 Aug 2005 01:19:10 -0000	1.109
+++ ld/emultempl/pe.em	4 Aug 2005 03:53:44 -0000
@@ -1823,7 +1823,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   set_output_arch_default,
   ldemul_default_target,
   gld_${EMULATION_NAME}_before_allocation,
-  do_assignments_default,
   gld_${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/ppc32elf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/ppc32elf.em,v
retrieving revision 1.9
diff -u -p -r1.9 ppc32elf.em
--- ld/emultempl/ppc32elf.em	16 Jul 2005 03:30:24 -0000	1.9
+++ ld/emultempl/ppc32elf.em	4 Aug 2005 03:53:44 -0000
@@ -117,23 +117,6 @@ ppc_before_allocation (void)
   gld${EMULATION_NAME}_before_allocation ();
 }
 
-static void
-ppc_do_assignments (void)
-{
-  asection *s;
-
-  if (is_ppc_elf32_vec (link_info.hash->creator))
-    ppc_elf_set_sdata_syms (output_bfd, &link_info);
-
-  s = bfd_get_section_by_name (output_bfd, ".sbss");
-  _bfd_elf_provide_section_bound_symbols (&link_info, s,
-					  "__sbss_start", "__sbss_end");
-  _bfd_elf_provide_section_bound_symbols (&link_info, s,
-					  "___sbss_start", "___sbss_end");
-
-  gld${EMULATION_NAME}_provide_init_fini_syms ();
-}
-
 EOF
 
 # Define some shell vars to insert bits of code into the standard elf
@@ -177,4 +160,3 @@ PARSE_AND_LIST_ARGS_CASES='
 #
 LDEMUL_AFTER_OPEN=ppc_after_open
 LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation
-LDEMUL_DO_ASSIGNMENTS=ppc_do_assignments
Index: ld/emultempl/sunos.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/sunos.em,v
retrieving revision 1.24
diff -u -p -r1.24 sunos.em
--- ld/emultempl/sunos.em	4 Aug 2005 01:19:10 -0000	1.24
+++ ld/emultempl/sunos.em	4 Aug 2005 03:53:45 -0000
@@ -1013,7 +1013,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   set_output_arch_default,
   ldemul_default_target,
   gld${EMULATION_NAME}_before_allocation,
-  do_assignments_default,
   gld${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/ticoff.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/ticoff.em,v
retrieving revision 1.15
diff -u -p -r1.15 ticoff.em
--- ld/emultempl/ticoff.em	4 Aug 2005 01:19:10 -0000	1.15
+++ ld/emultempl/ticoff.em	4 Aug 2005 03:53:45 -0000
@@ -162,7 +162,6 @@ struct ld_emulation_xfer_struct ld_${EMU
   set_output_arch_default,
   ldemul_default_target,
   before_allocation_default,
-  do_assignments_default,
   gld_${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
Index: ld/emultempl/vanilla.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/vanilla.em,v
retrieving revision 1.12
diff -u -p -r1.12 vanilla.em
--- ld/emultempl/vanilla.em	4 Aug 2005 01:19:10 -0000	1.12
+++ ld/emultempl/vanilla.em	4 Aug 2005 03:53:45 -0000
@@ -65,7 +65,6 @@ struct ld_emulation_xfer_struct ld_vanil
   vanilla_set_output_arch,
   ldemul_default_target,
   before_allocation_default,
-  do_assignments_default,
   vanilla_get_script,
   "vanilla",
   "a.out-sunos-big",
Index: ld/scripttempl/elf.sc
===================================================================
RCS file: /cvs/src/src/ld/scripttempl/elf.sc,v
retrieving revision 1.62
diff -u -p -r1.62 elf.sc
--- ld/scripttempl/elf.sc	3 Aug 2005 05:09:49 -0000	1.62
+++ ld/scripttempl/elf.sc	4 Aug 2005 03:53:46 -0000
@@ -123,10 +123,12 @@ STACKNOTE="/DISCARD/ : { *(.note.GNU-sta
 if test -z "${NO_SMALL_DATA}"; then
   SBSS=".sbss         ${RELOCATING-0} :
   {
+    ${RELOCATING+${SBSS_START_SYMBOLS}}
     ${CREATE_SHLIB+*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)}
     *(.dynsbss)
     *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*})
     *(.scommon)
+    ${RELOCATING+${SBSS_END_SYMBOLS}}
   }"
   SBSS2=".sbss2        ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }"
   SDATA="/* We want the small data sections together, so single-instruction offsets
@@ -138,7 +140,11 @@ if test -z "${NO_SMALL_DATA}"; then
     ${CREATE_SHLIB+*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)}
     *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*})
   }"
-  SDATA2=".sdata2       ${RELOCATING-0} : { *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) }"
+  SDATA2=".sdata2       ${RELOCATING-0} :
+  {
+    ${RELOCATING+${SDATA2_START_SYMBOLS}}
+    *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*})
+  }"
   REL_SDATA=".rel.sdata    ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) }
   .rela.sdata   ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }"
   REL_SBSS=".rel.sbss     ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) }
@@ -376,10 +382,24 @@ cat <<EOF
   .tdata	${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
   .tbss		${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
 
-  .preinit_array   ${RELOCATING-0} : { KEEP (*(.preinit_array)) }
-  .init_array   ${RELOCATING-0} : { KEEP (*(.init_array)) }
-  .fini_array   ${RELOCATING-0} : { KEEP (*(.fini_array)) }
-
+  .preinit_array   ${RELOCATING-0} :
+  {
+    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_start = .);}}
+    KEEP (*(.preinit_array))
+    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}}
+  }
+  .init_array   ${RELOCATING-0} :
+  {
+     ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}}
+     KEEP (*(.init_array))
+     ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}}
+  }
+  .fini_array   ${RELOCATING-0} :
+  {
+    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}}
+    KEEP (*(.fini_array))
+    ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}}
+  }
   ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
   ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}
   .jcr          ${RELOCATING-0} : { KEEP (*(.jcr)) }

-- 
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]