Re: [PATCH] recordmcount: Fix handling of elf64 big-endian objects.

From: David Daney
Date: Fri Jan 06 2012 - 15:42:25 EST


On 12/19/2011 07:09 PM, Steven Rostedt wrote:
On Mon, 2011-12-19 at 17:42 -0800, David Daney wrote:
From: David Daney<david.daney@xxxxxxxxxx>

In ELF64, the sh_flags field is 64-bits wide. recordmcount was
erroneously treating it as a 32-bit wide field. For little endian
objects this works because the flags of interest (SHF_EXECINSTR)
reside in the lower 32 bits of the word, and you get the same result
with either a 32-bit or 64-bit read. Big endian objects on the
other hand do not work at all with this error.

The fix: Correctly treat sh_flags as 64-bits wide in elf64 objects.

The symptom I observed was that my
__start_mcount_loc..__stop_mcount_loc was empty even though ftrace
function tracing was enabled.


OUCH!

This looks like something that needs to go to stable. Let me play with
this on my PPC64 tomorrow.


Hi Steven,

Any more feedback on this patch? Should I look for it to appear in 3.3?

Thanks,
David Daney

Thanks!

-- Steve

Signed-off-by: David Daney<david.daney@xxxxxxxxxx>
---
scripts/recordmcount.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h
index f40a6af6..54e35c1 100644
--- a/scripts/recordmcount.h
+++ b/scripts/recordmcount.h
@@ -462,7 +462,7 @@ __has_rel_mcount(Elf_Shdr const *const relhdr, /* is SHT_REL or SHT_RELA */
succeed_file();
}
if (w(txthdr->sh_type) != SHT_PROGBITS ||
- !(w(txthdr->sh_flags)& SHF_EXECINSTR))
+ !(_w(txthdr->sh_flags)& SHF_EXECINSTR))
return NULL;
return txtname;
}



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/