brintos

brintos / linux-shallow public Read only

0
0
Text · 1.8 KiB · 53e1af4 Raw
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