Patch "perf probe: Fix to get correct modname from elf header" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf probe: Fix to get correct modname from elf header
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-probe-fix-to-get-correct-modname-from-elf-header.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Aug 4 15:15:01 PDT 2017
From: Masami Hiramatsu <[email protected]>
Date: Tue, 3 Jan 2017 00:20:49 +0900
Subject: perf probe: Fix to get correct modname from elf header
From: Masami Hiramatsu <[email protected]>
[ Upstream commit 1f2ed153b916c95a49a1ca9d7107738664224b7f ]
Since 'perf probe' supports cross-arch probes, it is possible to analyze different arch kernel image which has different bits-per-long.
In that case, it fails to get the module name because it uses the MOD_NAME_OFFSET macro based on the host machine bits-per-long, instead of the target arch bits-per-long.
This fixes above issue by changing modname-offset based on the target archs bit width. This is ok because linux kernel uses LP64 model on 64bit arch.
E.g. without this (on x86_64, and target module is arm32):
$ perf probe -m build-arm/fs/configfs/configfs.ko -D configfs_lookup
p:probe/configfs_lookup :configfs_lookup+0
^-Here is an empty module name.With this fix, you can see correct module name:
$ perf probe -m build-arm/fs/configfs/configfs.ko -D configfs_lookup p:probe/configfs_lookup configfs:configfs_lookup+0
--- tools/perf/util/probe-event.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
tools/perf/util/probe-event.c +16 -16
@@ -268,21 +268,6 @@ static bool kprobe_warn_out_range(const }/* -* NOTE: -* '.gnu.linkonce.this_module' section of kernel module elf directly -* maps to 'struct module' from linux/module.h. This section contains -* actual module name which will be used by kernel after loading it. -* But, we cannot use 'struct module' here since linux/module.h is not -* exposed to user-space. Offset of 'name' has remained same from long -* time, so hardcoding it here. -*/ -#ifdef __LP64__ -#define MOD_NAME_OFFSET 24 -#else -#define MOD_NAME_OFFSET 12 -#endif - -/* * @module can be module name of module file path. In case of path, * inspect elf and find out what is actual module name. * Caller has to free mod_name after using it.
@@ -296,6 +281,7 @@ static char *find_module_name(const charElf_Data *data;Elf_Scn *sec;char *mod_name =NULL ; +int name_offset; fd =open (module,O_RDONLY );if (fd <0 )
@@ -317,7 +303,21 @@ static char *find_module_name(const charif (!data || !data->d_buf) goto ret_err; - mod_name =strdup ((char *)data->d_buf +MOD_NAME_OFFSET ); +/* +* NOTE: +* '.gnu.linkonce.this_module' section of kernel module elf directly +* maps to 'struct module' from linux/module.h. This section contains +* actual module name which will be used by kernel after loading it. +* But, we cannot use 'struct module' here since linux/module.h is not +* exposed to user-space. Offset of 'name' has remained same from long +* time, so hardcoding it here. +*/ +if (ehdr.e_ident[EI_CLASS ] ==ELFCLASS32 ) + name_offset =12 ; +else /* expect ELFCLASS64 by default */ + name_offset =24 ; + + mod_name =strdup ((char *)data->d_buf + name_offset); ret_err:elf_end (elf);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/perf-probe-fix-to-get-correct-modname-from-elf-header.patch