74 lines · c
1// SPDX-License-Identifier: GPL-2.02#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 10size_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 19size_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 else33 offset = al->addr - map__start(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 else40 return fprintf(fp, "[unknown]");41}42 43size_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 50size_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 57size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp)58{59 return __symbol__fprintf_symname_offs(sym, NULL, false, false, fp);60}61 62size_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(dso); i++) {68 struct symbol *pos = dso__symbol_names(dso)[i];69 70 ret += fprintf(fp, "%s\n", pos->name);71 }72 return ret;73}74