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