# define DEBUGS(v...) \r
#endif\r
\r
+// === CONSTANTS ===\r
+#define MAX_LOADED_LIBRARIES 64\r
+#define MAX_STRINGS_BYTES 4096\r
+#define SYSTEM_LIB_DIR "/Acess/Libs/"\r
+\r
// === PROTOTYPES ===\r
Uint IsFileLoaded(char *file);
int GetSymbolFromBase(Uint base, char *name, Uint *ret);\r
\r
// === GLOABLS ===\r
-#define MAX_LOADED_LIBRARIES 64\r
-#define MAX_STRINGS_BYTES 4096\r
struct {\r
Uint Base;\r
char *Name;\r
//tLoadLib *gpLoadedLibraries = NULL;\r
\r
// === CODE ===\r
-Uint LoadLibrary(char *filename, char *SearchDir, char **envp)\r
+char *FindLibrary(char *DestBuf, char *SoName, char *ExtraSearchDir)\r
+{ \r
+ // -- #1: Executable Specified\r
+ if(ExtraSearchDir)\r
+ {\r
+ strcpy(DestBuf, ExtraSearchDir);\r
+ strcat(DestBuf, "/");\r
+ strcat(DestBuf, SoName);\r
+ if(file_exists(DestBuf)) return DestBuf;\r
+ }\r
+ \r
+ // -- #2: System\r
+ strcpy(DestBuf, SYSTEM_LIB_DIR);\r
+ strcat(DestBuf, SoName);\r
+ if(file_exists(DestBuf)) return DestBuf;\r
+ \r
+ // -- #3: Current Directory\r
+ if(file_exists(SoName)) return SoName;\r
+ \r
+ return NULL;\r
+}\r
+\r
+/**\r
+ */\r
+Uint LoadLibrary(char *SoName, char *SearchDir, char **envp)\r
{\r
- char sTmpName[1024] = "/Acess/Libs/";\r
+ char sTmpName[1024];\r
+ char *filename;\r
Uint iArg;\r
void (*fEntry)(int, int, char *[], char**);\r
\r
DEBUGS("LoadLibrary: (filename='%s', envp=0x%x)\n", filename, envp);\r
\r
// Create Temp Name\r
- strcpy(&sTmpName[12], filename);\r
- DEBUGS(" LoadLibrary: sTmpName='%s'\n", sTmpName);\r
+ filename = FindLibrary(sTmpName, SoName, SearchDir);\r
+ DEBUGS(" LoadLibrary: filename='%s'\n", filename);\r
\r
- if( (iArg = IsFileLoaded(sTmpName)) )\r
+ if( (iArg = IsFileLoaded(filename)) )\r
return iArg;\r
\r
// Load Library\r
- iArg = SysLoadBin(sTmpName, (Uint*)&fEntry);\r
+ iArg = SysLoadBin(filename, (Uint*)&fEntry);\r
if(iArg == 0) {\r
DEBUGS("LoadLibrary: RETURN 0\n");\r
return 0;\r
DEBUGS(" LoadLibrary: iArg=0x%x, iEntry=0x%x\n", iArg, fEntry);\r
\r
// Load Symbols\r
- fEntry = (void*)DoRelocate( iArg, envp, sTmpName );\r
+ fEntry = (void*)DoRelocate( iArg, envp, filename );\r
\r
// Call Entrypoint\r
- DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", filename, fEntry);\r
+ DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", SoName, fEntry);\r
fEntry(iArg, 0, NULL, envp);\r
\r
DEBUGS("LoadLibrary: RETURN 1\n");\r
Uint IsFileLoaded(char *file)\r
{\r
int i;\r
- DEBUGS("IsFileLoaded: (file='%s')\n", file);\r
+ DEBUGS("IsFileLoaded: (file='%s')", file);\r
for( i = 0; i < MAX_LOADED_LIBRARIES; i++ )\r
{\r
if(gLoadedLibraries[i].Base == 0) break; // Last entry has Base set to NULL\r
+ DEBUGS(" strcmp('%s', '%s')", gLoadedLibraries[i].Name, file);\r
if(strcmp(gLoadedLibraries[i].Name, file) == 0) {\r
- DEBUGS("IsFileLoaded: Found %i (0x%x)\n", i, gLoadedLibraries[i].Base);\r
+ DEBUGS("IsFileLoaded: Found %i (0x%x)", i, gLoadedLibraries[i].Base);\r
return gLoadedLibraries[i].Base;\r
}\r
}\r
- DEBUGS("IsFileLoaded: Not Found\n");\r
+ DEBUGS("IsFileLoaded: Not Found");\r
return 0;\r
}\r
\r
Uint ret;\r
for(i=0;i<sizeof(gLoadedLibraries)/sizeof(gLoadedLibraries[0]);i++)\r
{\r
- if(gLoadedLibraries[i].Base == 0) break;
-// SysDebug(" GetSymbol: Trying 0x%x\n", gLoadedLibraries[i]);
+ if(gLoadedLibraries[i].Base == 0) break;\r
+
+ //SysDebug(" GetSymbol: Trying 0x%x, '%s'\n",\r
+ // gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);
if(GetSymbolFromBase(gLoadedLibraries[i].Base, name, &ret)) return ret;\r
}\r
SysDebug("GetSymbol: === Symbol '%s' not found ===\n", name);\r