/proc/self/exe mapping had wrong offset in stub for 32-bit ARM
https://github.com/upx/upx/issues/221 modified: stub/src/arm.v4a-linux.elf-entry.S modified: stub/src/arm.v4a-linux.elf-fold.S also arm*.*-linux.elf-*.{h,map}
This commit is contained in:
@@ -124,9 +124,9 @@ end_decompress: .globl end_decompress
|
|||||||
/* IDENTSTR goes here */
|
/* IDENTSTR goes here */
|
||||||
|
|
||||||
section ELFMAINZ
|
section ELFMAINZ
|
||||||
unfold: // in: r3= mflg; lr= &O_BINFO
|
unfold: // in: r3= mflg; r6= elfaddr; lr= &O_BINFO
|
||||||
str r3,[sp,#F_mflg]
|
str r3,[sp,#F_mflg]
|
||||||
mvn r10,r6; add r10,r10,#1 @ "neg r10,r6": -elfaddr
|
mov r10,#0; sub r10,r10,r6 @ "neg r10,r6": -elfaddr
|
||||||
add r6,lr,#4 @ &b_info of folded code
|
add r6,lr,#4 @ &b_info of folded code
|
||||||
add r14,r6,r10 @ offset(b_info)
|
add r14,r6,r10 @ offset(b_info)
|
||||||
|
|
||||||
|
|||||||
@@ -182,14 +182,15 @@ F_delta= 3*4
|
|||||||
str r0,[sp,#F_entry - F_delta] @ entry address
|
str r0,[sp,#F_entry - F_delta] @ entry address
|
||||||
|
|
||||||
// Map 1 page of /proc/self/exe so that it does not disappear
|
// Map 1 page of /proc/self/exe so that it does not disappear
|
||||||
mov r5,#0 @ SEEK_SET
|
ldr r4,[sp],#4 @ pop r4,F_fd
|
||||||
ldr r4,[sp,#F_fd - F_delta]! @ fd
|
mov r5,#0 @ SEEK_SET offset
|
||||||
|
stmdb sp!,{r4,r5} @ arg5,arg6 calling convention
|
||||||
mov r3,#MAP_PRIVATE
|
mov r3,#MAP_PRIVATE
|
||||||
mov r2,#PROT_READ
|
mov r2,#PROT_READ
|
||||||
mov r1,#PAGE_SIZE
|
mov r1,#PAGE_SIZE
|
||||||
mov r0,#0 @ any address
|
mov r0,#0 @ any address
|
||||||
bl mmap @ no error check: cannot recover
|
bl mmap @ no error check: cannot recover
|
||||||
ldr r0,[sp],#4 @ F_fd
|
ldmia sp!,{r0,r1} @ fd, offset
|
||||||
bl close
|
bl close
|
||||||
|
|
||||||
#if DEBUG //{
|
#if DEBUG //{
|
||||||
|
|||||||
Reference in New Issue
Block a user