[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