perf symbols: Support minimal build without libelf
Now we have isolated all ELF-specific stuff, it's possible to build without libelf. The output binary can do most of jobs but lacks (user level) symbol information - kernel symbols are still accessable thanks to the kallsyms. To build perf without libelf (elfutils), give NO_LIBELF=1 to make. For now, only 'perf probe' command is removed since it depends on libelf/libdw heavily. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1344228082-15569-4-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
e5a1845fc0
commit
393be2e374
|
@ -37,7 +37,12 @@ include config/utilities.mak
|
||||||
#
|
#
|
||||||
# Define NO_NEWT if you do not want TUI support.
|
# Define NO_NEWT if you do not want TUI support.
|
||||||
#
|
#
|
||||||
|
# Define NO_GTK2 if you do not want GTK+ GUI support.
|
||||||
|
#
|
||||||
# Define NO_DEMANGLE if you do not want C++ symbol demangling.
|
# Define NO_DEMANGLE if you do not want C++ symbol demangling.
|
||||||
|
#
|
||||||
|
# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
|
||||||
|
#
|
||||||
|
|
||||||
$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
|
$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
|
||||||
@$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
|
@$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
|
||||||
|
@ -450,13 +455,22 @@ PYRF_OBJS += $(OUTPUT)util/xyarray.o
|
||||||
-include config.mak.autogen
|
-include config.mak.autogen
|
||||||
-include config.mak
|
-include config.mak
|
||||||
|
|
||||||
ifndef NO_DWARF
|
ifdef NO_LIBELF
|
||||||
FLAGS_DWARF=$(ALL_CFLAGS) -ldw -lelf $(ALL_LDFLAGS) $(EXTLIBS)
|
|
||||||
ifneq ($(call try-cc,$(SOURCE_DWARF),$(FLAGS_DWARF)),y)
|
|
||||||
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
|
||||||
endif # Dwarf support
|
NO_DEMANGLE := 1
|
||||||
endif # NO_DWARF
|
else
|
||||||
|
FLAGS_LIBELF=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS)
|
||||||
|
ifneq ($(call try-cc,$(SOURCE_LIBELF),$(FLAGS_LIBELF)),y)
|
||||||
|
FLAGS_GLIBC=$(ALL_CFLAGS) $(ALL_LDFLAGS)
|
||||||
|
ifneq ($(call try-cc,$(SOURCE_GLIBC),$(FLAGS_GLIBC)),y)
|
||||||
|
msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
|
||||||
|
else
|
||||||
|
NO_LIBELF := 1
|
||||||
|
NO_DWARF := 1
|
||||||
|
NO_DEMANGLE := 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif # NO_LIBELF
|
||||||
|
|
||||||
-include arch/$(ARCH)/Makefile
|
-include arch/$(ARCH)/Makefile
|
||||||
|
|
||||||
|
@ -464,20 +478,34 @@ ifneq ($(OUTPUT),)
|
||||||
BASIC_CFLAGS += -I$(OUTPUT)
|
BASIC_CFLAGS += -I$(OUTPUT)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
FLAGS_LIBELF=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS)
|
ifdef NO_LIBELF
|
||||||
ifneq ($(call try-cc,$(SOURCE_LIBELF),$(FLAGS_LIBELF)),y)
|
BASIC_CFLAGS += -DNO_LIBELF_SUPPORT
|
||||||
FLAGS_GLIBC=$(ALL_CFLAGS) $(ALL_LDFLAGS)
|
|
||||||
ifneq ($(call try-cc,$(SOURCE_GLIBC),$(FLAGS_GLIBC)),y)
|
EXTLIBS := $(filter-out -lelf,$(EXTLIBS))
|
||||||
msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
|
|
||||||
else
|
# Remove ELF/DWARF dependent codes
|
||||||
msg := $(error No libelf.h/libelf found, please install libelf-dev/elfutils-libelf-devel);
|
LIB_OBJS := $(filter-out $(OUTPUT)util/symbol-elf.o,$(LIB_OBJS))
|
||||||
endif
|
LIB_OBJS := $(filter-out $(OUTPUT)util/dwarf-aux.o,$(LIB_OBJS))
|
||||||
endif
|
LIB_OBJS := $(filter-out $(OUTPUT)util/probe-event.o,$(LIB_OBJS))
|
||||||
|
LIB_OBJS := $(filter-out $(OUTPUT)util/probe-finder.o,$(LIB_OBJS))
|
||||||
|
|
||||||
|
BUILTIN_OBJS := $(filter-out $(OUTPUT)builtin-probe.o,$(BUILTIN_OBJS))
|
||||||
|
|
||||||
|
# Use minimal symbol handling
|
||||||
|
LIB_OBJS += $(OUTPUT)util/symbol-minimal.o
|
||||||
|
|
||||||
|
else # NO_LIBELF
|
||||||
|
|
||||||
ifneq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_COMMON)),y)
|
ifneq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_COMMON)),y)
|
||||||
BASIC_CFLAGS += -DLIBELF_NO_MMAP
|
BASIC_CFLAGS += -DLIBELF_NO_MMAP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
FLAGS_DWARF=$(ALL_CFLAGS) -ldw -lelf $(ALL_LDFLAGS) $(EXTLIBS)
|
||||||
|
ifneq ($(call try-cc,$(SOURCE_DWARF),$(FLAGS_DWARF)),y)
|
||||||
|
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
|
||||||
|
endif # Dwarf support
|
||||||
|
|
||||||
ifndef NO_DWARF
|
ifndef NO_DWARF
|
||||||
ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
|
ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
|
||||||
msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled);
|
msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled);
|
||||||
|
@ -488,6 +516,7 @@ else
|
||||||
LIB_OBJS += $(OUTPUT)util/dwarf-aux.o
|
LIB_OBJS += $(OUTPUT)util/dwarf-aux.o
|
||||||
endif # PERF_HAVE_DWARF_REGS
|
endif # PERF_HAVE_DWARF_REGS
|
||||||
endif # NO_DWARF
|
endif # NO_DWARF
|
||||||
|
endif # NO_LIBELF
|
||||||
|
|
||||||
ifdef NO_NEWT
|
ifdef NO_NEWT
|
||||||
BASIC_CFLAGS += -DNO_NEWT_SUPPORT
|
BASIC_CFLAGS += -DNO_NEWT_SUPPORT
|
||||||
|
|
|
@ -191,10 +191,13 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
|
||||||
* If this fails, too bad, let the other side
|
* If this fails, too bad, let the other side
|
||||||
* account this as unresolved.
|
* account this as unresolved.
|
||||||
*/
|
*/
|
||||||
} else
|
} else {
|
||||||
|
#ifndef NO_LIBELF_SUPPORT
|
||||||
pr_warning("no symbols found in %s, maybe "
|
pr_warning("no symbols found in %s, maybe "
|
||||||
"install a debug package?\n",
|
"install a debug package?\n",
|
||||||
al.map->dso->long_name);
|
al.map->dso->long_name);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ perf-stat mainporcelain common
|
||||||
perf-timechart mainporcelain common
|
perf-timechart mainporcelain common
|
||||||
perf-top mainporcelain common
|
perf-top mainporcelain common
|
||||||
perf-script mainporcelain common
|
perf-script mainporcelain common
|
||||||
perf-probe mainporcelain common
|
perf-probe mainporcelain full
|
||||||
perf-kmem mainporcelain common
|
perf-kmem mainporcelain common
|
||||||
perf-lock mainporcelain common
|
perf-lock mainporcelain common
|
||||||
perf-kvm mainporcelain common
|
perf-kvm mainporcelain common
|
||||||
|
|
|
@ -47,7 +47,9 @@ static struct cmd_struct commands[] = {
|
||||||
{ "version", cmd_version, 0 },
|
{ "version", cmd_version, 0 },
|
||||||
{ "script", cmd_script, 0 },
|
{ "script", cmd_script, 0 },
|
||||||
{ "sched", cmd_sched, 0 },
|
{ "sched", cmd_sched, 0 },
|
||||||
|
#ifndef NO_LIBELF_SUPPORT
|
||||||
{ "probe", cmd_probe, 0 },
|
{ "probe", cmd_probe, 0 },
|
||||||
|
#endif
|
||||||
{ "kmem", cmd_kmem, 0 },
|
{ "kmem", cmd_kmem, 0 },
|
||||||
{ "lock", cmd_lock, 0 },
|
{ "lock", cmd_lock, 0 },
|
||||||
{ "kvm", cmd_kvm, 0 },
|
{ "kvm", cmd_kvm, 0 },
|
||||||
|
|
|
@ -21,4 +21,19 @@ do
|
||||||
p
|
p
|
||||||
}' "Documentation/perf-$cmd.txt"
|
}' "Documentation/perf-$cmd.txt"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo "#ifndef NO_LIBELF_SUPPORT"
|
||||||
|
sed -n -e 's/^perf-\([^ ]*\)[ ].* full.*/\1/p' command-list.txt |
|
||||||
|
sort |
|
||||||
|
while read cmd
|
||||||
|
do
|
||||||
|
sed -n '
|
||||||
|
/^NAME/,/perf-'"$cmd"'/H
|
||||||
|
${
|
||||||
|
x
|
||||||
|
s/.*perf-'"$cmd"' - \(.*\)/ {"'"$cmd"'", "\1"},/
|
||||||
|
p
|
||||||
|
}' "Documentation/perf-$cmd.txt"
|
||||||
|
done
|
||||||
|
echo "#endif /* NO_LIBELF_SUPPORT */"
|
||||||
echo "};"
|
echo "};"
|
||||||
|
|
|
@ -156,6 +156,7 @@ int map__load(struct map *self, symbol_filter_t filter)
|
||||||
pr_warning(", continuing without symbols\n");
|
pr_warning(", continuing without symbols\n");
|
||||||
return -1;
|
return -1;
|
||||||
} else if (nr == 0) {
|
} else if (nr == 0) {
|
||||||
|
#ifndef NO_LIBELF_SUPPORT
|
||||||
const size_t len = strlen(name);
|
const size_t len = strlen(name);
|
||||||
const size_t real_len = len - sizeof(DSO__DELETED);
|
const size_t real_len = len - sizeof(DSO__DELETED);
|
||||||
|
|
||||||
|
@ -168,7 +169,7 @@ int map__load(struct map *self, symbol_filter_t filter)
|
||||||
pr_warning("no symbols found in %s, maybe install "
|
pr_warning("no symbols found in %s, maybe install "
|
||||||
"a debug package?\n", name);
|
"a debug package?\n", name);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
#include "symbol.h"
|
||||||
|
|
||||||
|
|
||||||
|
int filename__read_build_id(const char *filename __used, void *bf __used,
|
||||||
|
size_t size __used)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sysfs__read_build_id(const char *filename __used, void *build_id __used,
|
||||||
|
size_t size __used)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int filename__read_debuglink(const char *filename __used,
|
||||||
|
char *debuglink __used, size_t size __used)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dso__synthesize_plt_symbols(struct dso *dso __used, char *name __used,
|
||||||
|
struct map *map __used,
|
||||||
|
symbol_filter_t filter __used)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dso__load_sym(struct dso *dso __used, struct map *map __used,
|
||||||
|
const char *name __used, int fd __used,
|
||||||
|
symbol_filter_t filter __used, int kmodule __used,
|
||||||
|
int want_symtab __used)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void symbol__elf_init(void)
|
||||||
|
{
|
||||||
|
}
|
Loading…
Reference in New Issue