X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=AcessNative%2Fld-acess_src%2Felf_load.c;h=c5edc4a5c17049e3eabc083cd82cceae7f326c39;hb=c01cd6b0f42fa4cd400c5d9493c8b7ec92e72c5b;hp=909c24a23420fcb9314600adc35cc3af4083979a;hpb=11dbd684e9a3d907d43d71a3145205f1a86992fb;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/elf_load.c b/AcessNative/ld-acess_src/elf_load.c index 909c24a2..c5edc4a5 100644 --- a/AcessNative/ld-acess_src/elf_load.c +++ b/AcessNative/ld-acess_src/elf_load.c @@ -8,6 +8,7 @@ #include #include #include +#include // PRIx64 #include "common.h" #include "elf32.h" #include "elf64.h" @@ -41,7 +42,7 @@ void *Elf_Load(int FD) Elf64_Ehdr hdr; // Read ELF Header - acess_read(FD, &hdr, sizeof(hdr)); + acess__SysRead(FD, &hdr, sizeof(hdr)); // Check the file type if(hdr.e_ident[0] != 0x7F || hdr.e_ident[1] != 'E' || hdr.e_ident[2] != 'L' || hdr.e_ident[3] != 'F') { @@ -73,7 +74,7 @@ void *Elf32Load(int FD, Elf32_Ehdr *hdr) ENTER("iFD", FD); // Check for a program header - if(hdr->phoff == 0) { + if(hdr->e_phoff == 0) { #if DEBUG_WARN Warning("ELF File does not contain a program header\n"); #endif @@ -82,25 +83,25 @@ void *Elf32Load(int FD, Elf32_Ehdr *hdr) } // Read Program Header Table - phtab = malloc( sizeof(Elf32_Phdr) * hdr->phentcount ); + phtab = malloc( sizeof(Elf32_Phdr) * hdr->e_phnum ); if( !phtab ) { LEAVE('n'); return NULL; } - LOG("hdr.phoff = 0x%08x\n", hdr->phoff); - acess_seek(FD, hdr->phoff, ACESS_SEEK_SET); - acess_read(FD, phtab, sizeof(Elf32_Phdr) * hdr->phentcount); + LOG("hdr.e_phoff = 0x%08x\n", hdr->e_phoff); + acess__SysSeek(FD, hdr->e_phoff, ACESS_SEEK_SET); + acess__SysRead(FD, phtab, sizeof(Elf32_Phdr) * hdr->e_phnum); // Count Pages iPageCount = 0; - LOG("hdr.phentcount = %i\n", hdr->phentcount); - for( i = 0; i < hdr->phentcount; i++ ) + LOG("hdr.e_phnum = %i\n", hdr->e_phnum); + for( i = 0; i < hdr->e_phnum; i++ ) { // Ignore Non-LOAD types - if(phtab[i].Type != PT_LOAD) + if(phtab[i].p_type != PT_LOAD) continue; - iPageCount += ((phtab[i].VAddr&0xFFF) + phtab[i].MemSize + 0xFFF) >> 12; - LOG("phtab[%i] = {VAddr:0x%x, MemSize:0x%x}\n", i, phtab[i].VAddr, phtab[i].MemSize); + iPageCount += ((phtab[i].p_vaddr&0xFFF) + phtab[i].p_memsz + 0xFFF) >> 12; + LOG("phtab[%i] = {p_vaddr:0x%x, p_memsz:0x%x}\n", i, phtab[i].p_vaddr, phtab[i].MemSize); } LOG("iPageCount = %i\n", iPageCount); @@ -116,14 +117,14 @@ void *Elf32Load(int FD, Elf32_Ehdr *hdr) // Prescan for base and size max = 0; base = 0xFFFFFFFF; - for( i = 0; i < hdr->phentcount; i ++) + for( i = 0; i < hdr->e_phnum; i ++) { - if( phtab[i].Type != PT_LOAD ) + if( phtab[i].p_type != PT_LOAD ) continue; - if( phtab[i].VAddr < base ) - base = phtab[i].VAddr; - if( phtab[i].VAddr + phtab[i].MemSize > max ) - max = phtab[i].VAddr + phtab[i].MemSize; + if( phtab[i].p_vaddr < base ) + base = phtab[i].p_vaddr; + if( phtab[i].p_vaddr + phtab[i].p_memsz > max ) + max = phtab[i].p_vaddr + phtab[i].p_memsz; } LOG("base = %08x, max = %08x\n", base, max); @@ -137,39 +138,39 @@ void *Elf32Load(int FD, Elf32_Ehdr *hdr) } // Load Pages - for( i = 0; i < hdr->phentcount; i++ ) + for( i = 0; i < hdr->e_phnum; i++ ) { // Get Interpreter Name - if( phtab[i].Type == PT_INTERP ) + if( phtab[i].p_type == PT_INTERP ) { char *tmp; //if(ret->Interpreter) continue; - tmp = malloc(phtab[i].FileSize); - acess_seek(FD, phtab[i].Offset, ACESS_SEEK_SET); - acess_read(FD, tmp, phtab[i].FileSize); + tmp = malloc(phtab[i].p_filesz); + acess__SysSeek(FD, phtab[i].p_offset, ACESS_SEEK_SET); + acess__SysRead(FD, tmp, phtab[i].p_filesz); //ret->Interpreter = Binary_RegInterp(tmp); LOG("Interpreter '%s'\n", tmp); free(tmp); continue; } // Ignore non-LOAD types - if(phtab[i].Type != PT_LOAD) continue; + if(phtab[i].p_type != PT_LOAD) continue; - LOG("phtab[%i] = PT_LOAD {Adj VAddr:0x%x, Offset:0x%x, FileSize:0x%x, MemSize:0x%x}\n", - i, phtab[i].VAddr+baseDiff, phtab[i].Offset, phtab[i].FileSize, phtab[i].MemSize); + LOG("phtab[%i] = PT_LOAD {Adj p_vaddr:0x%x, p_offset:0x%x, p_filesz:0x%x, p_memsz:0x%x}\n", + i, phtab[i].p_vaddr+baseDiff, phtab[i].p_offset, phtab[i].p_filesz, phtab[i].p_memsz); - addr = phtab[i].VAddr + baseDiff; + addr = phtab[i].p_vaddr + baseDiff; - if( AllocateMemory( addr, phtab[i].MemSize ) ) { + if( AllocateMemory( addr, phtab[i].p_memsz ) ) { fprintf(stderr, "Elf_Load: Unable to map memory at %x (0x%x bytes)\n", - addr, phtab[i].MemSize); + addr, phtab[i].p_memsz); free( phtab ); return NULL; } - acess_seek(FD, phtab[i].Offset, ACESS_SEEK_SET); - acess_read(FD, PTRMK(void, addr), phtab[i].FileSize); - memset( PTRMK(char, addr) + phtab[i].FileSize, 0, phtab[i].MemSize - phtab[i].FileSize ); + acess__SysSeek(FD, phtab[i].p_offset, ACESS_SEEK_SET); + acess__SysRead(FD, PTRMK(void, addr), phtab[i].p_filesz); + memset( PTRMK(char, addr) + phtab[i].p_filesz, 0, phtab[i].p_memsz - phtab[i].p_filesz ); } // Clean Up @@ -209,20 +210,20 @@ void *Elf64Load(int FD, Elf64_Ehdr *hdr) LEAVE('n'); return NULL; } - LOG("hdr.phoff = 0x%08llx\n", (long long)hdr->e_phoff); - acess_seek(FD, hdr->e_phoff, ACESS_SEEK_SET); - acess_read(FD, phtab, sizeof(Elf64_Phdr) * hdr->e_phnum); + LOG("hdr.e_phoff = 0x%08llx\n", (long long)hdr->e_phoff); + acess__SysSeek(FD, hdr->e_phoff, ACESS_SEEK_SET); + acess__SysRead(FD, phtab, sizeof(Elf64_Phdr) * hdr->e_phnum); // Count Pages iPageCount = 0; - LOG("hdr.phentcount = %i\n", hdr->e_phnum); + LOG("hdr.e_phnum = %i\n", hdr->e_phnum); for( i = 0; i < hdr->e_phnum; i++ ) { // Ignore Non-LOAD types if(phtab[i].p_type != PT_LOAD) continue; iPageCount += ((phtab[i].p_vaddr&0xFFF) + phtab[i].p_memsz + 0xFFF) >> 12; - LOG("phtab[%i] = {VAddr:0x%llx, MemSize:0x%llx}\n", + LOG("phtab[%i] = {p_vaddr:0x%llx, p_memsz:0x%llx}\n", i, (long long)phtab[i].p_vaddr, (long long)phtab[i].p_memsz); } @@ -269,8 +270,8 @@ void *Elf64Load(int FD, Elf64_Ehdr *hdr) //if(ret->Interpreter) continue; tmp = malloc(phtab[i].p_filesz+1); tmp[ phtab[i].p_filesz ] = 0; - acess_seek(FD, phtab[i].p_offset, ACESS_SEEK_SET); - acess_read(FD, tmp, phtab[i].p_filesz); + acess__SysSeek(FD, phtab[i].p_offset, ACESS_SEEK_SET); + acess__SysRead(FD, tmp, phtab[i].p_filesz); //ret->Interpreter = Binary_RegInterp(tmp); LOG("Interpreter '%s'\n", tmp); free(tmp); @@ -279,7 +280,7 @@ void *Elf64Load(int FD, Elf64_Ehdr *hdr) // Ignore non-LOAD types if(phtab[i].p_type != PT_LOAD) continue; - LOG("phtab[%i] = PT_LOAD {Adj VAddr:0x%llx, Offset:0x%llx, FileSize:0x%llx, MemSize:0x%llx}\n", + LOG("phtab[%i] = PT_LOAD {Adj p_vaddr:0x%llx, p_offset:0x%llx, p_filesz:0x%llx, p_memsz:0x%llx}\n", i, (long long)phtab[i].p_vaddr+baseDiff, (long long)phtab[i].p_offset, (long long)phtab[i].p_filesz, (long long)phtab[i].p_memsz @@ -288,14 +289,14 @@ void *Elf64Load(int FD, Elf64_Ehdr *hdr) addr = phtab[i].p_vaddr + baseDiff; if( AllocateMemory( addr, phtab[i].p_memsz ) ) { - fprintf(stderr, "Elf_Load: Unable to map memory at %llx (0x%llx bytes)\n", - (long long)addr, (long long)phtab[i].p_memsz); + fprintf(stderr, "Elf_Load: Unable to map memory at %"PRIx64" (0x%"PRIx64" bytes)\n", + (uint64_t)addr, (uint64_t)phtab[i].p_memsz); free( phtab ); return NULL; } - acess_seek(FD, phtab[i].p_offset, ACESS_SEEK_SET); - acess_read(FD, PTRMK(void, addr), phtab[i].p_filesz); + acess__SysSeek(FD, phtab[i].p_offset, ACESS_SEEK_SET); + acess__SysRead(FD, PTRMK(void, addr), phtab[i].p_filesz); memset( PTRMK(char, addr) + phtab[i].p_filesz, 0, phtab[i].p_memsz - phtab[i].p_filesz ); }