OLD | NEW |
| (Empty) |
1 #define _GNU_SOURCE | |
2 #include <link.h> | |
3 #include <stdint.h> | |
4 | |
5 struct find_exidx_data { | |
6 uintptr_t pc, exidx_start; | |
7 int exidx_len; | |
8 }; | |
9 | |
10 static int find_exidx(struct dl_phdr_info* info, size_t size, void* ptr) { | |
11 struct find_exidx_data* data = ptr; | |
12 const ElfW(Phdr)* phdr = info->dlpi_phdr; | |
13 uintptr_t addr, exidx_start = 0; | |
14 int i, match = 0, exidx_len = 0; | |
15 | |
16 for (i = info->dlpi_phnum; i > 0; i--, phdr++) { | |
17 addr = info->dlpi_addr + phdr->p_vaddr; | |
18 switch (phdr->p_type) { | |
19 case PT_LOAD: | |
20 match |= data->pc >= addr && data->pc < addr + phdr->p_memsz; | |
21 break; | |
22 case PT_ARM_EXIDX: | |
23 exidx_start = addr; | |
24 exidx_len = phdr->p_memsz; | |
25 break; | |
26 } | |
27 } | |
28 data->exidx_start = exidx_start; | |
29 data->exidx_len = exidx_len; | |
30 return match; | |
31 } | |
32 | |
33 uintptr_t __gnu_Unwind_Find_exidx(uintptr_t pc, int* pcount) { | |
34 struct find_exidx_data data; | |
35 data.pc = pc; | |
36 if (dl_iterate_phdr(find_exidx, &data) <= 0) | |
37 return 0; | |
38 *pcount = data.exidx_len / 8; | |
39 return data.exidx_start; | |
40 } | |
OLD | NEW |