diff --git a/ld/ChangeLog b/ld/ChangeLog index 5912cafc87..50a474aed3 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2007-04-18 Alan Modra + + * ldlang.h (enum section_type): Add overlay_section. + * ldlang.c (lang_add_section): Handle flags for overlay_section + as per normal_section. + (lang_size_sections_1): When setting lma, detect overlays by + os->sectype rather than by looking for overlapping vmas. + (lang_enter_overlay_section): Use overlay_section type. + (lang_leave_overlay): Set first overlay section to normal. + 2007-04-14 Steve Ellcey * Makefile.am: Add ACLOCAL_AMFLAGS. diff --git a/ld/ldlang.c b/ld/ldlang.c index cf1a697a13..297df20a30 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2040,6 +2040,7 @@ lang_add_section (lang_statement_list_type *ptr, switch (output->sectype) { case normal_section: + case overlay_section: break; case noalloc_section: flags &= ~SEC_ALLOC; @@ -4438,14 +4439,9 @@ lang_size_sections_1 } else { - /* If the current vma overlaps the previous section, - then set the current lma to that at the end of - the previous section. The previous section was - probably an overlay. */ - if ((dot >= last->vma - && dot < last->vma + last->size) - || (last->vma >= dot - && last->vma < dot + os->bfd_section->size)) + /* If this is an overlay, set the current lma to that + at the end of the previous section. */ + if (os->sectype == overlay_section) lma = last->lma + last->size; /* Otherwise, keep the same lma to vma relationship @@ -6392,7 +6388,7 @@ lang_enter_overlay_section (const char *name) struct overlay_list *n; etree_type *size; - lang_enter_output_section_statement (name, overlay_vma, normal_section, + lang_enter_output_section_statement (name, overlay_vma, overlay_section, 0, overlay_subalign, 0, 0); /* If this is the first section, then base the VMA of future @@ -6506,7 +6502,10 @@ lang_leave_overlay (etree_type *lma_expr, The base address is not needed (and should be null) if an LMA region was specified. */ if (l->next == 0) - l->os->load_base = lma_expr; + { + l->os->load_base = lma_expr; + l->os->sectype = normal_section; + } if (phdrs != NULL && l->os->phdrs == NULL) l->os->phdrs = phdrs; diff --git a/ld/ldlang.h b/ld/ldlang.h index 33abf9f2a7..f52f46ffbc 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -108,6 +108,7 @@ typedef struct lang_output_statement_struct enum section_type { normal_section, + overlay_section, noload_section, noalloc_section }; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 5b5a496158..5033f78dfe 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-04-18 Alan Modra + + * ld-spu/ovl.lnk: Use OVERLAY keyword. + 2007-04-17 Paul Brook * ld-arm/preempt-app.s: New test. diff --git a/ld/testsuite/ld-spu/ovl.lnk b/ld/testsuite/ld-spu/ovl.lnk index 84701d4387..408ed1ebd6 100644 --- a/ld/testsuite/ld-spu/ovl.lnk +++ b/ld/testsuite/ld-spu/ovl.lnk @@ -3,10 +3,11 @@ SECTIONS . = SIZEOF_HEADERS; .text : { *(.text) *(.stub) } - . = 0x400; - .ov_a1 : { *(.ov_a1) } - .ov_a2 ADDR (.ov_a1) : { *(.ov_a2) } - . = ADDR (.ov_a1) + MAX (SIZEOF (.ov_a1), SIZEOF (.ov_a2)); + OVERLAY 0x400 : + { + .ov_a1 { *(.ov_a1) } + .ov_a2 { *(.ov_a2) } + } .data : { *(.data) *(.ovtab) } .bss : { *(.bss) }