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
Bugfix in NE2K driver (didn't wait for the DMA to be ready)
[tpg/acess2.git]
/
Kernel
/
bin
/
elf.c
diff --git
a/Kernel/bin/elf.c
b/Kernel/bin/elf.c
index
3209c04
..
2f43eee
100644
(file)
--- a/
Kernel/bin/elf.c
+++ b/
Kernel/bin/elf.c
@@
-9,13
+9,12
@@
\r
#define DEBUG_WARN 1
\r
\r
\r
#define DEBUG_WARN 1
\r
\r
-
\r
// === PROTOTYPES ===
\r
tBinary *Elf_Load(int fp);
\r
int Elf_Relocate(void *Base);
\r
// === PROTOTYPES ===
\r
tBinary *Elf_Load(int fp);
\r
int Elf_Relocate(void *Base);
\r
- int Elf_GetSymbol(void *Base, char *Name, Uint *ret);
\r
+ int Elf_GetSymbol(void *Base, c
onst c
har *Name, Uint *ret);
\r
int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symtab, Uint base);
\r
int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symtab, Uint base);
\r
-Uint Elf_Int_HashString(char *str);
\r
+Uint Elf_Int_HashString(c
onst c
har *str);
\r
\r
// === GLOBALS ===
\r
tBinaryType gELF_Info = {
\r
\r
// === GLOBALS ===
\r
tBinaryType gELF_Info = {
\r
@@
-35,7
+34,7
@@
tBinary *Elf_Load(int fp)
int iPageCount;
\r
int count;
\r
\r
int iPageCount;
\r
int count;
\r
\r
- ENTER("
i
fp", fp);
\r
+ ENTER("
x
fp", fp);
\r
\r
// Read ELF Header
\r
VFS_Read(fp, sizeof(hdr), &hdr);
\r
\r
// Read ELF Header
\r
VFS_Read(fp, sizeof(hdr), &hdr);
\r
@@
-126,13
+125,15
@@
tBinary *Elf_Load(int fp)
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
\r
- if( (phtab[i].FileSize & 0xFFF) < 0x1000 - (phtab[i].VAddr & 0xFFF) )
\r
-
lastSize = phtab[i].FileSize;
\r
- else
\r
+
//
if( (phtab[i].FileSize & 0xFFF) < 0x1000 - (phtab[i].VAddr & 0xFFF) )
\r
+
//
lastSize = phtab[i].FileSize;
\r
+
//
else
\r
lastSize = (phtab[i].FileSize & 0xFFF) + (phtab[i].VAddr & 0xFFF);
\r
lastSize = (phtab[i].FileSize & 0xFFF) + (phtab[i].VAddr & 0xFFF);
\r
- lastSize &= 0xFFF;
\r
+
//
lastSize &= 0xFFF;
\r
\r
\r
- LOG("lastSize = 0x%x", lastSize);
\r
+ //LOG("lastSize = 0x%x", lastSize);
\r
+
\r
+ lastSize = phtab[i].FileSize;
\r
\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
@@
-152,6
+153,7
@@
tBinary *Elf_Load(int fp)
ret->Pages[j+k].Size = 4096;
\r
LOG("ret->Pages[%i].Size = 0x%x", j+k, ret->Pages[j+k].Size);
\r
ret->Pages[j+k].Flags = 0;
\r
ret->Pages[j+k].Size = 4096;
\r
LOG("ret->Pages[%i].Size = 0x%x", j+k, ret->Pages[j+k].Size);
\r
ret->Pages[j+k].Flags = 0;
\r
+ lastSize -= ret->Pages[j+k].Size;
\r
}
\r
count = (phtab[i].MemSize + 0xFFF) >> 12;
\r
for(;k<count;k++)
\r
}
\r
count = (phtab[i].MemSize + 0xFFF) >> 12;
\r
for(;k<count;k++)
\r
@@
-283,9
+285,9
@@
int Elf_Relocate(void *Base)
ENTER("pBase", Base);
\r
\r
// Parse Program Header to get Dynamic Table
\r
ENTER("pBase", Base);
\r
\r
// Parse Program Header to get Dynamic Table
\r
- phtab =
Base + hdr->phoff
;
\r
+ phtab =
(void *)( (tVAddr)Base + hdr->phoff )
;
\r
iSegmentCount = hdr->phentcount;
\r
iSegmentCount = hdr->phentcount;
\r
- for(i
=0;i<iSegmentCount;i++
)
\r
+ for(i
= 0; i < iSegmentCount; i ++
)
\r
{
\r
// Determine linked base address
\r
if(phtab[i].Type == PT_LOAD && iRealBase > phtab[i].VAddr)
\r
{
\r
// Determine linked base address
\r
if(phtab[i].Type == PT_LOAD && iRealBase > phtab[i].VAddr)
\r
@@
-294,7
+296,7
@@
int Elf_Relocate(void *Base)
// Find Dynamic Section
\r
if(phtab[i].Type == PT_DYNAMIC) {
\r
if(dynamicTab) {
\r
// Find Dynamic Section
\r
if(phtab[i].Type == PT_DYNAMIC) {
\r
if(dynamicTab) {
\r
- Warning("ELF", "Elf_Relocate - Multiple PT_DYNAMIC segments\n");
\r
+
Log_
Warning("ELF", "Elf_Relocate - Multiple PT_DYNAMIC segments\n");
\r
continue;
\r
}
\r
dynamicTab = (void *) (tVAddr) phtab[i].VAddr;
\r
continue;
\r
}
\r
dynamicTab = (void *) (tVAddr) phtab[i].VAddr;
\r
@@
-305,7
+307,7
@@
int Elf_Relocate(void *Base)
\r
// Check if a PT_DYNAMIC segement was found
\r
if(!dynamicTab) {
\r
\r
// Check if a PT_DYNAMIC segement was found
\r
if(!dynamicTab) {
\r
- Warning("ELF", "Elf_Relocate: No PT_DYNAMIC segment in image, returning\n");
\r
+
Log_
Warning("ELF", "Elf_Relocate: No PT_DYNAMIC segment in image, returning\n");
\r
LEAVE('x', hdr->entrypoint);
\r
return hdr->entrypoint;
\r
}
\r
LEAVE('x', hdr->entrypoint);
\r
return hdr->entrypoint;
\r
}
\r
@@
-347,7
+349,7
@@
int Elf_Relocate(void *Base)
\r
\r
// Alter Symbols to true base
\r
\r
\r
// Alter Symbols to true base
\r
- for(i
=0;i<iSymCount;i
++)
\r
+ for(i
= 0; i < iSymCount; i
++)
\r
{
\r
dynsymtab[i].value += iBaseDiff;
\r
dynsymtab[i].nameOfs += (Uint)dynstrtab;
\r
{
\r
dynsymtab[i].value += iBaseDiff;
\r
dynsymtab[i].nameOfs += (Uint)dynstrtab;
\r
@@
-369,10
+371,10
@@
int Elf_Relocate(void *Base)
// --- Needed Library ---
\r
case DT_NEEDED:
\r
libPath = dynstrtab + dynamicTab[j].d_val;
\r
// --- Needed Library ---
\r
case DT_NEEDED:
\r
libPath = dynstrtab + dynamicTab[j].d_val;
\r
- L
OG("Required Library '%s' (IGNORED in kernel mode)\n"
, libPath);
\r
+ L
og_Notice("ELF", "%p - Required Library '%s' (Ignored in kernel mode)\n", Base
, libPath);
\r
break;
\r
// --- PLT/GOT ---
\r
break;
\r
// --- PLT/GOT ---
\r
- case DT_PLTGOT: pltgot = (void*)
iBaseDiff+(
dynamicTab[j].d_val); break;
\r
+ case DT_PLTGOT: pltgot = (void*)
(iBaseDiff+
dynamicTab[j].d_val); break;
\r
case DT_JMPREL: plt = (void*)(iBaseDiff+dynamicTab[j].d_val); break;
\r
case DT_PLTREL: pltType = dynamicTab[j].d_val; break;
\r
case DT_PLTRELSZ: pltSz = dynamicTab[j].d_val; break;
\r
case DT_JMPREL: plt = (void*)(iBaseDiff+dynamicTab[j].d_val); break;
\r
case DT_PLTREL: pltType = dynamicTab[j].d_val; break;
\r
case DT_PLTRELSZ: pltSz = dynamicTab[j].d_val; break;
\r
@@
-381,6
+383,7
@@
int Elf_Relocate(void *Base)
case DT_REL: rel = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
\r
case DT_RELSZ: relSz = dynamicTab[j].d_val; break;
\r
case DT_RELENT: relEntSz = dynamicTab[j].d_val; break;
\r
case DT_REL: rel = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
\r
case DT_RELSZ: relSz = dynamicTab[j].d_val; break;
\r
case DT_RELENT: relEntSz = dynamicTab[j].d_val; break;
\r
+
\r
case DT_RELA: rela = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
\r
case DT_RELASZ: relaSz = dynamicTab[j].d_val; break;
\r
case DT_RELAENT: relaEntSz = dynamicTab[j].d_val; break;
\r
case DT_RELA: rela = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
\r
case DT_RELASZ: relaSz = dynamicTab[j].d_val; break;
\r
case DT_RELAENT: relaEntSz = dynamicTab[j].d_val; break;
\r
@@
-419,6
+422,7
@@
int Elf_Relocate(void *Base)
{
\r
Elf32_Rel *pltRel = plt;
\r
j = pltSz / sizeof(Elf32_Rel);
\r
{
\r
Elf32_Rel *pltRel = plt;
\r
j = pltSz / sizeof(Elf32_Rel);
\r
+ LOG("PLT Rel - plt = %p, pltSz = %i (%i ents)", plt, pltSz, j);
\r
for(i = 0; i < j; i++)
\r
{
\r
ptr = (void*)(iBaseDiff + pltRel[i].r_offset);
\r
for(i = 0; i < j; i++)
\r
{
\r
ptr = (void*)(iBaseDiff + pltRel[i].r_offset);
\r
@@
-431,9
+435,10
@@
int Elf_Relocate(void *Base)
{
\r
Elf32_Rela *pltRela = plt;
\r
j = pltSz / sizeof(Elf32_Rela);
\r
{
\r
Elf32_Rela *pltRela = plt;
\r
j = pltSz / sizeof(Elf32_Rela);
\r
+ LOG("PLT RelA - plt = %p, pltSz = %i (%i ents)", plt, pltSz, j);
\r
for(i=0;i<j;i++)
\r
{
\r
for(i=0;i<j;i++)
\r
{
\r
- ptr = (void*)(
(Uint)Base
+ pltRela[i].r_offset);
\r
+ ptr = (void*)(
iBaseDiff
+ pltRela[i].r_offset);
\r
if( !Elf_Int_DoRelocate(pltRela[i].r_info, ptr, pltRela[i].r_addend, dynsymtab, (Uint)Base) ) {
\r
bFailed = 1;
\r
}
\r
if( !Elf_Int_DoRelocate(pltRela[i].r_info, ptr, pltRela[i].r_addend, dynsymtab, (Uint)Base) ) {
\r
bFailed = 1;
\r
}
\r
@@
-476,7
+481,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("
%08x R_386_32 *0x%x += 0x%x('%s')", r_info
, ptr, val, sSymName);
\r
*ptr = val + addend;
\r
break;
\r
\r
*ptr = val + addend;
\r
break;
\r
\r
@@
-485,7
+490,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("
%08x R_386_PC32 *0x%x = 0x%x + 0x%x('%s') - 0x%x", r_info
, 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
@@
-496,7
+501,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("
%08x R_386_GLOB_DAT *0x%x = 0x%x (%s)", r_info
, ptr, val, sSymName);
\r
*ptr = val;
\r
break;
\r
\r
*ptr = val;
\r
break;
\r
\r
@@
-505,13
+510,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("
%08x R_386_JMP_SLOT *0x%x = 0x%x (%s)", r_info
, 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("
%08x R_386_RELATIVE *0x%x = 0x%x + 0x%x", r_info
, ptr, base, addend);
\r
*ptr = base + addend;
\r
break;
\r
\r
*ptr = base + addend;
\r
break;
\r
\r
@@
-523,10
+528,10
@@
int Elf_Int_DoRelocate(Uint r_info, Uint32 *ptr, Uint32 addend, Elf32_Sym *symta
}
\r
\r
/**
\r
}
\r
\r
/**
\r
- * \fn int Elf_GetSymbol(void *Base, char *name, Uint *ret)
\r
+ * \fn int Elf_GetSymbol(void *Base, c
onst c
har *name, Uint *ret)
\r
* \brief Get a symbol from the loaded binary
\r
*/
\r
* \brief Get a symbol from the loaded binary
\r
*/
\r
-int Elf_GetSymbol(void *Base, char *Name, Uint *ret)
\r
+int Elf_GetSymbol(void *Base, c
onst c
har *Name, Uint *ret)
\r
{
\r
Elf32_Ehdr *hdr = (void*)Base;
\r
Elf32_Sym *symtab;
\r
{
\r
Elf32_Ehdr *hdr = (void*)Base;
\r
Elf32_Sym *symtab;
\r
@@
-576,7
+581,7
@@
int Elf_GetSymbol(void *Base, char *Name, Uint *ret)
* \param str String to hash
\r
* \return Hash value
\r
*/
\r
* \param str String to hash
\r
* \return Hash value
\r
*/
\r
-Uint Elf_Int_HashString(char *str)
\r
+Uint Elf_Int_HashString(c
onst c
har *str)
\r
{
\r
Uint h = 0, g;
\r
while(*str)
\r
{
\r
Uint h = 0, g;
\r
while(*str)
\r
UCC
git Repository :: git.ucc.asn.au