aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds/arm9/source
diff options
context:
space:
mode:
authorTony Puccinelli2010-07-22 01:44:45 +0000
committerTony Puccinelli2010-07-22 01:44:45 +0000
commit8d946ab847d03625bcc8938932f3ec393b312f20 (patch)
tree6bf110ad9d1b1c0ed4a8aec46cf0913b5c117b71 /backends/platform/ds/arm9/source
parentda414e62b8b61bb661bbf62517c8d249574732e2 (diff)
downloadscummvm-rg350-8d946ab847d03625bcc8938932f3ec393b312f20.tar.gz
scummvm-rg350-8d946ab847d03625bcc8938932f3ec393b312f20.tar.bz2
scummvm-rg350-8d946ab847d03625bcc8938932f3ec393b312f20.zip
Added code for relocation R_ARM_TARGET1 (untested)
svn-id: r51130
Diffstat (limited to 'backends/platform/ds/arm9/source')
-rw-r--r--backends/platform/ds/arm9/source/dsloader.cpp14
-rw-r--r--backends/platform/ds/arm9/source/elf32.h1
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 */