diff options
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/bfd-in.h | 3 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 3 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 30 | ||||
-rw-r--r-- | bfd/elflink.c | 21 | ||||
-rw-r--r-- | ld/ChangeLog | 12 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 51 | ||||
-rw-r--r-- | ld/scripttempl/elf.sc | 13 |
8 files changed, 107 insertions, 38 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f02c677..3920087 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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. diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 37c6386..0222a4e 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -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 **); diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 626e066..131bd83 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -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 **); diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 82de7df..f2a1d38 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -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; } diff --git a/bfd/elflink.c b/bfd/elflink.c index 783d9b9..9792137 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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; + } +} diff --git a/ld/ChangeLog b/ld/ChangeLog index 1378cb5..49e0a0c 100644 --- a/ld/ChangeLog +++ b/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 diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 00805d5..b2d2a7c 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1428,6 +1428,29 @@ 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) { if (bfd_elf_discard_info (output_bfd, &link_info)) @@ -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 diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc index 4ff6467..a6c0a63 100644 --- a/ld/scripttempl/elf.sc +++ b/ld/scripttempl/elf.sc @@ -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}}} |