diff options
author | Alan Modra <amodra@bigpond.net.au> | 2011-05-03 14:56:14 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2011-05-03 14:56:14 +0000 |
commit | 7271ea650c369704e736a0902869479e5a536618 (patch) | |
tree | 2a22a2e1cc50b7977ee2577055f638c2cd0207ca | |
parent | ee97f9909cd2e60e8edcb8b14710dfe05890f23e (diff) | |
download | binutils-redhat-7271ea650c369704e736a0902869479e5a536618.tar.gz |
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.
-rw-r--r-- | ld/ChangeLog | 12 | ||||
-rw-r--r-- | ld/ldexp.c | 7 | ||||
-rw-r--r-- | ld/ldexp.h | 1 | ||||
-rw-r--r-- | ld/ldlang.c | 10 | ||||
-rw-r--r-- | ld/ldlang.h | 2 | ||||
-rw-r--r-- | ld/pe-dll.c | 6 |
6 files changed, 27 insertions, 11 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index a9c5ee4360..6bf634998f 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 fc18601648..f70634c5c6 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 6d98e756fd..4ea13c2c7b 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 2c07fa4d35..c291fd9347 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 db47af8964..d172c34f9c 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 c8abf4df8a..682ce46e65 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; } |