The ELF table created by old kernels (2.4.3 ish) is different from
that created by newer 2.4 kernels. Try and handle that. (Untested).
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@290 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/vg_main.c b/vg_main.c
index 94e175c..9047731 100644
--- a/vg_main.c
+++ b/vg_main.c
@@ -561,18 +561,28 @@
&& sp[0] == VKI_AT_PAGESZ
&& sp[-2] == VKI_AT_PHNUM
&& sp[-4] == VKI_AT_PHENT
- && sp[-6] == VKI_AT_PHDR) {
+ && sp[-6] == VKI_AT_PHDR
+ && sp[-6-1] == 0) {
if (0)
VG_(printf)("Looks like you've got a 2.2.X kernel here.\n");
sp -= 6;
} else
if (sp[2] == VKI_AT_CLKTCK
&& sp[0] == VKI_AT_PAGESZ
- && sp[-2] == VKI_AT_HWCAP) {
+ && sp[-2] == VKI_AT_HWCAP
+ && sp[-2-1] == 0) {
if (0)
VG_(printf)("Looks like you've got a 2.4.X kernel here.\n");
sp -= 2;
} else
+ if (sp[2] == VKI_AT_CLKTCK
+ && sp[0] == VKI_AT_PAGESZ
+ && sp[-2] == VKI_AT_HWCAP
+ && sp[-2-20-1] == 0) {
+ if (0)
+ VG_(printf)("Looks like you've got a early 2.4.X kernel here.\n");
+ sp -= 22;
+ } else
args_grok_error(
"ELF frame does not look like 2.2.X or 2.4.X.\n "
"See kernel sources linux/fs/binfmt_elf.c to make sense of this."