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 | |
parent | 0c951c25c6c7cfbf0f399d34277f73b0fdfc18cd (diff) | |
download | gdb-7b2438015ca87297b2796c662182f796bb5358c2.zip gdb-7b2438015ca87297b2796c662182f796bb5358c2.tar.gz gdb-7b2438015ca87297b2796c662182f796bb5358c2.tar.bz2 |
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')
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/ldlang.c | 19 | ||||
-rw-r--r-- | 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 <amodra@gmail.com> + + 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 <amodra@gmail.com> * 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 |