From 1d39796e3fbbff78a4f6715df935abc21d72e138 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Tue, 19 Dec 2006 18:18:47 -0800 Subject: [PATCH] PackVmlinuxBase::canPack bug for AMD64 with holes between PT_LOAD --- src/p_vmlinx.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/p_vmlinx.cpp b/src/p_vmlinx.cpp index 1cf74b85..0a3ca42e 100644 --- a/src/p_vmlinx.cpp +++ b/src/p_vmlinx.cpp @@ -137,8 +137,9 @@ bool PackVmlinuxBase::canPack() || ehdri.e_machine != my_e_machine || ehdri.e_version != 1 // version || ehdri.e_ehsize != sizeof(ehdri) // different ? - ) + ) { return false; + } // additional requirements for vmlinux if (ehdri.e_type != Ehdr::ET_EXEC @@ -155,15 +156,16 @@ bool PackVmlinuxBase::canPack() return false; } { - int j; - for (p = shdri, j= ehdri.e_shnum; --j>=0; ++p) { - if (Shdr::SHT_PROGBITS==p->sh_type - && 0==strcmp("__ksymtab", p->sh_name + shstrtab)) { - break; + int j; + for (p = shdri, j= ehdri.e_shnum; --j>=0; ++p) { + if (Shdr::SHT_PROGBITS==p->sh_type + && 0==strcmp("__ksymtab", p->sh_name + shstrtab)) { + break; + } + } + if (j < 0) { + return false; } - } - if (j < 0) - return false; } phdri = new Phdr[(unsigned) ehdri.e_phnum]; @@ -181,9 +183,12 @@ bool PackVmlinuxBase::canPack() return false; } if (0 < j) { - unsigned const sz = (0u - phdri[j-1].p_align) - & (phdri[j-1].p_align -1 + phdri[j-1].p_filesz); - if ((sz + phdri[j-1].p_offset)!=phdri[j].p_offset) { + unsigned const org = (0u - phdri[j].p_align) & + (-1 + phdri[j].p_align + + phdri[j-1].p_filesz + phdri[j-1].p_offset); + unsigned const loc = (0u - phdri[j].p_align) & + (-1 + phdri[j].p_align + phdri[j].p_offset); + if (org!=loc) { return false; } }