aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-01-28 09:59:29 +1030
committerAlan Modra <amodra@gmail.com>2019-01-28 09:59:29 +1030
commit6a84624340dd19ccd927d91d79e0ece135c6d846 (patch)
treeeafcd04a1374596f537457ef8f2f7d61cf50db9d /ld/ldlang.c
parentControl gas enable-checking default by bfd/development.sh (diff)
downloadbinutils-gdb-6a84624340dd19ccd927d91d79e0ece135c6d846.tar.gz
binutils-gdb-6a84624340dd19ccd927d91d79e0ece135c6d846.tar.bz2
binutils-gdb-6a84624340dd19ccd927d91d79e0ece135c6d846.zip
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.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index bddce6d81ac..33f6bda292a 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;