/*\r
-Acess v0.1\r
-ELF Executable Loader Code\r
-*/\r
+ * Acess v0.1\r
+ * ELF Executable Loader Code\r
+ */\r
+#define DEBUG 0\r
#include <common.h>\r
#include <binary.h>\r
-#include "bin_elf.h"\r
+#include "elf.h"\r
\r
-#define DEBUG 1\r
#define DEBUG_WARN 1\r
\r
-#if DEBUG\r
-# define DEBUGS(v...) Log(v)\r
-#else\r
-# define DEBUGS(v...)\r
-# undef ENTER\r
-# undef LOG\r
-# undef LEAVE\r
-# define ENTER(...)\r
-# define LOG(...)\r
-# define LEAVE(...)\r
-#endif\r
-\r
\r
// === PROTOTYPES ===\r
tBinary *Elf_Load(int fp);\r
LOG("iPageCount = %i", iPageCount);\r
\r
// Allocate Information Structure\r
- ret = malloc( sizeof(tBinary) + 3*sizeof(Uint)*iPageCount );\r
+ ret = malloc( sizeof(tBinary) + sizeof(tBinaryPage)*iPageCount );\r
// Fill Info Struct\r
ret->Entry = hdr.entrypoint;\r
ret->Base = -1; // Set Base to maximum value\r
if(phtab[i].Type != PT_LOAD) continue;\r
\r
// Find Base\r
- if(phtab[i].VAddr < ret->Base) ret->Base = phtab[i].VAddr;
-\r
- k = 0;\r
+ if(phtab[i].VAddr < ret->Base) ret->Base = phtab[i].VAddr;\r
\r
LOG("phtab[%i] = {VAddr:0x%x,Offset:0x%x,FileSize:0x%x}",\r
i, phtab[i].VAddr, phtab[i].Offset, phtab[i].FileSize);\r
\r
// Get Pages\r
count = ( (phtab[i].VAddr&0xFFF) + phtab[i].FileSize + 0xFFF) >> 12;\r
- for(;k<count;k++)\r
+ for( k = 0; k < count; k ++ )\r
{\r
ret->Pages[j+k].Virtual = phtab[i].VAddr + (k<<12);\r
ret->Pages[j+k].Physical = phtab[i].Offset + (k<<12); // Store the offset in the physical address\r
Elf32_Dyn *dynamicTab = NULL; // Dynamic Table Pointer\r
char *dynstrtab = NULL; // .dynamic String Table\r
Elf32_Sym *dynsymtab = NULL;\r
+ int bFailed = 0;\r
\r
ENTER("pBase", Base);\r
\r
{\r
ptr = (void*)(iBaseDiff + rel[i].r_offset);\r
if( !Elf_Int_DoRelocate(rel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
{\r
ptr = (void*)(iBaseDiff + rela[i].r_offset);\r
if( !Elf_Int_DoRelocate(rel[i].r_info, ptr, rela[i].r_addend, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
{\r
ptr = (void*)(iBaseDiff + pltRel[i].r_offset);\r
if( !Elf_Int_DoRelocate(pltRel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
{\r
ptr = (void*)((Uint)Base + pltRela[i].r_offset);\r
if( !Elf_Int_DoRelocate(pltRela[i].r_info, ptr, pltRela[i].r_addend, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
}\r
\r
+ if(bFailed) {\r
+ LEAVE('i', 0);\r
+ return 0;\r
+ }\r
+ \r
LEAVE('x', hdr->entrypoint);\r
return hdr->entrypoint;\r
}\r