AxWin2 - Huge changes, getting to the working point
[tpg/acess2.git] / AcessNative / ld-acess_src / elf.c
index a79b591..daea044 100644 (file)
 #endif\r
 \r
 // === PROTOTYPES ===\r
-void   *Elf_Load(FILE *FP);\r
+void   *Elf_Load(int FD);\r
 uintptr_t      Elf_Relocate(void *Base);\r
  int   Elf_GetSymbol(void *Base, char *Name, uintptr_t *ret);\r
  int   Elf_Int_DoRelocate(uint32_t r_info, uint32_t *ptr, uint32_t addend, Elf32_Sym *symtab, void *Base);\r
 uint32_t       Elf_Int_HashString(char *str);\r
 \r
 // === CODE ===\r
-void *Elf_Load(FILE *FP)\r
+void *Elf_Load(int FD)\r
 {\r
        Elf32_Ehdr      hdr;\r
        Elf32_Phdr      *phtab;\r
@@ -46,10 +46,10 @@ void *Elf_Load(FILE *FP)
        uint32_t        addr;\r
        uint32_t        baseDiff = 0;\r
        \r
-       ENTER("pFP", FP);\r
+       ENTER("iFD", FD);\r
        \r
        // Read ELF Header\r
-       fread(&hdr, sizeof(hdr), 1, FP);\r
+       acess_read(FD, sizeof(hdr), &hdr);\r
        \r
        // Check the file type\r
        if(hdr.ident[0] != 0x7F || hdr.ident[1] != 'E' || hdr.ident[2] != 'L' || hdr.ident[3] != 'F') {\r
@@ -74,8 +74,8 @@ void *Elf_Load(FILE *FP)
                return NULL;\r
        }\r
        LOG("hdr.phoff = 0x%08x\n", hdr.phoff);\r
-       fseek(FP, hdr.phoff, SEEK_SET);\r
-       fread(phtab, sizeof(Elf32_Phdr), hdr.phentcount, FP);\r
+       acess_seek(FD, hdr.phoff, ACESS_SEEK_SET);\r
+       acess_read(FD, sizeof(Elf32_Phdr) * hdr.phentcount, phtab);\r
        \r
        // Count Pages\r
        iPageCount = 0;\r
@@ -108,8 +108,8 @@ void *Elf_Load(FILE *FP)
                        continue;\r
                if( phtab[i].VAddr < base )\r
                        base = phtab[i].VAddr;\r
-               if( phtab[i].VAddr > max )\r
-                       max = phtab[i].VAddr;\r
+               if( phtab[i].VAddr + phtab[i].MemSize > max )\r
+                       max = phtab[i].VAddr + phtab[i].MemSize;\r
        }\r
 \r
        LOG("base = %08x, max = %08x\n", base, max);\r
@@ -143,8 +143,8 @@ void *Elf_Load(FILE *FP)
                        char *tmp;\r
                        //if(ret->Interpreter)  continue;\r
                        tmp = malloc(phtab[i].FileSize);\r
-                       fseek(FP, phtab[i].Offset, SEEK_SET);\r
-                       fread(tmp, phtab[i].FileSize, 1, FP);\r
+                       acess_seek(FD, phtab[i].Offset, ACESS_SEEK_SET);\r
+                       acess_read(FD, phtab[i].FileSize, tmp);\r
                        //ret->Interpreter = Binary_RegInterp(tmp);\r
                        LOG("Interpreter '%s'\n", tmp);\r
                        free(tmp);\r
@@ -165,8 +165,8 @@ void *Elf_Load(FILE *FP)
                        return NULL;\r
                }\r
                \r
-               fseek(FP, phtab[i].Offset, SEEK_SET);\r
-               fread( PTRMK(void, addr), phtab[i].FileSize, 1, FP );\r
+               acess_seek(FD, phtab[i].Offset, ACESS_SEEK_SET);\r
+               acess_read(FD, phtab[i].FileSize, PTRMK(void, addr) );\r
                memset( PTRMK(char, addr) + phtab[i].FileSize, 0, phtab[i].MemSize - phtab[i].FileSize );\r
        }\r
        \r
@@ -248,6 +248,9 @@ uintptr_t Elf_Relocate(void *Base)
 \r
        hdr->entrypoint += iBaseDiff;\r
        \r
+       hdr->misc.SymTable = 0;\r
+       hdr->misc.HashTable = 0;\r
+       \r
        // === Get Symbol table and String Table ===\r
        for( j = 0; dynamicTab[j].d_tag != DT_NULL; j++)\r
        {\r
@@ -274,6 +277,9 @@ uintptr_t Elf_Relocate(void *Base)
                        break;\r
                }\r
        }\r
+       \r
+       LOG("hdr->misc.SymTable = %x, hdr->misc.HashTable = %x",\r
+               hdr->misc.SymTable, hdr->misc.HashTable);\r
 \r
 \r
        // Alter Symbols to true base\r
@@ -486,6 +492,11 @@ int Elf_GetSymbol(void *Base, char *Name, uintptr_t *ret)
        pBuckets = PTR(hdr->misc.HashTable);\r
        symtab = PTR(hdr->misc.SymTable);\r
        \r
+//     LOG("Base = %p : pBuckets = %p, symtab = %p\n", Base, pBuckets, symtab);\r
+       \r
+       if(!pBuckets || !symtab)\r
+               return 0;\r
+       \r
        nbuckets = pBuckets[0];\r
        iSymCount = pBuckets[1];\r
        pBuckets = &pBuckets[2];\r

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