aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds/arm9/source
diff options
context:
space:
mode:
authorTony Puccinelli2010-07-14 03:57:36 +0000
committerTony Puccinelli2010-07-14 03:57:36 +0000
commit03b188468bf905ef0805f9863f6d5411828211dd (patch)
treef6a4299079f43a71ef633244c3d0498561ef825b /backends/platform/ds/arm9/source
parent264cb839dabb40081d6713dbc0b4c9606dd98234 (diff)
downloadscummvm-rg350-03b188468bf905ef0805f9863f6d5411828211dd.tar.gz
scummvm-rg350-03b188468bf905ef0805f9863f6d5411828211dd.tar.bz2
scummvm-rg350-03b188468bf905ef0805f9863f6d5411828211dd.zip
various dsloader fixes, including initializing _symtab_sect to -1 in the header
svn-id: r50869
Diffstat (limited to 'backends/platform/ds/arm9/source')
-rw-r--r--backends/platform/ds/arm9/source/dsloader.cpp43
-rw-r--r--backends/platform/ds/arm9/source/dsloader.h4
2 files changed, 29 insertions, 18 deletions
diff --git a/backends/platform/ds/arm9/source/dsloader.cpp b/backends/platform/ds/arm9/source/dsloader.cpp
index 595b4fbc54..a4fe0573d2 100644
--- a/backends/platform/ds/arm9/source/dsloader.cpp
+++ b/backends/platform/ds/arm9/source/dsloader.cpp
@@ -73,30 +73,30 @@ void DLObject::unload() {
*
*/
bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset, unsigned long size, void *relSegment) {
- Elf32_Rela *rela; //relocation entry
+ Elf32_Rel *rel = NULL; //relocation entry
// Allocate memory for relocation table
- if (!(rela = (Elf32_Rela *)malloc(size))) {
+ if (!(rel = (Elf32_Rel *)malloc(size))) {
seterror("Out of memory.");
return false;
}
// Read in our relocation table
if (DLFile->seek(offset, SEEK_SET) < 0 ||
- DLFile->read(rela, size) != (ssize_t)size) {
+ DLFile->read(rel, size) != (ssize_t)size) {
seterror("Relocation table load failed.");
- free(rela);
+ free(rel);
return false;
}
// Treat each relocation entry. Loop over all of them
- int cnt = size / sizeof(*rela);
+ int cnt = size / sizeof(*rel);
+
+ DBG("# of relocation entries is %d.\n", cnt);
// TODO: Loop over relocation entries
for (int i = 0; i < cnt; i++) {
- DBG("attempting to relocate!");
-
//Elf32_Sym *sym = ???;
//void *target = ???;
@@ -107,13 +107,13 @@ bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset
//break;
// default:
//seterror("Unknown relocation type %d.", ?? ?);
- free(rela);
+ free(rel);
return false;
// }
}
- free(rela);
+ free(rel);
return true;
}
@@ -170,17 +170,24 @@ bool DLObject::loadSegment(Common::SeekableReadStream* DLFile, Elf32_Phdr *phdr)
seterror("Out of memory.\n");
return false;
}
+
DBG("allocated segment @ %p\n", _segment);
// Get offset to load segment into
baseAddress = (char *)_segment + phdr->p_vaddr;
_segmentSize = phdr->p_memsz + extra;
+ DBG("base address is %p\n", baseAddress);
+ DBG("_segmentSize is %p\n", _segmentSize);
+
// Set bss segment to 0 if necessary (assumes bss is at the end)
if (phdr->p_memsz > phdr->p_filesz) {
DBG("Setting %p to %p to 0 for bss\n", baseAddress + phdr->p_filesz, baseAddress + phdr->p_memsz);
memset(baseAddress + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz);
}
+
+ DBG("Reading the segment into memory\n");
+
// Read the segment into memory
if (DLFile->seek(phdr->p_offset, SEEK_SET) < 0 ||
DLFile->read(baseAddress, phdr->p_filesz) != (ssize_t)phdr->p_filesz) {
@@ -188,6 +195,8 @@ bool DLObject::loadSegment(Common::SeekableReadStream* DLFile, Elf32_Phdr *phdr)
return false;
}
+ DBG("Segment has been read into memory\n");
+
return true;
}
@@ -288,8 +297,8 @@ void DLObject::relocateSymbols(Elf32_Addr offset) {
if (s->st_shndx < SHN_LOPROC) {
relocCount++;
s->st_value += offset;
- if (s->st_value < (Elf32_Addr)_segment || s->st_value > (Elf32_Addr)_segment + _segmentSize)
- seterror("Symbol out of bounds! st_value = %x\n", s->st_value);
+ //if (s->st_value < (Elf32_Addr)_segment || s->st_value > (Elf32_Addr)_segment + _segmentSize)
+ //seterror("Symbol out of bounds! st_value = %x\n", s->st_value);
}
@@ -307,7 +316,7 @@ bool DLObject::relocateRels(Common::SeekableReadStream* DLFile, Elf32_Ehdr *ehdr
//Elf32_Shdr *linkShdr = &(shdr[curShdr->sh_info]);
if (curShdr->sh_type == SHT_REL && // Check for a relocation section
- curShdr->sh_entsize == sizeof(Elf32_Rela) && // Check for proper relocation size
+ curShdr->sh_entsize == sizeof(Elf32_Rel) && // Check for proper relocation size
(int)curShdr->sh_link == _symtab_sect && // Check that the sh_link connects to our symbol table
curShdr->sh_info < ehdr->e_shnum && // Check that the relocated section exists
(shdr[curShdr->sh_info].sh_flags & SHF_ALLOC)) { // Check if relocated section resides in memory
@@ -328,13 +337,11 @@ bool DLObject::load(Common::SeekableReadStream* DLFile) {
Elf32_Shdr *shdr;
bool ret = true;
- //int symtab_sect = -1;
-
if (readElfHeader(DLFile, &ehdr) == false) {
return false;
}
- for (int i = 0; i < ehdr.e_phnum; i++) { // Load our 2 segments
+ for (int i = 0; i < ehdr.e_phnum; i++) { //Load our segments
DBG("Loading segment %d\n", i);
@@ -389,9 +396,11 @@ bool DLObject::open(const char *path) {
return false;
}
+ DBG("loaded!/n");
+
//DLFile->finalize();
- //TODO: flush data cache
+ //TODO?: flush data cache
ctors_start = symbol("___plugin_ctors");
ctors_end = symbol("___plugin_ctors_end");
@@ -411,7 +420,7 @@ bool DLObject::open(const char *path) {
(**f)();
DBG(("%s opened ok.\n", path));
- return false;
+
return true;
}
diff --git a/backends/platform/ds/arm9/source/dsloader.h b/backends/platform/ds/arm9/source/dsloader.h
index 1d824792bc..ba8499d14d 100644
--- a/backends/platform/ds/arm9/source/dsloader.h
+++ b/backends/platform/ds/arm9/source/dsloader.h
@@ -27,6 +27,7 @@
#define DS_LOADER_H
#include "elf32.h"
+#include "common/list.h"
#define MAXDLERRLEN 80
@@ -63,7 +64,8 @@ public:
void discard_symtab();
DLObject(char *errbuf = NULL) : _errbuf(_errbuf), _segment(NULL), _symtab(NULL),
- _strtab(NULL), _symbol_cnt(0), _dtors_start(NULL), _dtors_end(NULL) {}
+ _strtab(NULL), _symbol_cnt(0), _symtab_sect(-1), _dtors_start(NULL), _dtors_end(NULL),
+ _segmentSize(0) {}
};
#define RTLD_LAZY 0