i386: new stub strategy to avoid problems with early mmap layout

The stub occupies the same region that execve() would create
for the original progam.  The stub copies everything to a new area,
erases the original region, replaces it with the de-compressed
program, and erases the copy of itself via the escape hatch.
The copy is inexpensive via mmap() of /proc/self/exe.

	modified:   stub/src/i386-linux.elf-entry.S
	modified:   stub/src/i386-linux.elf-fold.S
	modified:   stub/src/i386-linux.elf-main.c

	modified:   p_lx_elf.cpp
	modified:   p_lx_elf.h
	modified:   p_lx_interp.cpp
	modified:   p_lx_interp.h
	modified:   p_lx_sh.cpp
	modified:   p_lx_sh.h
	modified:   p_mach.cpp
	modified:   p_mach.h
	modified:   p_unix.cpp
	modified:   p_unix.h
	modified:   p_vmlinx.cpp

	plus .h, .map, .dump
This commit is contained in:
John Reiser
2017-10-01 15:56:34 -07:00
parent 26be845563
commit 9e8de4abe5
30 changed files with 2943 additions and 3118 deletions
+8 -8
View File
@@ -9,7 +9,7 @@ Linker script and memory map
TARGET(elf32-littlearm)
0x0000000000008080 . = ((0x8000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000008080 0x9f8
.text 0x0000000000008080 0x9dc
*(.text)
.text 0x0000000000008080 0x308 tmp/arm.v4a-linux.elf-fold.o
0x00000000000082dc munmap
@@ -29,18 +29,18 @@ TARGET(elf32-littlearm)
0x000000000000832c div10
0x00000000000082e4 mprotect
0x00000000000082b4 close
.text 0x0000000000008388 0x6f0 tmp/arm.v4a-linux.elf-main.o
.text 0x0000000000008388 0x6d4 tmp/arm.v4a-linux.elf-main.o
0x00000000000083a8 get_page_mask
0x0000000000008944 upx_main
0x000000000000891c upx_main
*(.data)
.data 0x0000000000008a78 0x0 tmp/arm.v4a-linux.elf-fold.o
.data 0x0000000000008a78 0x0 tmp/arm.v4a-linux.elf-main.o
.data 0x0000000000008a5c 0x0 tmp/arm.v4a-linux.elf-fold.o
.data 0x0000000000008a5c 0x0 tmp/arm.v4a-linux.elf-main.o
.data
.bss 0x0000000000008a78 0x0
.bss 0x0000000000008a78 0x0 tmp/arm.v4a-linux.elf-fold.o
.bss 0x0000000000008a78 0x0 tmp/arm.v4a-linux.elf-main.o
.bss 0x0000000000008a5c 0x0
.bss 0x0000000000008a5c 0x0 tmp/arm.v4a-linux.elf-fold.o
.bss 0x0000000000008a5c 0x0 tmp/arm.v4a-linux.elf-main.o
LOAD tmp/arm.v4a-linux.elf-fold.o
LOAD tmp/arm.v4a-linux.elf-main.o
OUTPUT(tmp/arm.v4a-linux.elf-fold.bin elf32-littlearm)
+8 -8
View File
@@ -9,7 +9,7 @@ Linker script and memory map
TARGET(elf32-littlearm)
0x0000000000008080 . = ((0x8000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000008080 0xa94
.text 0x0000000000008080 0xa78
*(.text)
.text 0x0000000000008080 0x3a8 tmp/arm.v5a-linux.elf-fold.o
0x0000000000008348 munmap
@@ -29,18 +29,18 @@ TARGET(elf32-littlearm)
0x00000000000083cc div10
0x000000000000835c mprotect
0x00000000000082e4 close
.text 0x0000000000008428 0x6ec tmp/armel-linux.elf-main.o
.text 0x0000000000008428 0x6d0 tmp/armel-linux.elf-main.o
0x0000000000008448 get_page_mask
0x00000000000089e0 upx_main
0x00000000000089b8 upx_main
*(.data)
.data 0x0000000000008b14 0x0 tmp/arm.v5a-linux.elf-fold.o
.data 0x0000000000008b14 0x0 tmp/armel-linux.elf-main.o
.data 0x0000000000008af8 0x0 tmp/arm.v5a-linux.elf-fold.o
.data 0x0000000000008af8 0x0 tmp/armel-linux.elf-main.o
.data
.bss 0x0000000000008b14 0x0
.bss 0x0000000000008b14 0x0 tmp/arm.v5a-linux.elf-fold.o
.bss 0x0000000000008b14 0x0 tmp/armel-linux.elf-main.o
.bss 0x0000000000008af8 0x0
.bss 0x0000000000008af8 0x0 tmp/arm.v5a-linux.elf-fold.o
.bss 0x0000000000008af8 0x0 tmp/armel-linux.elf-main.o
LOAD tmp/arm.v5a-linux.elf-fold.o
LOAD tmp/armel-linux.elf-main.o
OUTPUT(tmp/arm.v5a-linux.elf-fold.bin elf32-littlearm)
+8 -8
View File
@@ -9,7 +9,7 @@ Linker script and memory map
TARGET(elf32-bigarm)
0x0000000000008080 . = ((0x8000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000008080 0x9f8
.text 0x0000000000008080 0x9dc
*(.text)
.text 0x0000000000008080 0x308 tmp/armeb.v4a-linux.elf-fold.o
0x00000000000082dc munmap
@@ -29,18 +29,18 @@ TARGET(elf32-bigarm)
0x000000000000832c div10
0x00000000000082e4 mprotect
0x00000000000082b4 close
.text 0x0000000000008388 0x6f0 tmp/armeb.v4a-linux.elf-main.o
.text 0x0000000000008388 0x6d4 tmp/armeb.v4a-linux.elf-main.o
0x00000000000083a8 get_page_mask
0x0000000000008944 upx_main
0x000000000000891c upx_main
*(.data)
.data 0x0000000000008a78 0x0 tmp/armeb.v4a-linux.elf-fold.o
.data 0x0000000000008a78 0x0 tmp/armeb.v4a-linux.elf-main.o
.data 0x0000000000008a5c 0x0 tmp/armeb.v4a-linux.elf-fold.o
.data 0x0000000000008a5c 0x0 tmp/armeb.v4a-linux.elf-main.o
.data
.bss 0x0000000000008a78 0x0
.bss 0x0000000000008a78 0x0 tmp/armeb.v4a-linux.elf-fold.o
.bss 0x0000000000008a78 0x0 tmp/armeb.v4a-linux.elf-main.o
.bss 0x0000000000008a5c 0x0
.bss 0x0000000000008a5c 0x0 tmp/armeb.v4a-linux.elf-fold.o
.bss 0x0000000000008a5c 0x0 tmp/armeb.v4a-linux.elf-main.o
LOAD tmp/armeb.v4a-linux.elf-fold.o
LOAD tmp/armeb.v4a-linux.elf-main.o
OUTPUT(tmp/armeb.v4a-linux.elf-fold.bin elf32-bigarm)
+4 -21
View File
@@ -169,10 +169,7 @@ Idx Name Size VMA LMA File off Algn Flags
164 ctok32.30 0000000a 00000000 00000000 00001aa8 2**0 CONTENTS, RELOC, READONLY
165 ctok32.40 00000005 00000000 00000000 00001ab2 2**0 CONTENTS, RELOC, READONLY
166 LEXEC017 00000002 00000000 00000000 00001ab7 2**0 CONTENTS, READONLY
167 LEXEC020 00000031 00000000 00000000 00001ab9 2**0 CONTENTS, READONLY
168 LEXECEXE 00000040 00000000 00000000 00001aea 2**0 CONTENTS, RELOC, READONLY
169 LEXECDYN 000000a6 00000000 00000000 00001b2a 2**0 CONTENTS, RELOC, READONLY
170 LEXEC025 00000041 00000000 00000000 00001bd0 2**0 CONTENTS, RELOC, READONLY
167 LEXEC020 000000d4 00000000 00000000 00001ab9 2**0 CONTENTS, RELOC, READONLY
SYMBOL TABLE:
00000000 l d N2BSMA10 00000000 N2BSMA10
00000000 l d N2BFAS11 00000000 N2BFAS11
@@ -218,7 +215,6 @@ SYMBOL TABLE:
00000000 l d ctok32.20 00000000 ctok32.20
00000000 l d ctok32.40 00000000 ctok32.40
00000000 l d LEXEC020 00000000 LEXEC020
00000000 l d LEXEC025 00000000 LEXEC025
00000000 l d LEXEC000 00000000 LEXEC000
00000000 l d LEXEC009 00000000 LEXEC009
00000000 l d LEXEC010 00000000 LEXEC010
@@ -343,8 +339,6 @@ SYMBOL TABLE:
00000000 l d LXUNF035 00000000 LXUNF035
00000000 l d ctok32.30 00000000 ctok32.30
00000000 l d LEXEC017 00000000 LEXEC017
00000000 l d LEXECEXE 00000000 LEXECEXE
00000000 l d LEXECDYN 00000000 LEXECDYN
00000000 g LEXEC000 00000000 _start
00000000 *UND* 00000000 lzma_stack_adjust
00000000 *UND* 00000000 lzma_u_len
@@ -357,7 +351,7 @@ SYMBOL TABLE:
RELOCATION RECORDS FOR [LEXEC000]:
OFFSET TYPE VALUE
00000002 R_386_PC32 LEXEC025
00000002 R_386_PC32 LEXEC020
RELOCATION RECORDS FOR [N2BSMA10]:
OFFSET TYPE VALUE
@@ -661,17 +655,6 @@ RELOCATION RECORDS FOR [ctok32.40]:
OFFSET TYPE VALUE
00000004 R_386_PC8 ctok32.00
RELOCATION RECORDS FOR [LEXECEXE]:
RELOCATION RECORDS FOR [LEXEC020]:
OFFSET TYPE VALUE
0000002d R_386_PC32 LEXEC020
RELOCATION RECORDS FOR [LEXECDYN]:
OFFSET TYPE VALUE
00000004 R_386_32 LEXEC025
000000a0 R_386_32 LEXEC025
00000070 R_386_PC32 LEXEC020
RELOCATION RECORDS FOR [LEXEC025]:
OFFSET TYPE VALUE
00000039 R_386_PC32 LEXEC020
0000003d R_386_32 O_BINFO
000000d0 R_386_32 O_BINFO
+13 -13
View File
@@ -9,25 +9,25 @@ Linker script and memory map
TARGET(elf32-i386)
0x0000000000c01080 . = ((0xc01000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000c01080 0x6bc
.text 0x0000000000c01080 0x68c
*(.text)
.text 0x0000000000c01080 0x154 tmp/i386-linux.elf-fold.o
0x0000000000c011a5 mmap
.text 0x0000000000c011d4 0x565 tmp/i386-linux.elf-main.o
0x0000000000c012fc get_page_mask
0x0000000000c01634 upx_main
.text 0x0000000000c01080 0x14c tmp/i386-linux.elf-fold.o
0x0000000000c011a0 mmap
.text 0x0000000000c011cc 0x53e tmp/i386-linux.elf-main.o
0x0000000000c012f4 get_page_mask
0x0000000000c015fb upx_main
*(.data)
*fill* 0x0000000000c01739 0x3 00
.data 0x0000000000c0173c 0x0 tmp/i386-linux.elf-fold.o
.data 0x0000000000c0173c 0x0 tmp/i386-linux.elf-main.o
*fill* 0x0000000000c0170a 0x2 00
.data 0x0000000000c0170c 0x0 tmp/i386-linux.elf-fold.o
.data 0x0000000000c0170c 0x0 tmp/i386-linux.elf-main.o
.data
.bss 0x0000000000c0173c 0x0
.bss 0x0000000000c0173c 0x0 tmp/i386-linux.elf-fold.o
.bss 0x0000000000c0173c 0x0 tmp/i386-linux.elf-main.o
.bss 0x0000000000c0170c 0x0
.bss 0x0000000000c0170c 0x0 tmp/i386-linux.elf-fold.o
.bss 0x0000000000c0170c 0x0 tmp/i386-linux.elf-main.o
.rel.dyn 0x0000000000c0173c 0x0
.rel.dyn 0x0000000000c0170c 0x0
.rel.text 0x0000000000000000 0x0 tmp/i386-linux.elf-fold.o
LOAD tmp/i386-linux.elf-fold.o
LOAD tmp/i386-linux.elf-main.o
+8 -9
View File
@@ -9,21 +9,20 @@ Linker script and memory map
TARGET(elf32-bigmips)
0x0000000000100080 . = ((0x100000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000100080 0x980
.text 0x0000000000100080 0x940
*(.text)
.text 0x0000000000100080 0x130 tmp/mips.r3000-linux.elf-fold.o
.text 0x00000000001001b0 0x850 tmp/mips.r3000-linux.elf-main.o
0x0000000000100424 get_page_mask
0x0000000000100870 upx_main
.text 0x00000000001001b0 0x810 tmp/mips.r3000-linux.elf-main.o
0x0000000000100830 upx_main
*(.data)
.data 0x0000000000100a00 0x0 tmp/mips.r3000-linux.elf-fold.o
.data 0x0000000000100a00 0x0 tmp/mips.r3000-linux.elf-main.o
.data 0x00000000001009c0 0x0 tmp/mips.r3000-linux.elf-fold.o
.data 0x00000000001009c0 0x0 tmp/mips.r3000-linux.elf-main.o
.data
.bss 0x0000000000100a00 0x0
.bss 0x0000000000100a00 0x0 tmp/mips.r3000-linux.elf-fold.o
.bss 0x0000000000100a00 0x0 tmp/mips.r3000-linux.elf-main.o
.bss 0x00000000001009c0 0x0
.bss 0x00000000001009c0 0x0 tmp/mips.r3000-linux.elf-fold.o
.bss 0x00000000001009c0 0x0 tmp/mips.r3000-linux.elf-main.o
LOAD tmp/mips.r3000-linux.elf-fold.o
LOAD tmp/mips.r3000-linux.elf-main.o
OUTPUT(tmp/mips.r3000-linux.elf-fold.bin elf32-bigmips)
+8 -9
View File
@@ -9,21 +9,20 @@ Linker script and memory map
TARGET(elf32-littlemips)
0x0000000000100080 . = ((0x100000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000100080 0x980
.text 0x0000000000100080 0x940
*(.text)
.text 0x0000000000100080 0x130 tmp/mipsel.r3000-linux.elf-fold.o
.text 0x00000000001001b0 0x850 tmp/mipsel.r3000-linux.elf-main.o
0x0000000000100424 get_page_mask
0x0000000000100870 upx_main
.text 0x00000000001001b0 0x810 tmp/mipsel.r3000-linux.elf-main.o
0x0000000000100830 upx_main
*(.data)
.data 0x0000000000100a00 0x0 tmp/mipsel.r3000-linux.elf-fold.o
.data 0x0000000000100a00 0x0 tmp/mipsel.r3000-linux.elf-main.o
.data 0x00000000001009c0 0x0 tmp/mipsel.r3000-linux.elf-fold.o
.data 0x00000000001009c0 0x0 tmp/mipsel.r3000-linux.elf-main.o
.data
.bss 0x0000000000100a00 0x0
.bss 0x0000000000100a00 0x0 tmp/mipsel.r3000-linux.elf-fold.o
.bss 0x0000000000100a00 0x0 tmp/mipsel.r3000-linux.elf-main.o
.bss 0x00000000001009c0 0x0
.bss 0x00000000001009c0 0x0 tmp/mipsel.r3000-linux.elf-fold.o
.bss 0x00000000001009c0 0x0 tmp/mipsel.r3000-linux.elf-main.o
LOAD tmp/mipsel.r3000-linux.elf-fold.o
LOAD tmp/mipsel.r3000-linux.elf-main.o
OUTPUT(tmp/mipsel.r3000-linux.elf-fold.bin elf32-littlemips)
+9 -9
View File
@@ -9,7 +9,7 @@ Linker script and memory map
TARGET(elf32-powerpc)
0x0000000000100080 . = ((0x100000 + SIZEOF_HEADERS) + 0xc)
.text 0x0000000000100080 0x105c
.text 0x0000000000100080 0xfdc
*(.text)
.text 0x0000000000100080 0x264 tmp/powerpc-linux.elf-fold.o
0x0000000000100080 get_page_mask
@@ -24,19 +24,19 @@ TARGET(elf32-powerpc)
0x00000000001002b4 open
0x00000000001002c4 mprotect
0x00000000001002bc close
.text 0x00000000001002e4 0xdf8 tmp/powerpc-linux.elf-main.o
0x0000000000100ecc upx_main
.text 0x00000000001002e4 0xd78 tmp/powerpc-linux.elf-main.o
0x0000000000100e54 upx_main
*(.data)
.data 0x00000000001010dc 0x0 tmp/powerpc-linux.elf-fold.o
.data 0x00000000001010dc 0x0 tmp/powerpc-linux.elf-main.o
.data 0x000000000010105c 0x0 tmp/powerpc-linux.elf-fold.o
.data 0x000000000010105c 0x0 tmp/powerpc-linux.elf-main.o
.data
.bss 0x00000000001010dc 0x0
.bss 0x00000000001010dc 0x0 tmp/powerpc-linux.elf-fold.o
.bss 0x00000000001010dc 0x0 tmp/powerpc-linux.elf-main.o
.bss 0x000000000010105c 0x0
.bss 0x000000000010105c 0x0 tmp/powerpc-linux.elf-fold.o
.bss 0x000000000010105c 0x0 tmp/powerpc-linux.elf-main.o
.rela.dyn 0x00000000001010dc 0x0
.rela.dyn 0x000000000010105c 0x0
.rela.text 0x0000000000000000 0x0 tmp/powerpc-linux.elf-fold.o
LOAD tmp/powerpc-linux.elf-fold.o
LOAD tmp/powerpc-linux.elf-main.o