X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Felf.c;h=daea0443ce732e074093b51e5f0be241cc1cace8;hb=0f137ffed95af2eee3b9ecd2e277e5134e15ac69;hp=3ab5a504db8a209a5bd324dbc9812e121c20b775;hpb=a09032f44bba55ce1e60dfab92a39cf6c909220b;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/elf.c b/AcessNative/ld-acess_src/elf.c index 3ab5a504..daea0443 100644 --- a/AcessNative/ld-acess_src/elf.c +++ b/AcessNative/ld-acess_src/elf.c @@ -29,27 +29,27 @@ #endif // === PROTOTYPES === -void *Elf_Load(FILE *FP); +void *Elf_Load(int FD); uintptr_t Elf_Relocate(void *Base); int Elf_GetSymbol(void *Base, char *Name, uintptr_t *ret); int Elf_Int_DoRelocate(uint32_t r_info, uint32_t *ptr, uint32_t addend, Elf32_Sym *symtab, void *Base); uint32_t Elf_Int_HashString(char *str); // === CODE === -void *Elf_Load(FILE *FP) +void *Elf_Load(int FD) { Elf32_Ehdr hdr; Elf32_Phdr *phtab; int i, j; int iPageCount; - uint32_t max, base = -1; + uint32_t max, base; uint32_t addr; uint32_t baseDiff = 0; - ENTER("pFP", FP); + ENTER("iFD", FD); // Read ELF Header - fread(&hdr, sizeof(hdr), 1, FP); + acess_read(FD, sizeof(hdr), &hdr); // Check the file type if(hdr.ident[0] != 0x7F || hdr.ident[1] != 'E' || hdr.ident[2] != 'L' || hdr.ident[3] != 'F') { @@ -74,8 +74,8 @@ void *Elf_Load(FILE *FP) return NULL; } LOG("hdr.phoff = 0x%08x\n", hdr.phoff); - fseek(FP, hdr.phoff, SEEK_SET); - fread(phtab, sizeof(Elf32_Phdr), hdr.phentcount, FP); + acess_seek(FD, hdr.phoff, ACESS_SEEK_SET); + acess_read(FD, sizeof(Elf32_Phdr) * hdr.phentcount, phtab); // Count Pages iPageCount = 0; @@ -100,14 +100,16 @@ void *Elf_Load(FILE *FP) //ret->Interpreter = NULL; // Prescan for base and size + max = 0; + base = 0xFFFFFFFF; for( i = 0; i < hdr.phentcount; i ++) { if( phtab[i].Type != PT_LOAD ) continue; if( phtab[i].VAddr < base ) base = phtab[i].VAddr; - if( phtab[i].VAddr > max ) - max = phtab[i].VAddr; + if( phtab[i].VAddr + phtab[i].MemSize > max ) + max = phtab[i].VAddr + phtab[i].MemSize; } LOG("base = %08x, max = %08x\n", base, max); @@ -141,8 +143,8 @@ void *Elf_Load(FILE *FP) char *tmp; //if(ret->Interpreter) continue; tmp = malloc(phtab[i].FileSize); - fseek(FP, phtab[i].Offset, SEEK_SET); - fread(tmp, phtab[i].FileSize, 1, FP); + acess_seek(FD, phtab[i].Offset, ACESS_SEEK_SET); + acess_read(FD, phtab[i].FileSize, tmp); //ret->Interpreter = Binary_RegInterp(tmp); LOG("Interpreter '%s'\n", tmp); free(tmp); @@ -157,11 +159,14 @@ void *Elf_Load(FILE *FP) addr = phtab[i].VAddr + baseDiff; if( AllocateMemory( addr, phtab[i].MemSize ) ) { + fprintf(stderr, "Elf_Load: Unable to map memory at %x (0x%x bytes)\n", + addr, phtab[i].MemSize); + free( phtab ); return NULL; } - fseek(FP, phtab[i].Offset, SEEK_SET); - fread( PTRMK(void, addr), phtab[i].FileSize, 1, FP ); + acess_seek(FD, phtab[i].Offset, ACESS_SEEK_SET); + acess_read(FD, phtab[i].FileSize, PTRMK(void, addr) ); memset( PTRMK(char, addr) + phtab[i].FileSize, 0, phtab[i].MemSize - phtab[i].FileSize ); } @@ -243,6 +248,9 @@ uintptr_t Elf_Relocate(void *Base) hdr->entrypoint += iBaseDiff; + hdr->misc.SymTable = 0; + hdr->misc.HashTable = 0; + // === Get Symbol table and String Table === for( j = 0; dynamicTab[j].d_tag != DT_NULL; j++) { @@ -269,6 +277,9 @@ uintptr_t Elf_Relocate(void *Base) break; } } + + LOG("hdr->misc.SymTable = %x, hdr->misc.HashTable = %x", + hdr->misc.SymTable, hdr->misc.HashTable); // Alter Symbols to true base @@ -481,6 +492,11 @@ int Elf_GetSymbol(void *Base, char *Name, uintptr_t *ret) pBuckets = PTR(hdr->misc.HashTable); symtab = PTR(hdr->misc.SymTable); +// LOG("Base = %p : pBuckets = %p, symtab = %p\n", Base, pBuckets, symtab); + + if(!pBuckets || !symtab) + return 0; + nbuckets = pBuckets[0]; iSymCount = pBuckets[1]; pBuckets = &pBuckets[2];