perf symbols: Support minimal build without libelf
authorNamhyung Kim <namhyung.kim@lge.com>
Mon, 6 Aug 2012 04:41:21 +0000 (13:41 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 9 Aug 2012 19:26:38 +0000 (16:26 -0300)
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>
tools/perf/Makefile
tools/perf/builtin-inject.c
tools/perf/command-list.txt
tools/perf/perf.c
tools/perf/util/generate-cmdlist.sh
tools/perf/util/map.c
tools/perf/util/symbol-minimal.c [new file with mode: 0644]

index f790e3bf14cb39c0e807f0f5b875ed6afb3d3de0..de6aa8c706cf7957a53c9d42e3b85b6988c907fd 100644 (file)
@@ -37,7 +37,12 @@ include config/utilities.mak
 #
 # 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_LIBELF if you do not want libelf dependency (e.g. cross-builds)
+#
 
 $(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
        @$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
@@ -450,34 +455,57 @@ PYRF_OBJS += $(OUTPUT)util/xyarray.o
 -include config.mak.autogen
 -include config.mak
 
-ifndef NO_DWARF
-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);
+ifdef NO_LIBELF
        NO_DWARF := 1
-endif # Dwarf support
-endif # NO_DWARF
-
--include arch/$(ARCH)/Makefile
-
-ifneq ($(OUTPUT),)
-       BASIC_CFLAGS += -I$(OUTPUT)
-endif
-
+       NO_DEMANGLE := 1
+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
-               msg := $(error No libelf.h/libelf found, please install libelf-dev/elfutils-libelf-devel);
+               NO_LIBELF := 1
+               NO_DWARF := 1
+               NO_DEMANGLE := 1
        endif
 endif
+endif # NO_LIBELF
+
+-include arch/$(ARCH)/Makefile
+
+ifneq ($(OUTPUT),)
+       BASIC_CFLAGS += -I$(OUTPUT)
+endif
+
+ifdef NO_LIBELF
+BASIC_CFLAGS += -DNO_LIBELF_SUPPORT
+
+EXTLIBS := $(filter-out -lelf,$(EXTLIBS))
+
+# Remove ELF/DWARF dependent codes
+LIB_OBJS := $(filter-out $(OUTPUT)util/symbol-elf.o,$(LIB_OBJS))
+LIB_OBJS := $(filter-out $(OUTPUT)util/dwarf-aux.o,$(LIB_OBJS))
+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)
        BASIC_CFLAGS += -DLIBELF_NO_MMAP
 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
 ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
        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
 endif # PERF_HAVE_DWARF_REGS
 endif # NO_DWARF
+endif # NO_LIBELF
 
 ifdef NO_NEWT
        BASIC_CFLAGS += -DNO_NEWT_SUPPORT
index 3beab489afc5c69446c5ce37fefe5fa40cfde9b2..64d8ba2fb7bc34c258ace98a4e01011dbdcabc18 100644 (file)
@@ -191,10 +191,13 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
                                 * If this fails, too bad, let the other side
                                 * account this as unresolved.
                                 */
-                       } else
+                       } else {
+#ifndef NO_LIBELF_SUPPORT
                                pr_warning("no symbols found in %s, maybe "
                                           "install a debug package?\n",
                                           al.map->dso->long_name);
+#endif
+                       }
                }
        }
 
index d695fe40fbff3ff3f442d6a8ced39746fa668695..0303ec69227490ae630c8265be5001b8a51a1422 100644 (file)
@@ -18,7 +18,7 @@ perf-stat                     mainporcelain common
 perf-timechart                 mainporcelain common
 perf-top                       mainporcelain common
 perf-script                    mainporcelain common
-perf-probe                     mainporcelain common
+perf-probe                     mainporcelain full
 perf-kmem                      mainporcelain common
 perf-lock                      mainporcelain common
 perf-kvm                       mainporcelain common
index db37ee3f29b8425c3a1d38157f5a23741a507284..e7840e500715cbeda2ec50ff1d875310b57a2226 100644 (file)
@@ -47,7 +47,9 @@ static struct cmd_struct commands[] = {
        { "version",    cmd_version,    0 },
        { "script",     cmd_script,     0 },
        { "sched",      cmd_sched,      0 },
+#ifndef NO_LIBELF_SUPPORT
        { "probe",      cmd_probe,      0 },
+#endif
        { "kmem",       cmd_kmem,       0 },
        { "lock",       cmd_lock,       0 },
        { "kvm",        cmd_kvm,        0 },
index f06f6fd148f8e63b810a7095e403e6630f1ca7f8..389590c1ad21741b6eb8f6dac3db8c84551800db 100755 (executable)
@@ -21,4 +21,19 @@ do
            p
      }' "Documentation/perf-$cmd.txt"
 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 "};"
index 115654c469c6de2ae46f5b03341366239359b8fa..287cb3452b4b2a5809d36443fb60be704d8923e0 100644 (file)
@@ -156,6 +156,7 @@ int map__load(struct map *self, symbol_filter_t filter)
                pr_warning(", continuing without symbols\n");
                return -1;
        } else if (nr == 0) {
+#ifndef NO_LIBELF_SUPPORT
                const size_t len = strlen(name);
                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 "
                                   "a debug package?\n", name);
                }
-
+#endif
                return -1;
        }
        /*
diff --git a/tools/perf/util/symbol-minimal.c b/tools/perf/util/symbol-minimal.c
new file mode 100644 (file)
index 0000000..416ecf3
--- /dev/null
@@ -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)
+{
+}