From 7b2438015ca87297b2796c662182f796bb5358c2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 10 Jul 2019 23:35:18 +0930 Subject: [PATCH] PR24786, wrong LMA if first section in overlay is empty This stops the first overlay section being ignored when empty, losing its LMA assignment PR 24786 * ldlang.h (enum section_type): Add first_overlay_section. * ldlang.c (lang_add_section): Adjust switch statement. (map_input_to_output_sections): Likewise. (lang_size_sections_1): Always set last_os for first overlay section. (lang_leave_overlay): Set sectype to first_overlay_section. --- ld/ChangeLog | 9 +++++++++ ld/ldlang.c | 19 +++++++++++-------- ld/ldlang.h | 1 + 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index cb72592..8617750 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2019-07-13 Alan Modra + + PR 24786 + * ldlang.h (enum section_type): Add first_overlay_section. + * ldlang.c (lang_add_section): Adjust switch statement. + (map_input_to_output_sections): Likewise. + (lang_size_sections_1): Always set last_os for first overlay section. + (lang_leave_overlay): Set sectype to first_overlay_section. + 2019-07-08 Alan Modra * testsuite/ld-powerpc/callstub-1.d: Pass -melf64ppc to ld. diff --git a/ld/ldlang.c b/ld/ldlang.c index 898735e..3f25b36 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2579,6 +2579,7 @@ lang_add_section (lang_statement_list_type *ptr, { case normal_section: case overlay_section: + case first_overlay_section: break; case noalloc_section: flags &= ~SEC_ALLOC; @@ -3846,6 +3847,7 @@ map_input_to_output_sections { case normal_section: case overlay_section: + case first_overlay_section: break; case noalloc_section: flags = SEC_HAS_CONTENTS; @@ -5493,13 +5495,14 @@ lang_size_sections_1 important, if an orphan section is placed after an otherwise empty output section that has an explicit lma set, we want that lma reflected in the orphans lma. */ - if (!IGNORE_SECTION (os->bfd_section) - && (os->bfd_section->size != 0 - || (r->last_os == NULL - && os->bfd_section->vma != os->bfd_section->lma) - || (r->last_os != NULL - && dot >= (r->last_os->output_section_statement - .bfd_section->vma))) + if (((!IGNORE_SECTION (os->bfd_section) + && (os->bfd_section->size != 0 + || (r->last_os == NULL + && os->bfd_section->vma != os->bfd_section->lma) + || (r->last_os != NULL + && dot >= (r->last_os->output_section_statement + .bfd_section->vma)))) + || os->sectype == first_overlay_section) && os->lma_region == NULL && !bfd_link_relocatable (&link_info)) r->last_os = s; @@ -8292,7 +8295,7 @@ lang_leave_overlay (etree_type *lma_expr, if (l->next == 0) { l->os->load_base = lma_expr; - l->os->sectype = normal_section; + l->os->sectype = first_overlay_section; } if (phdrs != NULL && l->os->phdrs == NULL) l->os->phdrs = phdrs; diff --git a/ld/ldlang.h b/ld/ldlang.h index 24edc0b..4e96a20 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -116,6 +116,7 @@ typedef struct lang_output_statement_struct enum section_type { normal_section, + first_overlay_section, overlay_section, noload_section, noalloc_section -- 2.7.4