From c5acf24cd6835f7a3627a8b1784f543fb65d20cf Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 6 Aug 2009 13:05:24 +0000 Subject: [PATCH] bfd/ * elf32-arm.c (elf32_arm_size_stubs): Call layout_sections_again at least once when fixing cortex-a8. ld/testsuite/ * 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. --- bfd/ChangeLog | 5 +++++ bfd/elf32-arm.c | 10 ++++++++++ ld/testsuite/ChangeLog | 7 +++++++ ld/testsuite/ld-arm/arm-elf.exp | 4 ++++ ld/testsuite/ld-arm/cortex-a8-fix-hdr.d | 24 ++++++++++++++++++++++++ ld/testsuite/ld-arm/cortex-a8-fix-hdr.s | 14 ++++++++++++++ ld/testsuite/ld-arm/cortex-a8-fix-hdr.t | 10 ++++++++++ 7 files changed, 74 insertions(+) create mode 100644 ld/testsuite/ld-arm/cortex-a8-fix-hdr.d create mode 100644 ld/testsuite/ld-arm/cortex-a8-fix-hdr.s create mode 100644 ld/testsuite/ld-arm/cortex-a8-fix-hdr.t diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 95e033c150..c63bc2f823 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2009-08-06 Nathan Sidwell + + * elf32-arm.c (elf32_arm_size_stubs): Call layout_sections_again + at least once when fixing cortex-a8. + 2009-08-05 Chao-ying Fu * elf32-mips.c (mips_reloc_map): Add BFD_RELOC_MIPS_JALR. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 5aba3f360a..fbb4454ae9 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 13861620a2..d0e1699d7f 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2009-08-06 Nathan Sidwell + + * 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 * ld-spu/fixup.d: New. diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index 941ef50c69..4fcee6817a 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 0000000000..027d2a1151 --- /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 0000000000..827c0f8c07 --- /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 0000000000..d3afacbe8e --- /dev/null +++ b/ld/testsuite/ld-arm/cortex-a8-fix-hdr.t @@ -0,0 +1,10 @@ + + +SECTIONS { + . = SIZEOF_HEADERS; + . += 0xf80; + .text : { + *(.text) + } = 0 + /DISCARD/ : { *(*) } +} -- 2.11.0