git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
IPv6, and I need to learn to compile before commiting
[tpg/acess2.git]
/
Kernel
/
bin
/
elf.c
diff --git
a/Kernel/bin/elf.c
b/Kernel/bin/elf.c
index
dcfe35c
..
4bc13b1
100644
(file)
--- a/
Kernel/bin/elf.c
+++ b/
Kernel/bin/elf.c
@@
-1,26
+1,14
@@
/*
\r
/*
\r
-Acess v0.1
\r
-ELF Executable Loader Code
\r
-*/
\r
-#include <common.h>
\r
+ * Acess v0.1
\r
+ * ELF Executable Loader Code
\r
+ */
\r
+#define DEBUG 0
\r
+#include <acess.h>
\r
#include <binary.h>
\r
#include <binary.h>
\r
-#include "
bin_
elf.h"
\r
+#include "elf.h"
\r
\r
\r
-#define DEBUG 0
\r
#define DEBUG_WARN 1
\r
\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
\r
// === PROTOTYPES ===
\r
tBinary *Elf_Load(int fp);
\r
@@
-88,7
+76,7
@@
tBinary *Elf_Load(int fp)
LOG("iPageCount = %i", iPageCount);
\r
\r
// Allocate Information Structure
\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
// Fill Info Struct
\r
ret->Entry = hdr.entrypoint;
\r
ret->Base = -1; // Set Base to maximum value
\r
@@
-118,9
+106,7
@@
tBinary *Elf_Load(int fp)
if(phtab[i].Type != PT_LOAD) continue;
\r
\r
// Find Base
\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
LOG("phtab[%i] = {VAddr:0x%x,Offset:0x%x,FileSize:0x%x}",
\r
i, phtab[i].VAddr, phtab[i].Offset, phtab[i].FileSize);
\r
@@
-135,7
+121,7
@@
tBinary *Elf_Load(int fp)
\r
// Get Pages
\r
count = ( (phtab[i].VAddr&0xFFF) + phtab[i].FileSize + 0xFFF) >> 12;
\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
{
\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
@@
-277,6
+263,7
@@
int Elf_Relocate(void *Base)
Elf32_Dyn *dynamicTab = NULL; // Dynamic Table Pointer
\r
char *dynstrtab = NULL; // .dynamic String Table
\r
Elf32_Sym *dynsymtab = NULL;
\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
ENTER("pBase", Base);
\r
\r
@@
-393,8
+380,7
@@
int Elf_Relocate(void *Base)
{
\r
ptr = (void*)(iBaseDiff + rel[i].r_offset);
\r
if( !Elf_Int_DoRelocate(rel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {
\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
}
\r
}
\r
@@
-406,8
+392,7
@@
int Elf_Relocate(void *Base)
{
\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
{
\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
}
\r
}
\r
@@
-423,8
+408,7
@@
int Elf_Relocate(void *Base)
{
\r
ptr = (void*)(iBaseDiff + pltRel[i].r_offset);
\r
if( !Elf_Int_DoRelocate(pltRel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {
\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
}
\r
}
\r
@@
-436,13
+420,17
@@
int Elf_Relocate(void *Base)
{
\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
{
\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
}
\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
LEAVE('x', hdr->entrypoint);
\r
return hdr->entrypoint;
\r
}
\r
@@
-473,7
+461,7
@@
int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
if( !Elf_GetSymbol((void*)base, sSymName, &val) ) // Search this binary first
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
if( !Elf_GetSymbol((void*)base, sSymName, &val) ) // Search this binary first
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
-
//
LOG("R_386_32 *0x%x += 0x%x('%s')", ptr, val, sSymName);
\r
+ LOG("R_386_32 *0x%x += 0x%x('%s')", ptr, val, sSymName);
\r
*ptr = val + addend;
\r
break;
\r
\r
*ptr = val + addend;
\r
break;
\r
\r
@@
-482,7
+470,7
@@
int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
-
//
LOG("R_386_PC32 *0x%x = 0x%x + 0x%x('%s') - 0x%x", ptr, *ptr, val, sSymName, (Uint)ptr );
\r
+ LOG("R_386_PC32 *0x%x = 0x%x + 0x%x('%s') - 0x%x", ptr, *ptr, val, sSymName, (Uint)ptr );
\r
// TODO: Check if it needs the true value of ptr or the compiled value
\r
// NOTE: Testing using true value
\r
*ptr = val + addend - (Uint)ptr;
\r
// TODO: Check if it needs the true value of ptr or the compiled value
\r
// NOTE: Testing using true value
\r
*ptr = val + addend - (Uint)ptr;
\r
@@
-493,7
+481,7
@@
int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
-
//
LOG("R_386_GLOB_DAT *0x%x = 0x%x (%s)", ptr, val, sSymName);
\r
+ LOG("R_386_GLOB_DAT *0x%x = 0x%x (%s)", ptr, val, sSymName);
\r
*ptr = val;
\r
break;
\r
\r
*ptr = val;
\r
break;
\r
\r
@@
-502,13
+490,13
@@
int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
if( !Elf_GetSymbol( (void*)base, sSymName, &val ) )
\r
if( !Binary_GetSymbol( sSymName, &val ) )
\r
return 0;
\r
-
//
LOG("R_386_JMP_SLOT *0x%x = 0x%x (%s)", ptr, val, sSymName);
\r
+ LOG("R_386_JMP_SLOT *0x%x = 0x%x (%s)", ptr, val, sSymName);
\r
*ptr = val;
\r
break;
\r
\r
// Base Address (B+A)
\r
case R_386_RELATIVE:
\r
*ptr = val;
\r
break;
\r
\r
// Base Address (B+A)
\r
case R_386_RELATIVE:
\r
-
//
LOG("R_386_RELATIVE *0x%x = 0x%x + 0x%x", ptr, base, addend);
\r
+ LOG("R_386_RELATIVE *0x%x = 0x%x + 0x%x", ptr, base, addend);
\r
*ptr = base + addend;
\r
break;
\r
\r
*ptr = base + addend;
\r
break;
\r
\r
@@
-551,7
+539,7
@@
int Elf_GetSymbol(void *Base, char *Name, Uint *ret)
// Check Bucket
\r
i = pBuckets[ iNameHash ];
\r
if(symtab[i].shndx != SHN_UNDEF && strcmp(symtab[i].name, Name) == 0) {
\r
// Check Bucket
\r
i = pBuckets[ iNameHash ];
\r
if(symtab[i].shndx != SHN_UNDEF && strcmp(symtab[i].name, Name) == 0) {
\r
- *ret = symtab[ i ].value;
\r
+
if(ret)
*ret = symtab[ i ].value;
\r
return 1;
\r
}
\r
\r
return 1;
\r
}
\r
\r
@@
-560,7
+548,7
@@
int Elf_GetSymbol(void *Base, char *Name, Uint *ret)
{
\r
i = pChains[i];
\r
if(symtab[i].shndx != SHN_UNDEF && strcmp(symtab[ i ].name, Name) == 0) {
\r
{
\r
i = pChains[i];
\r
if(symtab[i].shndx != SHN_UNDEF && strcmp(symtab[ i ].name, Name) == 0) {
\r
- *ret = symtab[ i ].value;
\r
+
if(ret)
*ret = symtab[ i ].value;
\r
return 1;
\r
}
\r
}
\r
return 1;
\r
}
\r
}
\r
UCC
git Repository :: git.ucc.asn.au