1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include <elf.h> |
3 | #include <inttypes.h> |
4 | #include <stdio.h> |
5 | |
6 | #include "dso.h" |
7 | #include "map.h" |
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, |
21 | bool unknown_as_addr, |
22 | bool print_offsets, FILE *fp) |
23 | { |
24 | unsigned long offset; |
25 | size_t length; |
26 | |
27 | if (sym) { |
28 | length = fprintf(fp, "%s" , sym->name); |
29 | if (al && print_offsets) { |
30 | if (al->addr < sym->end) |
31 | offset = al->addr - sym->start; |
32 | else |
33 | offset = al->addr - map__start(map: al->map) - sym->start; |
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 | { |
47 | return __symbol__fprintf_symname_offs(sym, al, false, true, fp); |
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 | { |
54 | return __symbol__fprintf_symname_offs(sym, al, unknown_as_addr, false, fp); |
55 | } |
56 | |
57 | size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp) |
58 | { |
59 | return __symbol__fprintf_symname_offs(sym, NULL, false, false, fp); |
60 | } |
61 | |
62 | size_t dso__fprintf_symbols_by_name(struct dso *dso, |
63 | FILE *fp) |
64 | { |
65 | size_t ret = 0; |
66 | |
67 | for (size_t i = 0; i < dso->symbol_names_len; i++) { |
68 | struct symbol *pos = dso->symbol_names[i]; |
69 | |
70 | ret += fprintf(fp, "%s\n" , pos->name); |
71 | } |
72 | return ret; |
73 | } |
74 | |