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

workaround: MIPS.r3000 early uClibc forgot memset(,0,) of local array

ldso/ldso/ldso.c: _dl_get_ready_to_run()
    _dl_memset(app_tpnt, 0, sizeof(*app_tpnt));
	modified:   stub/src/mipsel.r3000-linux.elf-fold.S

	modified:   stub/mips.r3000-linux.elf-fold.h
	modified:   stub/mipsel.r3000-linux.elf-fold.h
This commit is contained in:
John Reiser 2020-05-26 14:49:25 -07:00 committed by Markus F.X.J. Oberhumer
parent f96638c42a
commit e1b42616a2
3 changed files with 14 additions and 7 deletions

View File

@ -32,8 +32,8 @@
#define STUB_MIPS_R3000_LINUX_ELF_FOLD_SIZE 2892
#define STUB_MIPS_R3000_LINUX_ELF_FOLD_ADLER32 0xa2e27f2f
#define STUB_MIPS_R3000_LINUX_ELF_FOLD_CRC32 0x719a099a
#define STUB_MIPS_R3000_LINUX_ELF_FOLD_ADLER32 0x40e97fad
#define STUB_MIPS_R3000_LINUX_ELF_FOLD_CRC32 0x749d56f7
unsigned char stub_mips_r3000_linux_elf_fold[2892] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -66,7 +66,7 @@ unsigned char stub_mips_r3000_linux_elf_fold[2892] = {
/* 0x01b0 */ 175,169, 0, 20, 36, 7, 0, 2, 36, 6, 0, 1, 0, 28, 40, 34,
/* 0x01c0 */ 0, 0, 32, 33, 36, 2, 15,250, 0, 0, 0, 12,143,164, 0, 16,
/* 0x01d0 */ 36, 2, 15,166, 0, 0, 0, 12,143,165, 0, 28,143,164, 0, 24,
/* 0x01e0 */ 39,189, 0, 32, 3,160, 8, 33, 39,189,254, 0, 39,189, 0, 4,
/* 0x01e0 */ 39,189, 0, 32, 3,160, 8, 33, 39,189,252,128, 39,189, 0, 4,
/* 0x01f0 */ 23,161,255,254,175,160,255,252,142,129,255,252, 0, 0, 0, 0,
/* 0x0200 */ 16, 32, 0, 3, 0, 0, 0, 0, 0, 32, 0, 8, 36, 2, 15,251,
/* 0x0210 */ 3,192, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

View File

@ -32,8 +32,8 @@
#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_SIZE 2892
#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_ADLER32 0xe89d7f2e
#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_CRC32 0x7f43d7f9
#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_ADLER32 0x88227fac
#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_CRC32 0x708b39a1
unsigned char stub_mipsel_r3000_linux_elf_fold[2892] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -66,7 +66,7 @@ unsigned char stub_mipsel_r3000_linux_elf_fold[2892] = {
/* 0x01b0 */ 20, 0,169,175, 2, 0, 7, 36, 1, 0, 6, 36, 34, 40, 28, 0,
/* 0x01c0 */ 33, 32, 0, 0,250, 15, 2, 36, 12, 0, 0, 0, 16, 0,164,143,
/* 0x01d0 */ 166, 15, 2, 36, 12, 0, 0, 0, 28, 0,165,143, 24, 0,164,143,
/* 0x01e0 */ 32, 0,189, 39, 33, 8,160, 3, 0,254,189, 39, 4, 0,189, 39,
/* 0x01e0 */ 32, 0,189, 39, 33, 8,160, 3,128,252,189, 39, 4, 0,189, 39,
/* 0x01f0 */ 254,255,161, 23,252,255,160,175,252,255,129,142, 0, 0, 0, 0,
/* 0x0200 */ 3, 0, 32, 16, 0, 0, 0, 0, 8, 0, 32, 0,251, 15, 2, 36,
/* 0x0210 */ 8, 0,192, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

View File

@ -220,9 +220,16 @@ p_vaddr= 4+4
/* Workaround suspected glibc bug: elf/rtld.c assumes uninit local is zero.
2007-11-24 openembedded.org mipsel-linux 2.6.12.6/glibc 2.3.2
Also early uClibc/ldso/ldso/ldso.c function _dl_get_ready_to_run() forgot
_dl_memset(app_tpnt, 0, sizeof(*app_tpnt));
leaving garbage in
if (app_tpnt->dynamic_info[DT_TEXTREL]) {
leading to SIGSEGV. Fixed in [git blame:]
27d501fdbf (Denis Vlasenko 2009-01-10 21:02:48 +0000
*/
move tmp,sp
addiu sp, -512 # estimated stack bound of upx_main and below
addiu sp, -0x380 # estimated stack bound of upx_main and below
0:
addiu sp,NBPW
bne sp,tmp,0b