3 #include <libelfu/libelfu.h>
6 static GElf_Word symtabLookupVal(ElfuElf *metarget, ElfuScn *msst, GElf_Word entry)
15 assert(!CIRCLEQ_EMPTY(&msst->symtab->syms));
17 sym = CIRCLEQ_FIRST(&msst->symtab->syms);
18 for (i = 1; i < entry; i++) {
19 sym = CIRCLEQ_NEXT(sym, elem);
27 assert(elfu_mScnByOldscn(metarget, sym->scnptr));
28 return elfu_mScnByOldscn(metarget, sym->scnptr)->shdr.sh_addr + sym->value;
30 // TODO: UNDEF, ABS, or COMMON
31 ELFU_WARN("symtabLookupVal: Returning 0 for UNDEF, ABS, or COMMON symbol.\n");
36 assert(elfu_mScnByOldscn(metarget, sym->scnptr));
37 return elfu_mScnByOldscn(metarget, sym->scnptr)->shdr.sh_addr;
40 ELFU_WARN("symtabLookupVal: Returning 0 for FILE symbol.\n");
43 ELFU_WARN("symtabLookupVal: Unknown symbol type %d.\n", sym->type);
48 void elfu_mRelocate32(ElfuElf *metarget, ElfuScn *mstarget, ElfuScn *msrt)
55 ELFU_DEBUG("Relocating in section of type %d size %jx\n",
56 mstarget->shdr.sh_type,
57 mstarget->shdr.sh_size);
59 CIRCLEQ_FOREACH(rel, &msrt->reltab->rels, elem) {
60 Elf32_Word *dest = (Elf32_Word*)(((char*)(mstarget->data.d_buf)) + rel->offset);
61 Elf32_Word a = rel->addendUsed ? rel->addend : *dest;
62 Elf32_Addr p = mstarget->shdr.sh_addr + rel->offset;
63 Elf32_Addr s = symtabLookupVal(metarget, msrt->linkptr, rel->sym);
64 Elf32_Word newval = *dest;
68 ELFU_DEBUG("Skipping relocation: R_386_NONE");
71 ELFU_DEBUG("Relocation: R_386_32");
75 ELFU_DEBUG("Relocation: R_386_PC32");
80 ELFU_DEBUG("Skipping relocation: Unknown type %d", rel->type);
82 ELFU_DEBUG(", overwriting %x with %x.\n", *dest, newval);