blob: 59fae2d81f2a8843a04867ef8afb8035c108973b [file] [log] [blame]
Juan Cespedesd914a202004-11-10 00:15:33 +01001#include <gelf.h>
Petr Machatac0ab2862012-05-05 00:06:17 +02002
Petr Machata366c2f42012-02-09 19:34:36 +01003#include "proc.h"
Petr Machatac0ab2862012-05-05 00:06:17 +02004#include "library.h"
5#include "ltrace-elf.h"
Juan Cespedesd914a202004-11-10 00:15:33 +01006
Zach Welchd568f512010-10-08 14:44:16 -07007static int
8arch_plt_entry_has_stub(struct ltelf *lte, size_t off) {
9 uint16_t op = *(uint16_t *)((char *)lte->relplt->d_buf + off);
10 return op == 0x4778;
11}
12
Juan Cespedesf1350522008-12-16 18:19:58 +010013GElf_Addr
14arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela * rela) {
Zach Welchd568f512010-10-08 14:44:16 -070015 size_t start = lte->relplt->d_size + 12;
16 size_t off = start + 20, i;
17 for (i = 0; i < ndx; i++)
18 off += arch_plt_entry_has_stub(lte, off) ? 16 : 12;
19 if (arch_plt_entry_has_stub(lte, off))
20 off += 4;
21 return lte->plt_addr + off - start;
Ian Wienand9a2ad352006-02-20 22:44:45 +010022}
23
Juan Cespedesf1350522008-12-16 18:19:58 +010024void *
Juan Cespedesa8909f72009-04-28 20:02:41 +020025sym2addr(Process *proc, struct library_symbol *sym) {
Paul Gilliam76c61f12006-06-14 06:55:21 +020026 return sym->enter_addr;
Juan Cespedesd914a202004-11-10 00:15:33 +010027}