mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	tools lib traceevent: Export dynamic symbols used by traceevent plugins
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>
			
			
This commit is contained in:
		
							parent
							
								
									f87027b968
								
							
						
					
					
						commit
						e3d09ec812
					
				
					 2 changed files with 25 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue