diff options
Diffstat (limited to 'backends')
-rw-r--r-- | backends/platform/ds/arm9/source/dsloader.cpp | 14 | ||||
-rw-r--r-- | backends/platform/ds/arm9/source/elf32.h | 1 |
2 files changed, 14 insertions, 1 deletions
diff --git a/backends/platform/ds/arm9/source/dsloader.cpp b/backends/platform/ds/arm9/source/dsloader.cpp index 8ab64e226a..21de4d77aa 100644 --- a/backends/platform/ds/arm9/source/dsloader.cpp +++ b/backends/platform/ds/arm9/source/dsloader.cpp @@ -106,7 +106,7 @@ bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset // Get the target instruction in the code unsigned int *target = (unsigned int *)((char *)relSegment + rel[i].r_offset); - unsigned int origTarget = *target; // Save for debugging + unsigned int origTarget = *target; //Save for debugging // Act differently based on the type of relocation switch (REL_TYPE(rel[i].r_info)) { @@ -134,6 +134,18 @@ bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset DBG("R_ARM_JUMP24: PC-relative jump, ld takes care of all relocation work for us.\n"); break; + case R_ARM_TARGET1: + if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section. + a = *target; // Get full 32 bits of addend + relocation = a + (Elf32_Addr)_segment; // Shift by main offset + + *target = relocation; + + DBG("R_ARM_TARGET1: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target); + seterror("WARNING: THIS RELOCATION CODE UNTESTED!\n"); //TODO: test cruise for corpse on ARM target! + } + break; + case R_ARM_V4BX: DBG("R_ARM_V4BX: No relocation calculation necessary.\n"); break; diff --git a/backends/platform/ds/arm9/source/elf32.h b/backends/platform/ds/arm9/source/elf32.h index c9253a6068..d72b71664d 100644 --- a/backends/platform/ds/arm9/source/elf32.h +++ b/backends/platform/ds/arm9/source/elf32.h @@ -190,6 +190,7 @@ typedef struct #define R_ARM_THM_CALL 10 #define R_ARM_CALL 28 #define R_ARM_JUMP24 29 +#define R_ARM_TARGET1 38 #define R_ARM_V4BX 40 #endif /* BACKENDS_ELF_H */ |