- // === Parse Relocation Data ===
- DEBUGS(" elf_relocate: dynamicTab = 0x%x", dynamicTab);
- for( j = 0; dynamicTab[j].d_tag != DT_NULL; j++)
- {
- switch(dynamicTab[j].d_tag)
- {
- // --- Shared Library Name ---
- case DT_SONAME:
- DEBUGS(" elf_relocate: .so Name '%s'", dynstrtab+dynamicTab[j].d_val);
- break;
- // --- Needed Library ---
- case DT_NEEDED:
- libPath = dynstrtab + dynamicTab[j].d_val;
- DEBUGS(" Required Library '%s'", libPath);
- if(LoadLibrary(libPath, NULL, envp) == 0) {
- #if DEBUG
- DEBUGS(" elf_relocate: Unable to load '%s'", libPath);
- #else
- SysDebug("Unable to load required library '%s'", libPath);
- #endif
- return 0;
- }
- DEBUGS(" Lib loaded");
- break;
- // --- PLT/GOT ---
-// case DT_PLTGOT: pltgot = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
- case DT_JMPREL: plt = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
- case DT_PLTREL: pltType = dynamicTab[j].d_val; break;
- case DT_PLTRELSZ: pltSz = dynamicTab[j].d_val; break;
-
- // --- Relocation ---
- case DT_REL: rel = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
- case DT_RELSZ: relSz = dynamicTab[j].d_val; break;
- case DT_RELENT: relEntSz = dynamicTab[j].d_val; break;
- case DT_RELA: rela = (void*)(iBaseDiff + dynamicTab[j].d_val); break;
- case DT_RELASZ: relaSz = dynamicTab[j].d_val; break;
- case DT_RELAENT: relaEntSz = dynamicTab[j].d_val; break;
-
- // --- Symbol Table ---
- case DT_SYMTAB:
- // --- Hash Table ---
- case DT_HASH:
- // --- String Table ---
- case DT_STRTAB:
- break;
-
- // --- Unknown ---
- default:
- if(dynamicTab[j].d_tag > DT_JMPREL) continue;
- //DEBUGS(" elf_relocate: %i-%i = %s,0x%x",
- // i,j, csaDT_NAMES[dynamicTab[j].d_tag],dynamicTab[j].d_val);
- break;
- }
- }
-
- DEBUGS(" elf_relocate: Beginning Relocation");