blob: 76f4f4cdabd977de0056fb47fab424cf3215971e [file] [log] [blame]
Juan Cespedesd914a202004-11-10 00:15:33 +01001#include <gelf.h>
Juan Cespedesf7281232009-06-25 16:11:21 +02002#include "common.h"
Juan Cespedesd914a202004-11-10 00:15:33 +01003
Zach Welchd568f512010-10-08 14:44:16 -07004static int
5arch_plt_entry_has_stub(struct ltelf *lte, size_t off) {
6 uint16_t op = *(uint16_t *)((char *)lte->relplt->d_buf + off);
7 return op == 0x4778;
8}
9
Juan Cespedesf1350522008-12-16 18:19:58 +010010GElf_Addr
11arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela * rela) {
Zach Welchd568f512010-10-08 14:44:16 -070012 size_t start = lte->relplt->d_size + 12;
13 size_t off = start + 20, i;
14 for (i = 0; i < ndx; i++)
15 off += arch_plt_entry_has_stub(lte, off) ? 16 : 12;
16 if (arch_plt_entry_has_stub(lte, off))
17 off += 4;
18 return lte->plt_addr + off - start;
Ian Wienand9a2ad352006-02-20 22:44:45 +010019}
20
Juan Cespedesf1350522008-12-16 18:19:58 +010021void *
Juan Cespedesa8909f72009-04-28 20:02:41 +020022sym2addr(Process *proc, struct library_symbol *sym) {
Paul Gilliam76c61f12006-06-14 06:55:21 +020023 return sym->enter_addr;
Juan Cespedesd914a202004-11-10 00:15:33 +010024}