diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 11 | ||||
-rw-r--r-- | ld/ldexp.c | 4 | ||||
-rw-r--r-- | ld/ldlang.c | 38 | ||||
-rw-r--r-- | ld/testsuite/ld-mmix/bpo-10.d | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-mmix/bpo-11.d | 3 |
5 files changed, 39 insertions, 20 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 4cfe874..1c71de1 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2016-10-11 Alan Modra <amodra@gmail.com> + + * ldlang.c (lang_do_assignments_1): Descend into output section + statements that do not yet have bfd sections. Set symbol section + temporarily for symbols defined in such statements to the undefined + section. Don't error on data or reloc statements until final phase. + * ldexp.c (exp_fold_tree_1 <etree_assign>): Handle bfd_und_section + in expld.section. + * testsuite/ld-mmix/bpo-10.d: Adjust. + * testsuite/ld-mmix/bpo-11.d: Adjust. + 2016-10-10 Andreas Krebbel <krebbel@linux.vnet.ibm.com> * emulparams/elf64_s390.sh: Move binary start to 16M. @@ -1077,6 +1077,7 @@ exp_fold_tree_1 (etree_type *tree) before relaxation and so be stripped incorrectly. */ if (expld.phase == lang_mark_phase_enum && expld.section != bfd_abs_section_ptr + && expld.section != bfd_und_section_ptr && !(expld.result.valid_p && expld.result.value == 0 && (is_value (tree->assign.src, 0) @@ -1085,7 +1086,8 @@ exp_fold_tree_1 (etree_type *tree) || is_align_conditional (tree->assign.src)))) expld.section->flags |= SEC_KEEP; - if (!expld.result.valid_p) + if (!expld.result.valid_p + || expld.section == bfd_und_section_ptr) { if (expld.phase != lang_mark_phase_enum) einfo (_("%F%S invalid assignment to" diff --git a/ld/ldlang.c b/ld/ldlang.c index fe0b844..af2ca99 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -5618,6 +5618,7 @@ lang_do_assignments_1 (lang_statement_union_type *s, case lang_output_section_statement_enum: { lang_output_section_statement_type *os; + bfd_vma newdot; os = &(s->output_section_statement); os->after_end = *found_end; @@ -5629,18 +5630,24 @@ lang_do_assignments_1 (lang_statement_union_type *s, prefer_next_section = FALSE; } dot = os->bfd_section->vma; - - lang_do_assignments_1 (os->children.head, - os, os->fill, dot, found_end); - - /* .tbss sections effectively have zero size. */ - if (!IS_TBSS (os->bfd_section) - || bfd_link_relocatable (&link_info)) - dot += TO_ADDR (os->bfd_section->size); - - if (os->update_dot_tree != NULL) - exp_fold_tree (os->update_dot_tree, bfd_abs_section_ptr, - &dot); + } + newdot = lang_do_assignments_1 (os->children.head, + os, os->fill, dot, found_end); + if (!os->ignored) + { + if (os->bfd_section != NULL) + { + /* .tbss sections effectively have zero size. */ + if (!IS_TBSS (os->bfd_section) + || bfd_link_relocatable (&link_info)) + dot += TO_ADDR (os->bfd_section->size); + + if (os->update_dot_tree != NULL) + exp_fold_tree (os->update_dot_tree, + bfd_abs_section_ptr, &dot); + } + else + dot = newdot; } } break; @@ -5664,7 +5671,7 @@ lang_do_assignments_1 (lang_statement_union_type *s, if (expld.result.section != NULL) s->data_statement.value += expld.result.section->vma; } - else + else if (expld.phase == lang_final_phase_enum) einfo (_("%F%P: invalid data statement\n")); { unsigned int size; @@ -5697,7 +5704,7 @@ lang_do_assignments_1 (lang_statement_union_type *s, bfd_abs_section_ptr, &dot); if (expld.result.valid_p) s->reloc_statement.addend_value = expld.result.value; - else + else if (expld.phase == lang_final_phase_enum) einfo (_("%F%P: invalid reloc statement\n")); dot += TO_ADDR (bfd_get_reloc_size (s->reloc_statement.howto)); break; @@ -5733,7 +5740,8 @@ lang_do_assignments_1 (lang_statement_union_type *s, *found_end = TRUE; } exp_fold_tree (s->assignment_statement.exp, - current_os->bfd_section, + (current_os->bfd_section != NULL + ? current_os->bfd_section : bfd_und_section_ptr), &dot); break; diff --git a/ld/testsuite/ld-mmix/bpo-10.d b/ld/testsuite/ld-mmix/bpo-10.d index 1cb7d61..6f49287 100644 --- a/ld/testsuite/ld-mmix/bpo-10.d +++ b/ld/testsuite/ld-mmix/bpo-10.d @@ -14,11 +14,10 @@ SYMBOL TABLE: 0+7f8 l +d \.MMIX.reg_contents 0+ (|\.MMIX\.reg_contents) 0+ l df \*ABS\* 0+ .* 0+ l \.init 0+ _start -0+ l df \*ABS\* 0+ .* -0+4 l \.init 0+ _start\. 2000000000000000 g \.init 0+ __bss_start 2000000000000000 g \.init 0+ _edata 2000000000000000 g \.init 0+ _end +0+4 g \.init 0+ _start\. Contents of section \.init: 0000 e37704a6 .* diff --git a/ld/testsuite/ld-mmix/bpo-11.d b/ld/testsuite/ld-mmix/bpo-11.d index 9b38be8..1abf381 100644 --- a/ld/testsuite/ld-mmix/bpo-11.d +++ b/ld/testsuite/ld-mmix/bpo-11.d @@ -16,13 +16,12 @@ SYMBOL TABLE: 0+7e8 l d \.MMIX\.reg_contents 0+ (|\.MMIX\.reg_contents) 0+ l df \*ABS\* 0+ .* 0+ l \.init 0+ _start -0+ l df \*ABS\* 0+ .* -0+10 l \.text 0+ _start\. 0+14 g \.text 0+ x 0+10 g \.text 0+ x2 2000000000000000 g \.text 0+ __bss_start 2000000000000000 g \.text 0+ _edata 2000000000000000 g \.text 0+ _end +0+10 g \.text 0+ _start\. Contents of section \.init: 0000 00000000 0000003d 00000000 0000003a .* |