summaryrefslogtreecommitdiff
path: root/ld/ldexp.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2012-03-14 05:24:02 +0000
committerAlan Modra <amodra@bigpond.net.au>2012-03-14 05:24:02 +0000
commite17566f2e043110b6aef30a7d79461778c2f061e (patch)
tree0135cac0d7c780a65296a41da54d54b65651e93b /ld/ldexp.c
parenta35887980a5f12ed6b27b52c8ed09fbd57564f94 (diff)
downloadbinutils-redhat-e17566f2e043110b6aef30a7d79461778c2f061e.tar.gz
PR ld/13839
* ldexp.c (fold_name): Ignore undefined symbols when assigning to dot in mark phase. (exp_fold_tree_1): Evaluate assignment to dot expressions even when discarding result, for side effects. Fix typo in error message.
Diffstat (limited to 'ld/ldexp.c')
-rw-r--r--ld/ldexp.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/ld/ldexp.c b/ld/ldexp.c
index 59743ea1ec..3bddc813e0 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -606,7 +606,8 @@ fold_name (etree_type *tree)
output_section);
}
else if (expld.phase == lang_final_phase_enum
- || expld.assigning_to_dot)
+ || (expld.phase != lang_mark_phase_enum
+ && expld.assigning_to_dot))
einfo (_("%F%S: undefined symbol `%s'"
" referenced in expression\n"),
tree, tree->name.name);
@@ -797,14 +798,7 @@ exp_fold_tree_1 (etree_type *tree)
if (tree->type.node_class != etree_assign)
einfo (_("%F%S can not PROVIDE assignment to"
" location counter\n"), tree);
- /* After allocation, assignment to dot should not be done inside
- an output section since allocation adds a padding statement
- that effectively duplicates the assignment. */
- if (expld.phase == lang_mark_phase_enum
- || expld.phase == lang_allocating_phase_enum
- || ((expld.phase == lang_assigning_phase_enum
- || expld.phase == lang_final_phase_enum)
- && expld.section == bfd_abs_section_ptr))
+ if (expld.phase != lang_first_phase_enum)
{
/* Notify the folder that this is an assignment to dot. */
expld.assigning_to_dot = TRUE;
@@ -819,8 +813,14 @@ exp_fold_tree_1 (etree_type *tree)
}
else if (expld.dotp == NULL)
einfo (_("%F%S assignment to location counter"
- " invalid outside of SECTION\n"), tree);
- else
+ " invalid outside of SECTIONS\n"), tree);
+
+ /* After allocation, assignment to dot should not be
+ done inside an output section since allocation adds a
+ padding statement that effectively duplicates the
+ assignment. */
+ else if (expld.phase <= lang_allocating_phase_enum
+ || expld.section == bfd_abs_section_ptr)
{
bfd_vma nextdot;