Name it upx_main2() for clarity

modified:   stub/src/amd64-linux.elf-fold.S
	modified:   stub/src/amd64-linux.elf-main2.c
	modified:   stub/src/arm64-linux.elf-fold.S
	modified:   stub/src/i386-linux.elf-main2.c
	modified:   stub/src/powerpc64-linux.elf-fold.S
This commit is contained in:
John Reiser 2024-11-20 15:00:11 -08:00
parent 17b94cdfe5
commit 02b9ac9764
5 changed files with 18 additions and 26 deletions

View File

@ -80,7 +80,7 @@ is_ptinterp= (1<<0)
.balign 8 .balign 8
PAGE_MASK: .quad -1<<12 // default PAGE_MASK: .quad -1<<12 // default
// IN: [ADRX,+LENX): compressed data; [ADRU,+LENU): expanded fold (w/ upx_main) // IN: [ADRX,+LENX): compressed data; [ADRU,+LENU): expanded fold (w/ upx_main2)
// %rsp= %rbp= &F_ADRX; %r13= O_BINFO | is_ptinterp | unmap_all_pages // %rsp= %rbp= &F_ADRX; %r13= O_BINFO | is_ptinterp | unmap_all_pages
// no 'section', thus '.text'; also loaded first in amd64-linux.elf-fold.bin. // no 'section', thus '.text'; also loaded first in amd64-linux.elf-fold.bin.
@ -161,8 +161,8 @@ no_env_pse:
mov %arg5,%r13 # save ELFA mov %arg5,%r13 # save ELFA
subq $ OVERHEAD,%rsp subq $ OVERHEAD,%rsp
movq %rsp,%arg3 # &ELf64_Ehdr temporary space movq %rsp,%arg3 # &ELf64_Ehdr temporary space
call upx_main # Out: %rax= entry call upx_main2 # Out: %rax= entry
/* entry= upx_main( /* entry= upx_main2(
b_info *arg1, {%rdi} b_info *arg1, {%rdi}
total_size arg2, {%rsi} total_size arg2, {%rsi}
Elf64_Ehdr *arg3, {%rdx} Elf64_Ehdr *arg3, {%rdx}
@ -200,7 +200,7 @@ p_memsz= 5*NBPW
mov %ebx,%edi # fd mov %ebx,%edi # fd
call close call close
no_pse_map: no_pse_map:
pop %arg1 # ADRU: unfolded upx_main etc. pop %arg1 # ADRU: unfolded upx_main2 etc.
pop %arg2 # LENU pop %arg2 # LENU
push $__NR_munmap; pop %rax push $__NR_munmap; pop %rax
/*notrack*/ jmp *(%r14) # goto: syscall; pop %rdx; ret /*notrack*/ jmp *(%r14) # goto: syscall; pop %rdx; ret

View File

@ -652,13 +652,13 @@ ERR_LAB
/************************************************************************* /*************************************************************************
// upx_main - called by our entry code // upx_main2 - called by our entry code
// //
// This function is optimized for size. // This function is optimized for size.
**************************************************************************/ **************************************************************************/
void * void *
upx_main( // returns entry address upx_main2( // returns entry address
/*arg1*/ struct b_info const *const bi, // 1st block header /*arg1*/ struct b_info const *const bi, // 1st block header
/*arg2*/ size_t const sz_compressed, // total length /*arg2*/ size_t const sz_compressed, // total length
/*arg3*/ ElfW(Ehdr) *const ehdr, // temp char[sz_ehdr] for decompressing /*arg3*/ ElfW(Ehdr) *const ehdr, // temp char[sz_ehdr] for decompressing
@ -672,7 +672,7 @@ upx_main( // returns entry address
#endif //} #endif //}
) )
{ {
DPRINTF("upx_main b_info=%%p sz_compressed=%%p ehdr=%%p av=%%p\\n", DPRINTF("upx_main2 b_info=%%p sz_compressed=%%p ehdr=%%p av=%%p\\n",
bi, sz_compressed, ehdr, av); bi, sz_compressed, ehdr, av);
#if defined(__powerpc64__) #if defined(__powerpc64__)
DPRINTF(" p_reloc=%%p\\n", p_reloc); DPRINTF(" p_reloc=%%p\\n", p_reloc);
@ -690,13 +690,13 @@ upx_main( // returns entry address
ElfW(Addr) *const p_reloc = &elfaddr; ElfW(Addr) *const p_reloc = &elfaddr;
#endif //} #endif //}
ElfW(Addr) page_mask = get_page_mask(); (void)page_mask; ElfW(Addr) page_mask = get_page_mask(); (void)page_mask;
DPRINTF("upx_main1 .e_entry=%%p p_reloc=%%p *p_reloc=%%p page_mask=%%p\\n", DPRINTF("upx_main21 .e_entry=%%p p_reloc=%%p *p_reloc=%%p page_mask=%%p\\n",
ehdr->e_entry, p_reloc, *p_reloc, page_mask); ehdr->e_entry, p_reloc, *p_reloc, page_mask);
ElfW(Phdr) *phdr = (ElfW(Phdr) *)(1+ ehdr); ElfW(Phdr) *phdr = (ElfW(Phdr) *)(1+ ehdr);
// De-compress Ehdr again into actual position, then de-compress the rest. // De-compress Ehdr again into actual position, then de-compress the rest.
ElfW(Addr) entry = do_xmap(ehdr, &xi1, 0, av, p_reloc); ElfW(Addr) entry = do_xmap(ehdr, &xi1, 0, av, p_reloc);
DPRINTF("upx_main2 entry=%%p *p_reloc=%%p\\n", entry, *p_reloc); DPRINTF("upx_main22 entry=%%p *p_reloc=%%p\\n", entry, *p_reloc);
auxv_up(av, AT_ENTRY , entry); auxv_up(av, AT_ENTRY , entry);
{ // Map PT_INTERP program interpreter { // Map PT_INTERP program interpreter

View File

@ -221,7 +221,7 @@ no_env_pse:
mov x2,sp // ehdr mov x2,sp // ehdr
mov w1,wLENC // total size of compressed data mov w1,wLENC // total size of compressed data
mov x0,xADRC // &b_info mov x0,xADRC // &b_info
call upx_main call upx_main2
add sp,sp,#MAX_ELF_HDR_64 + OVERHEAD // un-alloca add sp,sp,#MAX_ELF_HDR_64 + OVERHEAD // un-alloca
mov xfexp,x0 // entry address mov xfexp,x0 // entry address

View File

@ -283,7 +283,7 @@ extern long upx_mmap_and_fd( // x86_64 Android emulator of i386 is not faithful
// Create (or find) an escape hatch to use when munmapping ourselves the stub. // Create (or find) an escape hatch to use when munmapping ourselves the stub.
// Called by do_xmap to create it; remembered in AT_NULL.d_val // Called by do_xmap to create it; remembered in AT_NULL.d_val
static char * static char *
make_hatch_i386( make_hatch(
ElfW(Phdr) const *const phdr, ElfW(Phdr) const *const phdr,
char *next_unc, char *next_unc,
unsigned frag_mask unsigned frag_mask
@ -321,7 +321,7 @@ extern unsigned get_sys_munmap(void);
#define NBPI 4 #define NBPI 4
static void * static void *
make_hatch_arm32( make_hatch(
ElfW(Phdr) const *const phdr, ElfW(Phdr) const *const phdr,
char *next_unc, char *next_unc,
unsigned frag_mask unsigned frag_mask
@ -358,7 +358,7 @@ make_hatch_arm32(
} }
#elif defined(__mips__) /*}{*/ #elif defined(__mips__) /*}{*/
static void * static void *
make_hatch_mips( make_hatch(
ElfW(Phdr) const *const phdr, ElfW(Phdr) const *const phdr,
char *next_unc, char *next_unc,
unsigned frag_mask) unsigned frag_mask)
@ -398,7 +398,7 @@ make_hatch_mips(
} }
#elif defined(__powerpc__) /*}{*/ #elif defined(__powerpc__) /*}{*/
static void * static void *
make_hatch_ppc32( make_hatch(
ElfW(Phdr) const *const phdr, ElfW(Phdr) const *const phdr,
char *next_unc, char *next_unc,
unsigned frag_mask) unsigned frag_mask)
@ -702,15 +702,7 @@ do_xmap(
} }
if (xi && phdr->p_flags & PF_X) { if (xi && phdr->p_flags & PF_X) {
#if defined(__i386__) //{ char *hatch = make_hatch(phdr, xo.buf, ~page_mask);
void *const hatch = make_hatch_i386(phdr, xo.buf, ~page_mask);
#elif defined(__powerpc__) //}{
void *const hatch = make_hatch_ppc32(phdr, xo.buf, ~page_mask);
#elif defined(__arm__) //}{
void *const hatch = make_hatch_arm32(phdr, xo.buf, ~page_mask);
#elif defined(__mips__) //}{
void *const hatch = make_hatch_mips(phdr, xo.buf, ~page_mask);
#endif //}
if (0!=hatch) { if (0!=hatch) {
// Always update AT_NULL, especially for compressed PT_INTERP. // Always update AT_NULL, especially for compressed PT_INTERP.
// Clearing lo bit of av is for i386 only; else is superfluous. // Clearing lo bit of av is for i386 only; else is superfluous.

View File

@ -241,8 +241,8 @@ r_reloc= 32 - 1 # used slot in register save area
mr a3,r_auxv // &Elf64_auxv_t mr a3,r_auxv // &Elf64_auxv_t
la a4,SZ_FRAME+OVERHEAD + SZ_FRAME+(r_reloc * NBPW)(sp) // &p_reloc la a4,SZ_FRAME+OVERHEAD + SZ_FRAME+(r_reloc * NBPW)(sp) // &p_reloc
std r_elfa,0(a4) std r_elfa,0(a4)
call upx_main // Out: a0= entry call upx_main2 // Out: a0= entry
// entry= upx_main(b_info *a0, total_size a1, Elf64_Ehdr *a2, ELf32_auxv_t *a3, // entry= upx_main2(b_info *a0, total_size a1, Elf64_Ehdr *a2, ELf32_auxv_t *a3,
// Elf64_Addr *p_reloc) // Elf64_Addr *p_reloc)
la sp,SZ_FRAME+OVERHEAD(sp) // FR_01 deallocate this frame la sp,SZ_FRAME+OVERHEAD(sp) // FR_01 deallocate this frame
#if USE_TOC //{ #if USE_TOC //{
@ -296,7 +296,7 @@ sz_auxv= 2*NBPW
li r0,SYS_munmap li r0,SYS_munmap
mtlr r_exp // entry address mtlr r_exp // entry address
// BIG_ENDIAN: r2 (TOC) already is live (set after return from upx_main) // BIG_ENDIAN: r2 (TOC) already is live (set after return from upx_main2)
// LITTLE_ENDIAN: r2 never is touched // LITTLE_ENDIAN: r2 never is touched
// ld 2,SZ_FRAME + (-1+ 2)*NBPW(sp) // ld 2,SZ_FRAME + (-1+ 2)*NBPW(sp)
// r3,r4 are a0,a1 which are parameters to munmap() // r3,r4 are a0,a1 which are parameters to munmap()