From: norly Date: Sat, 22 Jun 2013 00:02:29 +0000 (+0100) Subject: Minor fixes to PHDR expansion to lower addresses X-Git-Url: https://git.enpas.org/?p=centaur.git;a=commitdiff_plain;h=e28b7c5e31e8ab929c2392c079aa2c0bda49b7ac Minor fixes to PHDR expansion to lower addresses --- diff --git a/src/libelfu/modelops/layout.c b/src/libelfu/modelops/layout.c index 65a713d..afa12c9 100644 --- a/src/libelfu/modelops/layout.c +++ b/src/libelfu/modelops/layout.c @@ -161,8 +161,10 @@ GElf_Addr elfu_mLayoutGetSpaceInPhdr(ElfuElf *me, GElf_Word size, *injPhdr = last; } return last->phdr.p_vaddr + (injOffset - last->phdr.p_offset); - } else if ((w && (first->phdr.p_flags & PF_W)) - || (x && (first->phdr.p_flags & PF_X))) { + } else if (((w && (first->phdr.p_flags & PF_W)) + || (x && (first->phdr.p_flags & PF_X))) + && /* Enough space to expand downwards? */ + (first->phdr.p_vaddr > 3 * first->phdr.p_align)) { /* Need to prepend or split up the PHDR. */ GElf_Off injOffset = OFFS_END(first->phdr.p_offset, first->phdr.p_filesz); ElfuScn *ms; @@ -194,7 +196,7 @@ GElf_Addr elfu_mLayoutGetSpaceInPhdr(ElfuElf *me, GElf_Word size, } /* Move other PHDRs and sections */ - assert(size <= shiftStuffAtAfterOffset(me, injOffset, size)); + assert(size <= shiftStuffAtAfterOffset(me, injOffset + 1, size)); /* Remap ourselves */ first->phdr.p_vaddr -= size;