perf probe: Check if dwarf_getlocations() is available
If not, tell the user that: config/Makefile:273: Old libdw.h, finding variables at given 'perf probe' point will not work, install elfutils-devel/libdw-dev >= 0.157 And return -ENOTSUPP in die_get_var_range(), failing features that need it, like the one pointed out above. This fixes the build on older systems, such as Ubuntu 12.04.5. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Vinson Lee <vlee@freedesktop.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-9l7luqkq4gfnx7vrklkq4obs@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
d8e28654f2
commit
bd0419e2a5
|
@ -30,6 +30,7 @@ endef
|
||||||
FEATURE_TESTS_BASIC := \
|
FEATURE_TESTS_BASIC := \
|
||||||
backtrace \
|
backtrace \
|
||||||
dwarf \
|
dwarf \
|
||||||
|
dwarf_getlocations \
|
||||||
fortify-source \
|
fortify-source \
|
||||||
sync-compare-and-swap \
|
sync-compare-and-swap \
|
||||||
glibc \
|
glibc \
|
||||||
|
@ -78,6 +79,7 @@ endif
|
||||||
|
|
||||||
FEATURE_DISPLAY ?= \
|
FEATURE_DISPLAY ?= \
|
||||||
dwarf \
|
dwarf \
|
||||||
|
dwarf_getlocations \
|
||||||
glibc \
|
glibc \
|
||||||
gtk2 \
|
gtk2 \
|
||||||
libaudit \
|
libaudit \
|
||||||
|
|
|
@ -3,6 +3,7 @@ FILES= \
|
||||||
test-backtrace.bin \
|
test-backtrace.bin \
|
||||||
test-bionic.bin \
|
test-bionic.bin \
|
||||||
test-dwarf.bin \
|
test-dwarf.bin \
|
||||||
|
test-dwarf_getlocations.bin \
|
||||||
test-fortify-source.bin \
|
test-fortify-source.bin \
|
||||||
test-sync-compare-and-swap.bin \
|
test-sync-compare-and-swap.bin \
|
||||||
test-glibc.bin \
|
test-glibc.bin \
|
||||||
|
@ -82,6 +83,9 @@ endif
|
||||||
$(OUTPUT)test-dwarf.bin:
|
$(OUTPUT)test-dwarf.bin:
|
||||||
$(BUILD) $(DWARFLIBS)
|
$(BUILD) $(DWARFLIBS)
|
||||||
|
|
||||||
|
$(OUTPUT)test-dwarf_getlocations.bin:
|
||||||
|
$(BUILD) $(DWARFLIBS)
|
||||||
|
|
||||||
$(OUTPUT)test-libelf-mmap.bin:
|
$(OUTPUT)test-libelf-mmap.bin:
|
||||||
$(BUILD) -lelf
|
$(BUILD) -lelf
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,10 @@
|
||||||
# include "test-dwarf.c"
|
# include "test-dwarf.c"
|
||||||
#undef main
|
#undef main
|
||||||
|
|
||||||
|
#define main main_test_dwarf_getlocations
|
||||||
|
# include "test-dwarf_getlocations.c"
|
||||||
|
#undef main
|
||||||
|
|
||||||
#define main main_test_libelf_getphdrnum
|
#define main main_test_libelf_getphdrnum
|
||||||
# include "test-libelf-getphdrnum.c"
|
# include "test-libelf-getphdrnum.c"
|
||||||
#undef main
|
#undef main
|
||||||
|
@ -143,6 +147,7 @@ int main(int argc, char *argv[])
|
||||||
main_test_libelf_mmap();
|
main_test_libelf_mmap();
|
||||||
main_test_glibc();
|
main_test_glibc();
|
||||||
main_test_dwarf();
|
main_test_dwarf();
|
||||||
|
main_test_dwarf_getlocations();
|
||||||
main_test_libelf_getphdrnum();
|
main_test_libelf_getphdrnum();
|
||||||
main_test_libunwind();
|
main_test_libunwind();
|
||||||
main_test_libaudit();
|
main_test_libaudit();
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <elfutils/libdw.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
Dwarf_Addr base, start, end;
|
||||||
|
Dwarf_Attribute attr;
|
||||||
|
Dwarf_Op *op;
|
||||||
|
size_t nops;
|
||||||
|
ptrdiff_t offset = 0;
|
||||||
|
return (int)dwarf_getlocations(&attr, offset, &base, &start, &end, &op, &nops);
|
||||||
|
}
|
|
@ -268,6 +268,12 @@ else
|
||||||
ifneq ($(feature-dwarf), 1)
|
ifneq ($(feature-dwarf), 1)
|
||||||
msg := $(warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev);
|
msg := $(warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev);
|
||||||
NO_DWARF := 1
|
NO_DWARF := 1
|
||||||
|
else
|
||||||
|
ifneq ($(feature-dwarf_getlocations), 1)
|
||||||
|
msg := $(warning Old libdw.h, finding variables at given 'perf probe' point will not work, install elfutils-devel/libdw-dev >= 0.157);
|
||||||
|
else
|
||||||
|
CFLAGS += -DHAVE_DWARF_GETLOCATIONS
|
||||||
|
endif # dwarf_getlocations
|
||||||
endif # Dwarf support
|
endif # Dwarf support
|
||||||
endif # libelf support
|
endif # libelf support
|
||||||
endif # NO_LIBELF
|
endif # NO_LIBELF
|
||||||
|
|
|
@ -959,6 +959,7 @@ int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_DWARF_GETLOCATIONS
|
||||||
/**
|
/**
|
||||||
* die_get_var_innermost_scope - Get innermost scope range of given variable DIE
|
* die_get_var_innermost_scope - Get innermost scope range of given variable DIE
|
||||||
* @sp_die: a subprogram DIE
|
* @sp_die: a subprogram DIE
|
||||||
|
@ -1080,3 +1081,11 @@ int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die *vr_die, struct strbuf *buf)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
int die_get_var_range(Dwarf_Die *sp_die __maybe_unused,
|
||||||
|
Dwarf_Die *vr_die __maybe_unused,
|
||||||
|
struct strbuf *buf __maybe_unused)
|
||||||
|
{
|
||||||
|
return -ENOTSUP;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue