perf tools: Add dso__type()
dso__type() determines wheather a dso is 32-bit, x32 (32-bit with 64-bit registers) or 64-bit. dso__type() will be used to determine the VDSO a program maps. Reviewed-by: Jiri Olsa <jolsa@redhat.com> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> 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/1406035081-14301-51-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:

committed by
Arnaldo Carvalho de Melo

parent
51682dc744
commit
2b5b8bb27b
@@ -1028,6 +1028,39 @@ int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data,
|
||||
return err;
|
||||
}
|
||||
|
||||
enum dso_type dso__type_fd(int fd)
|
||||
{
|
||||
enum dso_type dso_type = DSO__TYPE_UNKNOWN;
|
||||
GElf_Ehdr ehdr;
|
||||
Elf_Kind ek;
|
||||
Elf *elf;
|
||||
|
||||
elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
|
||||
if (elf == NULL)
|
||||
goto out;
|
||||
|
||||
ek = elf_kind(elf);
|
||||
if (ek != ELF_K_ELF)
|
||||
goto out_end;
|
||||
|
||||
if (gelf_getclass(elf) == ELFCLASS64) {
|
||||
dso_type = DSO__TYPE_64BIT;
|
||||
goto out_end;
|
||||
}
|
||||
|
||||
if (gelf_getehdr(elf, &ehdr) == NULL)
|
||||
goto out_end;
|
||||
|
||||
if (ehdr.e_machine == EM_X86_64)
|
||||
dso_type = DSO__TYPE_X32BIT;
|
||||
else
|
||||
dso_type = DSO__TYPE_32BIT;
|
||||
out_end:
|
||||
elf_end(elf);
|
||||
out:
|
||||
return dso_type;
|
||||
}
|
||||
|
||||
static int copy_bytes(int from, off_t from_offs, int to, off_t to_offs, u64 len)
|
||||
{
|
||||
ssize_t r;
|
||||
|
Reference in New Issue
Block a user