Preserve Mach_segment_header.flags; fix non-PIE main programs on MacOS.

https://github.com/upx/upx/issues/222
	modified:   p_mach.cpp
	modified:   p_mach.h
	modified:   stub/src/amd64-darwin.macho-entry.S
	also *.macho-*.h, *.macho-fold.map, amd64-darwin.macho-entry.bin.dump
This commit is contained in:
John Reiser
2018-09-22 18:45:44 -07:00
parent c1cfde21d7
commit 4d1c754af9
11 changed files with 737 additions and 700 deletions
@@ -15,7 +15,7 @@ Idx Name Size VMA LMA File off Algn
10 LZMA_DEC30 00000014 0000000000000000 0000000000000000 00001737 2**0 CONTENTS, READONLY
11 NRV_TAIL 00000000 0000000000000000 0000000000000000 0000174b 2**0 CONTENTS, READONLY
12 MACHMAINY 00000011 0000000000000000 0000000000000000 0000174b 2**0 CONTENTS, READONLY
13 MACHMAINZ 00000107 0000000000000000 0000000000000000 0000175c 2**0 CONTENTS, RELOC, READONLY
13 MACHMAINZ 00000135 0000000000000000 0000000000000000 0000175c 2**0 CONTENTS, RELOC, READONLY
SYMBOL TABLE:
0000000000000000 l d NRV_HEAD 0000000000000000 NRV_HEAD
0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30
@@ -36,7 +36,7 @@ SYMBOL TABLE:
RELOCATION RECORDS FOR [MACHMAINX]:
OFFSET TYPE VALUE
0000000000000001 R_X86_64_PC32 MACHMAINZ+0x000000000000009a
0000000000000001 R_X86_64_PC32 MACHMAINZ+0x00000000000000c8
RELOCATION RECORDS FOR [NRV2E]:
OFFSET TYPE VALUE
@@ -59,4 +59,4 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [MACHMAINZ]:
OFFSET TYPE VALUE
00000000000000e7 R_X86_64_PC32 _start+0xfffffffffffffff4
0000000000000115 R_X86_64_PC32 _start+0xfffffffffffffff4
+35 -36
View File
@@ -72,9 +72,9 @@ LOAD tmp/amd64-darwin.macho-main.o
.plt
*(.plt)
.text 0x0000000008048000 0x7a7
.text 0x0000000008048000 0x863
*(.text .stub .text.* .gnu.linkonce.t.*)
.text 0x0000000008048000 0x157 tmp/amd64-darwin.macho-fold.o
.text 0x0000000008048000 0x1d0 tmp/amd64-darwin.macho-fold.o
0x00000000080480b8 munmap
0x000000000804809c bswap
0x00000000080480c8 mmap
@@ -86,18 +86,17 @@ LOAD tmp/amd64-darwin.macho-main.o
0x00000000080480c4 open
0x00000000080480b4 mprotect
0x00000000080480c0 close
*fill* 0x0000000008048157 0x1 90909090
.text 0x0000000008048158 0x64f tmp/amd64-darwin.macho-main.o
0x00000000080482d4 do_xmap
0x0000000008048612 upx_main
.text 0x00000000080481d0 0x693 tmp/amd64-darwin.macho-main.o
0x000000000804834c do_xmap
0x00000000080486ce upx_main
*(.text.*personality*)
*(.gnu.warning)
.fini
*(.fini)
0x00000000080487a7 PROVIDE (__etext, .)
0x00000000080487a7 PROVIDE (_etext, .)
0x00000000080487a7 PROVIDE (etext, .)
0x0000000008048863 PROVIDE (__etext, .)
0x0000000008048863 PROVIDE (_etext, .)
0x0000000008048863 PROVIDE (etext, .)
.rodata
*(.rodata .rodata.* .gnu.linkonce.r.*)
@@ -113,8 +112,8 @@ LOAD tmp/amd64-darwin.macho-main.o
.gcc_except_table
*(.gcc_except_table .gcc_except_table.*)
0x00000000080487a7 . = (ALIGN (0x1000) - ((0x1000 - .) & 0xfff))
0x00000000080497a7 . = (0x1000 DATA_SEGMENT_ALIGN 0x1000)
0x0000000008048863 . = (ALIGN (0x1000) - ((0x1000 - .) & 0xfff))
0x0000000008049863 . = (0x1000 DATA_SEGMENT_ALIGN 0x1000)
.eh_frame
*(.eh_frame)
@@ -129,22 +128,22 @@ LOAD tmp/amd64-darwin.macho-main.o
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)
.preinit_array 0x00000000080497a7 0x0
0x00000000080497a7 PROVIDE (__preinit_array_start, .)
.preinit_array 0x0000000008049863 0x0
0x0000000008049863 PROVIDE (__preinit_array_start, .)
*(.preinit_array)
0x00000000080497a7 PROVIDE (__preinit_array_end, .)
0x0000000008049863 PROVIDE (__preinit_array_end, .)
.init_array 0x00000000080497a7 0x0
0x00000000080497a7 PROVIDE (__init_array_start, .)
.init_array 0x0000000008049863 0x0
0x0000000008049863 PROVIDE (__init_array_start, .)
*(SORT(.init_array.*))
*(.init_array)
0x00000000080497a7 PROVIDE (__init_array_end, .)
0x0000000008049863 PROVIDE (__init_array_end, .)
.fini_array 0x00000000080497a7 0x0
0x00000000080497a7 PROVIDE (__fini_array_start, .)
.fini_array 0x0000000008049863 0x0
0x0000000008049863 PROVIDE (__fini_array_start, .)
*(.fini_array)
*(SORT(.fini_array.*))
0x00000000080497a7 PROVIDE (__fini_array_end, .)
0x0000000008049863 PROVIDE (__fini_array_end, .)
.ctors
*crtbegin*.o(.ctors)
@@ -170,35 +169,35 @@ LOAD tmp/amd64-darwin.macho-main.o
.got
*(.got)
0x00000000080497a7 . = (. DATA_SEGMENT_RELRO_END 0xc)
0x0000000008049863 . = (. DATA_SEGMENT_RELRO_END 0xc)
.got.plt
*(.got.plt)
.data 0x00000000080497a8 0x0
.data 0x0000000008049864 0x0
*(.data .data.* .gnu.linkonce.d.*)
.data 0x00000000080497a8 0x0 tmp/amd64-darwin.macho-fold.o
.data 0x00000000080497a8 0x0 tmp/amd64-darwin.macho-main.o
.data 0x0000000008049864 0x0 tmp/amd64-darwin.macho-fold.o
.data 0x0000000008049864 0x0 tmp/amd64-darwin.macho-main.o
*(.gnu.linkonce.d.*personality*)
.data1
*(.data1)
0x00000000080497a8 _edata = .
0x00000000080497a8 PROVIDE (edata, .)
0x00000000080497a8 __bss_start = .
0x0000000008049864 _edata = .
0x0000000008049864 PROVIDE (edata, .)
0x0000000008049864 __bss_start = .
.bss 0x00000000080497a8 0x0
.bss 0x0000000008049864 0x0
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x00000000080497a8 0x0 tmp/amd64-darwin.macho-fold.o
.bss 0x00000000080497a8 0x0 tmp/amd64-darwin.macho-main.o
.bss 0x0000000008049864 0x0 tmp/amd64-darwin.macho-fold.o
.bss 0x0000000008049864 0x0 tmp/amd64-darwin.macho-main.o
*(COMMON)
0x00000000080497a8 . = ALIGN ((. != 0x0)?0x4:0x1)
0x00000000080497a8 . = ALIGN (0x4)
0x00000000080497a8 . = ALIGN (0x4)
0x00000000080497a8 _end = .
0x00000000080497a8 PROVIDE (end, .)
0x00000000080497a8 . = DATA_SEGMENT_END (.)
0x0000000008049864 . = ALIGN ((. != 0x0)?0x4:0x1)
0x0000000008049864 . = ALIGN (0x4)
0x0000000008049864 . = ALIGN (0x4)
0x0000000008049864 _end = .
0x0000000008049864 PROVIDE (end, .)
0x0000000008049864 . = DATA_SEGMENT_END (.)
.stab
*(.stab)
+33 -33
View File
@@ -72,7 +72,7 @@ LOAD tmp/arm.v5a-darwin.macho-main.o
.plt
*(.plt)
.text 0x0000000008048000 0x94c
.text 0x0000000008048000 0x978
*(.text .stub .text.* .gnu.linkonce.t.*)
.text 0x0000000008048000 0x22c tmp/arm.v5a-darwin.macho-fold.o
0x0000000008048128 munmap
@@ -90,17 +90,17 @@ LOAD tmp/arm.v5a-darwin.macho-main.o
0x00000000080481d0 div10
0x000000000804813c mprotect
0x0000000008048100 close
.text 0x000000000804822c 0x720 tmp/arm.v5a-darwin.macho-main.o
.text 0x000000000804822c 0x74c tmp/arm.v5a-darwin.macho-main.o
0x00000000080483e4 do_xmap
0x0000000008048794 upx_main
0x00000000080487c0 upx_main
*(.text.*personality*)
*(.gnu.warning)
.fini
*(.fini)
0x000000000804894c PROVIDE (__etext, .)
0x000000000804894c PROVIDE (_etext, .)
0x000000000804894c PROVIDE (etext, .)
0x0000000008048978 PROVIDE (__etext, .)
0x0000000008048978 PROVIDE (_etext, .)
0x0000000008048978 PROVIDE (etext, .)
.rodata
*(.rodata .rodata.* .gnu.linkonce.r.*)
@@ -116,8 +116,8 @@ LOAD tmp/arm.v5a-darwin.macho-main.o
.gcc_except_table
*(.gcc_except_table .gcc_except_table.*)
0x000000000804894c . = (ALIGN (0x1000) - ((0x1000 - .) & 0xfff))
0x000000000804994c . = (0x1000 DATA_SEGMENT_ALIGN 0x1000)
0x0000000008048978 . = (ALIGN (0x1000) - ((0x1000 - .) & 0xfff))
0x0000000008049978 . = (0x1000 DATA_SEGMENT_ALIGN 0x1000)
.eh_frame
*(.eh_frame)
@@ -132,22 +132,22 @@ LOAD tmp/arm.v5a-darwin.macho-main.o
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)
.preinit_array 0x000000000804994c 0x0
0x000000000804994c PROVIDE (__preinit_array_start, .)
.preinit_array 0x0000000008049978 0x0
0x0000000008049978 PROVIDE (__preinit_array_start, .)
*(.preinit_array)
0x000000000804994c PROVIDE (__preinit_array_end, .)
0x0000000008049978 PROVIDE (__preinit_array_end, .)
.init_array 0x000000000804994c 0x0
0x000000000804994c PROVIDE (__init_array_start, .)
.init_array 0x0000000008049978 0x0
0x0000000008049978 PROVIDE (__init_array_start, .)
*(SORT(.init_array.*))
*(.init_array)
0x000000000804994c PROVIDE (__init_array_end, .)
0x0000000008049978 PROVIDE (__init_array_end, .)
.fini_array 0x000000000804994c 0x0
0x000000000804994c PROVIDE (__fini_array_start, .)
.fini_array 0x0000000008049978 0x0
0x0000000008049978 PROVIDE (__fini_array_start, .)
*(.fini_array)
*(SORT(.fini_array.*))
0x000000000804994c PROVIDE (__fini_array_end, .)
0x0000000008049978 PROVIDE (__fini_array_end, .)
.ctors
*crtbegin*.o(.ctors)
@@ -173,35 +173,35 @@ LOAD tmp/arm.v5a-darwin.macho-main.o
.got
*(.got)
0x000000000804994c . = (. DATA_SEGMENT_RELRO_END 0xc)
0x0000000008049978 . = (. DATA_SEGMENT_RELRO_END 0xc)
.got.plt
*(.got.plt)
.data 0x000000000804994c 0x0
.data 0x0000000008049978 0x0
*(.data .data.* .gnu.linkonce.d.*)
.data 0x000000000804994c 0x0 tmp/arm.v5a-darwin.macho-fold.o
.data 0x000000000804994c 0x0 tmp/arm.v5a-darwin.macho-main.o
.data 0x0000000008049978 0x0 tmp/arm.v5a-darwin.macho-fold.o
.data 0x0000000008049978 0x0 tmp/arm.v5a-darwin.macho-main.o
*(.gnu.linkonce.d.*personality*)
.data1
*(.data1)
0x000000000804994c _edata = .
0x000000000804994c PROVIDE (edata, .)
0x000000000804994c __bss_start = .
0x0000000008049978 _edata = .
0x0000000008049978 PROVIDE (edata, .)
0x0000000008049978 __bss_start = .
.bss 0x000000000804994c 0x0
.bss 0x0000000008049978 0x0
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x000000000804994c 0x0 tmp/arm.v5a-darwin.macho-fold.o
.bss 0x000000000804994c 0x0 tmp/arm.v5a-darwin.macho-main.o
.bss 0x0000000008049978 0x0 tmp/arm.v5a-darwin.macho-fold.o
.bss 0x0000000008049978 0x0 tmp/arm.v5a-darwin.macho-main.o
*(COMMON)
0x000000000804994c . = ALIGN ((. != 0x0)?0x4:0x1)
0x000000000804994c . = ALIGN (0x4)
0x000000000804994c . = ALIGN (0x4)
0x000000000804994c _end = .
0x000000000804994c PROVIDE (end, .)
0x000000000804994c . = DATA_SEGMENT_END (.)
0x0000000008049978 . = ALIGN ((. != 0x0)?0x4:0x1)
0x0000000008049978 . = ALIGN (0x4)
0x0000000008049978 . = ALIGN (0x4)
0x0000000008049978 _end = .
0x0000000008049978 PROVIDE (end, .)
0x0000000008049978 . = DATA_SEGMENT_END (.)
.stab
*(.stab)
+44 -44
View File
@@ -67,7 +67,7 @@ LOAD tmp/arm64-darwin.macho-main.o
*(.iplt)
.iplt 0x0000000000400080 0x0 tmp/arm64-darwin.macho-fold.o
.text 0x0000000000400078 0x860
.text 0x0000000000400078 0x89c
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
@@ -87,16 +87,16 @@ LOAD tmp/arm64-darwin.macho-main.o
0x000000000040018c mmap
0x0000000000400198 pread
0x00000000004001a4 bswap
.text 0x00000000004001d0 0x708 tmp/arm64-darwin.macho-main.o
.text 0x00000000004001d0 0x744 tmp/arm64-darwin.macho-main.o
0x000000000040037c do_xmap
0x00000000004006fc upx_main
0x0000000000400738 upx_main
*(.gnu.warning)
.fini
*(SORT(.fini))
0x00000000004008d8 PROVIDE (__etext, .)
0x00000000004008d8 PROVIDE (_etext, .)
0x00000000004008d8 PROVIDE (etext, .)
0x0000000000400914 PROVIDE (__etext, .)
0x0000000000400914 PROVIDE (_etext, .)
0x0000000000400914 PROVIDE (etext, .)
.rodata
*(.rodata .rodata.* .gnu.linkonce.r.*)
@@ -107,9 +107,9 @@ LOAD tmp/arm64-darwin.macho-main.o
.eh_frame_hdr
*(.eh_frame_hdr)
.eh_frame 0x00000000004008d8 0x108
.eh_frame 0x0000000000400918 0x108
*(.eh_frame)
.eh_frame 0x00000000004008d8 0x108 tmp/arm64-darwin.macho-main.o
.eh_frame 0x0000000000400918 0x108 tmp/arm64-darwin.macho-main.o
0x100 (size before relaxing)
.gcc_except_table
@@ -117,8 +117,8 @@ LOAD tmp/arm64-darwin.macho-main.o
.exception_ranges
*(.exception_ranges .exception_ranges*)
0x00000000004009e0 . = (ALIGN (0x10000) - ((0x10000 - .) & 0xffff))
0x00000000004109e0 . = DATA_SEGMENT_ALIGN (0x10000, 0x1000)
0x0000000000400a20 . = (ALIGN (0x10000) - ((0x10000 - .) & 0xffff))
0x0000000000410a20 . = DATA_SEGMENT_ALIGN (0x10000, 0x1000)
.eh_frame
*(.eh_frame)
@@ -136,22 +136,22 @@ LOAD tmp/arm64-darwin.macho-main.o
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)
.preinit_array 0x00000000004109e0 0x0
0x00000000004109e0 PROVIDE (__preinit_array_start, .)
.preinit_array 0x0000000000410a20 0x0
0x0000000000410a20 PROVIDE (__preinit_array_start, .)
*(.preinit_array)
0x00000000004109e0 PROVIDE (__preinit_array_end, .)
0x0000000000410a20 PROVIDE (__preinit_array_end, .)
.init_array 0x00000000004109e0 0x0
0x00000000004109e0 PROVIDE (__init_array_start, .)
.init_array 0x0000000000410a20 0x0
0x0000000000410a20 PROVIDE (__init_array_start, .)
*(SORT(.init_array.*))
*(.init_array)
0x00000000004109e0 PROVIDE (__init_array_end, .)
0x0000000000410a20 PROVIDE (__init_array_end, .)
.fini_array 0x00000000004109e0 0x0
0x00000000004109e0 PROVIDE (__fini_array_start, .)
.fini_array 0x0000000000410a20 0x0
0x0000000000410a20 PROVIDE (__fini_array_start, .)
*(SORT(.fini_array.*))
*(.fini_array)
0x00000000004109e0 PROVIDE (__fini_array_end, .)
0x0000000000410a20 PROVIDE (__fini_array_end, .)
.ctors
*crtbegin.o(.ctors)
@@ -180,43 +180,43 @@ LOAD tmp/arm64-darwin.macho-main.o
.got
*(.got)
*(.igot)
0x00000000004109e0 . = DATA_SEGMENT_RELRO_END (., 0x18)
0x0000000000410a20 . = DATA_SEGMENT_RELRO_END (., 0x18)
.got.plt 0x00000000004109e0 0x0
.got.plt 0x0000000000410a20 0x0
*(.got.plt)
*(.igot.plt)
.igot.plt 0x00000000004109e0 0x0 tmp/arm64-darwin.macho-fold.o
.igot.plt 0x0000000000410a20 0x0 tmp/arm64-darwin.macho-fold.o
.data 0x00000000004109e0 0x0
0x00000000004109e0 PROVIDE (__data_start, .)
.data 0x0000000000410a20 0x0
0x0000000000410a20 PROVIDE (__data_start, .)
*(.data .data.* .gnu.linkonce.d.*)
.data 0x00000000004109e0 0x0 tmp/arm64-darwin.macho-fold.o
.data 0x00000000004109e0 0x0 tmp/arm64-darwin.macho-main.o
.data 0x0000000000410a20 0x0 tmp/arm64-darwin.macho-fold.o
.data 0x0000000000410a20 0x0 tmp/arm64-darwin.macho-main.o
.data1
*(.data1)
0x00000000004109e0 _edata = .
0x00000000004109e0 PROVIDE (edata, .)
0x00000000004109e0 . = .
0x00000000004109e0 __bss_start = .
0x00000000004109e0 __bss_start__ = .
0x0000000000410a20 _edata = .
0x0000000000410a20 PROVIDE (edata, .)
0x0000000000410a20 . = .
0x0000000000410a20 __bss_start = .
0x0000000000410a20 __bss_start__ = .
.bss 0x00000000004109e0 0x0
.bss 0x0000000000410a20 0x0
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x00000000004109e0 0x0 tmp/arm64-darwin.macho-fold.o
.bss 0x00000000004109e0 0x0 tmp/arm64-darwin.macho-main.o
.bss 0x0000000000410a20 0x0 tmp/arm64-darwin.macho-fold.o
.bss 0x0000000000410a20 0x0 tmp/arm64-darwin.macho-main.o
*(COMMON)
0x00000000004109e0 . = ALIGN ((. != 0x0)?0x8:0x1)
0x00000000004109e0 _bss_end__ = .
0x00000000004109e0 __bss_end__ = .
0x00000000004109e0 . = ALIGN (0x8)
0x00000000004109e0 . = SEGMENT_START ("ldata-segment", .)
0x00000000004109e0 . = ALIGN (0x8)
0x00000000004109e0 __end__ = .
0x00000000004109e0 _end = .
0x00000000004109e0 PROVIDE (end, .)
0x00000000004109e0 . = DATA_SEGMENT_END (.)
0x0000000000410a20 . = ALIGN ((. != 0x0)?0x8:0x1)
0x0000000000410a20 _bss_end__ = .
0x0000000000410a20 __bss_end__ = .
0x0000000000410a20 . = ALIGN (0x8)
0x0000000000410a20 . = SEGMENT_START ("ldata-segment", .)
0x0000000000410a20 . = ALIGN (0x8)
0x0000000000410a20 __end__ = .
0x0000000000410a20 _end = .
0x0000000000410a20 PROVIDE (end, .)
0x0000000000410a20 . = DATA_SEGMENT_END (.)
.stab
*(.stab)