lkml.org 
[lkml]   [2016]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 55/66] perf tools: Add feature detection for gelf_getnote()
    Date
    From: Arnaldo Carvalho de Melo <acme@redhat.com>

    That is not present on some libelf implementations, such as the one used
    in Alpine Linux: libelf-0.8.13.

    This ends up disabling the SDT code, that relies on this function.

    One alternative would be to provide an weak fallback implementation or
    the open coded variant used by the buildid sysfs notes reading code.

    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/n/tip-82lh22ybedy9b9lych8xj12g@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/build/Makefile.feature | 1 +
    tools/build/feature/Makefile | 4 ++++
    tools/build/feature/test-all.c | 5 +++++
    tools/build/feature/test-libelf-gelf_getnote.c | 7 +++++++
    tools/perf/config/Makefile | 6 ++++++
    tools/perf/util/build-id.c | 2 +-
    tools/perf/util/probe-file.c | 2 ++
    tools/perf/util/symbol-elf.c | 2 ++
    8 files changed, 28 insertions(+), 1 deletion(-)
    create mode 100644 tools/build/feature/test-libelf-gelf_getnote.c

    diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
    index 3dd529bb0604..fe12bee57418 100644
    --- a/tools/build/Makefile.feature
    +++ b/tools/build/Makefile.feature
    @@ -40,6 +40,7 @@ FEATURE_TESTS_BASIC := \
    libbfd \
    libelf \
    libelf-getphdrnum \
    + libelf-gelf_getnote \
    libelf-getshdrstrndx \
    libelf-mmap \
    libnuma \
    diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
    index 674711629ef0..d6017c1abdb0 100644
    --- a/tools/build/feature/Makefile
    +++ b/tools/build/feature/Makefile
    @@ -17,6 +17,7 @@ FILES= \
    test-cplus-demangle.bin \
    test-libelf.bin \
    test-libelf-getphdrnum.bin \
    + test-libelf-gelf_getnote.bin \
    test-libelf-getshdrstrndx.bin \
    test-libelf-mmap.bin \
    test-libnuma.bin \
    @@ -99,6 +100,9 @@ $(OUTPUT)test-libelf-mmap.bin:
    $(OUTPUT)test-libelf-getphdrnum.bin:
    $(BUILD) -lelf

    +$(OUTPUT)test-libelf-gelf_getnote.bin:
    + $(BUILD) -lelf
    +
    $(OUTPUT)test-libelf-getshdrstrndx.bin:
    $(BUILD) -lelf

    diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c
    index 7433cca33306..843aed024a3a 100644
    --- a/tools/build/feature/test-all.c
    +++ b/tools/build/feature/test-all.c
    @@ -49,6 +49,10 @@
    # include "test-libelf-getphdrnum.c"
    #undef main

    +#define main main_test_libelf_gelf_getnote
    +# include "test-libelf-gelf_getnote.c"
    +#undef main
    +
    #define main main_test_libelf_getshdrstrndx
    # include "test-libelf-getshdrstrndx.c"
    #undef main
    @@ -153,6 +157,7 @@ int main(int argc, char *argv[])
    main_test_dwarf();
    main_test_dwarf_getlocations();
    main_test_libelf_getphdrnum();
    + main_test_libelf_gelf_getnote();
    main_test_libelf_getshdrstrndx();
    main_test_libunwind();
    main_test_libaudit();
    diff --git a/tools/build/feature/test-libelf-gelf_getnote.c b/tools/build/feature/test-libelf-gelf_getnote.c
    new file mode 100644
    index 000000000000..d78cf4d5271f
    --- /dev/null
    +++ b/tools/build/feature/test-libelf-gelf_getnote.c
    @@ -0,0 +1,7 @@
    +#include <stdlib.h>
    +#include <gelf.h>
    +
    +int main(void)
    +{
    + return gelf_getnote(NULL, 0, NULL, NULL, NULL);
    +}
    diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
    index 97d47140a637..5ac428060779 100644
    --- a/tools/perf/config/Makefile
    +++ b/tools/perf/config/Makefile
    @@ -309,6 +309,12 @@ ifndef NO_LIBELF
    CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
    endif

    + ifeq ($(feature-libelf-gelf_getnote), 1)
    + CFLAGS += -DHAVE_GELF_GETNOTE_SUPPORT
    + else
    + msg := $(warning gelf_getnote() not found on libelf, SDT support disabled);
    + endif
    +
    ifeq ($(feature-libelf-getshdrstrndx), 1)
    CFLAGS += -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT
    endif
    diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
    index e1a16408da9c..1e504e40dac8 100644
    --- a/tools/perf/util/build-id.c
    +++ b/tools/perf/util/build-id.c
    @@ -533,7 +533,7 @@ int build_id_cache__list_build_ids(const char *pathname,
    return ret;
    }

    -#ifdef HAVE_LIBELF_SUPPORT
    +#if defined(HAVE_LIBELF_SUPPORT) && defined(HAVE_GELF_GETNOTE_SUPPORT)
    static int build_id_cache__add_sdt_cache(const char *sbuild_id,
    const char *realname)
    {
    diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
    index 98398b55a03f..e705a742ee1e 100644
    --- a/tools/perf/util/probe-file.c
    +++ b/tools/perf/util/probe-file.c
    @@ -624,6 +624,7 @@ out_err:
    return ret;
    }

    +#ifdef HAVE_GELF_GETNOTE_SUPPORT
    static unsigned long long sdt_note__get_addr(struct sdt_note *note)
    {
    return note->bit32 ? (unsigned long long)note->addr.a32[0]
    @@ -682,6 +683,7 @@ int probe_cache__scan_sdt(struct probe_cache *pcache, const char *pathname)
    cleanup_sdt_note_list(&sdtlist);
    return ret;
    }
    +#endif

    static int probe_cache_entry__write(struct probe_cache_entry *entry, int fd)
    {
    diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
    index 79a6a190f41d..cebf98ec27bc 100644
    --- a/tools/perf/util/symbol-elf.c
    +++ b/tools/perf/util/symbol-elf.c
    @@ -1790,6 +1790,7 @@ void kcore_extract__delete(struct kcore_extract *kce)
    unlink(kce->extract_filename);
    }

    +#ifdef HAVE_GELF_GETNOTE_SUPPORT
    /**
    * populate_sdt_note : Parse raw data and identify SDT note
    * @elf: elf of the opened file
    @@ -2041,6 +2042,7 @@ int sdt_notes__get_count(struct list_head *start)
    count++;
    return count;
    }
    +#endif

    void symbol__elf_init(void)
    {
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-07-13 01:41    [W:4.375 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site