summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog12
-rw-r--r--ld/ldexp.c7
-rw-r--r--ld/ldexp.h1
-rw-r--r--ld/ldlang.c10
-rw-r--r--ld/ldlang.h2
-rw-r--r--ld/pe-dll.c6
6 files changed, 27 insertions, 11 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index a9c5ee43608..6bf634998fe 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,15 @@
+2011-05-04 Alan Modra <amodra@gmail.com>
+
+ PR ld/12726
+ * ldexp.h (lang_phase_type): Add lang_assigning_phase_enum.
+ * ldexp.c (exp_fold_tree_1): Correct assign to dot comment. Don't
+ assign to dot when lang_assigning_phase_enum.
+ * ldlang.h (lang_do_assignments): Update prototype.
+ * ldlang.c (lang_do_assignments): Add phase parameter. Update all
+ callers.
+ * pe-dll.c (pe_dll_fill_sections, pe_exe_fill_sections): Update
+ lang_do_assignments calls.
+
2011-04-28 Daniel C. Klauer <daniel.c.klauer@web.de>
PR ld/12614
diff --git a/ld/ldexp.c b/ld/ldexp.c
index fc186016484..f70634c5c61 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -783,12 +783,15 @@ exp_fold_tree_1 (etree_type *tree)
case etree_provided:
if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
{
- /* Assignment to dot can only be done during allocation. */
if (tree->type.node_class != etree_assign)
einfo (_("%F%S can not PROVIDE assignment to location counter\n"));
+ /* 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_final_phase_enum
+ || ((expld.phase == lang_assigning_phase_enum
+ || expld.phase == lang_final_phase_enum)
&& expld.section == bfd_abs_section_ptr))
{
/* Notify the folder that this is an assignment to dot. */
diff --git a/ld/ldexp.h b/ld/ldexp.h
index 6d98e756fdd..4ea13c2c7b9 100644
--- a/ld/ldexp.h
+++ b/ld/ldexp.h
@@ -97,6 +97,7 @@ typedef enum {
lang_first_phase_enum,
lang_mark_phase_enum,
lang_allocating_phase_enum,
+ lang_assigning_phase_enum,
lang_final_phase_enum
} lang_phase_type;
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 2c07fa4d358..c291fd93476 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -5606,8 +5606,9 @@ lang_do_assignments_1 (lang_statement_union_type *s,
}
void
-lang_do_assignments (void)
+lang_do_assignments (lang_phase_type phase)
{
+ expld.phase = phase;
lang_statement_iteration++;
lang_do_assignments_1 (statement_list.head, abs_output_section, NULL, 0);
}
@@ -6403,7 +6404,7 @@ lang_relax_sections (bfd_boolean need_layout)
/* Do all the assignments with our current guesses as to
section sizes. */
- lang_do_assignments ();
+ lang_do_assignments (lang_assigning_phase_enum);
/* We must do this after lang_do_assignments, because it uses
size. */
@@ -6424,7 +6425,7 @@ lang_relax_sections (bfd_boolean need_layout)
if (need_layout)
{
/* Final extra sizing to report errors. */
- lang_do_assignments ();
+ lang_do_assignments (lang_assigning_phase_enum);
lang_reset_memory_regions ();
lang_size_sections (NULL, TRUE);
}
@@ -6666,8 +6667,7 @@ lang_process (void)
/* Do all the assignments, now that we know the final resting places
of all the symbols. */
- expld.phase = lang_final_phase_enum;
- lang_do_assignments ();
+ lang_do_assignments (lang_final_phase_enum);
ldemul_finish ();
diff --git a/ld/ldlang.h b/ld/ldlang.h
index db47af89640..d172c34f9c2 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -543,7 +543,7 @@ extern void lang_for_each_file
extern void lang_reset_memory_regions
(void);
extern void lang_do_assignments
- (void);
+ (lang_phase_type);
#define LANG_FOR_EACH_INPUT_STATEMENT(statement) \
lang_input_statement_type *statement; \
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index c8abf4df8a1..682ce46e65e 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -1,6 +1,6 @@
/* Routines to help build PEI-format DLLs (Win32 etc)
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
- 2008, 2009, 2010 Free Software Foundation, Inc.
+ 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
Written by DJ Delorie <dj@cygnus.com>
This file is part of the GNU Binutils.
@@ -3232,7 +3232,7 @@ pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
ldemul_after_allocation ();
/* Do the assignments again. */
- lang_do_assignments ();
+ lang_do_assignments (lang_final_phase_enum);
}
fill_edata (abfd, info);
@@ -3264,7 +3264,7 @@ pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
ldemul_after_allocation ();
/* Do the assignments again. */
- lang_do_assignments ();
+ lang_do_assignments (lang_final_phase_enum);
}
reloc_s->contents = reloc_d;
}