lkml.org 
[lkml]   [2019]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 112/135] perf symbols: Filter out hidden symbols from labels
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    [ Upstream commit 59a17706915fe5ea6f711e1f92d4fb706bce07fe ]

    When perf is built with the annobin plugin (RHEL8 build) extra symbols
    are added to its binary:

    # nm perf | grep annobin | head -10
    0000000000241100 t .annobin_annotate.c
    0000000000326490 t .annobin_annotate.c
    0000000000249255 t .annobin_annotate.c_end
    00000000003283a8 t .annobin_annotate.c_end
    00000000001bce18 t .annobin_annotate.c_end.hot
    00000000001bce18 t .annobin_annotate.c_end.hot
    00000000001bc3e2 t .annobin_annotate.c_end.unlikely
    00000000001bc400 t .annobin_annotate.c_end.unlikely
    00000000001bce18 t .annobin_annotate.c.hot
    00000000001bce18 t .annobin_annotate.c.hot
    ...

    Those symbols have no use for report or annotation and should be
    skipped. Moreover they interfere with the DWARF unwind test on the PPC
    arch, where they are mixed with checked symbols and then the test fails:

    # perf test dwarf -v
    59: Test dwarf unwind :
    --- start ---
    test child forked, pid 8515
    unwind: .annobin_dwarf_unwind.c:ip = 0x10dba40dc (0x2740dc)
    ...
    got: .annobin_dwarf_unwind.c 0x10dba40dc, expecting test__arch_unwind_sample
    unwind: failed with 'no error'

    The annobin symbols are defined as NOTYPE/LOCAL/HIDDEN:

    # readelf -s ./perf | grep annobin | head -1
    40: 00000000001bce4f 0 NOTYPE LOCAL HIDDEN 13 .annobin_init.c

    They can still pass the check for the label symbol. Adding check for
    HIDDEN and INTERNAL (as suggested by Nick below) visibility and filter
    out such symbols.

    > Just to be awkward, if you are going to ignore STV_HIDDEN
    > symbols then you should probably also ignore STV_INTERNAL ones
    > as well... Annobin does not generate them, but you never know,
    > one day some other tool might create some.

    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Michael Petlan <mpetlan@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nick Clifton <nickc@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20190128133526.GD15461@krava
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/perf/util/symbol-elf.c | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
    index 8ad4296de98b..3d39332b3a06 100644
    --- a/tools/perf/util/symbol-elf.c
    +++ b/tools/perf/util/symbol-elf.c
    @@ -87,6 +87,11 @@ static inline uint8_t elf_sym__type(const GElf_Sym *sym)
    return GELF_ST_TYPE(sym->st_info);
    }

    +static inline uint8_t elf_sym__visibility(const GElf_Sym *sym)
    +{
    + return GELF_ST_VISIBILITY(sym->st_other);
    +}
    +
    #ifndef STT_GNU_IFUNC
    #define STT_GNU_IFUNC 10
    #endif
    @@ -111,7 +116,9 @@ static inline int elf_sym__is_label(const GElf_Sym *sym)
    return elf_sym__type(sym) == STT_NOTYPE &&
    sym->st_name != 0 &&
    sym->st_shndx != SHN_UNDEF &&
    - sym->st_shndx != SHN_ABS;
    + sym->st_shndx != SHN_ABS &&
    + elf_sym__visibility(sym) != STV_HIDDEN &&
    + elf_sym__visibility(sym) != STV_INTERNAL;
    }

    static bool elf_sym__is_a(GElf_Sym *sym, enum map_type type)
    --
    2.19.1


    \
     
     \ /
      Last update: 2019-03-12 18:18    [W:4.132 / U:0.376 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site