|
@@ -830,6 +830,30 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void delete_last_nop(struct symbol *sym)
|
|
|
+{
|
|
|
+ struct annotation *notes = symbol__annotation(sym);
|
|
|
+ struct list_head *list = ¬es->src->source;
|
|
|
+ struct disasm_line *dl;
|
|
|
+
|
|
|
+ while (!list_empty(list)) {
|
|
|
+ dl = list_entry(list->prev, struct disasm_line, node);
|
|
|
+
|
|
|
+ if (dl->ins && dl->ins->ops) {
|
|
|
+ if (dl->ins->ops != &nop_ops)
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ if (!strstr(dl->line, " nop ") &&
|
|
|
+ !strstr(dl->line, " nopl ") &&
|
|
|
+ !strstr(dl->line, " nopw "))
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ list_del(&dl->node);
|
|
|
+ disasm_line__free(dl);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize)
|
|
|
{
|
|
|
struct dso *dso = map->dso;
|
|
@@ -923,6 +947,13 @@ fallback:
|
|
|
if (symbol__parse_objdump_line(sym, map, file, privsize) < 0)
|
|
|
break;
|
|
|
|
|
|
+ /*
|
|
|
+ * kallsyms does not have symbol sizes so there may a nop at the end.
|
|
|
+ * Remove it.
|
|
|
+ */
|
|
|
+ if (dso__is_kcore(dso))
|
|
|
+ delete_last_nop(sym);
|
|
|
+
|
|
|
pclose(file);
|
|
|
out_free_filename:
|
|
|
if (free_filename)
|