Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
bfbba189 ACM |
2 | #include <elf.h> |
3 | #include <inttypes.h> | |
4 | #include <stdio.h> | |
5 | ||
6 | #include "symbol.h" | |
7 | ||
8 | size_t symbol__fprintf(struct symbol *sym, FILE *fp) | |
9 | { | |
10 | return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %c %s\n", | |
11 | sym->start, sym->end, | |
12 | sym->binding == STB_GLOBAL ? 'g' : | |
13 | sym->binding == STB_LOCAL ? 'l' : 'w', | |
14 | sym->name); | |
15 | } | |
16 | ||
17 | size_t __symbol__fprintf_symname_offs(const struct symbol *sym, | |
18 | const struct addr_location *al, | |
a8763445 NK |
19 | bool unknown_as_addr, |
20 | bool print_offsets, FILE *fp) | |
bfbba189 ACM |
21 | { |
22 | unsigned long offset; | |
23 | size_t length; | |
24 | ||
a7c3899c | 25 | if (sym) { |
bfbba189 | 26 | length = fprintf(fp, "%s", sym->name); |
a8763445 | 27 | if (al && print_offsets) { |
bfbba189 ACM |
28 | if (al->addr < sym->end) |
29 | offset = al->addr - sym->start; | |
30 | else | |
31 | offset = al->addr - al->map->start - sym->start; | |
32 | length += fprintf(fp, "+0x%lx", offset); | |
33 | } | |
34 | return length; | |
35 | } else if (al && unknown_as_addr) | |
36 | return fprintf(fp, "[%#" PRIx64 "]", al->addr); | |
37 | else | |
38 | return fprintf(fp, "[unknown]"); | |
39 | } | |
40 | ||
41 | size_t symbol__fprintf_symname_offs(const struct symbol *sym, | |
42 | const struct addr_location *al, | |
43 | FILE *fp) | |
44 | { | |
a8763445 | 45 | return __symbol__fprintf_symname_offs(sym, al, false, true, fp); |
bfbba189 ACM |
46 | } |
47 | ||
48 | size_t __symbol__fprintf_symname(const struct symbol *sym, | |
49 | const struct addr_location *al, | |
50 | bool unknown_as_addr, FILE *fp) | |
51 | { | |
a8763445 | 52 | return __symbol__fprintf_symname_offs(sym, al, unknown_as_addr, false, fp); |
bfbba189 ACM |
53 | } |
54 | ||
55 | size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp) | |
56 | { | |
a8763445 | 57 | return __symbol__fprintf_symname_offs(sym, NULL, false, false, fp); |
bfbba189 ACM |
58 | } |
59 | ||
60 | size_t dso__fprintf_symbols_by_name(struct dso *dso, | |
61 | enum map_type type, FILE *fp) | |
62 | { | |
63 | size_t ret = 0; | |
64 | struct rb_node *nd; | |
65 | struct symbol_name_rb_node *pos; | |
66 | ||
67 | for (nd = rb_first(&dso->symbol_names[type]); nd; nd = rb_next(nd)) { | |
68 | pos = rb_entry(nd, struct symbol_name_rb_node, rb_node); | |
69 | fprintf(fp, "%s\n", pos->sym.name); | |
70 | } | |
71 | ||
72 | return ret; | |
73 | } |