bfd/
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:
parent
1ec0126d51
commit
81e1b023da
@ -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.
|
||||
|
@ -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 **);
|
||||
|
||||
|
@ -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 **);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
12
ld/ChangeLog
12
ld/ChangeLog
@ -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
|
||||
|
@ -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
|
||||
|
@ -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}}}
|
||||
|
Loading…
Reference in New Issue
Block a user