diff options
-rw-r--r-- | bfd/ChangeLog | 20 | ||||
-rw-r--r-- | bfd/bfd-in.h | 11 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 11 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 11 | ||||
-rw-r--r-- | bfd/elflink.c | 68 | ||||
-rw-r--r-- | bfd/reloc.c | 30 | ||||
-rw-r--r-- | ld/ChangeLog | 11 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 89 | ||||
-rw-r--r-- | ld/emultempl/hppaelf.em | 2 | ||||
-rw-r--r-- | ld/emultempl/ppc64elf.em | 2 | ||||
-rw-r--r-- | ld/ldlang.c | 8 |
11 files changed, 127 insertions, 136 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ddb07b7..17d27fa 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,19 @@ +2005-07-14 Alan Modra <amodra@bigpond.net.au> + + * 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. + 2005-07-14 Paul Woegerer <paul.woegerer@nsc.com> PR 1063 @@ -10,7 +26,7 @@ Alpha binaries and issue a helpful error message. (alpha_ecoff_swap_reloc_out): Increase maximum allowed internal symbol index to 15 to allow for binaries produced by DEC - compilers. + compilers. 2005-07-13 Steve Ellcey <sje@cup.hp.com> @@ -42,7 +58,7 @@ 2005-07-08 Ralf Corsepius <ralf.corsepius@rtems.org> * config.bfd: Mark i960-*-rtems*, or32-*-rtems* as obsolete. - Mark a29k-*rtems*, hppa*-*-rtems*, *-go32-rtems*, + Mark a29k-*rtems*, hppa*-*-rtems*, *-go32-rtems*, i[3-7]86*-*-rtemscoff*, mips*el-*-rtems*, powerpcle-*-rtems*, sparc*-*-rtemsaout* as removed diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 4d999b9..34188d1 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -704,10 +704,14 @@ 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 *sec, const char *, const char *); + (struct bfd_link_info *, struct bfd_section *, const char *, const char *); + +extern void _bfd_elf_fix_excluded_sec_syms + (bfd *, struct bfd_link_info *); extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs - (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **); + (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, + char **); /* SunOS shared library support routines for the linker. */ @@ -716,7 +720,8 @@ extern struct bfd_link_needed_list *bfd_sunos_get_needed_list extern bfd_boolean bfd_sunos_record_link_assignment (bfd *, struct bfd_link_info *, const char *); extern bfd_boolean bfd_sunos_size_dynamic_sections - (bfd *, struct bfd_link_info *, struct bfd_section **, struct bfd_section **, struct bfd_section **); + (bfd *, struct bfd_link_info *, struct bfd_section **, + struct bfd_section **, struct bfd_section **); /* Linux shared library support routines for the linker. */ diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index ada5e0e..0073c12 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -711,10 +711,14 @@ 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 *sec, const char *, const char *); + (struct bfd_link_info *, struct bfd_section *, const char *, const char *); + +extern void _bfd_elf_fix_excluded_sec_syms + (bfd *, struct bfd_link_info *); extern bfd_boolean bfd_m68k_elf32_create_embedded_relocs - (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, char **); + (bfd *, struct bfd_link_info *, struct bfd_section *, struct bfd_section *, + char **); /* SunOS shared library support routines for the linker. */ @@ -723,7 +727,8 @@ extern struct bfd_link_needed_list *bfd_sunos_get_needed_list extern bfd_boolean bfd_sunos_record_link_assignment (bfd *, struct bfd_link_info *, const char *); extern bfd_boolean bfd_sunos_size_dynamic_sections - (bfd *, struct bfd_link_info *, struct bfd_section **, struct bfd_section **, struct bfd_section **); + (bfd *, struct bfd_link_info *, struct bfd_section **, + struct bfd_section **, struct bfd_section **); /* Linux shared library support routines for the linker. */ diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 9b306e5..d4ef612 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5307,13 +5307,10 @@ ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info) } s = bfd_get_section_by_name (obfd, ".sbss"); - val = 0; - _bfd_elf_provide_symbol (info, "__sbss_start", val, s); - _bfd_elf_provide_symbol (info, "___sbss_start", val, s); - if (s != NULL) - val = s->size; - _bfd_elf_provide_symbol (info, "__sbss_end", val, s); - _bfd_elf_provide_symbol (info, "___sbss_end", val, s); + _bfd_elf_provide_section_bound_symbols (info, s, + "__sbss_start", "__sbss_end"); + _bfd_elf_provide_section_bound_symbols (info, s, + "___sbss_start", "___sbss_end"); return TRUE; } diff --git a/bfd/elflink.c b/bfd/elflink.c index 6177f53..791575b 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -9119,9 +9119,6 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) (asection *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *h, Elf_Internal_Sym *); - if (!info->gc_sections) - return bfd_generic_gc_sections (abfd, info); - if (!get_elf_backend_data (abfd)->can_gc_sections || info->relocatable || info->emitrelocations @@ -9846,8 +9843,7 @@ _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name, { struct elf_link_hash_entry *h; - h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, - FALSE); + h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE); if (h != NULL && !h->def_regular) bfd_elf_set_symbol (h, val, s); } @@ -9861,45 +9857,41 @@ _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info, const char *start, const char *end) { - struct elf_link_hash_entry *hs, *he; - bfd_vma start_val, end_val; - bfd_boolean do_start, do_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); +} - /* Check if we need them or not first. */ - hs = elf_link_hash_lookup (elf_hash_table (info), start, FALSE, - FALSE, FALSE); - do_start = hs != NULL && !hs->def_regular; +/* Convert symbols in excluded output sections to absolute. */ - he = elf_link_hash_lookup (elf_hash_table (info), end, FALSE, - FALSE, FALSE); - do_end = he != NULL && !he->def_regular; +static bfd_boolean +fix_syms (struct bfd_link_hash_entry *h, void *data) +{ + bfd *obfd = (bfd *) data; - if (!do_start && !do_end) - return; + if (h->type == bfd_link_hash_warning) + h = h->u.i.link; - if (sec != NULL) + if (h->type == bfd_link_hash_defined + || h->type == bfd_link_hash_defweak) { - start_val = sec->vma; - end_val = start_val + sec->size; - } - else - { - /* We have to choose those values very carefully. Some targets, - like alpha, may have relocation overflow with 0. "__bss_start" - should be defined in all cases. */ - struct elf_link_hash_entry *h - = elf_link_hash_lookup (elf_hash_table (info), "__bss_start", - FALSE, FALSE, FALSE); - if (h != NULL && h->root.type == bfd_link_hash_defined) - start_val = h->root.u.def.value; - else - start_val = 0; - end_val = start_val; + asection *s = h->u.def.section; + if (s != NULL + && s == s->output_section + && bfd_section_removed_from_list (obfd, s)) + { + h->u.def.value += s->vma; + h->u.def.section = bfd_abs_section_ptr; + } } - if (do_start) - bfd_elf_set_symbol (hs, start_val, NULL); + return TRUE; +} - if (do_end) - bfd_elf_set_symbol (he, end_val, NULL); +void +_bfd_elf_fix_excluded_sec_syms (bfd *obfd, struct bfd_link_info *info) +{ + bfd_link_hash_traverse (info->hash, fix_syms, obfd); } diff --git a/bfd/reloc.c b/bfd/reloc.c index 1b15e6a..9d10d25 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -4520,27 +4520,6 @@ bfd_generic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, return TRUE; } -/* Mark sections containing global symbols. This is called through - bfd_link_hash_traverse. */ - -static bfd_boolean -bfd_mark_used_section (struct bfd_link_hash_entry *h, - void *data ATTRIBUTE_UNUSED) -{ - if (h->type == bfd_link_hash_warning) - h = h->u.i.link; - - if (h->type == bfd_link_hash_defined - || h->type == bfd_link_hash_defweak) - { - asection *s = h->u.def.section; - if (s != NULL && s->output_section != NULL) - s->output_section->flags |= SEC_KEEP; - } - - return TRUE; -} - /* INTERNAL_FUNCTION bfd_generic_gc_sections @@ -4551,18 +4530,13 @@ SYNOPSIS DESCRIPTION Provides default handling for relaxing for back ends which - don't do section gc -- i.e., does nothing besides the special - case for marking sections having global symbols. + don't do section gc -- i.e., does nothing. */ bfd_boolean bfd_generic_gc_sections (bfd *abfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info) + struct bfd_link_info *info ATTRIBUTE_UNUSED) { - /* If called when info->gc_sections is 0, then mark all sections - containing global symbols with SEC_KEEP. */ - if (!info->gc_sections && !info->relocatable) - bfd_link_hash_traverse (info->hash, bfd_mark_used_section, NULL); return TRUE; } diff --git a/ld/ChangeLog b/ld/ChangeLog index f995fc5..78f4f68 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2005-07-14 Alan Modra <amodra@bigpond.net.au> + + * 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. + 2005-07-10 Ralf Corsepius <ralf.corsepius@rtems.org> * configure.tgt: Remove sparc*-*-rtemsaout*, i[3-7]86-go32-rtems*, diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index da7af0b..9480c2c 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -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; @@ -1448,49 +1490,6 @@ 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) { lang_reset_memory_regions (); @@ -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 diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em index 96a98ed..4303274 100644 --- a/ld/emultempl/hppaelf.em +++ b/ld/emultempl/hppaelf.em @@ -305,7 +305,7 @@ hppaelf_finish (void) } } - gld${EMULATION_NAME}_provide_init_fini_syms (); + _bfd_elf_fix_excluded_sec_syms (output_bfd, &link_info); } diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index 483d381..a9ced5f 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -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); } diff --git a/ld/ldlang.c b/ld/ldlang.c index ce178f1..35c5075 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -3049,7 +3049,6 @@ void strip_excluded_output_sections (void) { lang_output_section_statement_type *os; - unsigned int gc_sections; /* Run lang_size_sections (if not already done) to ensure that all symbols defined in the linker script are put in the bfd hash @@ -3062,13 +3061,6 @@ strip_excluded_output_sections (void) lang_reset_memory_regions (); } - /* Now call into bfd_gc_sections to mark all sections defining global - symbols with SEC_KEEP. */ - gc_sections = link_info.gc_sections; - link_info.gc_sections = 0; - bfd_gc_sections (output_bfd, &link_info); - link_info.gc_sections = gc_sections; - for (os = &lang_output_section_statement.head->output_section_statement; os != NULL; os = os->next) |