diff options
author | Alan Modra <amodra@gmail.com> | 2019-01-28 09:59:29 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-01-28 09:59:29 +1030 |
commit | 6a84624340dd19ccd927d91d79e0ece135c6d846 (patch) | |
tree | eafcd04a1374596f537457ef8f2f7d61cf50db9d /ld/ldlang.c | |
parent | e044973b0cadb4c36c2a2c11e908d758b8cd75f9 (diff) | |
download | fsf-binutils-gdb-6a84624340dd19ccd927d91d79e0ece135c6d846.zip fsf-binutils-gdb-6a84624340dd19ccd927d91d79e0ece135c6d846.tar.gz fsf-binutils-gdb-6a84624340dd19ccd927d91d79e0ece135c6d846.tar.bz2 |
PR24008, Wrong value of ternary expression in map file
PR 24008
* ldexp.h (lang_phase_type): Add lang_fixed_phase_enum.
* ldexp.c (fold_name): Move expld.assign_name check later to
avoid an extra lookup.
(exp_fold_tree_1): When lang_fixed_phase_enum, don't change symbol
values, and don't clear expld.assign_name.
* ldlang.c (lang_map): Set expld.phase to lang_fixed_phase_enum.
(print_assignment): Resolve entire assignment expression.
Don't access symbol u.def unless symbol is defined.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r-- | ld/ldlang.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c index bddce6d..33f6bda 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2315,6 +2315,7 @@ lang_map (void) obstack_begin (&map_obstack, 1000); bfd_link_hash_traverse (link_info.hash, sort_def_symbol, 0); } + expld.phase = lang_fixed_phase_enum; lang_statement_iteration++; print_statements (); @@ -4244,9 +4245,7 @@ print_assignment (lang_assignment_statement_type *assignment, const char *dst = assignment->exp->assign.dst; is_dot = (dst[0] == '.' && dst[1] == 0); - if (!is_dot) - expld.assign_name = dst; - tree = assignment->exp->assign.src; + tree = assignment->exp; } osec = output_section->bfd_section; @@ -4281,7 +4280,9 @@ print_assignment (lang_assignment_statement_type *assignment, h = bfd_link_hash_lookup (link_info.hash, assignment->exp->assign.dst, FALSE, FALSE, TRUE); - if (h) + if (h != NULL + && (h->type == bfd_link_hash_defined + || h->type == bfd_link_hash_defweak)) { value = h->u.def.value; value += h->u.def.section->output_section->vma; |