* bfd-in.h (_bfd_elf_fix_excluded_sec_syms): Declare.
	(_bfd_elf_provide_section_bound_symbols): Remove param name.
	Formatting.
	* bfd-in2.h: Regenerate.
	* elflink.c (bfd_elf_gc_sections): Don't call generic function.
	(_bfd_elf_provide_symbol): Formatting.
	(_bfd_elf_provide_section_bound_symbols): Remove all hacks, just
	create section relative syms.
	(fix_syms, _bfd_elf_fix_excluded_sec_syms): New functions.
	* elf32-ppc.c (ppc_elf_set_sdata_syms): Use
	_bfd_elf_provide_section_bound_symbols.
	* reloc.c (bfd_mark_used_section): Delete.
	(bfd_generic_gc_sections): Don't call the above.
ld/
	* ldlang.c (strip_excluded_output_sections): Don't call
	bfd_gc_sections.
	* emultempl/elf32.em (gld*_provide_bound_symbols): Move.
	(gld*_provide_init_fini_syms): Move.
	(gld*_before_allocation): Call the above from here..
	(gld*_finish): ..not here.  Call _bfd_elf_fix_excluded_sec_syms.
	* emultempl/hppaelf.em (hppaelf_finish): Likewise.
	* emultempl/ppc64elf.em (ppc_finish): Likewise.
This commit is contained in:
Alan Modra
2005-07-14 13:54:23 +00:00
parent bfaaa3c28b
commit a3c2b96af6
11 changed files with 134 additions and 143 deletions

View File

@ -61,7 +61,6 @@ static void gld${EMULATION_NAME}_before_allocation (void);
static bfd_boolean gld${EMULATION_NAME}_place_orphan
(lang_input_statement_type *file, asection *s);
static void gld${EMULATION_NAME}_layout_sections_again (void);
static void gld${EMULATION_NAME}_provide_init_fini_syms (void);
static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED;
EOF
@ -1040,6 +1039,47 @@ if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_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. */
@ -1057,6 +1097,8 @@ gld${EMULATION_NAME}_before_allocation (void)
referred to by dynamic objects. */
lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment);
gld${EMULATION_NAME}_provide_init_fini_syms ();
/* Let the ELF backend work out the sizes of any sections required
by dynamic linking. */
rpath = command_line.rpath;
@ -1447,49 +1489,6 @@ fi
if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
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);
if (s && bfd_section_removed_from_list (output_bfd, s))
s = NULL;
_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");
}
}
static void
gld${EMULATION_NAME}_layout_sections_again (void)
{
@ -1511,7 +1510,7 @@ gld${EMULATION_NAME}_finish (void)
if (bfd_elf_discard_info (output_bfd, &link_info))
gld${EMULATION_NAME}_layout_sections_again ();
gld${EMULATION_NAME}_provide_init_fini_syms ();
_bfd_elf_fix_excluded_sec_syms (output_bfd, &link_info);
}
EOF
fi

View File

@ -305,7 +305,7 @@ hppaelf_finish (void)
}
}
gld${EMULATION_NAME}_provide_init_fini_syms ();
_bfd_elf_fix_excluded_sec_syms (output_bfd, &link_info);
}

View File

@ -379,7 +379,7 @@ ppc_finish (void)
}
ppc64_elf_restore_symbols (&link_info);
gld${EMULATION_NAME}_provide_init_fini_syms ();
_bfd_elf_fix_excluded_sec_syms (output_bfd, &link_info);
}