Restructured Modules_LoadBuiltins to load modules in the order they are linked in.
[tpg/acess2.git] / Kernel / bin / elf.c
index 745c2c7..4bc13b1 100644 (file)
@@ -1,26 +1,14 @@
 /*\r
-Acess v0.1\r
-ELF Executable Loader Code\r
-*/\r
-#include <common.h>\r
+ * Acess v0.1\r
+ * ELF Executable Loader Code\r
+ */\r
+#define DEBUG  0\r
+#include <acess.h>\r
 #include <binary.h>\r
-#include "bin_elf.h"\r
+#include "elf.h"\r
 \r
-#define DEBUG  0\r
 #define DEBUG_WARN     1\r
 \r
-#if DEBUG\r
-# define DEBUGS(v...)  Log(v)\r
-#else\r
-# define DEBUGS(v...)\r
-# undef ENTER\r
-# undef LOG\r
-# undef LEAVE\r
-# define ENTER(...)\r
-# define LOG(...)\r
-# define LEAVE(...)\r
-#endif\r
-\r
 \r
 // === PROTOTYPES ===\r
 tBinary        *Elf_Load(int fp);\r
@@ -88,7 +76,7 @@ tBinary *Elf_Load(int fp)
        LOG("iPageCount = %i", iPageCount);\r
        \r
        // Allocate Information Structure\r
-       ret = malloc( sizeof(tBinary) + 3*sizeof(Uint)*iPageCount );\r
+       ret = malloc( sizeof(tBinary) + sizeof(tBinaryPage)*iPageCount );\r
        // Fill Info Struct\r
        ret->Entry = hdr.entrypoint;\r
        ret->Base = -1;         // Set Base to maximum value\r
@@ -118,9 +106,7 @@ tBinary *Elf_Load(int fp)
                if(phtab[i].Type != PT_LOAD)    continue;\r
                \r
                // Find Base\r
-               if(phtab[i].VAddr < ret->Base)  ret->Base = phtab[i].VAddr;
-\r
-               k = 0;\r
+               if(phtab[i].VAddr < ret->Base)  ret->Base = phtab[i].VAddr;\r
                \r
                LOG("phtab[%i] = {VAddr:0x%x,Offset:0x%x,FileSize:0x%x}",\r
                        i, phtab[i].VAddr, phtab[i].Offset, phtab[i].FileSize);\r
@@ -135,7 +121,7 @@ tBinary *Elf_Load(int fp)
                \r
                // Get Pages\r
                count = ( (phtab[i].VAddr&0xFFF) + phtab[i].FileSize + 0xFFF) >> 12;\r
-               for(;k<count;k++)\r
+               for( k = 0; k < count; k ++ )\r
                {\r
                        ret->Pages[j+k].Virtual = phtab[i].VAddr + (k<<12);\r
                        ret->Pages[j+k].Physical = phtab[i].Offset + (k<<12);   // Store the offset in the physical address\r
@@ -475,7 +461,7 @@ int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
                if( !Elf_GetSymbol((void*)base, sSymName, &val) )       // Search this binary first\r
                        if( !Binary_GetSymbol( sSymName, &val ) )\r
                                return 0;\r
-               //LOG("R_386_32 *0x%x += 0x%x('%s')", ptr, val, sSymName);\r
+               LOG("R_386_32 *0x%x += 0x%x('%s')", ptr, val, sSymName);\r
                *ptr = val + addend;\r
                break;\r
                \r
@@ -484,7 +470,7 @@ int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
                if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )\r
                        if( !Binary_GetSymbol( sSymName, &val ) )\r
                                return 0;\r
-               //LOG("R_386_PC32 *0x%x = 0x%x + 0x%x('%s') - 0x%x", ptr, *ptr, val, sSymName, (Uint)ptr );\r
+               LOG("R_386_PC32 *0x%x = 0x%x + 0x%x('%s') - 0x%x", ptr, *ptr, val, sSymName, (Uint)ptr );\r
                // TODO: Check if it needs the true value of ptr or the compiled value\r
                // NOTE: Testing using true value\r
                *ptr = val + addend - (Uint)ptr;\r
@@ -495,7 +481,7 @@ int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
                if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )\r
                        if( !Binary_GetSymbol( sSymName, &val ) )\r
                                return 0;\r
-               //LOG("R_386_GLOB_DAT *0x%x = 0x%x (%s)", ptr, val, sSymName);\r
+               LOG("R_386_GLOB_DAT *0x%x = 0x%x (%s)", ptr, val, sSymName);\r
                *ptr = val;\r
                break;\r
        \r
@@ -504,13 +490,13 @@ int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
                if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )\r
                        if( !Binary_GetSymbol( sSymName, &val ) )\r
                                return 0;\r
-               //LOG("R_386_JMP_SLOT *0x%x = 0x%x (%s)", ptr, val, sSymName);\r
+               LOG("R_386_JMP_SLOT *0x%x = 0x%x (%s)", ptr, val, sSymName);\r
                *ptr = val;\r
                break;\r
 \r
        // Base Address (B+A)\r
        case R_386_RELATIVE:\r
-               //LOG("R_386_RELATIVE *0x%x = 0x%x + 0x%x", ptr, base, addend);\r
+               LOG("R_386_RELATIVE *0x%x = 0x%x + 0x%x", ptr, base, addend);\r
                *ptr = base + addend;\r
                break;\r
                \r
@@ -553,7 +539,7 @@ int Elf_GetSymbol(void *Base, char *Name, Uint *ret)
        // Check Bucket\r
        i = pBuckets[ iNameHash ];\r
        if(symtab[i].shndx != SHN_UNDEF && strcmp(symtab[i].name, Name) == 0) {\r
-               *ret = symtab[ i ].value;\r
+               if(ret) *ret = symtab[ i ].value;\r
                return 1;\r
        }\r
        \r
@@ -562,7 +548,7 @@ int Elf_GetSymbol(void *Base, char *Name, Uint *ret)
        {\r
                i = pChains[i];\r
                if(symtab[i].shndx != SHN_UNDEF && strcmp(symtab[ i ].name, Name) == 0) {\r
-                       *ret = symtab[ i ].value;\r
+                       if(ret) *ret = symtab[ i ].value;\r
                        return 1;\r
                }\r
        }\r

UCC git Repository :: git.ucc.asn.au