1
0
mirror of https://github.com/upx/upx synced 2025-10-05 19:20:23 +08:00

Replace crumb with b_info

modified:   stub/src/arm.v4a-linux.elf-entry.S
	modified:   stub/src/arm.v4a-linux.elf-fold.S
This commit is contained in:
John Reiser 2017-04-09 18:06:16 -07:00
parent 360b94dd6c
commit ed31fb184b
2 changed files with 37 additions and 18 deletions

View File

@ -96,15 +96,14 @@ _start: .globl _start
ldr r3,[r11,# sz_unc]
sub r9,r12,r1 // &our_Elf32_Ehdr
add r1,r1,r3 // sz_pack2 + cpr0.sz_unc
ldr r3,[r11,#o_binfo - cpr0]
mov r0,r2 // ADRM
add r3,r3,r9 // &b_info for Elf32_Ehdr
add r1,r1,# PAGE_SIZE
section LUNMP000
mov r3,#0<<12 // 0-page crumb
section LUNMP001
mov r3,#1<<12 // 1-page crumb
section ELFMAINXu
stmdb sp!,{r0,r1,r2,r3,lr} // ADRU,LENU,space for sz_unc,crumb,MFLG
stmdb sp!,{r0,r1,r2,r3,lr} // ADRU,LENU,space for sz_unc,&b_info,MFLG
SP_MFLG= 4*4
D_b_info=3*4 // stack displacement to b_info
D_sz_unc=2*4 // stack displacement to sz_unc
mov r2,#PROT_READ | PROT_WRITE | PROT_EXEC
ldr r3,[r12, #mflg - (start_params -4)] // MAP_{PRIVATE|ANON}
@ -144,9 +143,7 @@ copy:
swi __ARM_NR_cacheflush
#endif /*}*/
ldr r9,[r12] // sz_pack2
sub r9,r9,#sz_Elf32_Ehdr + 2*sz_Elf32_Phdr + sz_l_info + sz_p_info
sub r10,r12,r9 // &b_info
ldr r10,[sp,#D_b_info]
add r10,r10,r4 // relocated &b_info
ldr r0,[r11,# b_method ] // 5th param (whole word: endian issues!)
@ -162,6 +159,9 @@ D_stm1=2*4
stmdb sp!,{TRACE_REGS}; mov r0,#3; bl trace
#endif /*}*/
mov lr,pc; mov pc,r5 // decompress folded code [opcode 'blx' not in v4a]
#if DEBUG /*{*/
stmdb sp!,{TRACE_REGS}; mov r0,#4; bl trace
#endif /*}*/
ldmia sp!,{r1, pc} // discard 5th param; goto unfolded
#if DEBUG /*{*/
@ -262,6 +262,8 @@ L71:
/* IDENTSTR goes here */
section ELFMAINZ
o_binfo:
.long O_BINFO // .int4
cpr0: .globl cpr0
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */

View File

@ -49,6 +49,7 @@ O_RDONLY= 0
PAGE_SHIFT= 12
PAGE_SIZE = -(~0<<PAGE_SHIFT)
PATHMAX= 4096
#ifndef DEBUG /*{*/
#define DEBUG 0
@ -61,13 +62,17 @@ PAGE_SIZE = -(~0<<PAGE_SHIFT)
#define MAX_ELF_HDR 512
fold_begin:
#if DEBUG //{
#define TRACE_REGS r0-r12,r14,r15
stmdb sp!,{TRACE_REGS}; mov r0,#5; bl trace
#endif //}
/* In:
r10= &b_info of first compressed block (after move)
r9= total size of compressed data
r5= f_decompress
sp/ ADRU,LENU,sz_unc,crumb,MFLG,argc,argv...
sp/ ADRU,LENU,sz_unc,&b_info,MFLG,argc,argv...
*/
ldmia sp!,{r3,r4,r6,r7,r8,r11} @ ADRU,LENU,sz_unc,crumb,MFLG,argc
ldmia sp!,{r3,r4,r6,r7,r8,r11} @ ADRU,LENU,sz_unc,&b_info,MFLG,argc
mov r0,sp @ current stack pointer
add r1,sp,r11,lsl #2 @ skip argv pointers
@ -79,7 +84,10 @@ fold_begin:
ldr r2,[r1],#8
cmp r2,#0; bne .L20
sub r0,r1,#4096 @ buffer for readlink
#if DEBUG //{
stmdb sp!,{TRACE_REGS}; mov r0,#6; bl trace
#endif //}
sub r0,r1,#PATHMAX @ buffer for readlink
sub r0,r0,#4 @ space for copy of space3eq
sub r1,r1,sp @ amount needed for argv,env,auxv
mov r0,r0,lsr #2+ PAGE_SHIFT @ 2+ because hardware might require
@ -94,7 +102,10 @@ fold_begin:
sub r0,r0,r2 @ new_argv with same 8-byte alignment as old_argv
mov sp,r0
stmdb sp!,{r3,r4,r6,r7,r11} @ ADRU,LENU,sz_unc,crumb,argc; drop MFLG
stmdb sp!,{r3,r4,r6,r7,r11} @ ADRU,LENU,sz_unc,&b_info,argc; drop MFLG
#if DEBUG //{
stmdb sp!,{TRACE_REGS}; mov r0,#7; bl trace
#endif //}
SP_sz_unc= 2*4
SP_argc= 4*4
@ -120,6 +131,9 @@ SP_argc= 4*4
cmp r2,#0; bne .Laux
str r0,[sp,#SP_sz_unc] @ clobber sz_unc with 1+ &Elf32_auxv_t[AT_NULL@.a_type]
#if DEBUG //{
stmdb sp!,{TRACE_REGS}; mov r0,#8; bl trace
#endif //}
add r1,r0,#1<<(2+ PAGE_SHIFT) @ after the page
str r1,[r4] @ new env ptr
@ -127,7 +141,7 @@ SP_argc= 4*4
ldr r2,space3eq
str r2,[r1],#4 @ " =" of new env var
mov r2,#4096 @ buffer length
mov r2,#PATHMAX @ buffer length
adr r0,proc_self_exe
sub r2,r2,#1 @ room for null terminator
bl readlink; cmn r0,#4096; bcs 0f @ error
@ -170,7 +184,13 @@ SP_argc= 4*4
#endif /*}*/
stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,r12}
ldmia sp!,{r0,r1,r2,r3}
#if DEBUG //{
stmdb sp!,{TRACE_REGS}; mov r0,#9; bl trace
#endif //}
bl upx_main
#if DEBUG //{
stmdb sp!,{TRACE_REGS}; mov r0,#10; bl trace
#endif //}
mov lr,r0 @ entry address
add sp,sp,#(10-4)*4
add sp,sp,#MAX_ELF_HDR + OVERHEAD @ un-alloca
@ -184,16 +204,13 @@ SP_argc= 4*4
do_sys7t2 __ARM_NR_cacheflush @ scribble r7
#endif //}
ldmia sp!,{r0,r1,r2,r3} @ ADRU,LENU,1+ &Elf32_auxv_t[AT_NULL@.a_type],crumb
add r0,r0,r3 @ ADRU+=crumb
sub r1,r1,r3 @ LENU-=crumb
ldmia sp!,{r0,r1,r2,r3} @ ADRU,LENU,1+ &Elf32_auxv_t[AT_NULL@.a_type],&b_info
#if DEBUG /*{*/
ldr r3,[r2,#4 -2*4] @ Elf32_auxv_t[AT_NULL@.a_type].a_val
ldr r4,[r3,#0] @ 1st instr
ldr r5,[r3,#4] @ 2nd instr
#define TRACE_REGS r0-r12,r14,r15
stmdb sp!,{TRACE_REGS}; mov r0,#4; bl trace
stmdb sp!,{TRACE_REGS}; mov r0,#9; bl trace
#endif /*}*/
mov r3,#0 @ clear registers: paranoia
mov r4,#0