__map_groups__fixup_end(self, i);
}
-static struct symbol *symbol__new(u64 start, u64 len, const char *name)
+static struct symbol *symbol__new(u64 start, u64 len, u8 binding,
+ const char *name)
{
size_t namelen = strlen(name) + 1;
struct symbol *self = calloc(1, (symbol_conf.priv_size +
self->start = start;
self->end = len ? start + len - 1 : start;
+ self->binding = binding;
self->namelen = namelen - 1;
pr_debug4("%s: %s %#Lx-%#Lx\n", __func__, name, start, self->end);
static size_t symbol__fprintf(struct symbol *self, FILE *fp)
{
- return fprintf(fp, " %llx-%llx %s\n",
- self->start, self->end, self->name);
+ return fprintf(fp, " %llx-%llx %c %s\n",
+ self->start, self->end,
+ self->binding == STB_GLOBAL ? 'g' :
+ self->binding == STB_LOCAL ? 'l' : 'w',
+ self->name);
}
void dso__set_long_name(struct dso *self, char *name)
struct dso *dso;
};
+static u8 kallsyms2elf_type(char type)
+{
+ if (type == 'W')
+ return STB_WEAK;
+
+ return isupper(type) ? STB_GLOBAL : STB_LOCAL;
+}
+
static int map__process_kallsym_symbol(void *arg, const char *name,
char type, u64 start)
{
/*
* Will fix up the end later, when we have all symbols sorted.
*/
- sym = symbol__new(start, 0, name);
+ sym = symbol__new(start, 0, kallsyms2elf_type(type), name);
if (sym == NULL)
return -ENOMEM;
if (len + 2 >= line_len)
continue;
- sym = symbol__new(start, size, line + len);
+ sym = symbol__new(start, size, STB_GLOBAL, line + len);
if (sym == NULL)
goto out_delete_line;
"%s@plt", elf_sym__name(&sym, symstrs));
f = symbol__new(plt_offset, shdr_plt.sh_entsize,
- sympltname);
+ STB_GLOBAL, sympltname);
if (!f)
goto out_elf_end;
"%s@plt", elf_sym__name(&sym, symstrs));
f = symbol__new(plt_offset, shdr_plt.sh_entsize,
- sympltname);
+ STB_GLOBAL, sympltname);
if (!f)
goto out_elf_end;
if (demangled != NULL)
elf_name = demangled;
new_symbol:
- f = symbol__new(sym.st_value, sym.st_size, elf_name);
+ f = symbol__new(sym.st_value, sym.st_size,
+ GELF_ST_BIND(sym.st_info), elf_name);
free(demangled);
if (!f)
goto out_elf_end;