diff options
author | Alan Modra <amodra@gmail.com> | 2014-08-14 13:49:31 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2014-08-14 13:49:31 +0930 |
commit | 18cd5bce47dc4a33dd1d8e3036b99d2fa7e3234f (patch) | |
tree | a45e5b4efa46052d1f8bf538e0695e2b264795a5 /ld/ldlang.c | |
parent | b879806f2fdd2eca7092d7b854d6cbbbbbd0493b (diff) | |
download | gdb-18cd5bce47dc4a33dd1d8e3036b99d2fa7e3234f.zip gdb-18cd5bce47dc4a33dd1d8e3036b99d2fa7e3234f.tar.gz gdb-18cd5bce47dc4a33dd1d8e3036b99d2fa7e3234f.tar.bz2 |
Linker part of PR16563 fix
Presents .eh_frame input sections to the optimisation machinery in
elf-eh-frame.c in the order they are given by the linker script.
PR 16563
bfd/
* elflink.c (bfd_elf_discard_info): Process .eh_frame and .stab
in the order they are mapped to output sections.
ld/
* ldlang.c (map_head_is_link_order): Rename from
stripped_excluded_sections.
(lang_clear_os_map): New function, extracted from..
(strip_excluded_output_sections): ..here.
* ldlang.h (lang_clear_os_map): Declare.
* ldwrite.c (ldwrite): Call lang_clear_os_map.
* emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_after_allocation):
Likewise.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r-- | ld/ldlang.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c index 419caa1..899f710 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -57,7 +57,7 @@ static struct obstack map_obstack; #define obstack_chunk_free free static const char *entry_symbol_default = "start"; static bfd_boolean placed_commons = FALSE; -static bfd_boolean stripped_excluded_sections = FALSE; +static bfd_boolean map_head_is_link_order = FALSE; static lang_output_section_statement_type *default_common_section; static bfd_boolean map_option_f; static bfd_vma print_dot; @@ -2412,7 +2412,7 @@ lang_add_section (lang_statement_list_type *ptr, section->output_section = output->bfd_section; if (!link_info.relocatable - && !stripped_excluded_sections) + && !map_head_is_link_order) { asection *s = output->bfd_section->map_tail.s; output->bfd_section->map_tail.s = section; @@ -3912,10 +3912,6 @@ strip_excluded_output_sections (void) } } - /* TODO: Don't just junk map_head.s, turn them into link_orders. */ - output_section->map_head.link_order = NULL; - output_section->map_tail.link_order = NULL; - if (exclude) { /* We don't set bfd_section to NULL since bfd_section of the @@ -3927,10 +3923,42 @@ strip_excluded_output_sections (void) link_info.output_bfd->section_count--; } } +} + +/* Called from ldwrite to clear out asection.map_head and + asection.map_tail for use as link_orders in ldwrite. + FIXME: Except for sh64elf.em which starts creating link_orders in + its after_allocation routine so needs to call it early. */ + +void +lang_clear_os_map (void) +{ + lang_output_section_statement_type *os; + + if (map_head_is_link_order) + return; + + for (os = &lang_output_section_statement.head->output_section_statement; + os != NULL; + os = os->next) + { + asection *output_section; + + if (os->constraint < 0) + continue; + + output_section = os->bfd_section; + if (output_section == NULL) + continue; + + /* TODO: Don't just junk map_head.s, turn them into link_orders. */ + output_section->map_head.link_order = NULL; + output_section->map_tail.link_order = NULL; + } /* Stop future calls to lang_add_section from messing with map_head and map_tail link_order fields. */ - stripped_excluded_sections = TRUE; + map_head_is_link_order = TRUE; } static void |