X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fld-acess.so_src%2Floadlib.c;h=3f8e674260b3a988554a9ae724d216b75c1e57a5;hb=2fcb3775f3afee7bfa9aa3cbb6aea3c6c3426e64;hp=9a1bc10d63a03463b0ade4b694a39e919990092c;hpb=a743018b19b089137e406de0a682856dc1be61ff;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/ld-acess.so_src/loadlib.c b/Usermode/Libraries/ld-acess.so_src/loadlib.c index 9a1bc10d..3f8e6742 100644 --- a/Usermode/Libraries/ld-acess.so_src/loadlib.c +++ b/Usermode/Libraries/ld-acess.so_src/loadlib.c @@ -3,8 +3,9 @@ By thePowersGang */ #include "common.h" +#include -#define DEBUG 1 +#define DEBUG 0 #if DEBUG # define DEBUGS(v...) SysDebug(v) @@ -14,7 +15,7 @@ // === PROTOTYPES === void *IsFileLoaded(const char *file); - int GetSymbolFromBase(void *base, const char *name, void **ret); + int GetSymbolFromBase(void *base, const char *name, void **ret, size_t *size); // === IMPORTS === extern const struct { @@ -22,6 +23,7 @@ extern const struct { char *Name; } caLocalExports[]; extern const int ciNumLocalExports; +extern char **gEnvP; // === GLOABLS === tLoadedLib gLoadedLibraries[MAX_LOADED_LIBRARIES]; @@ -61,7 +63,7 @@ void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) void *base; void (*fEntry)(void *, int, char *[], char**); - DEBUGS("LoadLibrary: (SoName='%s', SearchDir='%s', envp=0x%x)", SoName, SearchDir, envp); + DEBUGS("LoadLibrary: (SoName='%s', SearchDir='%s', envp=%p)", SoName, SearchDir, envp); // Create Temp Name filename = FindLibrary(sTmpName, SoName, SearchDir); @@ -82,14 +84,14 @@ void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) return 0; } - DEBUGS(" LoadLibrary: iArg=%p, iEntry=0x%x", base, fEntry); + DEBUGS(" LoadLibrary: iArg=%p, fEntry=%p", base, fEntry); // Load Symbols fEntry = DoRelocate( base, envp, filename ); // Call Entrypoint - DEBUGS(" LoadLibrary: '%s' Entry 0x%x", SoName, fEntry); - fEntry(base, 0, NULL, envp); + DEBUGS(" LoadLibrary: '%s' Entry %p", SoName, fEntry); + fEntry(base, 0, NULL, gEnvP); DEBUGS("LoadLibrary: RETURN 1"); return base; @@ -108,7 +110,7 @@ void *IsFileLoaded(const char *file) if(gLoadedLibraries[i].Base == 0) break; // Last entry has Base set to NULL DEBUGS(" strcmp('%s', '%s')", gLoadedLibraries[i].Name, file); if(strcmp(gLoadedLibraries[i].Name, file) == 0) { - DEBUGS("IsFileLoaded: Found %i (0x%x)", i, gLoadedLibraries[i].Base); + DEBUGS("IsFileLoaded: Found %i (%p)", i, gLoadedLibraries[i].Base); return gLoadedLibraries[i].Base; } } @@ -125,7 +127,7 @@ void AddLoaded(const char *File, void *base) int i, length; char *name = gsNextAvailString; - DEBUGS("AddLoaded: (File='%s', base=0x%x)", File, base); + DEBUGS("AddLoaded: (File='%s', base=%p)", File, base); // Find a free slot for( i = 0; i < MAX_LOADED_LIBRARIES; i ++ ) @@ -149,7 +151,7 @@ void AddLoaded(const char *File, void *base) strcpy(name, File); gLoadedLibraries[i].Name = name; gsNextAvailString = &name[length+1]; - DEBUGS("'%s' (0x%x) loaded as %i", name, base, i); + DEBUGS("'%s' (%p) loaded as %i", name, base, i); return; } @@ -196,7 +198,7 @@ void Unload(void *Base) \fn Uint GetSymbol(const char *name) \brief Gets a symbol value from a loaded library */ -void *GetSymbol(const char *name) +void *GetSymbol(const char *name, size_t *Size) { int i; void *ret; @@ -215,7 +217,7 @@ void *GetSymbol(const char *name) //SysDebug(" GetSymbol: Trying 0x%x, '%s'", // gLoadedLibraries[i].Base, gLoadedLibraries[i].Name); - if(GetSymbolFromBase(gLoadedLibraries[i].Base, name, &ret)) return ret; + if(GetSymbolFromBase(gLoadedLibraries[i].Base, name, &ret, Size)) return ret; } SysDebug("GetSymbol: === Symbol '%s' not found ===", name); return 0; @@ -225,13 +227,15 @@ void *GetSymbol(const char *name) \fn int GetSymbolFromBase(Uint base, char *name, Uint *ret) \breif Gets a symbol from a specified library */ -int GetSymbolFromBase(void *base, const char *name, void **ret) +int GetSymbolFromBase(void *base, const char *name, void **ret, size_t *Size) { - if(*(Uint32*)base == (0x7F|('E'<<8)|('L'<<16)|('F'<<24))) - return ElfGetSymbol(base, name, ret); - if(*(Uint16*)base == ('M'|('Z'<<8))) - return PE_GetSymbol(base, name, ret); - SysDebug("Unknown type at %p", base); + uint8_t *hdr = base; + if(hdr[0] == 0x7F && hdr[1] == 'E' && hdr[2] == 'L' && hdr[3] == 'F') + return ElfGetSymbol(base, name, ret, Size); + if(hdr[0] == 'M' && hdr[1] == 'Z') + return PE_GetSymbol(base, name, ret, Size); + SysDebug("Unknown type at %p (%02x %02x %02x %02x)", base, + hdr[0], hdr[1], hdr[2], hdr[3]); return 0; }