2005-03-22  H.J. Lu  <hongjiu.lu@intel.com>

	* bfd-in.h (_bfd_elf_provide_symbol): New.
	* bfd-in2.h: Regenerated.

	* elf32-ppc.c (set_linker_sym): Moved to elflink.c.
	(ppc_elf_set_sdata_syms): Call _bfd_elf_provide_symbol instead
	of set_linker_sym.

	* elflink.c (_bfd_elf_provide_symbol): New. Moved and renamed
	from elf32-ppc.c.

ld/

2005-03-22  H.J. Lu  <hongjiu.lu@intel.com>

	* emultempl/elf32.em (gld${EMULATION_NAME}_provide_bound_symbols): New
	(gld${EMULATION_NAME}_finish): Call
	gld${EMULATION_NAME}_provide_bound_symbols to provide
	__preinit_array_start, __preinit_array_end, __init_array_start,
	__init_array_end, __fini_array_start and __fini_array_end.

	* scripttempl/elf.sc: Don't provide __preinit_array_start,
	__preinit_array_end, __init_array_start, __init_array_end,
	__fini_array_start nor __fini_array_end.
This commit is contained in:
H.J. Lu 2005-03-23 04:14:46 +00:00
parent 1ec0126d51
commit 81e1b023da
8 changed files with 107 additions and 38 deletions

View File

@ -1,3 +1,15 @@
2005-03-22 H.J. Lu <hongjiu.lu@intel.com>
* bfd-in.h (_bfd_elf_provide_symbol): New.
* bfd-in2.h: Regenerated.
* elf32-ppc.c (set_linker_sym): Moved to elflink.c.
(ppc_elf_set_sdata_syms): Call _bfd_elf_provide_symbol instead
of set_linker_sym.
* elflink.c (_bfd_elf_provide_symbol): New. Moved and renamed
from elf32-ppc.c.
2005-03-22 Hans-Peter Nilsson <hp@axis.com>
* hash.c (strtab_hash_newfunc): Fix typo in allocated size.

View File

@ -694,6 +694,9 @@ 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);
extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs
(bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **);

View File

@ -701,6 +701,9 @@ 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);
extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs
(bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **);

View File

@ -4545,26 +4545,6 @@ ppc_elf_relax_section (bfd *abfd,
return FALSE;
}
/* Set SYM_NAME to VAL if the symbol exists and is undefined. */
static void
set_linker_sym (struct ppc_elf_link_hash_table *htab,
const char *sym_name,
bfd_vma val)
{
struct elf_link_hash_entry *h;
h = elf_link_hash_lookup (&htab->elf, sym_name, FALSE, FALSE, FALSE);
if (h != NULL && h->root.type == bfd_link_hash_undefined)
{
h->root.type = bfd_link_hash_defined;
h->root.u.def.section = bfd_abs_section_ptr;
h->root.u.def.value = val;
h->def_regular = 1;
h->type = STT_OBJECT;
h->other = STV_HIDDEN;
}
}
/* 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
@ -4599,19 +4579,19 @@ ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info)
val = s->vma + 32768;
lsect->sym_val = val;
set_linker_sym (htab, lsect->sym_name, val);
_bfd_elf_provide_symbol (info, lsect->sym_name, val);
}
s = bfd_get_section_by_name (obfd, ".sbss");
val = 0;
if (s != NULL)
val = s->vma;
set_linker_sym (htab, "__sbss_start", val);
set_linker_sym (htab, "___sbss_start", val);
_bfd_elf_provide_symbol (info, "__sbss_start", val);
_bfd_elf_provide_symbol (info, "___sbss_start", val);
if (s != NULL)
val += s->size;
set_linker_sym (htab, "__sbss_end", val);
set_linker_sym (htab, "___sbss_end", val);
_bfd_elf_provide_symbol (info, "__sbss_end", val);
_bfd_elf_provide_symbol (info, "___sbss_end", val);
return TRUE;
}

View File

@ -9754,3 +9754,24 @@ _bfd_elf_section_already_linked (bfd *abfd, struct bfd_section * sec)
/* This is the first section with this name. Record it. */
bfd_section_already_linked_table_insert (already_linked_list, sec);
}
/* Set NAME to VAL if the symbol exists and is undefined. */
void
_bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name,
bfd_vma val)
{
struct elf_link_hash_entry *h;
h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE,
FALSE);
if (h != NULL && h->root.type == bfd_link_hash_undefined)
{
h->root.type = bfd_link_hash_defined;
h->root.u.def.section = 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;
}
}

View File

@ -1,3 +1,15 @@
2005-03-22 H.J. Lu <hongjiu.lu@intel.com>
* emultempl/elf32.em (gld${EMULATION_NAME}_provide_bound_symbols): New
(gld${EMULATION_NAME}_finish): Call
gld${EMULATION_NAME}_provide_bound_symbols to provide
__preinit_array_start, __preinit_array_end, __init_array_start,
__init_array_end, __fini_array_start and __fini_array_end.
* scripttempl/elf.sc: Don't provide __preinit_array_start,
__preinit_array_end, __init_array_start, __init_array_end,
__fini_array_start nor __fini_array_end.
2005-03-23 Alan Modra <amodra@bigpond.net.au>
* emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation): Set

View File

@ -1427,6 +1427,29 @@ 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_vma start_val, end_val;
s = bfd_get_section_by_name (output_bfd, sec);
if (s != NULL)
{
start_val = s->vma;
end_val = start_val + s->size;
}
else
{
start_val = 0;
end_val = 0;
}
_bfd_elf_provide_symbol (&link_info, start, start_val);
_bfd_elf_provide_symbol (&link_info, end, end_val);
}
static void
gld${EMULATION_NAME}_finish (void)
{
@ -1472,6 +1495,34 @@ gld${EMULATION_NAME}_finish (void)
}
}
}
/* If not building 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. */
if (!link_info.shared)
{
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");
}
}
}
EOF

View File

@ -333,22 +333,9 @@ cat <<EOF
.tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
.tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
/* Ensure the __preinit_array_start label is properly aligned. We
could instead move the label definition inside the section, but
the linker would then create the section even if it turns out to
be empty, which isn't pretty. */
${RELOCATING+. = ALIGN(${ALIGNMENT});}
${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_start = .);}}
.preinit_array ${RELOCATING-0} : { KEEP (*(.preinit_array)) }
${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}}
${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}}
.init_array ${RELOCATING-0} : { KEEP (*(.init_array)) }
${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}}
${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}}
.fini_array ${RELOCATING-0} : { KEEP (*(.fini_array)) }
${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}}
${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}