2 AcessOS 1 - Dynamic Loader
\r
7 // === PROTOTYPES ===
\r
8 int DoRelocate( Uint base, char **envp, char *Filename );
\r
9 int CallUser(Uint entry, Uint SP);
\r
10 int ElfRelocate(void *Base, char *envp[], char *Filename);
\r
11 int PE_Relocate(void *Base, char *envp[], char *Filename);
\r
14 extern void gLinkedBase;
\r
15 extern tLoadedLib gLoadedLibraries[];
\r
19 \fn int SoMain(Uint base, int argc, char *argv[], char **envp)
\r
20 \brief Library entry point
\r
21 \note This is the entrypoint for the library
\r
23 int SoMain(Uint base, int arg1)
\r
27 // - Assume that the file pointer will be less than 4096
\r
29 SysDebug("ld-acess - SoMain: Passed file pointer %i\n", base);
\r
33 // Check if we are being called directly
\r
34 if(base == (Uint)&gLinkedBase) {
\r
35 SysDebug("ld-acess should not be directly called\n");
\r
40 gLoadedLibraries[0].Base = (Uint)&gLinkedBase;
\r
41 gLoadedLibraries[0].Name = "/Acess/Libs/libld-acess.so";
\r
43 // Otherwise do relocations
\r
44 //ret = DoRelocate( base, envp, "Executable" );
\r
45 ret = DoRelocate( base, NULL, "Executable" );
\r
47 SysDebug("ld-acess - SoMain: Relocate failed, base=0x%x\n", base);
\r
53 //SysDebug("Calling User at 0x%x\n", ret);
\r
54 CallUser( ret, (Uint)&arg1 );
\r
60 \fn int DoRelocate(Uint base, char **envp)
\r
61 \brief Relocates an in-memory image
\r
63 int DoRelocate( Uint base, char **envp, char *Filename )
\r
66 if(*(Uint*)base == (0x7F|('E'<<8)|('L'<<16)|('F'<<24)))
\r
67 return ElfRelocate((void*)base, envp, Filename);
\r
68 if(*(Uint16*)base == ('M'|('Z'<<8)))
\r
69 return PE_Relocate((void*)base, envp, Filename);
\r
71 SysDebug("ld-acess - DoRelocate: Unkown file format '0x%x 0x%x 0x%x 0x%x'\n",
\r
72 *(Uint8*)(base), *(Uint8*)(base+1), *(Uint8*)(base+2), *(Uint8*)(base+3) );
\r
73 SysDebug("ld-acess - DoRelocate: File '%s'\n", Filename);
\r
79 \fn int CallUser(Uint entry, Uint sp)
\r
81 int CallUser(Uint entry, Uint sp)
\r
83 //SysDebug("CallUser: (entry=0x%x, sp=0x%x)", entry, sp);
\r
84 *(Uint*)(sp-4) = 0; // Clear return address
\r
85 __asm__ __volatile__ (
\r
86 "mov %%eax, %%esp;\n\t"
\r
88 : : "a"(sp), "c"(entry));
\r