Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf jit: Fix incorrect file name in DWARF line table

Fixes an issue where an incorrect filename was added in the DWARF line table of
an ELF object file when calling 'perf inject --jit' due to not checking the
filename of a debug entry against the repeated name marker (/xff/0).
The marker is mentioned in the tools/perf/util/jitdump.h header, which describes
the jitdump binary format, and indicitates that the filename in a debug entry
is the same as the previous enrty.

In the function emit_lineno_info(), in the file tools/perf/util/genelf-debug.c,
the debug entry filename gets compared to the previous entry filename. If they
are not the same, a new filename is added to the DWARF line table. However,
since there is no check against '\xff\0', in some cases '\xff\0' is inserted
as the filename into the DWARF line table.

This can be seen with `objdump --dwarf=line` on the ELF file after `perf inject --jit`.
It also makes no source code information show up in 'perf annotate'.

Signed-off-by: Elisabeth Panholzer <elisabeth@leaningtech.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20230602123815.255001-1-paniii94@gmail.com
[ Fixed a trailing white space, removed a subject prefix ]
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

authored by

elisabeth and committed by
Namhyung Kim
362f9c90 4ca0d340

+5 -1
+5 -1
tools/perf/util/genelf_debug.c
··· 337 337 { 338 338 size_t i; 339 339 340 + /* as described in the jitdump format */ 341 + const char repeated_name_marker[] = {'\xff', '\0'}; 342 + 340 343 /* 341 344 * Machine state at start of a statement program 342 345 * address = 0 ··· 366 363 /* 367 364 * check if filename changed, if so add it 368 365 */ 369 - if (!cur_filename || strcmp(cur_filename, ent->name)) { 366 + if ((!cur_filename || strcmp(cur_filename, ent->name)) && 367 + strcmp(repeated_name_marker, ent->name)) { 370 368 emit_lne_define_filename(be, ent->name); 371 369 cur_filename = ent->name; 372 370 emit_set_file(be, ++cur_file_idx);