X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fld-acess.so_src%2Floadlib.c;h=53073019330baac99c440289cd7c442a2165743d;hb=b806b8f55067584cb90fe20277235369a1111c66;hp=182109bf814355f49e8be4a354be110c7b647c5f;hpb=c43c05ef3234d6118ce601d299df60383d54ac7b;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 182109bf..53073019 100644 --- a/Usermode/Libraries/ld-acess.so_src/loadlib.c +++ b/Usermode/Libraries/ld-acess.so_src/loadlib.c @@ -4,8 +4,9 @@ */ #include "common.h" #include +#include -#define DEBUG 1 +#define DEBUG 0 #if DEBUG # define DEBUGS(v...) SysDebug(v) @@ -15,7 +16,6 @@ // === PROTOTYPES === void *IsFileLoaded(const char *file); - int GetSymbolFromBase(void *base, const char *name, void **ret); // === IMPORTS === extern const struct { @@ -23,6 +23,8 @@ extern const struct { char *Name; } caLocalExports[]; extern const int ciNumLocalExports; +extern char **gEnvP; +extern char gLinkedBase[]; // === GLOABLS === tLoadedLib gLoadedLibraries[MAX_LOADED_LIBRARIES]; @@ -77,7 +79,7 @@ void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) DEBUGS(" LoadLibrary: SysLoadBin()"); // Load Library - base = SysLoadBin(filename, (void**)&fEntry); + base = _SysLoadBin(filename, (void**)&fEntry); if(!base) { DEBUGS("LoadLibrary: RETURN 0"); return 0; @@ -87,10 +89,13 @@ void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) // Load Symbols fEntry = DoRelocate( base, envp, filename ); + if( !fEntry ) { + return 0; + } // Call Entrypoint DEBUGS(" LoadLibrary: '%s' Entry %p", SoName, fEntry); - fEntry(base, 0, NULL, envp); + fEntry(base, 0, NULL, gEnvP); DEBUGS("LoadLibrary: RETURN 1"); return base; @@ -104,6 +109,15 @@ void *IsFileLoaded(const char *file) { int i; DEBUGS("IsFileLoaded: (file='%s')", file); + + // Applications link against either libld-acess.so or ld-acess.so + if( strcmp(file, "/Acess/Libs/libld-acess.so") == 0 + || strcmp(file, "/Acess/Libs/ld-acess.so") == 0 ) + { + DEBUGS("IsFileLoaded: Found local (%p)", &gLinkedBase); + return &gLinkedBase; + } + for( i = 0; i < MAX_LOADED_LIBRARIES; i++ ) { if(gLoadedLibraries[i].Base == 0) break; // Last entry has Base set to NULL @@ -169,7 +183,7 @@ void Unload(void *Base) if(id == MAX_LOADED_LIBRARIES) return; // Unload Binary - SysUnloadBin( Base ); + _SysUnloadBin( Base ); // Save String Pointer str = gLoadedLibraries[id].Name; @@ -197,26 +211,31 @@ void Unload(void *Base) \fn Uint GetSymbol(const char *name) \brief Gets a symbol value from a loaded library */ -void *GetSymbol(const char *name) +int GetSymbol(const char *name, void **Value, size_t *Size) { int i; - void *ret; //SysDebug("ciNumLocalExports = %i", ciNumLocalExports); for(i=0;i