4 #include "tizenasanenvmodule.h"
7 using Addr = Elf64_Addr;
10 using Rel = Elf64_Rel;
11 using Rela = Elf64_Rela;
13 using Addr = Elf32_Addr;
14 using Dyn = Elf32_Dyn;
15 using Sym = Elf32_Sym;
16 using Rel = Elf32_Rel;
17 using Rela = Elf32_Rela;
21 * Request arguments for dlinfo().
23 #define RTLD_DI_LINKMAP 2 /* Obtain link map. */
26 Addr l_addr; /* Base Address of library */
27 const char *l_name; /* Absolute Path to Library */
28 Dyn *l_ld; /* Pointer to .dynamic in memory */
29 struct link_map *l_next, *l_prev; /* linked list of of mapped libs */
32 extern "C" int dlinfo(void *handle, int request, void *info);
34 struct plt_sym_resolver {
35 Sym *dynsym; // .dynsym section
36 char *dynstr; // .dynstr section
37 long reltype; // relocation type
38 size_t pltrel_size; // size of .rel(a).plt section
39 void *jmprel; // .rel(a).plt section. Exact relocation
40 // type is resolved at runtime
43 : dynsym(nullptr), dynstr(nullptr), reltype(-1), pltrel_size(0),
47 bool init(void *handle)
49 struct link_map *lmap;
51 if (handle == nullptr || dlinfo(handle, RTLD_DI_LINKMAP, &lmap) < 0)
54 if (lmap == nullptr || lmap->l_ld == nullptr)
57 return init_relocation_info(lmap->l_ld);
60 bool is_symbol_available(const char *sym) const
64 return is_symbol_available_in_rtable(reinterpret_cast<Rel *>(jmprel), sym);
66 return is_symbol_available_in_rtable(reinterpret_cast<Rela *>(jmprel), sym);
67 default: // no relocations
74 bool init_relocation_info(Dyn *dynamic)
76 for (Dyn *dyn = dynamic; dyn->d_tag != DT_NULL; ++dyn) {
79 dynsym = reinterpret_cast<Sym *>(dyn->d_un.d_ptr);
82 dynstr = reinterpret_cast<char *>(dyn->d_un.d_ptr);
85 reltype = dyn->d_un.d_val;
88 pltrel_size = dyn->d_un.d_val;
91 jmprel = reinterpret_cast<void *>(dyn->d_un.d_ptr);
98 if (dynsym == nullptr ||
102 (reltype != DT_REL && reltype != DT_RELA))
108 template<typename Rel>
109 bool is_symbol_available_in_rtable(const Rel *rel_table, const char *sym) const
111 if (rel_table == nullptr || pltrel_size == 0)
114 const size_t rel_cnt = pltrel_size / sizeof(Rel);
115 const Rel *rel_end = rel_table + rel_cnt;
116 for (const Rel *rel = rel_table; rel < rel_end; ++rel) {
117 if (strcmp(sym, rel_to_symname(rel)) == 0)
124 template<typename Rel>
125 inline char *rel_to_symname(const Rel *rel) const
127 return dynstr + dynsym[rel->getSymbol()].st_name;
131 BOOL is_module_sanitized(void *handle)
133 plt_sym_resolver psr;
134 if (!psr.init(handle))
136 return psr.is_symbol_available("__asan_init") ? TRUE : FALSE;