diff options
author | Alan Modra <amodra@gmail.com> | 2019-07-10 23:35:18 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-07-13 09:57:50 +0930 |
commit | 7b2438015ca87297b2796c662182f796bb5358c2 (patch) | |
tree | 41b7c77993f76651b6094c7bee583a874cad4069 /ld/ldlang.c | |
parent | [GOLD] PowerPC R_PPC64_PCREL_OPT support (diff) | |
download | binutils-gdb-7b2438015ca87297b2796c662182f796bb5358c2.tar.gz binutils-gdb-7b2438015ca87297b2796c662182f796bb5358c2.tar.bz2 binutils-gdb-7b2438015ca87297b2796c662182f796bb5358c2.zip |
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.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r-- | ld/ldlang.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c index 898735efab5..3f25b363d0c 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; |