| Juan Cespedes | d914a20 | 2004-11-10 00:15:33 +0100 | [diff] [blame] | 1 | #include <gelf.h> |
| Juan Cespedes | f728123 | 2009-06-25 16:11:21 +0200 | [diff] [blame] | 2 | #include "common.h" |
| Juan Cespedes | d914a20 | 2004-11-10 00:15:33 +0100 | [diff] [blame] | 3 | |
| Zach Welch | d568f51 | 2010-10-08 14:44:16 -0700 | [diff] [blame^] | 4 | static int |
| 5 | arch_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 Cespedes | f135052 | 2008-12-16 18:19:58 +0100 | [diff] [blame] | 10 | GElf_Addr |
| 11 | arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela * rela) { |
| Zach Welch | d568f51 | 2010-10-08 14:44:16 -0700 | [diff] [blame^] | 12 | 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 Wienand | 9a2ad35 | 2006-02-20 22:44:45 +0100 | [diff] [blame] | 19 | } |
| 20 | |
| Juan Cespedes | f135052 | 2008-12-16 18:19:58 +0100 | [diff] [blame] | 21 | void * |
| Juan Cespedes | a8909f7 | 2009-04-28 20:02:41 +0200 | [diff] [blame] | 22 | sym2addr(Process *proc, struct library_symbol *sym) { |
| Paul Gilliam | 76c61f1 | 2006-06-14 06:55:21 +0200 | [diff] [blame] | 23 | return sym->enter_addr; |
| Juan Cespedes | d914a20 | 2004-11-10 00:15:33 +0100 | [diff] [blame] | 24 | } |