aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-arm.c10
-rw-r--r--ld/testsuite/ChangeLog7
-rw-r--r--ld/testsuite/ld-arm/arm-elf.exp4
-rw-r--r--ld/testsuite/ld-arm/cortex-a8-fix-hdr.d24
-rw-r--r--ld/testsuite/ld-arm/cortex-a8-fix-hdr.s14
-rw-r--r--ld/testsuite/ld-arm/cortex-a8-fix-hdr.t10
7 files changed, 74 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 95e033c..c63bc2f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2009-08-06 Nathan Sidwell <nathan@codesourcery.com>
+
+ * elf32-arm.c (elf32_arm_size_stubs): Call layout_sections_again
+ at least once when fixing cortex-a8.
+
2009-08-05 Chao-ying Fu <fu@mips.com>
* elf32-mips.c (mips_reloc_map): Add BFD_RELOC_MIPS_JALR.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 5aba3f3..fbb4454 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -4246,6 +4246,16 @@ elf32_arm_size_stubs (bfd *output_bfd,
group_sections (htab, stub_group_size, stubs_always_after_branch);
+ /* If we're applying the cortex A8 fix, we need to determine the
+ program header size now, because we cannot change it later --
+ that could alter section placements. Notice the A8 erratum fix
+ ends up requiring the section addresses to remain unchanged
+ modulo the page size. That's something we cannot represent
+ inside BFD, and we don't want to force the section alignment to
+ be the page size. */
+ if (htab->fix_cortex_a8)
+ (*htab->layout_sections_again) ();
+
while (1)
{
bfd *input_bfd;
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 1386162..d0e1699 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2009-08-06 Nathan Sidwell <nathan@codesourcery.com>
+
+ * ld-arm/arm-elf.exp: Add new test.
+ * ld-arm/cortex-a8-fix-hdr.d: New.
+ * ld-arm/cortex-a8-fix-hdr.s: New.
+ * ld-arm/cortex-a8-fix-hdr.t: New.
+
2009-08-05 Trevor Smigiel <Trevor_Smigiel@playstation.sony.com>
* ld-spu/fixup.d: New.
diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp
index 941ef50..4fcee68 100644
--- a/ld/testsuite/ld-arm/arm-elf.exp
+++ b/ld/testsuite/ld-arm/arm-elf.exp
@@ -209,6 +209,10 @@ set armelftests {
"-EL -Ttext=0x00 --fix-cortex-a8 --defsym far_fn1=0x80000000 --defsym far_fn2=0x80000004 --defsym far_fn=0x7fff0000 --defsym _start=0" "-EL" {cortex-a8-far-1.s cortex-a8-far-2.s}
{{objdump -dr cortex-a8-far.d}}
"cortex-a8-far"}
+ {"Cortex-A8 erratum fix, headers"
+ "-EL --fix-cortex-a8 -T cortex-a8-fix-hdr.t" "-EL" {cortex-a8-fix-hdr.s}
+ {{objdump -dr cortex-a8-fix-hdr.d}}
+ "cortex-a8-fix-hdr"}
{"Unwinding and -gc-sections" "-gc-sections" "" {gc-unwind.s}
{{objdump -sj.data gc-unwind.d}}
"gc-unwind"}
diff --git a/ld/testsuite/ld-arm/cortex-a8-fix-hdr.d b/ld/testsuite/ld-arm/cortex-a8-fix-hdr.d
new file mode 100644
index 0000000..027d2a1
--- /dev/null
+++ b/ld/testsuite/ld-arm/cortex-a8-fix-hdr.d
@@ -0,0 +1,24 @@
+
+.*: file format .*
+
+
+Disassembly of section \.text:
+
+00000fe0 <_start>:
+ fe0: bf00 nop
+ fe2: bf00 nop
+ fe4: bf00 nop
+ fe6: bf00 nop
+ fe8: bf00 nop
+ fea: bf00 nop
+ fec: bf00 nop
+ fee: bf00 nop
+ ff0: bf00 nop
+ ff2: bf00 nop
+ ff4: bf00 nop
+ ff6: bf00 nop
+ ff8: bf00 nop
+ ffa: ea81 0002 eor.w r0, r1, r2
+ ffe: f000 b80f b.w 1020 <_start\+0x40>
+#...
+ 1020: f7ff bfde b.w fe0 <_start>
diff --git a/ld/testsuite/ld-arm/cortex-a8-fix-hdr.s b/ld/testsuite/ld-arm/cortex-a8-fix-hdr.s
new file mode 100644
index 0000000..827c0f8
--- /dev/null
+++ b/ld/testsuite/ld-arm/cortex-a8-fix-hdr.s
@@ -0,0 +1,14 @@
+ .syntax unified
+
+ .section .text, "ax"
+
+ .align 5
+ .globl _start
+ .thumb_func
+_start:
+ .rept 13
+ nop
+ .endr
+ eor r0, r1, r2
+ b.w _start
+
diff --git a/ld/testsuite/ld-arm/cortex-a8-fix-hdr.t b/ld/testsuite/ld-arm/cortex-a8-fix-hdr.t
new file mode 100644
index 0000000..d3afacb
--- /dev/null
+++ b/ld/testsuite/ld-arm/cortex-a8-fix-hdr.t
@@ -0,0 +1,10 @@
+
+
+SECTIONS {
+ . = SIZEOF_HEADERS;
+ . += 0xf80;
+ .text : {
+ *(.text)
+ } = 0
+ /DISCARD/ : { *(*) }
+}