#include #include #include #include static int __dlerror; // the linker inserts this id behind the idString static char id[3] = {0x0b, 0xeb, 0xb0}; void *dlopen (__const char *__file, int __mode) { __dlerror = 0; struct Library * lib = OldOpenLibrary(__file); if (lib) { // only one exported function -> neg size == 32, magic marker "bebb0" behind id string! if (32 != lib->lib_NegSize || !lib->lib_IdString || memcmp(id, lib->lib_IdString + strlen(lib->lib_IdString) + 1, 3)) { #ifndef __KICK13__ Printf("%s is not suitable for dlopen", __file); #endif CloseLibrary(lib); lib = 0; __dlerror = 2; } } else { __dlerror = 1; } return lib; } /* Unmap and close a shared object opened by `dlopen'. The handle cannot be used again after calling `dlclose'. */ int dlclose (void *__handle) { if (!__handle) return -1; CloseLibrary((struct Library *)__handle); return 0; } /* Find the run-time address in the shared object HANDLE refers to of the symbol called NAME with VERSION. */ void *dlvsym (void *__restrict __handle, __const char *__restrict __name, __const char *__restrict __version) { if (!__handle) return 0; void * r = 0; static void const * p[3]; p[0] = __name; p[1] = &r; register void * a0 asm("a0") = p; register struct Library * a6 asm("a6") = (struct Library *)__handle; asm volatile("jsr (-30,a6)" : "=m"(r) : "r"(a0), "r"(a6)); return r; } /* Find the run-time address in the shared object HANDLE refers to of the symbol called NAME. */ void *dlsym (void *__restrict __handle, __const char *__restrict __name) { return dlvsym(__handle, __name, 0); } char const * dlerror() { switch (__dlerror) { case 1: return "shared library not found"; case 2: return "invalid library found"; } return ""; }