ARM shlib escape hatch moves to just beyond .text.

https://sourceforge.net/p/upx/bugs/223/
This commit is contained in:
John Reiser 2013-11-22 19:26:19 -08:00
parent 1c459a7bea
commit cd3132667a
4 changed files with 703 additions and 693 deletions

View File

@ -3042,14 +3042,18 @@ void PackLinuxElf64::unpack(OutputFile *fo)
}
}
}
bool const is_shlib = 0; // XXX ??
bool const is_shlib = 0; // XXX: THIS IS BROKEN; see 32-bit ::unpack
if (is_shlib
|| ((unsigned)(get_te64(&ehdri.e_entry) - load_va) + up4(lsize) +
ph.getPackHeaderSize() + sizeof(overlay_offset))
< up4(fi->st_size())) {
// Loader is not at end; skip past it.
funpad4(fi); // MATCH01
fi->seek(lsize, SEEK_CUR);
unsigned d_info[4]; fi->readx(d_info, sizeof(d_info));
//if (0==old_dtinit) {
// old_dtinit = d_info[2 + (0==d_info[0])];
//}
fi->seek(lsize - sizeof(d_info), SEEK_CUR);
}
// The gaps between PT_LOAD and after last PT_LOAD
@ -3606,7 +3610,11 @@ void PackLinuxElf32::unpack(OutputFile *fo)
< up4(fi->st_size())) {
// Loader is not at end; skip past it.
funpad4(fi); // MATCH01
fi->seek(lsize, SEEK_CUR);
unsigned d_info[4]; fi->readx(d_info, sizeof(d_info));
if (0==old_dtinit) {
old_dtinit = d_info[2 + (0==d_info[0])];
}
fi->seek(lsize - sizeof(d_info), SEEK_CUR);
}
// The gaps between PT_LOAD and after last PT_LOAD

View File

@ -331,7 +331,9 @@ _=-5+_ // 22
pop_ tmp // toss arg5
// Place the escape hatch
ldr edi,[SP(o_hatch)]
pop {arg1,arg2} // addr, len
push {arg1,arg2}
add edi,arg1,arg2 // ldr edi,[SP(o_hatch)]
ldr tmp,hatch // the 2 instructions
str tmp,[edi]
add edi,#1 // thumb mode

File diff suppressed because it is too large Load Diff

View File

@ -13,7 +13,7 @@ Idx Name Size VMA LMA File off Algn Flags
8 LZMA_DEC10 00000478 00000000 00000000 00000e0c 2**0 CONTENTS, RELOC, READONLY
9 LZMA_DEC30 00000000 00000000 00000000 00001284 2**0 CONTENTS, READONLY
10 ELFMAINY 0000003e 00000000 00000000 00001284 2**0 CONTENTS, READONLY
11 ELFMAINZ 00000178 00000000 00000000 000012c4 2**2 CONTENTS, RELOC, READONLY
11 ELFMAINZ 0000017c 00000000 00000000 000012c4 2**2 CONTENTS, RELOC, READONLY
SYMBOL TABLE:
00000000 l ELFMAINX 00000000 .real_start_ofELFMAINX
00000000 l d NRV2E 00000000 NRV2E
@ -255,12 +255,12 @@ OFFSET TYPE VALUE
00000028 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000030 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000050 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000072 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000090 R_ARM_THM_CALL .real_start_ofELFMAINZ
000000c0 R_ARM_PC24 ELFMAINZ
000000de R_ARM_THM_CALL .real_start_ofELFMAINZ
00000104 R_ARM_THM_CALL .real_start_ofELFMAINZ
0000011c R_ARM_THM_CALL .real_start_ofELFMAINZ
00000126 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000130 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000138 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000076 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000094 R_ARM_THM_CALL .real_start_ofELFMAINZ
000000c4 R_ARM_PC24 ELFMAINZ
000000e2 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000108 R_ARM_THM_CALL .real_start_ofELFMAINZ
00000120 R_ARM_THM_CALL .real_start_ofELFMAINZ
0000012a R_ARM_THM_CALL .real_start_ofELFMAINZ
00000134 R_ARM_THM_CALL .real_start_ofELFMAINZ
0000013c R_ARM_THM_CALL .real_start_ofELFMAINZ