#include "elf.h" #include #include #include uintptr_t dl_runtime_resolve(struct elf_image *img, unsigned long sym_id) { elf_sym_t *sym = (elf_sym_t *)((virt_addr_t)img->e_base + img->e_dynsym); const char *sym_name = (const char *)img->e_base + img->e_strtab + sym[sym_id + 1].st_name; // kern_logf("%s: request for symbol %s", img->e_leaf.l_name, sym_name); virt_addr_t sym_addr = elf_image_find_linked_symbol(img, sym_name); virt_addr_t *sym_slot = (virt_addr_t *)((virt_addr_t)img->e_base + img->e_got_plt + ((sym_id + 3) * sizeof(virt_addr_t))); // kern_logf("symbol %s = %zx", sym_name, sym_addr); // kern_logf("slot %s = %zx", sym_name, sym_slot); *sym_slot = sym_addr; return sym_addr; }