aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog10
-rw-r--r--ld/ldlang.c19
-rw-r--r--ld/ldlang.h1
-rw-r--r--ld/testsuite/ChangeLog4
-rw-r--r--ld/testsuite/ld-spu/ovl.lnk9
5 files changed, 29 insertions, 14 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 5912caf..50a474a 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,13 @@
+2007-04-18 Alan Modra <amodra@bigpond.net.au>
+
+ * 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 <sje@cup.hp.com>
* Makefile.am: Add ACLOCAL_AMFLAGS.
diff --git a/ld/ldlang.c b/ld/ldlang.c
index cf1a697..297df20 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 33abf9f..f52f46f 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 5b5a496..5033f78 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-04-18 Alan Modra <amodra@bigpond.net.au>
+
+ * ld-spu/ovl.lnk: Use OVERLAY keyword.
+
2007-04-17 Paul Brook <paul@codesourcery.com>
* ld-arm/preempt-app.s: New test.
diff --git a/ld/testsuite/ld-spu/ovl.lnk b/ld/testsuite/ld-spu/ovl.lnk
index 84701d4..408ed1e 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) }