This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
__init_array_start and similar symbols
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Date: Thu, 4 Aug 2005 15:50:37 +0930
- Subject: __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