X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Fbin%2Felf.c;h=3209c044a5923ea257c832a92ac8563345d400b7;hb=a79ebcb3a2e206251f44e99376ec2ed6c2bacc63;hp=4bc13b16a29f007190712c9a5c84442ba8391665;hpb=fbb51904de075386178cc6bb14717132d3b2153d;p=tpg%2Facess2.git diff --git a/Kernel/bin/elf.c b/Kernel/bin/elf.c index 4bc13b16..3209c044 100644 --- a/Kernel/bin/elf.c +++ b/Kernel/bin/elf.c @@ -57,7 +57,12 @@ tBinary *Elf_Load(int fp) } // Read Program Header Table - phtab = malloc(sizeof(Elf32_Phdr)*hdr.phentcount); + phtab = malloc( sizeof(Elf32_Phdr) * hdr.phentcount ); + if( !phtab ) { + LEAVE('n'); + return NULL; + } + LOG("hdr.phoff = 0x%08x", hdr.phoff); VFS_Seek(fp, hdr.phoff, SEEK_SET); VFS_Read(fp, sizeof(Elf32_Phdr)*hdr.phentcount, phtab); @@ -88,7 +93,17 @@ tBinary *Elf_Load(int fp) for( i = 0; i < hdr.phentcount; i++ ) { int lastSize; - LOG("phtab[%i].Type = 0x%x", i, phtab[i].Type); + //LOG("phtab[%i].Type = 0x%x", i, phtab[i].Type); + LOG("phtab[%i] = {", i); + LOG(" .Type = 0x%08x", phtab[i].Type); + LOG(" .Offset = 0x%08x", phtab[i].Offset); + LOG(" .VAddr = 0x%08x", phtab[i].VAddr); + LOG(" .PAddr = 0x%08x", phtab[i].PAddr); + LOG(" .FileSize = 0x%08x", phtab[i].FileSize); + LOG(" .MemSize = 0x%08x", phtab[i].MemSize); + LOG(" .Flags = 0x%08x", phtab[i].Flags); + LOG(" .Align = 0x%08x", phtab[i].Align); + LOG(" }"); // Get Interpreter Name if( phtab[i].Type == PT_INTERP ) { @@ -282,7 +297,7 @@ int Elf_Relocate(void *Base) Warning("ELF", "Elf_Relocate - Multiple PT_DYNAMIC segments\n"); continue; } - dynamicTab = (void *) phtab[i].VAddr; + dynamicTab = (void *) (tVAddr) phtab[i].VAddr; j = i; // Save Dynamic Table ID break; } @@ -311,20 +326,20 @@ int Elf_Relocate(void *Base) // --- Symbol Table --- case DT_SYMTAB: dynamicTab[j].d_val += iBaseDiff; - dynsymtab = (void*)(dynamicTab[j].d_val); + dynsymtab = (void*) (tVAddr) dynamicTab[j].d_val; hdr->misc.SymTable = dynamicTab[j].d_val; // Saved in unused bytes of ident break; // --- String Table --- case DT_STRTAB: dynamicTab[j].d_val += iBaseDiff; - dynstrtab = (void*)(dynamicTab[j].d_val); + dynstrtab = (void*) (tVAddr) dynamicTab[j].d_val; break; // --- Hash Table -- case DT_HASH: dynamicTab[j].d_val += iBaseDiff; - iSymCount = ((Uint*)(dynamicTab[j].d_val))[1]; + iSymCount = ((Uint*)((tVAddr)dynamicTab[j].d_val))[1]; hdr->misc.HashTable = dynamicTab[j].d_val; // Saved in unused bytes of ident break; }