int Elf32GetSymbol(void *Base, const char *Name, void **Ret, size_t *Size);
int elf_doRelocate_386(uint32_t r_info, uint32_t *ptr, Elf32_Addr addend, int type, int bRela, const char *Sym, intptr_t iBaseDiff);
int elf_doRelocate_arm(uint32_t r_info, uint32_t *ptr, Elf32_Addr addend, int type, int bRela, const char *Sym, intptr_t iBaseDiff);
+ int elf_doRelocate_unk(uint32_t , uint32_t *, Elf32_Addr , int , int , const char *, intptr_t);
#ifdef SUPPORT_ELF64
void *Elf64Relocate(void *Base, char **envp, const char *Filename);
int Elf64GetSymbol(void *Base, const char *Name, void **Ret, size_t *Size);
return 0;
}
+int elf_doRelocate_unk(uint32_t r_info, uint32_t *ptr, Elf32_Addr addend, int type, int bRela, const char *Sym, intptr_t iBaseDiff)
+{
+ return 1;
+}
+
void *Elf32Relocate(void *Base, char **envp, const char *Filename)
{
Elf32_Ehdr *hdr = Base;
char *dynstrtab = NULL; // .dynamic String Table
Elf32_Sym *dynsymtab;
int (*do_relocate)(uint32_t t_info, uint32_t *ptr, Elf32_Addr addend, int Type, int bRela, const char *Sym, intptr_t iBaseDiff);
- auto int _doRelocate(uint32_t r_info, uint32_t *ptr, int bRela, Elf32_Addr addend);
DEBUGS("ElfRelocate: (Base=0x%x)", Base);
// - Will be reversed at the end of the function
for( i = 0; i < iSegmentCount; i ++ )
{
- if(phtab[i].Type == PT_LOAD && phtab[i].Flags & PF_R ) {
+ if(phtab[i].Type == PT_LOAD && !(phtab[i].Flags & PF_W) ) {
uintptr_t addr = phtab[i].VAddr + iBaseDiff;
uintptr_t end = addr + phtab[i].MemSize;
for( ; addr < end; addr += PAGE_SIZE )
- SysSetMemFlags(addr, 0, 1); // Unset RO
+ _SysSetMemFlags(addr, 0, 1); // Unset RO
}
}
dynamicTab = (void *)( (intptr_t)dynamicTab + iBaseDiff );
// === Get Symbol table and String Table ===
+ dynsymtab = NULL;
for( j = 0; dynamicTab[j].d_tag != DT_NULL; j++)
{
switch(dynamicTab[j].d_tag)
DEBUGS(" elf_relocate: Beginning Relocation");
- int _doRelocate(uint32_t r_info, uint32_t *ptr, int bRela, Elf32_Addr addend)
- {
- int type = ELF32_R_TYPE(r_info);
- int sym = ELF32_R_SYM(r_info);
- const char *symname = dynstrtab + dynsymtab[sym].nameOfs;
- return do_relocate(r_info, ptr, addend, type, bRela, symname, iBaseDiff);
- }
+ int fail = 0;
switch(hdr->machine)
{
break;
default:
SysDebug("Elf32Relocate: Unknown machine type %i", hdr->machine);
- // TODO: Chuck sad
+ do_relocate = elf_doRelocate_unk;
+ fail = 1;
break;
}
DEBUGS("do_relocate = %p (%p or %p)", do_relocate, &elf_doRelocate_386, &elf_doRelocate_arm);
- int fail = 0;
+ #define _doRelocate(r_info, ptr, bRela, addend) \
+ do_relocate(r_info, ptr, addend, ELF32_R_TYPE(r_info), bRela, \
+ dynstrtab + dynsymtab[ELF32_R_SYM(r_info)].nameOfs, iBaseDiff);
// Parse Relocation Entries
if(rel && relSz)
// Re-set readonly
for( i = 0; i < iSegmentCount; i ++ )
{
- if(phtab[i].Type == PT_LOAD && phtab[i].Flags & PF_R ) {
+ // If load and not writable
+ if(phtab[i].Type == PT_LOAD && !(phtab[i].Flags & PF_W) ) {
uintptr_t addr = phtab[i].VAddr + iBaseDiff;
uintptr_t end = addr + phtab[i].MemSize;
for( ; addr < end; addr += PAGE_SIZE )
- SysSetMemFlags(addr, 1, 1); // Unset RO
+ _SysSetMemFlags(addr, 1, 1); // Unset RO
}
}
return NULL;
}
+ #undef _doRelocate
+
DEBUGS("ElfRelocate: RETURN 0x%x to %p", hdr->entrypoint + iBaseDiff, __builtin_return_address(0));
return (void*)(intptr_t)( hdr->entrypoint + iBaseDiff );
}
}
// Relocation function
+ auto int _Elf64DoReloc(Elf64_Xword r_info, void *ptr, Elf64_Sxword addend);
int _Elf64DoReloc(Elf64_Xword r_info, void *ptr, Elf64_Sxword addend)
{
int sym = ELF64_R_SYM(r_info);
int type = ELF64_R_TYPE(r_info);
const char *symname = strtab + symtab[sym].st_name;
void *symval;
+ //DEBUGS("_Elf64DoReloc: %s", symname);
switch( type )
{
case R_X86_64_NONE:
SysDebug("ld-acess - _Elf64DoReloc: Unknown relocation type %i", type);
return 2;
}
+ //DEBUGS("_Elf64DoReloc: - Good");
return 0;
}