* 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.
This commit is contained in:
Ulrich Weigand 2009-05-14 15:26:36 +00:00
parent d342a8b157
commit 452de53c12
6 changed files with 49 additions and 6 deletions

View file

@ -1,3 +1,8 @@
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

View file

@ -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;
}

View file

@ -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.

View file

@ -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:

View file

@ -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>:

View file

@ -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>: