Re: [PATCH 08/41] perf tools: Fix missing label symbols

From: Adrian Hunter
Date: Tue Jul 15 2014 - 08:13:09 EST


On 07/14/2014 11:38 PM, Arnaldo Carvalho de Melo wrote:
> Em Mon, Jul 14, 2014 at 01:02:32PM +0300, Adrian Hunter escreveu:
>> label symbols are missing because elf_sec__is_a() fails
>> to find the section because the section strings do not
>> match the section headers because the sections headers
>> are from the 'runtime' object and the sections strings
>> are from the 'symbol source' object.
>>
>> Fix by getting the section strings from the 'runtime'
>> object so that they match the section headers.
>
> Would be great to have a 'perf test' entry that fail when looking for
> those 'label symbols', i.e. looking for one such symbol in vmlinux that
> we know is always there, in some written in stone area of the kernel,
> where this label vanishing is unlikely to happen.
>
> Can you elaborate on the case that fails? So that I can test it here,
> and then after the fix, check that it indeed fixes the problem? I may
> well write that test myself and insert it in my branch just before this
> one.

It fails with "_start" which is a label in /lib/x86_64-linux-gnu/ld-2.17.so.
It is where the program starts so it is not a function, and it is the first
user space address of an exec'ed process.

If you do:

perf record --per-thread -T -e branches:u -c1 -d -- uname

Then, assuming the old BTS driver doesn't lose the data, it should be
pretty much the first branch.

pref script | head

>
> - Arnaldo
>
>> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
>> ---
>> tools/perf/util/symbol-elf.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
>> index 6864661..8c96817 100644
>> --- a/tools/perf/util/symbol-elf.c
>> +++ b/tools/perf/util/symbol-elf.c
>> @@ -732,7 +732,7 @@ int dso__load_sym(struct dso *dso, struct map *map,
>> if (symstrs == NULL)
>> goto out_elf_end;
>>
>> - sec_strndx = elf_getscn(elf, ehdr.e_shstrndx);
>> + sec_strndx = elf_getscn(runtime_ss->elf, runtime_ss->ehdr.e_shstrndx);
>> if (sec_strndx == NULL)
>> goto out_elf_end;
>>
>> --
>> 1.8.3.2
>
>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/