This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
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