X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fld-acess.so_src%2Floadlib.c;h=31dcbd8acfa23840d954df1e2b555c7a78fee44f;hb=7f2068235fabc311332962711cd3220ce8ee2638;hp=53073019330baac99c440289cd7c442a2165743d;hpb=b806b8f55067584cb90fe20277235369a1111c66;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 53073019..31dcbd8a 100644 --- a/Usermode/Libraries/ld-acess.so_src/loadlib.c +++ b/Usermode/Libraries/ld-acess.so_src/loadlib.c @@ -4,6 +4,7 @@ */ #include "common.h" #include +#include #include #define DEBUG 0 @@ -14,8 +15,7 @@ # define DEBUGS(v...) #endif -// === PROTOTYPES === -void *IsFileLoaded(const char *file); +#define MAX_QUEUED_ENTRYPOINTS 8 // === IMPORTS === extern const struct { @@ -26,13 +26,50 @@ extern const int ciNumLocalExports; extern char **gEnvP; extern char gLinkedBase[]; +// === TYPES === +typedef void tLibEntry(void *, int, char *[], char**); + +// === PROTOTYPES === +void *IsFileLoaded(const char *file); + // === GLOABLS === tLoadedLib gLoadedLibraries[MAX_LOADED_LIBRARIES]; char gsLoadedStrings[MAX_STRINGS_BYTES]; char *gsNextAvailString = gsLoadedStrings; +struct sQueuedEntry { + void *Base; + tLibEntry *Entry; +} gaQueuedEntrypoints[MAX_QUEUED_ENTRYPOINTS]; + int giNumQueuedEntrypoints; //tLoadLib *gpLoadedLibraries = NULL; // === CODE === +void ldacess_DumpLoadedLibraries(void) +{ + for( int i = 0; i < MAX_LOADED_LIBRARIES; i ++ ) + { + if(gLoadedLibraries[i].Base == 0) break; // Last entry has Base set to NULL + _SysDebug("%p: %s", + gLoadedLibraries[i].Base, + gLoadedLibraries[i].Name + ); + } +} + +/** + * \brief Call queued up entry points (after relocations completed) + */ +void CallQueuedEntrypoints(char **EnvP) +{ + while( giNumQueuedEntrypoints ) + { + giNumQueuedEntrypoints --; + const struct sQueuedEntry *qe = &gaQueuedEntrypoints[giNumQueuedEntrypoints]; + DEBUGS("Calling EP %p for %p", qe->Entry, qe->Base); + qe->Entry(qe->Base, 0, NULL, EnvP); + } +} + const char *FindLibrary(char *DestBuf, const char *SoName, const char *ExtraSearchDir) { // -- #1: Executable Specified @@ -60,14 +97,12 @@ const char *FindLibrary(char *DestBuf, const char *SoName, const char *ExtraSear void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) { char sTmpName[1024]; - const char *filename; void *base; - void (*fEntry)(void *, int, char *[], char**); DEBUGS("LoadLibrary: (SoName='%s', SearchDir='%s', envp=%p)", SoName, SearchDir, envp); // Create Temp Name - filename = FindLibrary(sTmpName, SoName, SearchDir); + const char *filename = FindLibrary(sTmpName, SoName, SearchDir); if(filename == NULL) { DEBUGS("LoadLibrary: RETURN 0"); return 0; @@ -79,6 +114,7 @@ void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) DEBUGS(" LoadLibrary: SysLoadBin()"); // Load Library + tLibEntry *fEntry; base = _SysLoadBin(filename, (void**)&fEntry); if(!base) { DEBUGS("LoadLibrary: RETURN 0"); @@ -94,10 +130,17 @@ void *LoadLibrary(const char *SoName, const char *SearchDir, char **envp) } // Call Entrypoint - DEBUGS(" LoadLibrary: '%s' Entry %p", SoName, fEntry); - fEntry(base, 0, NULL, gEnvP); + // - TODO: Queue entrypoint calls + if( giNumQueuedEntrypoints >= MAX_QUEUED_ENTRYPOINTS ) { + SysDebug("ERROR - Maximum number of queued entrypoints exceeded on %p '%s'", + base, SoName); + return 0; + } + gaQueuedEntrypoints[giNumQueuedEntrypoints].Base = base; + gaQueuedEntrypoints[giNumQueuedEntrypoints].Entry = fEntry; + giNumQueuedEntrypoints ++; - DEBUGS("LoadLibrary: RETURN 1"); + DEBUGS("LoadLibrary: RETURN success"); return base; } @@ -211,34 +254,50 @@ void Unload(void *Base) \fn Uint GetSymbol(const char *name) \brief Gets a symbol value from a loaded library */ -int GetSymbol(const char *name, void **Value, size_t *Size) +int GetSymbol(const char *name, void **Value, size_t *Size, void *IgnoreBase) { - int i; - - //SysDebug("ciNumLocalExports = %i", ciNumLocalExports); - for(i=0;i