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 | ||
b1d1b094 | 6 | #include "dso.h" |
d328e305 | 7 | #include "map.h" |
bfbba189 ACM |
8 | #include "symbol.h" |
9 | ||
10 | size_t symbol__fprintf(struct symbol *sym, FILE *fp) | |
11 | { | |
12 | return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %c %s\n", | |
13 | sym->start, sym->end, | |
14 | sym->binding == STB_GLOBAL ? 'g' : | |
15 | sym->binding == STB_LOCAL ? 'l' : 'w', | |
16 | sym->name); | |
17 | } | |
18 | ||
19 | size_t __symbol__fprintf_symname_offs(const struct symbol *sym, | |
20 | const struct addr_location *al, | |
a8763445 NK |
21 | bool unknown_as_addr, |
22 | bool print_offsets, FILE *fp) | |
bfbba189 ACM |
23 | { |
24 | unsigned long offset; | |
25 | size_t length; | |
26 | ||
a7c3899c | 27 | if (sym) { |
bfbba189 | 28 | length = fprintf(fp, "%s", sym->name); |
a8763445 | 29 | if (al && print_offsets) { |
bfbba189 ACM |
30 | if (al->addr < sym->end) |
31 | offset = al->addr - sym->start; | |
32 | else | |
e5116f46 | 33 | offset = al->addr - map__start(al->map) - sym->start; |
bfbba189 ACM |
34 | length += fprintf(fp, "+0x%lx", offset); |
35 | } | |
36 | return length; | |
37 | } else if (al && unknown_as_addr) | |
38 | return fprintf(fp, "[%#" PRIx64 "]", al->addr); | |
39 | else | |
40 | return fprintf(fp, "[unknown]"); | |
41 | } | |
42 | ||
43 | size_t symbol__fprintf_symname_offs(const struct symbol *sym, | |
44 | const struct addr_location *al, | |
45 | FILE *fp) | |
46 | { | |
a8763445 | 47 | return __symbol__fprintf_symname_offs(sym, al, false, true, fp); |
bfbba189 ACM |
48 | } |
49 | ||
50 | size_t __symbol__fprintf_symname(const struct symbol *sym, | |
51 | const struct addr_location *al, | |
52 | bool unknown_as_addr, FILE *fp) | |
53 | { | |
a8763445 | 54 | return __symbol__fprintf_symname_offs(sym, al, unknown_as_addr, false, fp); |
bfbba189 ACM |
55 | } |
56 | ||
57 | size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp) | |
58 | { | |
a8763445 | 59 | return __symbol__fprintf_symname_offs(sym, NULL, false, false, fp); |
bfbba189 ACM |
60 | } |
61 | ||
62 | size_t dso__fprintf_symbols_by_name(struct dso *dso, | |
3183f8ca | 63 | FILE *fp) |
bfbba189 ACM |
64 | { |
65 | size_t ret = 0; | |
bfbba189 | 66 | |
259dce91 IR |
67 | for (size_t i = 0; i < dso->symbol_names_len; i++) { |
68 | struct symbol *pos = dso->symbol_names[i]; | |
bfbba189 | 69 | |
259dce91 IR |
70 | ret += fprintf(fp, "%s\n", pos->name); |
71 | } | |
bfbba189 ACM |
72 | return ret; |
73 | } |