diff options
author | norly <ny-git@enpas.org> | 2013-06-22 01:02:29 +0100 |
---|---|---|
committer | norly <ny-git@enpas.org> | 2013-06-22 01:02:29 +0100 |
commit | e28b7c5e31e8ab929c2392c079aa2c0bda49b7ac (patch) | |
tree | d4b5565c8a342e90d4ef144a7a970af0747681ea | |
parent | 2affa1e1f0c64a2ca4d7a69761932b070c1bdc52 (diff) |
Minor fixes to PHDR expansion to lower addresses
-rw-r--r-- | src/libelfu/modelops/layout.c | 8 |
1 files changed, 5 insertions, 3 deletions
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; |