Commit b5cabbcb authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf tools: Fix copying of /proc/kcore

A copy of /proc/kcore containing the kernel text can be made to the
buildid cache. e.g.

	perf buildid-cache -v -k /proc/kcore

To workaround objdump limitations, a copy is also made when annotating
against /proc/kcore.

The copying process stops working from libelf about v1.62 onwards (the
problem was found with v1.63).

The cause is that a call to gelf_getphdr() in kcore__add_phdr() fails
because additional validation has been added to gelf_getphdr().

The use of gelf_getphdr() is a misguided attempt to get default
initialization of the Gelf_Phdr structure.  That should not be
necessary because every member of the Gelf_Phdr structure is
subsequently assigned.  So just remove the call to gelf_getphdr().

Similarly, a call to gelf_getehdr() in gelf_kcore__init() can be
removed also.

Committer notes:

Note to stable@kernel.org, from Adrian in the cover letter for this
patchkit:

The "Fix copying of /proc/kcore" problem goes back to v3.13 if you think
it is important enough for stable.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: stable@kernel.org
Link: http://lkml.kernel.org/r/1443089122-19082-3-git-send-email-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 597ee407
...@@ -1271,8 +1271,6 @@ static int kcore__open(struct kcore *kcore, const char *filename) ...@@ -1271,8 +1271,6 @@ static int kcore__open(struct kcore *kcore, const char *filename)
static int kcore__init(struct kcore *kcore, char *filename, int elfclass, static int kcore__init(struct kcore *kcore, char *filename, int elfclass,
bool temp) bool temp)
{ {
GElf_Ehdr *ehdr;
kcore->elfclass = elfclass; kcore->elfclass = elfclass;
if (temp) if (temp)
...@@ -1289,9 +1287,7 @@ static int kcore__init(struct kcore *kcore, char *filename, int elfclass, ...@@ -1289,9 +1287,7 @@ static int kcore__init(struct kcore *kcore, char *filename, int elfclass,
if (!gelf_newehdr(kcore->elf, elfclass)) if (!gelf_newehdr(kcore->elf, elfclass))
goto out_end; goto out_end;
ehdr = gelf_getehdr(kcore->elf, &kcore->ehdr); memset(&kcore->ehdr, 0, sizeof(GElf_Ehdr));
if (!ehdr)
goto out_end;
return 0; return 0;
...@@ -1348,23 +1344,18 @@ static int kcore__copy_hdr(struct kcore *from, struct kcore *to, size_t count) ...@@ -1348,23 +1344,18 @@ static int kcore__copy_hdr(struct kcore *from, struct kcore *to, size_t count)
static int kcore__add_phdr(struct kcore *kcore, int idx, off_t offset, static int kcore__add_phdr(struct kcore *kcore, int idx, off_t offset,
u64 addr, u64 len) u64 addr, u64 len)
{ {
GElf_Phdr gphdr; GElf_Phdr phdr = {
GElf_Phdr *phdr; .p_type = PT_LOAD,
.p_flags = PF_R | PF_W | PF_X,
phdr = gelf_getphdr(kcore->elf, idx, &gphdr); .p_offset = offset,
if (!phdr) .p_vaddr = addr,
return -1; .p_paddr = 0,
.p_filesz = len,
phdr->p_type = PT_LOAD; .p_memsz = len,
phdr->p_flags = PF_R | PF_W | PF_X; .p_align = page_size,
phdr->p_offset = offset; };
phdr->p_vaddr = addr;
phdr->p_paddr = 0; if (!gelf_update_phdr(kcore->elf, idx, &phdr))
phdr->p_filesz = len;
phdr->p_memsz = len;
phdr->p_align = page_size;
if (!gelf_update_phdr(kcore->elf, idx, phdr))
return -1; return -1;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment