#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
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
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
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
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
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
\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
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
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