lkml.org 
[lkml]   [2015]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/15] tools lib traceevent: Export dynamic symbols used by traceevent plugins
    Date
    From: He Kuang <hekuang@huawei.com>

    Traceevent plugins need dynamic symbols exported from libtraceevent.a,
    otherwise a dlopen error will occur during plugins loading.

    This patch uses dynamic-list-file to export dynamic symbols which will
    be used in plugins to perf executable.

    The problem is covered up if feature-libpython is enabled, because
    PYTHON_EMBED_LDOPTS contains '-Xlinker --export-dynamic' which adds all
    symbols to the dynamic symbol table. So we should reproduce the problem
    by setting NO_LIBPYTHON=1.

    Before this patch:

    (Prepare plugins)
    $ ls /root/.traceevent/plugins/
    plugin_sched_switch.so
    plugin_function.so
    ...

    $ perf record -e 'ftrace:function' ls

    $ perf script
    Warning: could not load plugin '/mnt/data/root/.traceevent/plugins/plugin_sched_switch.so'
    /root/.traceevent/plugins/plugin_sched_switch.so: undefined symbol: pevent_unregister_event_handler

    Warning: could not load plugin '/root/.traceevent/plugins/plugin_function.so'
    /root/.traceevent/plugins/plugin_function.so: undefined symbol: warning
    ...
    :1049 1049 [000] 9666.754487: ftrace:function: ffffffff8118bc50 <-- ffffffff8118c5b3
    :1049 1049 [000] 9666.754487: ftrace:function: ffffffff818e2440 <-- ffffffff8118bc75
    :1049 1049 [000] 9666.754487: ftrace:function: ffffffff8106eee0 <-- ffffffff811212e2

    After this patch:

    $ perf record -e 'ftrace:function' ls
    $ perf script
    :1049 1049 [000] 9666.754487: ftrace:function: __set_task_comm
    :1049 1049 [000] 9666.754487: ftrace:function: _raw_spin_lock
    :1049 1049 [000] 9666.754487: ftrace:function: task_tgid_nr_ns
    ...

    Signed-off-by: He Kuang <hekuang@huawei.com>
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/r/1432819735-35040-1-git-send-email-hekuang@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/lib/traceevent/Makefile | 14 +++++++++++++-
    tools/perf/Makefile.perf | 14 ++++++++++++--
    2 files changed, 25 insertions(+), 3 deletions(-)

    diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile
    index 84640394ebf9..6daaff652aff 100644
    --- a/tools/lib/traceevent/Makefile
    +++ b/tools/lib/traceevent/Makefile
    @@ -23,6 +23,7 @@ endef
    # Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
    $(call allow-override,CC,$(CROSS_COMPILE)gcc)
    $(call allow-override,AR,$(CROSS_COMPILE)ar)
    +$(call allow-override,NM,$(CROSS_COMPILE)nm)

    EXT = -std=gnu99
    INSTALL = install
    @@ -157,8 +158,9 @@ PLUGINS_IN := $(PLUGINS:.so=-in.o)

    TE_IN := $(OUTPUT)libtraceevent-in.o
    LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
    +DYNAMIC_LIST_FILE := $(OUTPUT)libtraceevent-dynamic-list

    -CMD_TARGETS = $(LIB_FILE) $(PLUGINS)
    +CMD_TARGETS = $(LIB_FILE) $(PLUGINS) $(DYNAMIC_LIST_FILE)

    TARGETS = $(CMD_TARGETS)

    @@ -175,6 +177,9 @@ $(OUTPUT)libtraceevent.so: $(TE_IN)
    $(OUTPUT)libtraceevent.a: $(TE_IN)
    $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^

    +$(OUTPUT)libtraceevent-dynamic-list: $(PLUGINS)
    + $(QUIET_GEN)$(call do_generate_dynamic_list_file, $(PLUGINS), $@)
    +
    plugins: $(PLUGINS)

    __plugin_obj = $(notdir $@)
    @@ -244,6 +249,13 @@ define do_install_plugins
    done
    endef

    +define do_generate_dynamic_list_file
    + (echo '{'; \
    + $(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u; \
    + echo '};'; \
    + ) > $2
    +endef
    +
    install_lib: all_cmd install_plugins
    $(call QUIET_INSTALL, $(LIB_FILE)) \
    $(call do_install,$(LIB_FILE),$(libdir_SQ))
    diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
    index 5816a3bb7e9f..b1dfcd8e93e3 100644
    --- a/tools/perf/Makefile.perf
    +++ b/tools/perf/Makefile.perf
    @@ -173,6 +173,9 @@ endif
    LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
    export LIBTRACEEVENT

    +LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list
    +LDFLAGS += -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
    +
    LIBAPI = $(LIB_PATH)libapi.a
    export LIBAPI

    @@ -278,7 +281,7 @@ build := -f $(srctree)/tools/build/Makefile.build dir=. obj
    $(PERF_IN): $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h FORCE
    $(Q)$(MAKE) $(build)=perf

    -$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN)
    +$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
    $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(PERF_IN) $(LIBS) -o $@

    $(GTK_IN): FORCE
    @@ -373,7 +376,13 @@ $(LIB_FILE): $(LIBPERF_IN)
    LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ)

    $(LIBTRACEEVENT): FORCE
    - $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a plugins
    + $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a
    +
    +libtraceevent_plugins: FORCE
    + $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) plugins
    +
    +$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
    + $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent-dynamic-list

    $(LIBTRACEEVENT)-clean:
    $(call QUIET_CLEAN, libtraceevent)
    @@ -555,4 +564,5 @@ FORCE:
    .PHONY: all install clean config-clean strip install-gtk
    .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
    .PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE single_dep
    +.PHONY: libtraceevent_plugins

    --
    2.1.0


    \
     
     \ /
      Last update: 2015-06-08 16:41    [W:5.644 / U:0.860 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site