1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

powerpc stub: used wrong register

modified:   stub/src/powerpc-linux.elf-entry.S
	modified:   stub/src/arch/powerpc/32/ppc_regs.h
This commit is contained in:
John Reiser 2017-10-11 17:17:45 -07:00
parent 608662d73b
commit 85eb4c7537
3 changed files with 9 additions and 7 deletions

View File

@ -32,8 +32,8 @@
#define STUB_POWERPC_LINUX_ELF_ENTRY_SIZE 9144
#define STUB_POWERPC_LINUX_ELF_ENTRY_ADLER32 0xbffd5d8f
#define STUB_POWERPC_LINUX_ELF_ENTRY_CRC32 0x77078a44
#define STUB_POWERPC_LINUX_ELF_ENTRY_ADLER32 0x3faf5db0
#define STUB_POWERPC_LINUX_ELF_ENTRY_CRC32 0x825ccfba
unsigned char stub_powerpc_linux_elf_entry[9144] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -427,9 +427,9 @@ unsigned char stub_powerpc_linux_elf_entry[9144] = {
/* 0x1840 */ 56, 96, 0, 0,124, 25,176, 80,124,149, 2, 20,124,156, 35,120,
/* 0x1850 */ 72, 0, 0,153,124,125, 27,120,128, 22, 0, 8,124,149,224, 80,
/* 0x1860 */ 127,103,219,120, 56,192, 0, 18,124,132, 2, 20, 72, 0, 0,125,
/* 0x1870 */ 126,153, 24, 80,130,118, 0, 0, 56,118, 0, 16,126,214,162, 20,
/* 0x1880 */ 126,246,170, 20,126,216,240, 56,126,248,184, 80,127,233, 3,166,
/* 0x1890 */ 127,255,162, 20,136,246, 0, 12,146,161, 0,140, 56,193, 0,140,
/* 0x1870 */ 126,153, 24, 80,127,233, 3,166,127,255,162, 20,130,118, 0, 0,
/* 0x1880 */ 56,118, 0, 16,126,214,162, 20,126,246,170, 20,127,248,240, 56,
/* 0x1890 */ 126,248,184, 80,136,246, 0, 12,146,161, 0,140, 56,193, 0,140,
/* 0x18a0 */ 126,197,179,120,128,150, 0, 8, 78,128, 4, 33,128, 22, 0, 0,
/* 0x18b0 */ 87,195,186,126, 80, 96, 4, 62,144, 22, 0, 0, 56,160, 0, 5,
/* 0x18c0 */ 126,228,187,120,127, 3,195,120, 56, 0, 0,125, 68, 0, 0, 2,

View File

@ -34,6 +34,8 @@
#define r30 30
#define r31 31
// http://refspecs.linux-foundation.org/elf/elfspec_ppc.pdf
//
/* Stack pointer */
#define sp 1
SZ_FRAME= 6*4 // (sp,cr,lr, xx,yy,zz) save area per calling convention

View File

@ -212,17 +212,17 @@ unfold: // IN: r_exp, r_auxv, r_PMASK
add a1,a1,r0 // + sz_cpr of fold; a1 <= .st_size
call mmapRW0
sub r_relo,a0,r_elf // relocation amount
mtctr r_exp; add r_exp,r_exp,r_relo // use old f_exp; r_exp= new &f_exp
// Decompress from old folded code, overwriting new copy of folded code.
lwz r_obinf, LOBINFO - LrFLD(r_FLD) // O_BINFO
la src,sz_b_info + LBINFO - LrFLD(r_FLD) // old folded code
add r_FLD,r_FLD,r_relo // dst for unfolding; use copied data
add r_LENM,r_FLD,r_szuf // + sz_unc = last of unfolded
and r_ADRM,r_FLD,r_PMASK // base for PROT_EXEC
and r_ADRM,r_exp,r_PMASK // base for PROT_EXEC
sub r_LENM,r_LENM,r_ADRM // length for PROT_EXEC
// The new f_exp has PROT_WRITE, so use the old f_exp to decompress.
mtctr r_exp; add r_exp,r_exp,r_relo // use old f_exp; r_exp= new &f_exp
lbz meth,b_method + LBINFO - LrFLD(r_FLD)
stw r_szuf,SZ_FRAME+31*NBPW(sp) // lzma uses for EOF
la ldst,SZ_FRAME+31*NBPW(sp) // &slot on stack