x86_64 support, requiring a slight refactor to the build system.
[tpg/acess2.git] / Kernel / bin / elf.c
index 9381b5c..3209c04 100644 (file)
@@ -57,7 +57,12 @@ tBinary *Elf_Load(int fp)
        }\r
        \r
        // Read Program Header Table\r
-       phtab = malloc(sizeof(Elf32_Phdr)*hdr.phentcount);\r
+       phtab = malloc( sizeof(Elf32_Phdr) * hdr.phentcount );\r
+       if( !phtab ) {\r
+               LEAVE('n');\r
+               return NULL;\r
+       }\r
+       LOG("hdr.phoff = 0x%08x", hdr.phoff);\r
        VFS_Seek(fp, hdr.phoff, SEEK_SET);\r
        VFS_Read(fp, sizeof(Elf32_Phdr)*hdr.phentcount, phtab);\r
        \r
@@ -88,7 +93,17 @@ tBinary *Elf_Load(int fp)
        for( i = 0; i < hdr.phentcount; i++ )\r
        {\r
                 int    lastSize;\r
-               LOG("phtab[%i].Type = 0x%x", i, phtab[i].Type);\r
+               //LOG("phtab[%i].Type = 0x%x", i, phtab[i].Type);\r
+               LOG("phtab[%i] = {", i);\r
+               LOG(" .Type = 0x%08x", phtab[i].Type);\r
+               LOG(" .Offset = 0x%08x", phtab[i].Offset);\r
+               LOG(" .VAddr = 0x%08x", phtab[i].VAddr);\r
+               LOG(" .PAddr = 0x%08x", phtab[i].PAddr);\r
+               LOG(" .FileSize = 0x%08x", phtab[i].FileSize);\r
+               LOG(" .MemSize = 0x%08x", phtab[i].MemSize);\r
+               LOG(" .Flags = 0x%08x", phtab[i].Flags);\r
+               LOG(" .Align = 0x%08x", phtab[i].Align);\r
+               LOG(" }");\r
                // Get Interpreter Name\r
                if( phtab[i].Type == PT_INTERP )\r
                {\r
@@ -282,7 +297,7 @@ int Elf_Relocate(void *Base)
                                Warning("ELF", "Elf_Relocate - Multiple PT_DYNAMIC segments\n");\r
                                continue;\r
                        }\r
-                       dynamicTab = (void *) phtab[i].VAddr;\r
+                       dynamicTab = (void *) (tVAddr) phtab[i].VAddr;\r
                        j = i;  // Save Dynamic Table ID\r
                        break;\r
                }\r
@@ -311,20 +326,20 @@ int Elf_Relocate(void *Base)
                // --- Symbol Table ---\r
                case DT_SYMTAB:\r
                        dynamicTab[j].d_val += iBaseDiff;\r
-                       dynsymtab = (void*)(dynamicTab[j].d_val);\r
+                       dynsymtab = (void*) (tVAddr) dynamicTab[j].d_val;\r
                        hdr->misc.SymTable = dynamicTab[j].d_val;       // Saved in unused bytes of ident\r
                        break;\r
                \r
                // --- String Table ---\r
                case DT_STRTAB:\r
                        dynamicTab[j].d_val += iBaseDiff;\r
-                       dynstrtab = (void*)(dynamicTab[j].d_val);\r
+                       dynstrtab = (void*) (tVAddr) dynamicTab[j].d_val;\r
                        break;\r
                \r
                // --- Hash Table --\r
                case DT_HASH:\r
                        dynamicTab[j].d_val += iBaseDiff;\r
-                       iSymCount = ((Uint*)(dynamicTab[j].d_val))[1];\r
+                       iSymCount = ((Uint*)((tVAddr)dynamicTab[j].d_val))[1];\r
                        hdr->misc.HashTable = dynamicTab[j].d_val;      // Saved in unused bytes of ident\r
                        break;\r
                }\r
@@ -461,7 +476,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
@@ -470,7 +485,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
@@ -481,7 +496,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
@@ -490,13 +505,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

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