perf tools: Add feature detection for gelf_getnote()

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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent c8a3f7de
...@@ -40,6 +40,7 @@ FEATURE_TESTS_BASIC := \ ...@@ -40,6 +40,7 @@ FEATURE_TESTS_BASIC := \
libbfd \ libbfd \
libelf \ libelf \
libelf-getphdrnum \ libelf-getphdrnum \
libelf-gelf_getnote \
libelf-getshdrstrndx \ libelf-getshdrstrndx \
libelf-mmap \ libelf-mmap \
libnuma \ libnuma \
......
...@@ -17,6 +17,7 @@ FILES= \ ...@@ -17,6 +17,7 @@ FILES= \
test-cplus-demangle.bin \ test-cplus-demangle.bin \
test-libelf.bin \ test-libelf.bin \
test-libelf-getphdrnum.bin \ test-libelf-getphdrnum.bin \
test-libelf-gelf_getnote.bin \
test-libelf-getshdrstrndx.bin \ test-libelf-getshdrstrndx.bin \
test-libelf-mmap.bin \ test-libelf-mmap.bin \
test-libnuma.bin \ test-libnuma.bin \
...@@ -99,6 +100,9 @@ $(OUTPUT)test-libelf-mmap.bin: ...@@ -99,6 +100,9 @@ $(OUTPUT)test-libelf-mmap.bin:
$(OUTPUT)test-libelf-getphdrnum.bin: $(OUTPUT)test-libelf-getphdrnum.bin:
$(BUILD) -lelf $(BUILD) -lelf
$(OUTPUT)test-libelf-gelf_getnote.bin:
$(BUILD) -lelf
$(OUTPUT)test-libelf-getshdrstrndx.bin: $(OUTPUT)test-libelf-getshdrstrndx.bin:
$(BUILD) -lelf $(BUILD) -lelf
......
...@@ -49,6 +49,10 @@ ...@@ -49,6 +49,10 @@
# include "test-libelf-getphdrnum.c" # include "test-libelf-getphdrnum.c"
#undef main #undef main
#define main main_test_libelf_gelf_getnote
# include "test-libelf-gelf_getnote.c"
#undef main
#define main main_test_libelf_getshdrstrndx #define main main_test_libelf_getshdrstrndx
# include "test-libelf-getshdrstrndx.c" # include "test-libelf-getshdrstrndx.c"
#undef main #undef main
...@@ -153,6 +157,7 @@ int main(int argc, char *argv[]) ...@@ -153,6 +157,7 @@ int main(int argc, char *argv[])
main_test_dwarf(); main_test_dwarf();
main_test_dwarf_getlocations(); main_test_dwarf_getlocations();
main_test_libelf_getphdrnum(); main_test_libelf_getphdrnum();
main_test_libelf_gelf_getnote();
main_test_libelf_getshdrstrndx(); main_test_libelf_getshdrstrndx();
main_test_libunwind(); main_test_libunwind();
main_test_libaudit(); main_test_libaudit();
......
#include <stdlib.h>
#include <gelf.h>
int main(void)
{
return gelf_getnote(NULL, 0, NULL, NULL, NULL);
}
...@@ -309,6 +309,12 @@ ifndef NO_LIBELF ...@@ -309,6 +309,12 @@ ifndef NO_LIBELF
CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
endif 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) ifeq ($(feature-libelf-getshdrstrndx), 1)
CFLAGS += -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT CFLAGS += -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT
endif endif
......
...@@ -533,7 +533,7 @@ int build_id_cache__list_build_ids(const char *pathname, ...@@ -533,7 +533,7 @@ int build_id_cache__list_build_ids(const char *pathname,
return ret; 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, static int build_id_cache__add_sdt_cache(const char *sbuild_id,
const char *realname) const char *realname)
{ {
......
...@@ -624,6 +624,7 @@ int probe_cache__add_entry(struct probe_cache *pcache, ...@@ -624,6 +624,7 @@ int probe_cache__add_entry(struct probe_cache *pcache,
return ret; return ret;
} }
#ifdef HAVE_GELF_GETNOTE_SUPPORT
static unsigned long long sdt_note__get_addr(struct sdt_note *note) static unsigned long long sdt_note__get_addr(struct sdt_note *note)
{ {
return note->bit32 ? (unsigned long long)note->addr.a32[0] 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) ...@@ -682,6 +683,7 @@ int probe_cache__scan_sdt(struct probe_cache *pcache, const char *pathname)
cleanup_sdt_note_list(&sdtlist); cleanup_sdt_note_list(&sdtlist);
return ret; return ret;
} }
#endif
static int probe_cache_entry__write(struct probe_cache_entry *entry, int fd) static int probe_cache_entry__write(struct probe_cache_entry *entry, int fd)
{ {
......
...@@ -1790,6 +1790,7 @@ void kcore_extract__delete(struct kcore_extract *kce) ...@@ -1790,6 +1790,7 @@ void kcore_extract__delete(struct kcore_extract *kce)
unlink(kce->extract_filename); unlink(kce->extract_filename);
} }
#ifdef HAVE_GELF_GETNOTE_SUPPORT
/** /**
* populate_sdt_note : Parse raw data and identify SDT note * populate_sdt_note : Parse raw data and identify SDT note
* @elf: elf of the opened file * @elf: elf of the opened file
...@@ -2041,6 +2042,7 @@ int sdt_notes__get_count(struct list_head *start) ...@@ -2041,6 +2042,7 @@ int sdt_notes__get_count(struct list_head *start)
count++; count++;
return count; return count;
} }
#endif
void symbol__elf_init(void) void symbol__elf_init(void)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment