4 #include <libelfu/libelfu.h>
7 /* Apply relocation information from section *msrt to data in
8 * section *mstarget (which is stored in *metarget). */
9 void elfu_mRelocate(ElfuElf *metarget, ElfuScn *mstarget, ElfuScn *msrt)
16 ELFU_DEBUG("Relocating in section of type %d size %jx\n",
17 mstarget->shdr.sh_type,
18 mstarget->shdr.sh_size);
20 CIRCLEQ_FOREACH(rel, &msrt->reltab.rels, elem) {
21 Elf32_Word *dest32 = (Elf32_Word*)(((char*)(mstarget->data.d_buf)) + rel->offset);
22 Elf64_Word *dest64 = (Elf64_Word*)(((char*)(mstarget->data.d_buf)) + rel->offset);
25 if (metarget->elfclass == ELFCLASS32) {
26 Elf32_Word a32 = rel->addendUsed ? rel->addend : *dest32;
27 Elf32_Addr p32 = mstarget->shdr.sh_addr + rel->offset;
28 Elf32_Addr s32 = elfu_mSymtabLookupVal(metarget, msrt->linkptr, rel->sym);
31 ELFU_DEBUG("Skipping relocation: R_386_NONE\n");
37 *dest32 = s32 + a32 - p32;
41 ELFU_DEBUG("Skipping relocation: Unknown type %d\n", rel->type);
43 } else if (metarget->elfclass == ELFCLASS64) {
44 /* x86-64 only uses RELA with explicit addend. */
45 assert(rel->addendUsed);
46 Elf64_Word a64 = rel->addend;
47 Elf64_Addr p64 = mstarget->shdr.sh_addr + rel->offset;
48 Elf64_Addr s64 = elfu_mSymtabLookupVal(metarget, msrt->linkptr, rel->sym);
52 ELFU_DEBUG("Skipping relocation: R_386_NONE\n");
58 *dest32 = s64 + a64 - p64;
65 ELFU_DEBUG("Skipping relocation: Unknown type %d", rel->type);