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: [RFC] Providing init_fini_syms earlier?


On Thu, Jul 14, 2005 at 07:44:02AM -0700, H. J. Lu wrote:
> _bfd_elf_provide_section_bound_symbols should be called at least
> once after lang_size_sections. Otherwise, the section size will be
> zero.

Oops.  Yes, of course.

On Thu, Jul 14, 2005 at 10:21:52AM -0700, H. J. Lu wrote:
> This patch fixes ELF arrays and restore the patch for
> 
> http://sourceware.org/ml/binutils/2005-04/msg00660.html:

No longer needed.  The following fixes the problem with section end
syms.  It has this to recommend it over previous schemes:  Our special
linker provided section syms are processed at all places where syms are
set from assignments in linker scripts.  In gld*_before_allocation,
gld*_provide_init_fini_syms and gld*_find_statement_assignment both
call bfd_elf_record_link_assignment to handle references from dynamic
objects.  In lang_do_assignments, we set symbol values, as is done for
link script syms.  (We also call bfd_elf_record_link_assignment again
which is unnecessary but shouldn't hurt.)

bfd/
	* elflink.c (bfd_elf_record_link_assignment): Remove output_bfd param.
	(_bfd_elf_provide_symbol): Allow redefinition of weak syms and those
	defined in output sections.  Call bfd_elf_record_link_assignment.
	* bfd-in.h (bfd_elf_record_link_assignment): Update prototype.
	* bfd-in2.h: Regenerate.
ld/
	* ldemul.c (ldemul_do_assignments): New function.
	(do_assignments_default): New function.
	* ldemul.h (ldemul_do_assignments): Declare.
	(do_assignments_default): Declare.
	(struct ld_emulation_xfer_struct): Add do_assignments.
	* ldlang.c (lang_do_assignments) Call ldemul_do_assignments.
	* emultempl/aix.em (ld_*_emulation): Init do_assignments field.
	* 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, to call gld*_provide_init_fini_syms.
	(gld*_find_exp_assignment): Adjust bfd_elf_record_link_assignment call.

Index: bfd/bfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in.h,v
retrieving revision 1.105
diff -u -p -r1.105 bfd-in.h
--- bfd/bfd-in.h	14 Jul 2005 13:54:15 -0000	1.105
+++ bfd/bfd-in.h	15 Jul 2005 11:28:10 -0000
@@ -633,7 +633,7 @@ enum dynamic_lib_link_class {
 };
 
 extern bfd_boolean bfd_elf_record_link_assignment
-  (bfd *, struct bfd_link_info *, const char *, bfd_boolean);
+  (struct bfd_link_info *, const char *, bfd_boolean);
 extern struct bfd_link_needed_list *bfd_elf_get_needed_list
   (bfd *, struct bfd_link_info *);
 extern bfd_boolean bfd_elf_get_bfd_needed_list
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.175
diff -u -p -r1.175 elflink.c
--- bfd/elflink.c	14 Jul 2005 13:54:16 -0000	1.175
+++ bfd/elflink.c	15 Jul 2005 11:28:23 -0000
@@ -433,8 +433,7 @@ bfd_elf_link_record_dynamic_symbol (stru
    this in case some dynamic object refers to this symbol.  */
 
 bfd_boolean
-bfd_elf_record_link_assignment (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info,
+bfd_elf_record_link_assignment (struct bfd_link_info *info,
 				const char *name,
 				bfd_boolean provide)
 {
@@ -9843,8 +9842,13 @@ _bfd_elf_provide_symbol (struct bfd_link
 {
   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->def_regular)
+  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);
 }
 
Index: ld/ldemul.c
===================================================================
RCS file: /cvs/src/src/ld/ldemul.c,v
retrieving revision 1.20
diff -u -p -r1.20 ldemul.c
--- ld/ldemul.c	12 May 2005 07:32:02 -0000	1.20
+++ ld/ldemul.c	15 Jul 2005 11:28:56 -0000
@@ -80,6 +80,12 @@ ldemul_before_allocation (void)
 }
 
 void
+ldemul_do_assignments (void)
+{
+  ld_emulation->do_assignments ();
+}
+
+void
 ldemul_set_output_arch (void)
 {
   ld_emulation->set_output_arch ();
@@ -217,6 +223,11 @@ before_allocation_default (void)
 }
 
 void
+do_assignments_default (void)
+{
+}
+
+void
 set_output_arch_default (void)
 {
   /* Set the output architecture and machine if possible.  */
Index: ld/ldemul.h
===================================================================
RCS file: /cvs/src/src/ld/ldemul.h,v
retrieving revision 1.14
diff -u -p -r1.14 ldemul.h
--- ld/ldemul.h	3 Mar 2005 11:51:58 -0000	1.14
+++ ld/ldemul.h	15 Jul 2005 11:28:56 -0000
@@ -35,6 +35,8 @@ 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
@@ -77,6 +79,8 @@ extern void after_allocation_default
   (void);
 extern void before_allocation_default
   (void);
+extern void do_assignments_default
+  (void);
 extern void set_output_arch_default
   (void);
 extern void syslib_default
@@ -117,6 +121,9 @@ 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.191
diff -u -p -r1.191 ldlang.c
--- ld/ldlang.c	14 Jul 2005 13:54:23 -0000	1.191
+++ ld/ldlang.c	15 Jul 2005 11:29:00 -0000
@@ -4585,6 +4585,7 @@ 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/emultempl/aix.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/aix.em,v
retrieving revision 1.38
diff -u -p -r1.38 aix.em
--- ld/emultempl/aix.em	12 May 2005 07:32:03 -0000	1.38
+++ ld/emultempl/aix.em	15 Jul 2005 11:29:00 -0000
@@ -1340,6 +1340,7 @@ 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.20
diff -u -p -r1.20 armcoff.em
--- ld/emultempl/armcoff.em	12 May 2005 07:32:03 -0000	1.20
+++ ld/emultempl/armcoff.em	15 Jul 2005 11:29:00 -0000
@@ -260,6 +260,7 @@ 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.30
diff -u -p -r1.30 beos.em
--- ld/emultempl/beos.em	1 Jun 2005 04:04:18 -0000	1.30
+++ ld/emultempl/beos.em	15 Jul 2005 11:29:01 -0000
@@ -767,6 +767,7 @@ 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.151
diff -u -p -r1.151 elf32.em
--- ld/emultempl/elf32.em	14 Jul 2005 13:54:23 -0000	1.151
+++ ld/emultempl/elf32.em	15 Jul 2005 11:29:02 -0000
@@ -981,8 +981,8 @@ gld${EMULATION_NAME}_find_exp_assignment
 	 will do no harm.  */
       if (strcmp (exp->assign.dst, ".") != 0)
 	{
-	  if (!bfd_elf_record_link_assignment (output_bfd, &link_info,
-					       exp->assign.dst, provide))
+	  if (!bfd_elf_record_link_assignment (&link_info, exp->assign.dst,
+					       provide))
 	    einfo ("%P%F: failed to record assignment to %s: %E\n",
 		   exp->assign.dst);
 	}
@@ -1881,6 +1881,7 @@ 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.16
diff -u -p -r1.16 generic.em
--- ld/emultempl/generic.em	12 May 2005 07:32:03 -0000	1.16
+++ ld/emultempl/generic.em	15 Jul 2005 11:29:02 -0000
@@ -128,6 +128,7 @@ 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.16
diff -u -p -r1.16 gld960.em
--- ld/emultempl/gld960.em	12 May 2005 07:32:03 -0000	1.16
+++ ld/emultempl/gld960.em	15 Jul 2005 11:29:02 -0000
@@ -134,6 +134,7 @@ 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.18
diff -u -p -r1.18 gld960c.em
--- ld/emultempl/gld960c.em	12 May 2005 07:32:03 -0000	1.18
+++ ld/emultempl/gld960c.em	15 Jul 2005 11:29:02 -0000
@@ -149,6 +149,7 @@ 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.17
diff -u -p -r1.17 linux.em
--- ld/emultempl/linux.em	12 May 2005 07:32:03 -0000	1.17
+++ ld/emultempl/linux.em	15 Jul 2005 11:29:02 -0000
@@ -189,6 +189,7 @@ 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.17
diff -u -p -r1.17 lnk960.em
--- ld/emultempl/lnk960.em	12 May 2005 07:32:03 -0000	1.17
+++ ld/emultempl/lnk960.em	15 Jul 2005 11:29:03 -0000
@@ -269,6 +269,7 @@ 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.13
diff -u -p -r1.13 m68kcoff.em
--- ld/emultempl/m68kcoff.em	12 May 2005 07:32:03 -0000	1.13
+++ ld/emultempl/m68kcoff.em	15 Jul 2005 11:29:03 -0000
@@ -222,6 +222,7 @@ 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.107
diff -u -p -r1.107 pe.em
--- ld/emultempl/pe.em	10 Jul 2005 01:33:13 -0000	1.107
+++ ld/emultempl/pe.em	15 Jul 2005 11:29:04 -0000
@@ -1822,6 +1822,7 @@ 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/sunos.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/sunos.em,v
retrieving revision 1.22
diff -u -p -r1.22 sunos.em
--- ld/emultempl/sunos.em	12 May 2005 07:32:04 -0000	1.22
+++ ld/emultempl/sunos.em	15 Jul 2005 11:29:04 -0000
@@ -1013,6 +1013,7 @@ 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.13
diff -u -p -r1.13 ticoff.em
--- ld/emultempl/ticoff.em	12 May 2005 07:32:04 -0000	1.13
+++ ld/emultempl/ticoff.em	15 Jul 2005 11:29:04 -0000
@@ -162,6 +162,7 @@ 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.10
diff -u -p -r1.10 vanilla.em
--- ld/emultempl/vanilla.em	12 May 2005 07:32:04 -0000	1.10
+++ ld/emultempl/vanilla.em	15 Jul 2005 11:29:04 -0000
@@ -65,6 +65,7 @@ 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",

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