Lines Matching refs:symtab

31 #include "symtab.h"
50 typedef struct symtab {
58 struct symtab* build_symtab(int fd) {
60 struct symtab* symtab = NULL;
126 // guarantee(symtab == NULL, "multiple symtab");
127 symtab = calloc(1, sizeof(*symtab));
128 if (symtab == NULL) {
139 symtab->hash_table = dbopen(NULL, O_CREAT | O_RDWR, 0600, DB_HASH, NULL);
140 // guarantee(symtab->hash_table, "unexpected failure: dbopen");
141 if (symtab->hash_table == NULL)
149 symtab->strs = malloc(size);
150 if (symtab->strs == NULL)
152 memcpy(symtab->strs, scn_cache[shdr->sh_link].c_data, size);
155 symtab->num_symbols = n;
156 symtab->symbols = calloc(n , sizeof(*symtab->symbols));
157 if (symtab->symbols == NULL)
160 // copy symbols info our symtab and enter them info the hash table
163 char *sym_name = symtab->strs + syms->st_name;
172 symtab->symbols[j].name = sym_name;
173 symtab->symbols[j].offset = syms->st_value - baseaddr;
174 symtab->symbols[j].size = syms->st_size;
178 value.data = &(symtab->symbols[j]);
180 (*symtab->hash_table->put)(symtab->hash_table, &key, &value, 0);
187 destroy_symtab(symtab);
188 symtab = NULL;
201 return symtab;
204 void destroy_symtab(struct symtab* symtab) {
205 if (!symtab) return;
206 if (symtab->strs) free(symtab->strs);
207 if (symtab->symbols) free(symtab->symbols);
208 if (symtab->hash_table) {
209 (*symtab->hash_table->close)(symtab->hash_table);
211 free(symtab);
214 uintptr_t search_symbol(struct symtab* symtab, uintptr_t base,
220 if (!symtab || !symtab->hash_table)
225 ret = (*symtab->hash_table->get)(symtab->hash_table, &key, &value, 0);
236 const char* nearest_symbol(struct symtab* symtab, uintptr_t offset,
239 if (!symtab) return NULL;
240 for (; n < symtab->num_symbols; n++) {
241 struct elf_symbol* sym = &(symtab->symbols[n]);