Lines Matching refs:sym
20 static unsigned int __for_each_addr(struct symbol *sym, symbol_callback_t func, in __for_each_addr() argument
28 symbol_addr_hash(&sym->addr)) { in __for_each_addr()
29 if (match == sym) in __for_each_addr()
32 if (match->addr.section == sym->addr.section && in __for_each_addr()
33 match->addr.address == sym->addr.address) { in __for_each_addr()
85 static void set_crc(struct symbol *sym, void *data) in set_crc() argument
89 if (sym->state == SYMBOL_PROCESSED && sym->crc != *crc) in set_crc()
91 sym->name, sym->crc, *crc); in set_crc()
93 sym->state = SYMBOL_PROCESSED; in set_crc()
94 sym->crc = *crc; in set_crc()
97 void symbol_set_crc(struct symbol *sym, unsigned long crc) in symbol_set_crc() argument
99 if (for_each(sym->name, set_crc, &crc) == 0) in symbol_set_crc()
100 error("no matching symbols: '%s'", sym->name); in symbol_set_crc()
103 static void set_ptr(struct symbol *sym, void *data) in set_ptr() argument
105 sym->ptr_die_addr = (uintptr_t)((Dwarf_Die *)data)->addr; in set_ptr()
108 void symbol_set_ptr(struct symbol *sym, Dwarf_Die *ptr) in symbol_set_ptr() argument
110 if (for_each(sym->name, set_ptr, ptr) == 0) in symbol_set_ptr()
111 error("no matching symbols: '%s'", sym->name); in symbol_set_ptr()
114 static void set_die(struct symbol *sym, void *data) in set_die() argument
116 sym->die_addr = (uintptr_t)((Dwarf_Die *)data)->addr; in set_die()
117 sym->state = SYMBOL_MAPPED; in set_die()
120 void symbol_set_die(struct symbol *sym, Dwarf_Die *die) in symbol_set_die() argument
122 if (for_each(sym->name, set_die, die) == 0) in symbol_set_die()
123 error("no matching symbols: '%s'", sym->name); in symbol_set_die()
133 struct symbol *sym; in symbol_read_exports() local
149 sym = xcalloc(1, sizeof(*sym)); in symbol_read_exports()
150 sym->name = name; in symbol_read_exports()
151 sym->addr.section = SHN_UNDEF; in symbol_read_exports()
152 sym->state = SYMBOL_UNPROCESSED; in symbol_read_exports()
154 hash_add(symbol_names, &sym->name_hash, hash_str(sym->name)); in symbol_read_exports()
157 debug("%s", sym->name); in symbol_read_exports()
164 static void get_symbol(struct symbol *sym, void *arg) in get_symbol() argument
168 if (sym->state == SYMBOL_UNPROCESSED) in get_symbol()
169 *res = sym; in get_symbol()
174 struct symbol *sym = NULL; in symbol_get() local
176 for_each(name, get_symbol, &sym); in symbol_get()
177 return sym; in symbol_get()
183 struct symbol *sym; in symbol_for_each() local
185 hash_for_each_safe(symbol_names, sym, tmp, name_hash) { in symbol_for_each()
186 func(sym, arg); in symbol_for_each()
190 typedef void (*elf_symbol_callback_t)(const char *name, GElf_Sym *sym,
252 GElf_Sym *sym; in elf_for_each_global() local
254 sym = gelf_getsymshndx(data, xndx_data, n, in elf_for_each_global()
256 if (!sym) in elf_for_each_global()
260 if (GELF_ST_BIND(sym->st_info) == STB_LOCAL) in elf_for_each_global()
263 if (sym->st_shndx != SHN_XINDEX) in elf_for_each_global()
264 xndx = sym->st_shndx; in elf_for_each_global()
267 sym->st_name); in elf_for_each_global()
274 func(name, sym, xndx, arg); in elf_for_each_global()
284 static void set_symbol_addr(struct symbol *sym, void *arg) in set_symbol_addr() argument
288 if (sym->addr.section == SHN_UNDEF) { in set_symbol_addr()
289 sym->addr = *addr; in set_symbol_addr()
290 hash_add(symbol_addrs, &sym->addr_hash, in set_symbol_addr()
291 symbol_addr_hash(&sym->addr)); in set_symbol_addr()
293 debug("%s -> { %u, %lx }", sym->name, sym->addr.section, in set_symbol_addr()
294 sym->addr.address); in set_symbol_addr()
295 } else if (sym->addr.section != addr->section || in set_symbol_addr()
296 sym->addr.address != addr->address) { in set_symbol_addr()
297 warn("multiple addresses for symbol %s?", sym->name); in set_symbol_addr()
301 static void elf_set_symbol_addr(const char *name, GElf_Sym *sym, in elf_set_symbol_addr() argument
304 struct symbol_addr addr = { .section = xndx, .address = sym->st_value }; in elf_set_symbol_addr()
319 struct symbol *sym; in symbol_print_versions() local
321 hash_for_each_safe(symbol_names, sym, tmp, name_hash) { in symbol_print_versions()
322 if (sym->state != SYMBOL_PROCESSED) in symbol_print_versions()
323 warn("no information for symbol %s", sym->name); in symbol_print_versions()
325 printf("#SYMVER %s 0x%08lx\n", sym->name, sym->crc); in symbol_print_versions()
332 struct symbol *sym; in symbol_free() local
334 hash_for_each_safe(symbol_names, sym, tmp, name_hash) { in symbol_free()
335 free((void *)sym->name); in symbol_free()
336 free(sym); in symbol_free()