- // Determine linked base address
- if(phtab[i].Type == PT_LOAD && iRealBase > phtab[i].VAddr)
- iRealBase = phtab[i].VAddr;
-
- // Find Dynamic Section
- if(phtab[i].Type == PT_DYNAMIC) {
- if(dynamicTab) {
- DEBUGS(" WARNING - elf_relocate: Multiple PT_DYNAMIC segments");
- continue;
- }
- dynamicTab = (void *) (intptr_t) phtab[i].VAddr;
- j = i; // Save Dynamic Table ID
- }
- }
-
- // Page Align real base
- iRealBase &= ~0xFFF;
- DEBUGS(" elf_relocate: True Base = 0x%x, Compiled Base = 0x%x", Base, iRealBase);
-
- // Adjust "Real" Base
- iBaseDiff = (intptr_t)Base - iRealBase;
-
-// hdr->entrypoint += iBaseDiff; // Adjust Entrypoint
-
- // Check if a PT_DYNAMIC segement was found
- if(!dynamicTab) {
- SysDebug(" elf_relocate: No PT_DYNAMIC segment in image %p, returning", Base);
- return (void *)(intptr_t)(hdr->entrypoint + iBaseDiff);
- }
-
- // Adjust Dynamic Table
- dynamicTab = (void *)( (intptr_t)dynamicTab + iBaseDiff );
-
- // === Get Symbol table and String Table ===
- for( j = 0; dynamicTab[j].d_tag != DT_NULL; j++)
- {
- switch(dynamicTab[j].d_tag)
- {
- // --- Symbol Table ---
- 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;
- 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;
- break;
- // --- Hash Table --
- case DT_HASH:
- if(iBaseDiff != 0) dynamicTab[j].d_val += iBaseDiff;
-// iSymCount = ((Elf32_Word*)(intptr_t)dynamicTab[j].d_val)[1];
- break;
- }