Implemented rel building and loading

This commit is contained in:
dbalatoni13 2025-04-06 06:30:30 +02:00
parent 3b31d9fcfc
commit d3b45cf2b4
14 changed files with 1045 additions and 922 deletions

View file

@ -5,6 +5,10 @@
typedef s32 (*DLLProlog)(void);
typedef void (*DLLEpilog)(void);
#ifdef TARGET_PC
typedef void (*DLLObjectSetup)(void);
#endif
omDllData *omDLLinfoTbl[OM_DLL_MAX];
static FileListEntry *omDLLFileList;
@ -31,6 +35,10 @@ s32 omDLLStart(s16 overlay, s16 flag)
dllno = omDLLSearch(overlay);
if(dllno >= 0 && !flag) {
omDllData *dll = omDLLinfoTbl[dllno];
#ifdef TARGET_PC
// TODO PC
OSReport("objdll>Already Loaded %s\n", dll->name);
#else
OSReport("objdll>Already Loaded %s(%08x %08x)\n", dll->name, dll->module, dll->bss);
omDLLInfoDump(&dll->module->info);
@ -38,6 +46,7 @@ s32 omDLLStart(s16 overlay, s16 flag)
memset(dll->bss, 0, dll->module->bssSize);
HuMemDCFlushAll();
dll->ret = ((DLLProlog)dll->module->prolog)();
#endif
OSReport("objdll> %s prolog end\n", dll->name);
return dllno;
} else {
@ -80,8 +89,10 @@ void omDLLEnd(s16 dllno, s16 flag)
} else {
omDllData *dll;
dll = omDLLinfoTbl[dllno];
#ifdef __MWERKS__
OSReport("objdll>Call Epilog\n");
((DLLEpilog)dll->module->epilog)();
#endif
OSReport("objdll>End DLL stayed:%s\n", omDLLinfoTbl[dllno]->name);
}
OSReport("objdll>End DLL finish\n");
@ -95,6 +106,12 @@ omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag)
dll = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(omDllData));
*dll_ptr = dll;
dll->name = dllFile->name;
#ifdef _WIN32
dll->hModule = LoadLibrary(dllFile->name);
if (dll->hModule == NULL) {
OSReport("objdll>++++++++++++++++ DLL Link Failed\n");
}
#else
dll->module = HuDvdDataReadDirect(dllFile->name, HEAP_SYSTEM);
dll->bss = HuMemDirectMalloc(HEAP_SYSTEM, dll->module->bssSize);
if(OSLink(&dll->module->info, dll->bss) != TRUE) {
@ -103,9 +120,17 @@ omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag)
omDLLInfoDump(&dll->module->info);
omDLLHeaderDump(dll->module);
OSReport("objdll>LinkOK %08x %08x\n", dll->module, dll->bss);
#endif
if(flag == 1) {
OSReport("objdll> %s prolog start\n", dllFile->name);
#ifdef _WIN32
{
DLLObjectSetup objectSetup = (DLLObjectSetup)GetProcAddress(dll->hModule, "ObjectSetup");
objectSetup();
}
#else
dll->ret = ((DLLProlog)dll->module->prolog)();
#endif
OSReport("objdll> %s prolog end\n", dllFile->name);
}
return dll;
@ -114,6 +139,9 @@ omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag)
void omDLLUnlink(omDllData *dll_ptr, s16 flag)
{
OSReport("odjdll>Unlink DLL:%s\n", dll_ptr->name);
#ifdef _WIN32
FreeLibrary(dll_ptr->hModule);
#else
if(flag == 1) {
OSReport("objdll>Unlink DLL epilog\n");
((DLLEpilog)dll_ptr->module->epilog)();
@ -124,6 +152,7 @@ void omDLLUnlink(omDllData *dll_ptr, s16 flag)
}
HuMemDirectFree(dll_ptr->bss);
HuMemDirectFree(dll_ptr->module);
#endif
HuMemDirectFree(dll_ptr);
}
@ -169,4 +198,4 @@ void omDLLHeaderDump(OSModuleHeader *module)
OSReport(" epilog func:0x%08x\n", module->epilog);
OSReport(" unresolved func:0x%08x\n", module->unresolved);
OSReport("================================\n");
}
}