[Scummvm-cvs-logs] SF.net SVN: scummvm:[51793] scummvm/branches/gsoc2010-plugins/backends
toneman1138 at users.sourceforge.net
toneman1138 at users.sourceforge.net
Fri Aug 6 19:33:44 CEST 2010
Revision: 51793
http://scummvm.svn.sourceforge.net/scummvm/?rev=51793&view=rev
Author: toneman1138
Date: 2010-08-06 17:33:44 +0000 (Fri, 06 Aug 2010)
Log Message:
-----------
got rid of unneccessary 'extern C' section in elf-loader header and refactored arm-relocs.cpp to arm-loader.cpp
Modified Paths:
--------------
scummvm/branches/gsoc2010-plugins/backends/platform/ds/arm9/makefile
scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h
Added Paths:
-----------
scummvm/branches/gsoc2010-plugins/backends/plugins/arm-loader.cpp
Removed Paths:
-------------
scummvm/branches/gsoc2010-plugins/backends/plugins/arm-relocs.cpp
Modified: scummvm/branches/gsoc2010-plugins/backends/platform/ds/arm9/makefile
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/platform/ds/arm9/makefile 2010-08-06 17:29:17 UTC (rev 51792)
+++ scummvm/branches/gsoc2010-plugins/backends/platform/ds/arm9/makefile 2010-08-06 17:33:44 UTC (rev 51793)
@@ -293,7 +293,7 @@
$(portdir)/source/dsoptions.o $(portdir)/source/keys.o $(portdir)/source/wordcompletion.o\
$(portdir)/source/interrupt.o\
$(srcdir)/backends/plugins/elf-loader.o\
- $(srcdir)/backends/plugins/arm-relocs.o
+ $(srcdir)/backends/plugins/arm-loader.o
ifdef USE_PROFILER
PORT_OBJS += $(portdir)/source/profiler/cyg-profile.o
Copied: scummvm/branches/gsoc2010-plugins/backends/plugins/arm-loader.cpp (from rev 51772, scummvm/branches/gsoc2010-plugins/backends/plugins/arm-relocs.cpp)
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/arm-loader.cpp (rev 0)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/arm-loader.cpp 2010-08-06 17:33:44 UTC (rev 51793)
@@ -0,0 +1,164 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "backends/fs/ds/ds-fs.h"
+#include "elf-loader.h"
+#include "dsmain.h"
+
+#define __DEBUG_PLUGINS__
+
+#ifdef __DEBUG_PLUGINS__
+#define DBG(x,...) consolePrintf(x, ## __VA_ARGS__)
+#else
+#define DBG(x,...)
+#endif
+
+#define seterror(x,...) consolePrintf(x, ## __VA_ARGS__)
+
+/**
+ * Follow the instruction of a relocation section.
+ *
+ * @param DLFile SeekableReadStream of File
+ * @param offset Offset into the File
+ * @param size Size of relocation section
+ *
+ */
+bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset, unsigned long size, void *relSegment) {
+ Elf32_Rel *rel = NULL; //relocation entry
+
+ // Allocate memory for relocation table
+ 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(rel, size) != (ssize_t)size) {
+ seterror("Relocation table load failed.");
+ free(rel);
+ return false;
+ }
+
+ // Treat each relocation entry. Loop over all of them
+ int cnt = size / sizeof(*rel);
+
+ DBG("Loaded relocation table. %d entries. base address=%p\n", cnt, relSegment);
+
+ int a = 0;
+ unsigned int relocation = 0;
+
+ // Loop over relocation entries
+ for (int i = 0; i < cnt; i++) {
+
+ // Get the symbol this relocation entry is referring to
+ Elf32_Sym *sym = (Elf32_Sym *)(_symtab) + (REL_INDEX(rel[i].r_info));
+
+ // 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
+
+ // Act differently based on the type of relocation
+ switch (REL_TYPE(rel[i].r_info)) {
+
+ case R_ARM_ABS32:
+ 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_ABS32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
+ }
+ break;
+
+ case R_ARM_THM_CALL:
+ DBG("R_ARM_THM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
+ break;
+
+ case R_ARM_CALL:
+ DBG("R_ARM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
+ break;
+
+ case R_ARM_JUMP24:
+ 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);
+ DBG("Make sure --target1-abs is a flag to LD!\n");
+ }
+ break;
+
+ case R_ARM_V4BX:
+ DBG("R_ARM_V4BX: No relocation calculation necessary.\n");
+ break;
+
+ default:
+ seterror("Unknown relocation type %d.", REL_TYPE(rel[i].r_info));
+ free(rel);
+ return false;
+ }
+
+ }
+
+ free(rel);
+ return true;
+}
+
+bool DLObject::relocateRels(Common::SeekableReadStream* DLFile, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) {
+
+ // Loop over sections, finding relocation sections
+ for (int i = 0; i < ehdr->e_shnum; i++) {
+
+ Elf32_Shdr *curShdr = &(shdr[i]);
+
+ if ((curShdr->sh_type == SHT_REL || curShdr->sh_type == SHT_RELA) && // Check for a relocation section
+ 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
+
+ if (curShdr->sh_type == SHT_RELA) {
+ seterror("RELA entries not supported yet!\n");
+ return false;
+ }
+
+ if (!relocate(DLFile, curShdr->sh_offset, curShdr->sh_size, _segment)) {
+ return false;
+ }
+
+ }
+ }
+
+ return true;
+}
Deleted: scummvm/branches/gsoc2010-plugins/backends/plugins/arm-relocs.cpp
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/arm-relocs.cpp 2010-08-06 17:29:17 UTC (rev 51792)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/arm-relocs.cpp 2010-08-06 17:33:44 UTC (rev 51793)
@@ -1,164 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "backends/fs/ds/ds-fs.h"
-#include "elf-loader.h"
-#include "dsmain.h"
-
-#define __DEBUG_PLUGINS__
-
-#ifdef __DEBUG_PLUGINS__
-#define DBG(x,...) consolePrintf(x, ## __VA_ARGS__)
-#else
-#define DBG(x,...)
-#endif
-
-#define seterror(x,...) consolePrintf(x, ## __VA_ARGS__)
-
-/**
- * Follow the instruction of a relocation section.
- *
- * @param DLFile SeekableReadStream of File
- * @param offset Offset into the File
- * @param size Size of relocation section
- *
- */
-bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset, unsigned long size, void *relSegment) {
- Elf32_Rel *rel = NULL; //relocation entry
-
- // Allocate memory for relocation table
- 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(rel, size) != (ssize_t)size) {
- seterror("Relocation table load failed.");
- free(rel);
- return false;
- }
-
- // Treat each relocation entry. Loop over all of them
- int cnt = size / sizeof(*rel);
-
- DBG("Loaded relocation table. %d entries. base address=%p\n", cnt, relSegment);
-
- int a = 0;
- unsigned int relocation = 0;
-
- // Loop over relocation entries
- for (int i = 0; i < cnt; i++) {
-
- // Get the symbol this relocation entry is referring to
- Elf32_Sym *sym = (Elf32_Sym *)(_symtab) + (REL_INDEX(rel[i].r_info));
-
- // 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
-
- // Act differently based on the type of relocation
- switch (REL_TYPE(rel[i].r_info)) {
-
- case R_ARM_ABS32:
- 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_ABS32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
- }
- break;
-
- case R_ARM_THM_CALL:
- DBG("R_ARM_THM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
- break;
-
- case R_ARM_CALL:
- DBG("R_ARM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
- break;
-
- case R_ARM_JUMP24:
- 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);
- DBG("Make sure --target1-abs is a flag to LD!\n");
- }
- break;
-
- case R_ARM_V4BX:
- DBG("R_ARM_V4BX: No relocation calculation necessary.\n");
- break;
-
- default:
- seterror("Unknown relocation type %d.", REL_TYPE(rel[i].r_info));
- free(rel);
- return false;
- }
-
- }
-
- free(rel);
- return true;
-}
-
-bool DLObject::relocateRels(Common::SeekableReadStream* DLFile, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) {
-
- // Loop over sections, finding relocation sections
- for (int i = 0; i < ehdr->e_shnum; i++) {
-
- Elf32_Shdr *curShdr = &(shdr[i]);
-
- if ((curShdr->sh_type == SHT_REL || curShdr->sh_type == SHT_RELA) && // Check for a relocation section
- 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
-
- if (curShdr->sh_type == SHT_RELA) {
- seterror("RELA entries not supported yet!\n");
- return false;
- }
-
- if (!relocate(DLFile, curShdr->sh_offset, curShdr->sh_size, _segment)) {
- return false;
- }
-
- }
- }
-
- return true;
-}
Modified: scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h 2010-08-06 17:29:17 UTC (rev 51792)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h 2010-08-06 17:33:44 UTC (rev 51793)
@@ -88,15 +88,6 @@
};
-#define RTLD_LAZY 0
-
-extern "C" {
- void *dlopen(const char *filename, int flags);
- int dlclose(void *handle);
- const char *dlerror();
- void dlforgetsyms(void *handle);
-}
-
extern void flushDataCache();
#endif /* LOADER_H */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list