diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2009-05-14 15:26:36 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2009-05-14 15:26:36 +0000 |
commit | 452de53c120bef76efb636cc404b23d4170907c8 (patch) | |
tree | fd55e9c67c3ba06ffe3a2babdfac9f2cec85474d | |
parent | d342a8b15740545c4584db1957abaf12040ba646 (diff) | |
download | binutils-452de53c120bef76efb636cc404b23d4170907c8.tar.gz binutils-452de53c120bef76efb636cc404b23d4170907c8.tar.bz2 binutils-452de53c120bef76efb636cc404b23d4170907c8.zip |
bfd/
* elf32-spu.c (spu_elf_modify_segment_map): Move all PF_OVERLAY
segments first amongst the program headers.
ld/testsuite/
* ld-spu/icache.d: Update file offsets.
* ld-spu/ovl.d: Likewise.
* ld-spu/ovl1.d: Likewise.
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf32-spu.c | 34 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-spu/icache1.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-spu/ovl.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-spu/ovl2.d | 4 |
6 files changed, 49 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index edaf9c862e2..63e22006d24 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2009-05-14 Ulrich Weigand <uweigand@de.ibm.com> + * elf32-spu.c (spu_elf_modify_segment_map): Move all PF_OVERLAY + segments first amongst the program headers. + +2009-05-14 Ulrich Weigand <uweigand@de.ibm.com> + * elf32-spu.c (spu_elf_relocate_section): Only encode overlay index into addresses for relocation types that look at high bits. Remove special handling of relocation overflow warnings. diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c index 838f6fc44e5..0443e5e7d9f 100644 --- a/bfd/elf32-spu.c +++ b/bfd/elf32-spu.c @@ -5045,7 +5045,8 @@ static bfd_boolean spu_elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info) { asection *toe, *s; - struct elf_segment_map *m; + struct elf_segment_map *m, *m_overlay; + struct elf_segment_map **p, **p_overlay; unsigned int i; if (info == NULL) @@ -5092,6 +5093,37 @@ spu_elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info) break; } + + /* Some SPU ELF loaders ignore the PF_OVERLAY flag and just load all + PT_LOAD segments. This can cause the .ovl.init section to be + overwritten with the contents of some overlay segment. To work + around this issue, we ensure that all PF_OVERLAY segments are + sorted first amongst the program headers; this ensures that even + with a broken loader, the .ovl.init section (which is not marked + as PF_OVERLAY) will be placed into SPU local store on startup. */ + + /* Move all overlay segments onto a separate list. */ + p = &elf_tdata (abfd)->segment_map; + p_overlay = &m_overlay; + while (*p != NULL) + { + if ((*p)->p_type == PT_LOAD && (*p)->count == 1 + && spu_elf_section_data ((*p)->sections[0])->u.o.ovl_index != 0) + { + struct elf_segment_map *m = *p; + *p = m->next; + *p_overlay = m; + p_overlay = &m->next; + continue; + } + + p = &((*p)->next); + } + + /* Re-insert overlay segments at the head of the segment map. */ + *p_overlay = elf_tdata (abfd)->segment_map; + elf_tdata (abfd)->segment_map = m_overlay; + return TRUE; } diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 766525cde95..845a99733e9 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-05-14 Ulrich Weigand <uweigand@de.ibm.com> + + * ld-spu/icache.d: Update file offsets. + * ld-spu/ovl.d: Likewise. + * ld-spu/ovl1.d: Likewise. + 2009-05-14 Alan Modra <amodra@bigpond.net.au> * ld-spu/icache1.d: Update for changed overlay manager placement. diff --git a/ld/testsuite/ld-spu/icache1.d b/ld/testsuite/ld-spu/icache1.d index bad3274fb78..2089294650b 100644 --- a/ld/testsuite/ld-spu/icache1.d +++ b/ld/testsuite/ld-spu/icache1.d @@ -8,7 +8,7 @@ Disassembly of section .ovl.init: 00000800 <__icache_fileoff>: .* 00 00 00 00.* -.* 00 00 07 00.* +.* 00 00 02 00.* \.\.\. Disassembly of section \.ovly1: diff --git a/ld/testsuite/ld-spu/ovl.d b/ld/testsuite/ld-spu/ovl.d index f33d4140b36..cbf7573a642 100644 --- a/ld/testsuite/ld-spu/ovl.d +++ b/ld/testsuite/ld-spu/ovl.d @@ -151,12 +151,12 @@ Disassembly of section .data: 450: 00 00 04 00 .* 454: 00 00 00 20 .* # 458: 00 00 03 40 .* - 458: 00 00 03 90 .* + 458: 00 00 01 00 .* 45c: 00 00 00 01 .* 460: 00 00 04 00 .* 464: 00 00 00 40 .* # 468: 00 00 03 60 .* - 468: 00 00 03 b0 .* + 468: 00 00 01 20 .* 46c: 00 00 00 01 .* 00000470 <_ovly_buf_table>: diff --git a/ld/testsuite/ld-spu/ovl2.d b/ld/testsuite/ld-spu/ovl2.d index 6206e4941f5..b1e344c456a 100644 --- a/ld/testsuite/ld-spu/ovl2.d +++ b/ld/testsuite/ld-spu/ovl2.d @@ -104,12 +104,12 @@ Disassembly of section \.data: .*00 00 04 00 .* .*00 00 00 20 .* #.*00 00 03 10 .* -.*00 00 03 60 .* +.*00 00 01 00 .* .*00 00 00 01 .* .*00 00 04 00 .* .*00 00 00 20 .* #.*00 00 03 20 .* -.*00 00 03 80 .* +.*00 00 01 20 .* .*00 00 00 01 .* 00000450 <_ovly_buf_table>: |