AcessOS 1 - Dynamic Loader\r
By thePowersGang\r
*/\r
+#include <stdint.h>\r
#include "common.h"\r
\r
// === PROTOTYPES ===\r
- int DoRelocate( Uint base, char **envp, char *Filename );\r
- int CallUser(Uint entry, Uint SP);\r
- int ElfRelocate(void *Base, char *envp[], char *Filename);\r
- int PE_Relocate(void *Base, char *envp[], char *Filename);\r
+void *DoRelocate(void *base, char **envp, const char *Filename);\r
+ int CallUser(void *Entry, void *SP);\r
+void *ElfRelocate(void *Base, char **envp, const char *Filename);\r
+void *PE_Relocate(void *Base, char **envp, const char *Filename);\r
\r
// === Imports ===\r
extern void gLinkedBase;\r
+extern tLoadedLib gLoadedLibraries[];\r
\r
// === CODE ===\r
/**\r
\brief Library entry point\r
\note This is the entrypoint for the library\r
*/\r
-int SoMain(Uint base, int arg1)\r
+void *SoMain(void *base)\r
{\r
- int ret;\r
- \r
- //SysDebug("SoMain: base = 0x%x", base);\r
- //SysDebug("SoMain: arg1 = 0x%x", arg1);\r
+ void *ret;\r
\r
// - Assume that the file pointer will be less than 4096\r
- if(base < 0x1000) {\r
+ if((intptr_t)base < 0x1000) {\r
SysDebug("ld-acess - SoMain: Passed file pointer %i\n", base);\r
- SysExit();\r
+ _exit(-1);\r
for(;;);\r
}\r
// Check if we are being called directly\r
- if(base == (Uint)&gLinkedBase) {\r
+ if(base == &gLinkedBase) {\r
SysDebug("ld-acess should not be directly called\n");\r
- SysExit();\r
+ _exit(1);\r
for(;;);\r
}\r
+\r
+ gLoadedLibraries[0].Base = &gLinkedBase;\r
+ // 'libld-acess.so' because that is what applications link against\r
+ gLoadedLibraries[0].Name = "/Acess/Libs/libld-acess.so";\r
\r
// Otherwise do relocations\r
//ret = DoRelocate( base, envp, "Executable" );\r
ret = DoRelocate( base, NULL, "Executable" );\r
if( ret == 0 ) {\r
SysDebug("ld-acess - SoMain: Relocate failed, base=0x%x\n", base);\r
- SysExit();\r
+ _exit(-1);\r
for(;;);\r
}\r
- \r
- // And call user\r
- //SysDebug("Calling User at 0x%x\n", ret);\r
- CallUser( ret, (Uint)&arg1 );\r
- \r
- return 0;\r
+\r
+ SysDebug("ld-acess - SoMain: ret = %p", ret); \r
+ return ret;\r
}\r
\r
/**\r
- \fn int DoRelocate(Uint base, char **envp)\r
+ \fn int DoRelocate(void *base, char **envp)\r
\brief Relocates an in-memory image\r
*/\r
-int DoRelocate( Uint base, char **envp, char *Filename )\r
+void *DoRelocate(void *base, char **envp, const char *Filename)\r
{\r
+ Uint8 *hdr = base;\r
// Load Executable\r
- if(*(Uint*)base == (0x7F|('E'<<8)|('L'<<16)|('F'<<24)))\r
- return ElfRelocate((void*)base, envp, Filename);\r
- if(*(Uint16*)base == ('M'|('Z'<<8)))\r
- return PE_Relocate((void*)base, envp, Filename);\r
+ if(memcmp(base, "\x7F""ELF", 4) == 0)\r
+ return ElfRelocate(base, envp, Filename);\r
+ if(hdr[0] == 0x7F && hdr[1] == 'E' && hdr[2] == 'L' && hdr[3] == 'F')\r
+ return ElfRelocate(base, envp, Filename);\r
+\r
+ if(hdr[0] == 'M' && hdr[1] == 'Z')\r
+ return PE_Relocate(base, envp, Filename);\r
\r
SysDebug("ld-acess - DoRelocate: Unkown file format '0x%x 0x%x 0x%x 0x%x'\n",\r
- *(Uint8*)(base), *(Uint8*)(base+1), *(Uint8*)(base+2), *(Uint8*)(base+3) );\r
+ hdr[0], hdr[1], hdr[2], hdr[3] );\r
SysDebug("ld-acess - DoRelocate: File '%s'\n", Filename);\r
- SysExit();\r
+ _exit(-1);\r
for(;;);\r
}\r
\r
/**\r
\fn int CallUser(Uint entry, Uint sp)\r
*/\r
-int CallUser(Uint entry, Uint sp)\r
+int CallUser(void *entry, void *sp)\r
{\r
- //SysDebug("CallUser: (entry=0x%x, sp=0x%x)", entry, sp);\r
- *(Uint*)(sp-4) = 0; // Clear return address\r
+ #if ARCHDIR_IS_x86_64\r
+ ((void **)sp)[-1] = 0; // Clear return address\r
+ __asm__ __volatile__ (\r
+ "mov %%rax, %%rsp;\n\t"\r
+ "jmp *%%rcx"\r
+ : : "a"(sp), "c"(entry));\r
+ #elif ARCHDIR_IS_x86\r
+ ((void **)sp)[-1] = 0; // Clear return address\r
__asm__ __volatile__ (\r
"mov %%eax, %%esp;\n\t"\r
"jmp *%%ecx"\r
: : "a"(sp), "c"(entry));\r
+ #endif\r
for(;;);\r
}\r