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
}
}
case DT_SYMTAB:
DEBUGS(" elf_relocate: DYNAMIC Symbol Table 0x%x (0x%x)",
dynamicTab[j].d_val, dynamicTab[j].d_val + iBaseDiff);
- if(iBaseDiff != 0) dynamicTab[j].d_val += iBaseDiff;
- dynsymtab = (void*)(intptr_t)dynamicTab[j].d_val;
+ dynsymtab = (void*)((intptr_t)dynamicTab[j].d_val + iBaseDiff);
+ //if(iBaseDiff != 0) dynamicTab[j].d_val += iBaseDiff;
break;
// --- String Table ---
case DT_STRTAB:
DEBUGS(" elf_relocate: DYNAMIC String Table 0x%x (0x%x)",
dynamicTab[j].d_val, dynamicTab[j].d_val + iBaseDiff);
- if(iBaseDiff != 0) dynamicTab[j].d_val += iBaseDiff;
- dynstrtab = (void*)(intptr_t)dynamicTab[j].d_val;
+ dynstrtab = (void*)((intptr_t)dynamicTab[j].d_val + iBaseDiff);
+ //if(iBaseDiff != 0) dynamicTab[j].d_val += iBaseDiff;
break;
// --- Hash Table --
case DT_HASH:
- if(iBaseDiff != 0) dynamicTab[j].d_val += iBaseDiff;
+ //if(iBaseDiff != 0) dynamicTab[j].d_val += iBaseDiff;
// iSymCount = ((Elf32_Word*)(intptr_t)dynamicTab[j].d_val)[1];
break;
}
// --- Needed Library ---
case DT_NEEDED:
libPath = dynstrtab + dynamicTab[j].d_val;
+ DEBUGS(" dynstrtab = %p, d_val = 0x%x", dynstrtab, dynamicTab[j].d_val);
DEBUGS(" Required Library '%s'", libPath);
if(LoadLibrary(libPath, NULL, envp) == 0) {
#if DEBUG
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
}
}
{
// --- Symbol Table ---
case DT_SYMTAB:
- symtab = (void*)(intptr_t) dynTab[i].d_val; // Rebased in Relocate
+ symtab = (void*)((intptr_t)dynTab[i].d_val + iBaseDiff); // Rebased in Relocate
break;
case DT_STRTAB:
- dynstrtab = (void*)(intptr_t) dynTab[i].d_val;
+ dynstrtab = (void*)((intptr_t)dynTab[i].d_val + iBaseDiff);
break;
// --- Hash Table --
case DT_HASH:
- pBuckets = (void*)(intptr_t) dynTab[i].d_val;
+ pBuckets = (void*)((intptr_t)dynTab[i].d_val + iBaseDiff);
break;
}
}
}
#ifdef SUPPORT_ELF64
+typedef int (*t_elf64_doreloc)(void *Base, const char *strtab, Elf64_Sym *symtab, Elf64_Xword r_info, void *ptr, Elf64_Sxword addend);
+
+int _Elf64DoReloc_X86_64(void *Base, const char *strtab, Elf64_Sym *symtab, 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:
+ break;
+ case R_X86_64_64:
+ if( !GetSymbol(symname, &symval, NULL) ) return 1;
+ *(uint64_t*)ptr = (uintptr_t)symval + addend;
+ break;
+ case R_X86_64_COPY: {
+ size_t size;
+ if( !GetSymbol(symname, &symval, &size) ) return 1;
+ memcpy(ptr, symval, size);
+ } break;
+ case R_X86_64_GLOB_DAT:
+ if( !GetSymbol(symname, &symval, NULL) ) return 1;
+ *(uint64_t*)ptr = (uintptr_t)symval;
+ break;
+ case R_X86_64_JUMP_SLOT:
+ if( !GetSymbol(symname, &symval, NULL) ) return 1;
+ *(uint64_t*)ptr = (uintptr_t)symval;
+ break;
+ case R_X86_64_RELATIVE:
+ *(uint64_t*)ptr = (uintptr_t)Base + addend;
+ break;
+ default:
+ SysDebug("ld-acess - _Elf64DoReloc: Unknown relocation type %i", type);
+ return 2;
+ }
+ //DEBUGS("_Elf64DoReloc: - Good");
+ return 0;
+}
+
void *Elf64Relocate(void *Base, char **envp, const char *Filename)
{
int i;
}
// 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:
- break;
- case R_X86_64_64:
- if( !GetSymbol(symname, &symval, NULL) ) return 1;
- *(uint64_t*)ptr = (uintptr_t)symval + addend;
- break;
- case R_X86_64_COPY: {
- size_t size;
- if( !GetSymbol(symname, &symval, &size) ) return 1;
- memcpy(ptr, symval, size);
- } break;
- case R_X86_64_GLOB_DAT:
- if( !GetSymbol(symname, &symval, NULL) ) return 1;
- *(uint64_t*)ptr = (uintptr_t)symval;
- break;
- case R_X86_64_JUMP_SLOT:
- if( !GetSymbol(symname, &symval, NULL) ) return 1;
- *(uint64_t*)ptr = (uintptr_t)symval;
- break;
- case R_X86_64_RELATIVE:
- *(uint64_t*)ptr = (uintptr_t)Base + addend;
- break;
- default:
- SysDebug("ld-acess - _Elf64DoReloc: Unknown relocation type %i", type);
- return 2;
- }
- //DEBUGS("_Elf64DoReloc: - Good");
- return 0;
- }
+ t_elf64_doreloc fpElf64DoReloc = &_Elf64DoReloc_X86_64;
+ #define _Elf64DoReloc(info, ptr, addend) fpElf64DoReloc(Base, strtab, symtab, info, ptr, addend)
int fail = 0;
if( rel )