[Scummvm-cvs-logs] SF.net SVN: scummvm:[52551] scummvm/branches/gsoc2010-plugins/backends/ plugins

dhewg at users.sourceforge.net dhewg at users.sourceforge.net
Sun Sep 5 14:38:58 CEST 2010


Revision: 52551
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52551&view=rev
Author:   dhewg
Date:     2010-09-05 12:38:58 +0000 (Sun, 05 Sep 2010)

Log Message:
-----------
PLUGINS: Respect the VMA when relocating.

Plugins do not have to be linked at 0x0. Some platforms have limited
relocation jump offsets, which makes 0x0 unusable.

Modified Paths:
--------------
    scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.cpp
    scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h

Modified: scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.cpp
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.cpp	2010-09-05 12:38:38 UTC (rev 52550)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.cpp	2010-09-05 12:38:58 UTC (rev 52551)
@@ -63,6 +63,22 @@
 #endif
 }
 
+DLObject::DLObject() :
+	_segment(0),
+	_symtab(0),
+	_strtab(0),
+	_symbol_cnt(0),
+	_symtab_sect(-1),
+	_dtors_start(0),
+	_dtors_end(0),
+	_segmentSize(0),
+	_segmentOffset(0) {
+}
+
+DLObject::~DLObject() {
+	unload();
+}
+
 // Expel the symbol table from memory
 void DLObject::discard_symtab() {
 	free(_symtab);
@@ -276,7 +292,7 @@
 	return true;
 }
 
-void DLObject::relocateSymbols(Elf32_Addr offset) {
+void DLObject::relocateSymbols(ptrdiff_t offset) {
 	// Loop over symbols, add relocation offset
 	Elf32_Sym *s = (Elf32_Sym *)_symtab;
 	for (int c = _symbol_cnt; c--; s++) {
@@ -318,8 +334,11 @@
 	if (ret && (loadStringTable(DLFile, shdr) == false))
 		ret = false;
 
-	if (ret)
-		relocateSymbols((Elf32_Addr)_segment);	// Offset by our segment allocated address
+	if (ret) {
+		// Offset by our segment allocated address
+		_segmentOffset = ptrdiff_t(_segment) - phdr.p_vaddr;
+		relocateSymbols(_segmentOffset);
+	}
 
 	if (ret && (relocateRels(DLFile, &ehdr, shdr) == false))
 		ret = false;

Modified: scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h	2010-09-05 12:38:38 UTC (rev 52550)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/elf-loader.h	2010-09-05 12:38:58 UTC (rev 52551)
@@ -28,6 +28,8 @@
 #ifndef ELF_LOADER_H
 #define ELF_LOADER_H
 
+#include <stddef.h>
+
 #include "backends/plugins/dynamic-plugin.h"
 #include "backends/plugins/elf32.h"
 
@@ -49,6 +51,7 @@
     void *_dtors_start, *_dtors_end;
 
     uint32 _segmentSize;
+	ptrdiff_t _segmentOffset;
 
     virtual void unload();
     virtual bool relocate(Common::SeekableReadStream* DLFile, unsigned long offset, unsigned long size, void *relSegment) = 0;
@@ -60,7 +63,7 @@
     Elf32_Shdr *loadSectionHeaders(Common::SeekableReadStream* DLFile, Elf32_Ehdr *ehdr);
     int loadSymbolTable(Common::SeekableReadStream* DLFile, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr);
     bool loadStringTable(Common::SeekableReadStream* DLFile, Elf32_Shdr *shdr);
-    virtual void relocateSymbols(Elf32_Addr offset);
+    virtual void relocateSymbols(ptrdiff_t offset);
     virtual bool relocateRels(Common::SeekableReadStream* DLFile, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) = 0;
 
 public:
@@ -69,9 +72,8 @@
     void *symbol(const char *name);
     void discard_symtab();
 
-	DLObject() : _segment(NULL), _symtab(NULL), _strtab(NULL), _symbol_cnt(0),
-				 _symtab_sect(-1), _dtors_start(NULL), _dtors_end(NULL), _segmentSize(0) {}
-	virtual ~DLObject() { unload(); }
+	DLObject();
+	virtual ~DLObject();
 };
 
 #endif /* ELF_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