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:
@@ -96,15 +96,14 @@ _start: .globl _start
|
|||||||
ldr r3,[r11,# sz_unc]
|
ldr r3,[r11,# sz_unc]
|
||||||
sub r9,r12,r1 // &our_Elf32_Ehdr
|
sub r9,r12,r1 // &our_Elf32_Ehdr
|
||||||
add r1,r1,r3 // sz_pack2 + cpr0.sz_unc
|
add r1,r1,r3 // sz_pack2 + cpr0.sz_unc
|
||||||
|
ldr r3,[r11,#o_binfo - cpr0]
|
||||||
mov r0,r2 // ADRM
|
mov r0,r2 // ADRM
|
||||||
|
add r3,r3,r9 // &b_info for Elf32_Ehdr
|
||||||
add r1,r1,# PAGE_SIZE
|
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
|
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
|
SP_MFLG= 4*4
|
||||||
|
D_b_info=3*4 // stack displacement to b_info
|
||||||
D_sz_unc=2*4 // stack displacement to sz_unc
|
D_sz_unc=2*4 // stack displacement to sz_unc
|
||||||
mov r2,#PROT_READ | PROT_WRITE | PROT_EXEC
|
mov r2,#PROT_READ | PROT_WRITE | PROT_EXEC
|
||||||
ldr r3,[r12, #mflg - (start_params -4)] // MAP_{PRIVATE|ANON}
|
ldr r3,[r12, #mflg - (start_params -4)] // MAP_{PRIVATE|ANON}
|
||||||
@@ -144,9 +143,7 @@ copy:
|
|||||||
swi __ARM_NR_cacheflush
|
swi __ARM_NR_cacheflush
|
||||||
#endif /*}*/
|
#endif /*}*/
|
||||||
|
|
||||||
ldr r9,[r12] // sz_pack2
|
ldr r10,[sp,#D_b_info]
|
||||||
sub r9,r9,#sz_Elf32_Ehdr + 2*sz_Elf32_Phdr + sz_l_info + sz_p_info
|
|
||||||
sub r10,r12,r9 // &b_info
|
|
||||||
add r10,r10,r4 // relocated &b_info
|
add r10,r10,r4 // relocated &b_info
|
||||||
|
|
||||||
ldr r0,[r11,# b_method ] // 5th param (whole word: endian issues!)
|
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
|
stmdb sp!,{TRACE_REGS}; mov r0,#3; bl trace
|
||||||
#endif /*}*/
|
#endif /*}*/
|
||||||
mov lr,pc; mov pc,r5 // decompress folded code [opcode 'blx' not in v4a]
|
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
|
ldmia sp!,{r1, pc} // discard 5th param; goto unfolded
|
||||||
|
|
||||||
#if DEBUG /*{*/
|
#if DEBUG /*{*/
|
||||||
@@ -262,6 +262,8 @@ L71:
|
|||||||
/* IDENTSTR goes here */
|
/* IDENTSTR goes here */
|
||||||
|
|
||||||
section ELFMAINZ
|
section ELFMAINZ
|
||||||
|
o_binfo:
|
||||||
|
.long O_BINFO // .int4
|
||||||
cpr0: .globl cpr0
|
cpr0: .globl cpr0
|
||||||
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
|
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ O_RDONLY= 0
|
|||||||
|
|
||||||
PAGE_SHIFT= 12
|
PAGE_SHIFT= 12
|
||||||
PAGE_SIZE = -(~0<<PAGE_SHIFT)
|
PAGE_SIZE = -(~0<<PAGE_SHIFT)
|
||||||
|
PATHMAX= 4096
|
||||||
|
|
||||||
#ifndef DEBUG /*{*/
|
#ifndef DEBUG /*{*/
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
@@ -61,13 +62,17 @@ PAGE_SIZE = -(~0<<PAGE_SHIFT)
|
|||||||
#define MAX_ELF_HDR 512
|
#define MAX_ELF_HDR 512
|
||||||
|
|
||||||
fold_begin:
|
fold_begin:
|
||||||
|
#if DEBUG //{
|
||||||
|
#define TRACE_REGS r0-r12,r14,r15
|
||||||
|
stmdb sp!,{TRACE_REGS}; mov r0,#5; bl trace
|
||||||
|
#endif //}
|
||||||
/* In:
|
/* In:
|
||||||
r10= &b_info of first compressed block (after move)
|
r10= &b_info of first compressed block (after move)
|
||||||
r9= total size of compressed data
|
r9= total size of compressed data
|
||||||
r5= f_decompress
|
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
|
mov r0,sp @ current stack pointer
|
||||||
|
|
||||||
add r1,sp,r11,lsl #2 @ skip argv pointers
|
add r1,sp,r11,lsl #2 @ skip argv pointers
|
||||||
@@ -79,7 +84,10 @@ fold_begin:
|
|||||||
ldr r2,[r1],#8
|
ldr r2,[r1],#8
|
||||||
cmp r2,#0; bne .L20
|
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 r0,r0,#4 @ space for copy of space3eq
|
||||||
sub r1,r1,sp @ amount needed for argv,env,auxv
|
sub r1,r1,sp @ amount needed for argv,env,auxv
|
||||||
mov r0,r0,lsr #2+ PAGE_SHIFT @ 2+ because hardware might require
|
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
|
sub r0,r0,r2 @ new_argv with same 8-byte alignment as old_argv
|
||||||
mov sp,r0
|
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_sz_unc= 2*4
|
||||||
SP_argc= 4*4
|
SP_argc= 4*4
|
||||||
|
|
||||||
@@ -120,6 +131,9 @@ SP_argc= 4*4
|
|||||||
cmp r2,#0; bne .Laux
|
cmp r2,#0; bne .Laux
|
||||||
|
|
||||||
str r0,[sp,#SP_sz_unc] @ clobber sz_unc with 1+ &Elf32_auxv_t[AT_NULL@.a_type]
|
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
|
add r1,r0,#1<<(2+ PAGE_SHIFT) @ after the page
|
||||||
str r1,[r4] @ new env ptr
|
str r1,[r4] @ new env ptr
|
||||||
@@ -127,7 +141,7 @@ SP_argc= 4*4
|
|||||||
ldr r2,space3eq
|
ldr r2,space3eq
|
||||||
str r2,[r1],#4 @ " =" of new env var
|
str r2,[r1],#4 @ " =" of new env var
|
||||||
|
|
||||||
mov r2,#4096 @ buffer length
|
mov r2,#PATHMAX @ buffer length
|
||||||
adr r0,proc_self_exe
|
adr r0,proc_self_exe
|
||||||
sub r2,r2,#1 @ room for null terminator
|
sub r2,r2,#1 @ room for null terminator
|
||||||
bl readlink; cmn r0,#4096; bcs 0f @ error
|
bl readlink; cmn r0,#4096; bcs 0f @ error
|
||||||
@@ -170,7 +184,13 @@ SP_argc= 4*4
|
|||||||
#endif /*}*/
|
#endif /*}*/
|
||||||
stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,r12}
|
stmdb sp!,{r3,r4,r5,r6,r7,r8,r9,r10,r11,r12}
|
||||||
ldmia sp!,{r0,r1,r2,r3}
|
ldmia sp!,{r0,r1,r2,r3}
|
||||||
|
#if DEBUG //{
|
||||||
|
stmdb sp!,{TRACE_REGS}; mov r0,#9; bl trace
|
||||||
|
#endif //}
|
||||||
bl upx_main
|
bl upx_main
|
||||||
|
#if DEBUG //{
|
||||||
|
stmdb sp!,{TRACE_REGS}; mov r0,#10; bl trace
|
||||||
|
#endif //}
|
||||||
mov lr,r0 @ entry address
|
mov lr,r0 @ entry address
|
||||||
add sp,sp,#(10-4)*4
|
add sp,sp,#(10-4)*4
|
||||||
add sp,sp,#MAX_ELF_HDR + OVERHEAD @ un-alloca
|
add sp,sp,#MAX_ELF_HDR + OVERHEAD @ un-alloca
|
||||||
@@ -184,16 +204,13 @@ SP_argc= 4*4
|
|||||||
do_sys7t2 __ARM_NR_cacheflush @ scribble r7
|
do_sys7t2 __ARM_NR_cacheflush @ scribble r7
|
||||||
#endif //}
|
#endif //}
|
||||||
|
|
||||||
ldmia sp!,{r0,r1,r2,r3} @ ADRU,LENU,1+ &Elf32_auxv_t[AT_NULL@.a_type],crumb
|
ldmia sp!,{r0,r1,r2,r3} @ ADRU,LENU,1+ &Elf32_auxv_t[AT_NULL@.a_type],&b_info
|
||||||
add r0,r0,r3 @ ADRU+=crumb
|
|
||||||
sub r1,r1,r3 @ LENU-=crumb
|
|
||||||
|
|
||||||
#if DEBUG /*{*/
|
#if DEBUG /*{*/
|
||||||
ldr r3,[r2,#4 -2*4] @ Elf32_auxv_t[AT_NULL@.a_type].a_val
|
ldr r3,[r2,#4 -2*4] @ Elf32_auxv_t[AT_NULL@.a_type].a_val
|
||||||
ldr r4,[r3,#0] @ 1st instr
|
ldr r4,[r3,#0] @ 1st instr
|
||||||
ldr r5,[r3,#4] @ 2nd instr
|
ldr r5,[r3,#4] @ 2nd instr
|
||||||
#define TRACE_REGS r0-r12,r14,r15
|
stmdb sp!,{TRACE_REGS}; mov r0,#9; bl trace
|
||||||
stmdb sp!,{TRACE_REGS}; mov r0,#4; bl trace
|
|
||||||
#endif /*}*/
|
#endif /*}*/
|
||||||
mov r3,#0 @ clear registers: paranoia
|
mov r3,#0 @ clear registers: paranoia
|
||||||
mov r4,#0
|
mov r4,#0
|
||||||
|
|||||||
Reference in New Issue
Block a user