diff options
author | Alan Modra <amodra@gmail.com> | 2016-10-11 18:13:04 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2016-10-11 18:13:04 +1030 |
commit | f02cb058822459ea29a9fdaa928c2623df435908 (patch) | |
tree | 1345ed2dd4496afc5d7a62981e881c0bda413908 /ld/ldexp.c | |
parent | 3b202c10808fa17200aaeb8eb9935d94e622e671 (diff) | |
download | gdb-f02cb058822459ea29a9fdaa928c2623df435908.zip gdb-f02cb058822459ea29a9fdaa928c2623df435908.tar.gz gdb-f02cb058822459ea29a9fdaa928c2623df435908.tar.bz2 |
Always descend into output section statements in lang_do_assignments
See https://sourceware.org/ml/binutils/2016-07/msg00091.html
This patch stop --gc-sections elf_gc_sweep_symbol localizing symbols
that ought to remain global.
The difficulty with always descending into output section statements
is that symbols defined by the script in such statements don't have
a bfd section when lang_do_assignments runs early in the link process.
There are two approaches to curing this problem. Either we can
create the bfd section early, or we can use a special section. This
patch takes the latter approach and uses bfd_und_section. (Creating
bfd sections early results in changed output section order, and thus
lots of testsuite failures. You can't create all output sections
early to ensure proper ordering as KEEP then stops empty sections
from being stripped.)
The wrinkle with this approach is that some code that runs at
gc-sections time needs to be made aware of the odd defined symbols
using bfd_und_section.
bfd/
* elf64-x86-64.c (elf_x86_64_convert_load_reloc): Handle symbols
defined temporarily with bfd_und_section.
* elflink.c (_bfd_elf_gc_keep): Don't set SEC_KEEP for bfd_und_section.
* elfxx-mips.c (mips_elf_local_pic_function_p): Exclude defined
symbols with bfd_und_section.
ld/
* ldlang.c (lang_do_assignments_1): Descend into output section
statements that do not yet have bfd sections. Set symbol section
temporarily for symbols defined in such statements to the undefined
section. Don't error on data or reloc statements until final phase.
* ldexp.c (exp_fold_tree_1 <etree_assign>): Handle bfd_und_section
in expld.section.
* testsuite/ld-mmix/bpo-10.d: Adjust.
* testsuite/ld-mmix/bpo-11.d: Adjust.
Diffstat (limited to 'ld/ldexp.c')
-rw-r--r-- | ld/ldexp.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -1077,6 +1077,7 @@ exp_fold_tree_1 (etree_type *tree) before relaxation and so be stripped incorrectly. */ if (expld.phase == lang_mark_phase_enum && expld.section != bfd_abs_section_ptr + && expld.section != bfd_und_section_ptr && !(expld.result.valid_p && expld.result.value == 0 && (is_value (tree->assign.src, 0) @@ -1085,7 +1086,8 @@ exp_fold_tree_1 (etree_type *tree) || is_align_conditional (tree->assign.src)))) expld.section->flags |= SEC_KEEP; - if (!expld.result.valid_p) + if (!expld.result.valid_p + || expld.section == bfd_und_section_ptr) { if (expld.phase != lang_mark_phase_enum) einfo (_("%F%S invalid assignment to" |