[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