From 012f491d4e8bcf16e392a44903a04cf3d227b18d Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Tue, 3 Apr 2012 10:57:27 +0200 Subject: [PATCH] deal with odd-address errors: handle non-aligned relocations make sure .init/.fini sections are aligned --- elf2flt/elf2flt.ld.in | 1 + libretro/start.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/elf2flt/elf2flt.ld.in b/elf2flt/elf2flt.ld.in index 4d65427908..6491b4f086 100644 --- a/elf2flt/elf2flt.ld.in +++ b/elf2flt/elf2flt.ld.in @@ -24,6 +24,7 @@ SECTIONS { *(.glue_7t) *(.glue_7) *(.jcr) + . = ALIGN (4) ; @SYMBOL_PREFIX@__init_section = . ; KEEP (*(.init)) @SYMBOL_PREFIX@__init_section_end = . ; diff --git a/libretro/start.c b/libretro/start.c index eb585bba12..529a493410 100644 --- a/libretro/start.c +++ b/libretro/start.c @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -60,8 +62,17 @@ void _start() for(i = 0; i < n; i++) { - long *addr = (long*)(relocs[i] + displacement); - *addr += (*addr >= data_end ? bss_displacement : displacement); + uint8_t *addrPtr = (uint8_t*)(relocs[i] + displacement); + long addr; + + addr = (addrPtr[0] << 24) | (addrPtr[1] << 16) | (addrPtr[2] << 8) | addrPtr[3]; + + addr += addr >= data_end ? bss_displacement : displacement; + + addrPtr[0] = addr >> 24; + addrPtr[1] = addr >> 16; + addrPtr[2] = addr >> 8; + addrPtr[3] = addr; } /* {