From: Arnaldo Carvalho de Melo <acme@infradead.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org,
Adrian Hunter <adrian.hunter@intel.com>,
David Ahern <dsahern@gmail.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Jiri Olsa <jolsa@redhat.com>, Mike Galbraith <efault@gmx.de>,
Namhyung Kim <namhyung@gmail.com>,
Paul Mackerras <paulus@samba.org>,
Peter Zijlstra <peterz@infradead.org>,
Stephane Eranian <eranian@google.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 29/47] perf tools: Make it possible to read object code from kernel modules
Date: Wed, 7 Aug 2013 18:10:56 -0300 [thread overview]
Message-ID: <1375909874-22073-30-git-send-email-acme@infradead.org> (raw)
In-Reply-To: <1375909874-22073-1-git-send-email-acme@infradead.org>
From: Adrian Hunter <adrian.hunter@intel.com>
The new "object code reading" test shows that it is not possible to read
object code from kernel modules. That is because the mappings do not
map to the dsos. This patch fixes that.
This involves identifying and flagging relocatable (ELF type ET_REL)
files (e.g. kernel modules) for symbol adjustment and updating
map__rip_2objdump() accordingly. The kmodule parameter of
dso__load_sym() is taken into use and the module map altered to map to
the dso.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1375875537-4509-7-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/dso.c | 1 +
tools/perf/util/dso.h | 1 +
tools/perf/util/map.c | 14 +++++++++-----
tools/perf/util/symbol-elf.c | 25 ++++++++++++++++++++++++-
tools/perf/util/symbol.c | 11 ++++++++---
5 files changed, 43 insertions(+), 9 deletions(-)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 121583d..1955804 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -419,6 +419,7 @@ struct dso *dso__new(const char *name)
dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND;
dso->data_type = DSO_BINARY_TYPE__NOT_FOUND;
dso->loaded = 0;
+ dso->rel = 0;
dso->sorted_by_name = 0;
dso->has_build_id = 0;
dso->kernel = DSO_TYPE_USER;
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
index 02aadaf..735a837 100644
--- a/tools/perf/util/dso.h
+++ b/tools/perf/util/dso.h
@@ -85,6 +85,7 @@ struct dso {
u8 lname_alloc:1;
u8 sorted_by_name;
u8 loaded;
+ u8 rel;
u8 build_id[BUILD_ID_SIZE];
const char *short_name;
char *long_name;
diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index 5f662a3..4d599fe 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -248,14 +248,18 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp)
/*
* objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN.
- * map->dso->adjust_symbols==1 for ET_EXEC-like cases.
+ * map->dso->adjust_symbols==1 for ET_EXEC-like cases except ET_REL which is
+ * relative to section start.
*/
u64 map__rip_2objdump(struct map *map, u64 rip)
{
- u64 addr = map->dso->adjust_symbols ?
- map->unmap_ip(map, rip) : /* RIP -> IP */
- rip;
- return addr;
+ if (!map->dso->adjust_symbols)
+ return rip;
+
+ if (map->dso->rel)
+ return rip - map->pgoff;
+
+ return map->unmap_ip(map, rip);
}
void map_groups__init(struct map_groups *mg)
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index ed6f443..3eaa7b4 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -599,11 +599,13 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
if (dso->kernel == DSO_TYPE_USER) {
GElf_Shdr shdr;
ss->adjust_symbols = (ehdr.e_type == ET_EXEC ||
+ ehdr.e_type == ET_REL ||
elf_section_by_name(elf, &ehdr, &shdr,
".gnu.prelink_undo",
NULL) != NULL);
} else {
- ss->adjust_symbols = ehdr.e_type == ET_EXEC;
+ ss->adjust_symbols = ehdr.e_type == ET_EXEC ||
+ ehdr.e_type == ET_REL;
}
ss->name = strdup(name);
@@ -676,6 +678,14 @@ int dso__load_sym(struct dso *dso, struct map *map,
bool remap_kernel = false, adjust_kernel_syms = false;
dso->symtab_type = syms_ss->type;
+ dso->rel = syms_ss->ehdr.e_type == ET_REL;
+
+ /*
+ * Modules may already have symbols from kallsyms, but those symbols
+ * have the wrong values for the dso maps, so remove them.
+ */
+ if (kmodule && syms_ss->symtab)
+ symbols__delete(&dso->symbols[map->type]);
if (!syms_ss->symtab) {
syms_ss->symtab = syms_ss->dynsym;
@@ -828,11 +838,24 @@ int dso__load_sym(struct dso *dso, struct map *map,
map_groups__insert(kmap->kmaps, map);
}
+ /*
+ * The initial module mapping is based on
+ * /proc/modules mapped to offset zero.
+ * Overwrite it to map to the module dso.
+ */
+ if (remap_kernel && kmodule) {
+ remap_kernel = false;
+ map->pgoff = shdr.sh_offset;
+ }
+
curr_map = map;
curr_dso = dso;
goto new_symbol;
}
+ if (!kmap)
+ goto new_symbol;
+
snprintf(dso_name, sizeof(dso_name),
"%s%s", dso->short_name, section_name);
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 04300dd..b9056a8 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -854,10 +854,15 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
if (!runtime_ss && syms_ss)
runtime_ss = syms_ss;
- if (syms_ss)
- ret = dso__load_sym(dso, map, syms_ss, runtime_ss, filter, 0);
- else
+ if (syms_ss) {
+ int km;
+
+ km = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
+ dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE;
+ ret = dso__load_sym(dso, map, syms_ss, runtime_ss, filter, km);
+ } else {
ret = -1;
+ }
if (ret > 0) {
int nr_plt;
--
1.8.1.4
next prev parent reply other threads:[~2013-08-07 21:13 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-07 21:10 [GIT PULL 00/47] perf/core improvements and fixes Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 01/47] perf: Add PERF_EVENT_IOC_ID ioctl to return event ID Arnaldo Carvalho de Melo
2013-08-09 14:50 ` Vince Weaver
2013-08-10 12:11 ` Jiri Olsa
2013-08-07 21:10 ` [PATCH 02/47] perf: Do not get values from disabled counters in group format read Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 03/47] perf evlist: Use PERF_EVENT_IOC_ID perf ioctl to read event id Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 04/47] perf tools: Add support for parsing PERF_SAMPLE_READ sample type Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 05/47] perf evlist: Fix event ID retrieval for group format read case Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 06/47] perf evlist: Add perf_evlist__id2sid method to get event ID related data Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 07/47] perf evsel: Add PERF_SAMPLE_READ sample related processing Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 08/47] perf tools: Add 'S' event/group modifier to read sample value Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 09/47] perf tests: Add attr record group sampling test Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 10/47] perf tests: Add parse events tests for leader sampling Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 11/47] perf evsel: Actually show symbol offset in stack trace when requested Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 12/47] perf tools: Fix compile of util/tsc.c Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 13/47] perf trace: Beautify 'connect' result Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 14/47] perf python: Remove duplicate TID bit from mask Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 15/47] perf util: Add parse_nsec_time() function Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 16/47] perf top: move CONSOLE_CLEAR to header file Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 17/47] perf stats: Add max and min stats Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 18/47] perf session: Export a few functions for event processing Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 19/47] perf kvm: Split out tracepoints from record args Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 20/47] perf evlist: Remove obsolete dummy execve Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 21/47] perf evsel: Add support for enabling counters Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 22/47] perf stat: Add support for --initial-delay option Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 23/47] perf stat: Flush output after each line in interval mode Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 24/47] perf symbols: avoid SyS kernel syscall aliases Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 25/47] perf tests: Add test for reading object code Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 26/47] perf symbols: Load kernel maps before using Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 27/47] perf tools: Make it possible to read object code from vmlinux Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 28/47] perf tests: Adjust the vmlinux symtab matches kallsyms test Arnaldo Carvalho de Melo
2013-08-07 21:10 ` Arnaldo Carvalho de Melo [this message]
2013-08-07 21:10 ` [PATCH 30/47] perf symbols: Add support for reading from /proc/kcore Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 31/47] perf tests: Adjust the vmlinux symtab matches kallsyms test again Arnaldo Carvalho de Melo
2013-08-07 21:10 ` [PATCH 32/47] perf tests: Add kcore to the object code reading test Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 33/47] perf annotate: Allow disassembly using /proc/kcore Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 34/47] perf annotate: Put dso name in symbol annotation title Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 35/47] perf annotate: Remove nop at end of annotation Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 36/47] perf annotate: Add call target name if it is missing Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 37/47] perf annotate browser: Improve description of '?' hotkey Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 38/47] perf annotate browser: Fix typo Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 39/47] perf session: Export queue_event function Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 40/47] perf kvm: Add live mode Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 41/47] perf kvm: Add min and max stats to display Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 42/47] perf kvm stat report: Add option to analyze specific VM Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 43/47] perf ui/gtk: Fix segmentation fault on perf_hpp__for_each_format loop Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 44/47] perf tools: Add support for pinned modifier Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 45/47] perf tests: Add tests of new " Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 46/47] perf machine: Do not require /lib/modules/* on a guest Arnaldo Carvalho de Melo
2013-08-07 21:11 ` [PATCH 47/47] Revert "tools lib lk: Fix for cross build" Arnaldo Carvalho de Melo
2013-08-12 8:17 ` [GIT PULL 00/47] perf/core improvements and fixes Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1375909874-22073-30-git-send-email-acme@infradead.org \
--to=acme@infradead.org \
--cc=acme@redhat.com \
--cc=adrian.hunter@intel.com \
--cc=dsahern@gmail.com \
--cc=efault@gmx.de \
--cc=eranian@google.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@gmail.com \
--cc=paulus@samba.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®