23 lines
794 B
C
23 lines
794 B
C
#include "elf.h"
|
|
|
|
#include <mango/log.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
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;
|
|
}
|