stash work-in-progress

modified:   stub/src/amd64-darwin.macho-entry.S
	modified:   stub/src/arm.v5a-darwin.macho-entry.S
	modified:   stub/src/arm64-darwin.macho-entry.S
This commit is contained in:
John Reiser
2017-12-17 15:02:57 -08:00
parent c9b09555c4
commit 576d9a4e7e
7 changed files with 1465 additions and 1204 deletions
File diff suppressed because it is too large Load Diff
+210 -196
View File
@@ -1,5 +1,5 @@
/* arm64-darwin.macho-entry.h /* arm64-darwin.macho-entry.h
created from arm64-darwin.macho-entry.bin, 7768 (0x1e58) bytes created from arm64-darwin.macho-entry.bin, 7997 (0x1f3d) bytes
This file is part of the UPX executable compressor. This file is part of the UPX executable compressor.
@@ -31,14 +31,14 @@
*/ */
#define STUB_ARM64_DARWIN_MACHO_ENTRY_SIZE 7768 #define STUB_ARM64_DARWIN_MACHO_ENTRY_SIZE 7997
#define STUB_ARM64_DARWIN_MACHO_ENTRY_ADLER32 0xdf5a6a8d #define STUB_ARM64_DARWIN_MACHO_ENTRY_ADLER32 0xc3a0cd93
#define STUB_ARM64_DARWIN_MACHO_ENTRY_CRC32 0xc5aa2667 #define STUB_ARM64_DARWIN_MACHO_ENTRY_CRC32 0x23734600
unsigned char stub_arm64_darwin_macho_entry[7768] = { unsigned char stub_arm64_darwin_macho_entry[7997] = {
/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 22, 0, 0, 0, 0, 0, 0, /* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 8, 23, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, /* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
/* 0x0040 */ 255, 35, 0,209,224, 7,177,169,226, 15, 1,169,228, 23, 2,169, /* 0x0040 */ 255, 35, 0,209,224, 7,177,169,226, 15, 1,169,228, 23, 2,169,
/* 0x0050 */ 230, 31, 3,169,232, 39, 4,169,234, 47, 5,169,236, 55, 6,169, /* 0x0050 */ 230, 31, 3,169,232, 39, 4,169,234, 47, 5,169,236, 55, 6,169,
@@ -332,194 +332,208 @@ unsigned char stub_arm64_darwin_macho_entry[7768] = {
/* 0x1250 */ 159, 1, 2,107, 2, 1, 0, 84, 2, 0,129, 82,231, 3, 2, 42, /* 0x1250 */ 159, 1, 2,107, 2, 1, 0, 84, 2, 0,129, 82,231, 3, 2, 42,
/* 0x1260 */ 66, 0, 3, 75, 0, 0, 0, 58, 99, 20, 66, 11, 35, 0, 0,121, /* 0x1260 */ 66, 0, 3, 75, 0, 0, 0, 58, 99, 20, 66, 11, 35, 0, 0,121,
/* 0x1270 */ 32, 2, 95,214,140, 1, 2, 75,231, 0, 2, 75, 99, 20, 67, 75, /* 0x1270 */ 32, 2, 95,214,140, 1, 2, 75,231, 0, 2, 75, 99, 20, 67, 75,
/* 0x1280 */ 0, 0, 0, 58, 35, 0, 0,121, 32, 2, 95,214,195, 15, 64,185, /* 0x1280 */ 0, 0, 0, 58, 35, 0, 0,121, 32, 2, 95,214,232, 3, 30,170,
/* 0x1290 */ 193, 19, 64,185,194, 67, 33,139, 66, 48, 0,145,192, 67, 35,139, /* 0x1290 */ 7, 1, 64,185,226, 3, 8,170, 66, 0, 12,203, 66, 64, 39,139,
/* 0x12a0 */ 0, 0, 3,145,228, 3, 1, 42, 73,204, 95,184,132, 16, 0, 81, /* 0x12a0 */ 226, 11, 0,249,225, 3, 2,170, 5, 0,128, 82, 4, 0,128, 18,
/* 0x12b0 */ 9,204, 31,184,164,255,255, 53,196, 11, 64,185,222, 3, 2,145, /* 0x12b0 */ 67, 4,128, 82, 98, 0,128, 82, 0, 0,128,210,168, 24,128, 82,
/* 0x12c0 */ 227, 15, 31,184,227, 3, 0,145,226, 3, 30,170,171, 32, 1,209, /* 0x12c0 */ 1, 0, 0,212,224, 7, 0,249, 74, 1, 12,203, 74, 1, 0,139,
/* 0x12d0 */ 234, 3, 30,170,160, 0, 63,214, 64, 1, 31,214,229, 3, 30,170, /* 0x12d0 */ 5, 0,128,210,228, 3, 64,185, 67, 2,128, 82, 98, 0,128, 82,
/* 0x12e0 */ 235,255,255,151, 0, 0, 0, 0,102,105,108,101, 32,102,111,114, /* 0x12e0 */ 1, 1, 12,203,168, 24,128, 82, 1, 0, 0,212,226, 11, 64,249,
/* 0x12f0 */ 109, 97,116, 32,101,108,102, 54, 52, 45,108,105,116,116,108,101, /* 0x12f0 */ 227, 19, 64,249, 66, 0, 7,139,236, 0, 3,203,231, 0, 9,139,
/* 0x1300 */ 97, 97,114, 99,104, 54, 52, 10, 10, 83,101, 99,116,105,111,110, /* 0x1300 */ 233,143, 31,248,231,252, 76,211,231,204,116,211,231,143, 31,248,
/* 0x1310 */ 115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, /* 0x1310 */ 66, 0, 7,203,226,143, 31,248, 7, 1, 64,185,231,131, 31,248,
/* 0x1320 */ 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, /* 0x1320 */ 227, 3, 0,145, 2, 1, 12,139,230, 3, 2,170, 7, 5, 64,185,
/* 0x1330 */ 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1330 */ 4, 9, 64,185, 0, 49, 0,145,225, 3, 7,170, 32, 1, 63,214,
/* 0x1340 */ 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1340 */ 255, 35, 0,145,225,135, 64,248,224,135, 64,248,233,135, 64,248,
/* 0x1350 */ 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103, /* 0x1350 */ 162, 0,128, 82, 72, 9,128, 82, 1, 0, 0,212,192, 0, 31,214,
/* 0x1360 */ 110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 77, 65, 67, /* 0x1360 */ 101,120,101, 99,117,116, 97, 98,108,101, 95,112, 97,116,104, 61,
/* 0x1370 */ 72, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, /* 0x1370 */ 0, 0, 32,212,229, 3, 30,170,226, 35, 0,145, 64,132, 64,248,
/* 0x1380 */ 48, 52, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1380 */ 224,255,255,181, 64,132, 64,248,224,255,255,181, 64,132, 64,248,
/* 0x1390 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1390 */ 0,255,255,180, 97,254,255, 16, 3, 2,128, 82, 4, 20, 64, 56,
/* 0x13a0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, /* 0x13a0 */ 37, 20, 64, 56, 99, 4, 0, 81,159, 0, 5,107, 1,255,255, 84,
/* 0x13b0 */ 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, /* 0x13b0 */ 99,255,255, 53, 1, 0,128,210,168, 0,128, 82, 1, 0, 0,212,
/* 0x13c0 */ 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, /* 0x13c0 */ 229,143, 29,248, 1, 0, 0, 16,236, 3, 1,170, 32, 68, 64,184,
/* 0x13d0 */ 76, 89, 10, 32, 32, 49, 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, /* 0x13d0 */ 140, 65, 32,203,236, 19, 0,249,234, 3, 1,170, 32, 68, 64,184,
/* 0x13e0 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x13e0 */ 74, 65, 32,203, 11, 32, 0,209,169,255,255,151,102,105,108,101,
/* 0x13f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x13f0 */ 32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,108,105,
/* 0x1400 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1400 */ 116,116,108,101, 97, 97,114, 99,104, 54, 52, 10, 10, 83,101, 99,
/* 0x1410 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 56, 52, 32, 32, 50, 42, 42, /* 0x1410 */ 116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32,
/* 0x1420 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, /* 0x1420 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32,
/* 0x1430 */ 68, 79, 78, 76, 89, 10, 32, 32, 50, 32, 78, 82, 86, 50, 69, 32, /* 0x1430 */ 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1440 */ 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 50, 56, /* 0x1440 */ 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1450 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1450 */ 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32,
/* 0x1460 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1460 */ 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48,
/* 0x1470 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 56, 52, 32, 32, /* 0x1470 */ 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 48,
/* 0x1480 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x1480 */ 48, 48, 48, 48, 48, 52, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x1490 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, /* 0x1490 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x14a0 */ 50, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, /* 0x14a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x14b0 */ 49, 49, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x14b0 */ 48, 48, 48, 52, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x14c0 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x14c0 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69,
/* 0x14d0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 97, /* 0x14d0 */ 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 78, 82, 86, 95, 72,
/* 0x14e0 */ 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, /* 0x14e0 */ 69, 65, 68, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x14f0 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, /* 0x14f0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1500 */ 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, /* 0x1500 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1510 */ 48, 48, 48, 48,102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1510 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 56, 52, 32,
/* 0x1520 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1520 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x1530 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x1530 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 50, 32, 78, 82,
/* 0x1540 */ 48, 50, 99, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x1540 */ 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x1550 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x1550 */ 48, 49, 50, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1560 */ 32, 53, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, 32, /* 0x1560 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1570 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x1570 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1580 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, /* 0x1580 */ 56, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x1590 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x1590 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51,
/* 0x15a0 */ 48, 48, 48, 48, 51, 98, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x15a0 */ 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48,
/* 0x15b0 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x15b0 */ 48, 48, 48, 48, 49, 49, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x15c0 */ 89, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, /* 0x15c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x15d0 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,100, 48, 32, 32, 48, 48, /* 0x15d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x15e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x15e0 */ 48, 48, 49, 97, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x15f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x15f0 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x1600 */ 32, 32, 48, 48, 48, 48, 48, 51, 98, 56, 32, 32, 50, 42, 42, 48, /* 0x1600 */ 32, 32, 52, 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32,
/* 0x1610 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, /* 0x1610 */ 32, 32, 48, 48, 48, 48, 48, 48,102, 48, 32, 32, 48, 48, 48, 48,
/* 0x1620 */ 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, /* 0x1620 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1630 */ 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, /* 0x1630 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x1640 */ 48, 48, 48, 57, 54, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1640 */ 48, 48, 48, 48, 48, 50, 99, 56, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x1650 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1650 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x1660 */ 76, 89, 10, 32, 32, 53, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32,
/* 0x1670 */ 48, 52, 56, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x1670 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1680 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x1680 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1690 */ 32, 56, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, /* 0x1690 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16a0 */ 32, 48, 48, 48, 48, 48, 52, 57, 99, 32, 32, 48, 48, 48, 48, 48, /* 0x16a0 */ 48, 32, 32, 48, 48, 48, 48, 48, 51, 98, 56, 32, 32, 50, 42, 42,
/* 0x16b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, /* 0x16b0 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x16c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x16c0 */ 68, 79, 78, 76, 89, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 69,
/* 0x16d0 */ 48, 48, 48, 48,100,102, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x16d0 */ 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,100, 48,
/* 0x16e0 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x16e0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16f0 */ 89, 10, 32, 32, 57, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, /* 0x16f0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1700 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1700 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 51, 98, 56, 32, 32,
/* 0x1710 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x1710 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x1720 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1720 */ 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x1730 */ 32, 32, 48, 48, 48, 48, 49, 50, 56, 99, 32, 32, 50, 42, 42, 48, /* 0x1730 */ 32, 32, 55, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 32,
/* 0x1740 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, /* 0x1740 */ 32, 32, 48, 48, 48, 48, 48, 57, 54, 56, 32, 32, 48, 48, 48, 48,
/* 0x1750 */ 79, 78, 76, 89, 10, 32, 49, 48, 32, 77, 65, 67, 72, 77, 65, 73, /* 0x1750 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1760 */ 78, 89, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1760 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x1770 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1770 */ 48, 48, 48, 48, 48, 52, 56, 56, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x1780 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1780 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x1790 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 56, 99, 32, 32, 50, /* 0x1790 */ 76, 89, 10, 32, 32, 56, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49,
/* 0x17a0 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, /* 0x17a0 */ 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 52, 57, 99, 32, 32, 48,
/* 0x17b0 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 49, 32, 77, 65, 67, 72, /* 0x17b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x17c0 */ 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x17c0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17d0 */ 53, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x17d0 */ 48, 32, 32, 48, 48, 48, 48, 48,100,102, 48, 32, 32, 50, 42, 42,
/* 0x17e0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x17e0 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x17f0 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 56, 99, /* 0x17f0 */ 68, 79, 78, 76, 89, 10, 32, 32, 57, 32, 76, 90, 77, 65, 95, 68,
/* 0x1800 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x1800 */ 69, 67, 51, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1810 */ 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x1810 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1820 */ 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, /* 0x1820 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1830 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1830 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 56, 99, 32, 32,
/* 0x1840 */ 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, /* 0x1840 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x1850 */ 67, 51, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1850 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 48, 32, 77, 65, 67,
/* 0x1860 */ 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, /* 0x1860 */ 72, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x1870 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1870 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1880 */ 32,108, 32, 32, 32, 32,100, 32, 32, 77, 65, 67, 72, 77, 65, 73, /* 0x1880 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1890 */ 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1890 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 56,
/* 0x18a0 */ 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, 73, 78, 90, 10, 48, 48, /* 0x18a0 */ 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x18b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x18b0 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 49, 32,
/* 0x18c0 */ 32, 32, 32, 32,100, 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, /* 0x18c0 */ 77, 65, 67, 72, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, 48, 48,
/* 0x18d0 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x18d0 */ 48, 48, 48, 49, 54, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18e0 */ 48, 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, /* 0x18e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x18f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x18f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1900 */ 32, 32,100, 32, 32, 78, 82, 86, 95, 72, 69, 65, 68, 9, 48, 48, /* 0x1900 */ 49, 50, 56, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x1910 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, /* 0x1910 */ 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65,
/* 0x1920 */ 82, 86, 95, 72, 69, 65, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1920 */ 68, 79, 78, 76, 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66,
/* 0x1930 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x1930 */ 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1940 */ 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1940 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77,
/* 0x1950 */ 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, /* 0x1950 */ 65, 95, 68, 69, 67, 51, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1960 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x1960 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69,
/* 0x1970 */ 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68, 9, 48, 48, 48, /* 0x1970 */ 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1980 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, /* 0x1980 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 77, 65, 67,
/* 0x1990 */ 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1990 */ 72, 77, 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x19a0 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, /* 0x19a0 */ 48, 48, 48, 48, 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, 73, 78,
/* 0x19b0 */ 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x19b0 */ 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x19c0 */ 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, 48, 48, /* 0x19c0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 77, 65, 67, 72, 77,
/* 0x19d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x19d0 */ 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x19e0 */ 100, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, 9, 48, 48, 48, 48, /* 0x19e0 */ 48, 48, 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, 10,
/* 0x19f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, /* 0x19f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a00 */ 95, 84, 65, 73, 76, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1a00 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 72, 69, 65,
/* 0x1a10 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, /* 0x1a10 */ 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a20 */ 90, 77, 65, 95, 69, 76, 70, 48, 48, 9, 48, 48, 48, 48, 48, 48, /* 0x1a20 */ 48, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, 10, 48, 48, 48, 48,
/* 0x1a30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, /* 0x1a30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1a40 */ 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1a40 */ 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48,
/* 0x1a50 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, /* 0x1a50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50,
/* 0x1a60 */ 90, 77, 65, 95, 68, 69, 67, 50, 48, 9, 48, 48, 48, 48, 48, 48, /* 0x1a60 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, /* 0x1a70 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68,
/* 0x1a80 */ 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1a80 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a90 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, /* 0x1a90 */ 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1aa0 */ 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, /* 0x1aa0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1ab0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, /* 0x1ab0 */ 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ac0 */ 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1ac0 */ 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48,
/* 0x1ad0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 77, /* 0x1ad0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1ae0 */ 65, 67, 72, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x1ae0 */ 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, 9,
/* 0x1af0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 77, 65, 67, 72, 77, 65, /* 0x1af0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b00 */ 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1b00 */ 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, 48, 48, 48,
/* 0x1b10 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 77, 65, 67, /* 0x1b10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1b20 */ 72, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1b20 */ 100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 9, 48, 48,
/* 0x1b30 */ 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, 97,114,116, 10, 48, /* 0x1b30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,
/* 0x1b40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1b40 */ 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, 48,
/* 0x1b50 */ 103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, 69, 9, 48, 48, /* 0x1b50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1b60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 50, 56, 32,117, /* 0x1b60 */ 100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 9, 48, 48,
/* 0x1b70 */ 99,108, 95,110,114,118, 50,101, 95,100,101, 99,111,109,112,114, /* 0x1b70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,
/* 0x1b80 */ 101,115,115, 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1b80 */ 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, 48,
/* 0x1b90 */ 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, /* 0x1b90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1ba0 */ 78, 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1ba0 */ 100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, 48,
/* 0x1bb0 */ 48, 48, 48, 49, 49, 99, 32,117, 99,108, 95,110,114,118, 50,100, /* 0x1bb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,
/* 0x1bc0 */ 95,100,101, 99,111,109,112,114,101,115,115, 95, 51, 50, 10, 48, /* 0x1bc0 */ 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48,
/* 0x1bd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x1bd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1be0 */ 103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, 66, 9, 48, 48, /* 0x1be0 */ 100, 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, 89, 9, 48, 48, 48,
/* 0x1bf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,102, 48, 32,117, /* 0x1bf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 77, 65,
/* 0x1c00 */ 99,108, 95,110,114,118, 50, 98, 95,100,101, 99,111,109,112,114, /* 0x1c00 */ 67, 72, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c10 */ 101,115,115, 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1c10 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32,
/* 0x1c20 */ 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, /* 0x1c20 */ 32, 77, 65, 67, 72, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48,
/* 0x1c30 */ 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, /* 0x1c30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, 97,
/* 0x1c40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,122,109, 97, /* 0x1c40 */ 114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c50 */ 68,101, 99,111,100,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1c50 */ 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50,
/* 0x1c60 */ 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, /* 0x1c60 */ 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49,
/* 0x1c70 */ 77, 65, 67, 72, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, /* 0x1c70 */ 50, 56, 32,117, 99,108, 95,110,114,118, 50,101, 95,100,101, 99,
/* 0x1c80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,101,110,100, 95,100, /* 0x1c80 */ 111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48, 48,
/* 0x1c90 */ 101, 99,111,109,112,114,101,115,115, 10, 48, 48, 48, 48, 48, 48, /* 0x1c90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32,
/* 0x1ca0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x1ca0 */ 32, 32, 70, 32, 78, 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48,
/* 0x1cb0 */ 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x1cb0 */ 48, 48, 48, 48, 48, 48, 48, 49, 49, 99, 32,117, 99,108, 95,110,
/* 0x1cc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 79, 95, 66, 73, 78, 70, /* 0x1cc0 */ 114,118, 50,100, 95,100,101, 99,111,109,112,114,101,115,115, 95,
/* 0x1cd0 */ 79, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x1cd0 */ 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ce0 */ 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 77, 65, 67, 72, 77, /* 0x1ce0 */ 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50,
/* 0x1cf0 */ 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, /* 0x1cf0 */ 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d00 */ 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, /* 0x1d00 */ 102, 48, 32,117, 99,108, 95,110,114,118, 50, 98, 95,100,101, 99,
/* 0x1d10 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, /* 0x1d10 */ 111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48, 48,
/* 0x1d20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 48, /* 0x1d20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32,
/* 0x1d30 */ 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65, 76, 76, 50, /* 0x1d30 */ 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48,
/* 0x1d40 */ 54, 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, 90, 43, 48,120, 48, /* 0x1d40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1d50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 10, /* 0x1d50 */ 76,122,109, 97, 68,101, 99,111,100,101, 10, 48, 48, 48, 48, 48,
/* 0x1d60 */ 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, /* 0x1d60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32,
/* 0x1d70 */ 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, /* 0x1d70 */ 32, 32, 32, 32, 77, 65, 67, 72, 77, 65, 73, 78, 89, 9, 48, 48,
/* 0x1d80 */ 70, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, /* 0x1d80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,101,
/* 0x1d90 */ 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x1d90 */ 110,100, 95,100,101, 99,111,109,112,114,101,115,115, 10, 10, 82,
/* 0x1da0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, /* 0x1da0 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68,
/* 0x1db0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, /* 0x1db0 */ 83, 32, 70, 79, 82, 32, 91, 77, 65, 67, 72, 77, 65, 73, 78, 88,
/* 0x1dc0 */ 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, /* 0x1dc0 */ 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32,
/* 0x1dd0 */ 49, 57, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, 10, /* 0x1dd0 */ 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1de0 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x1de0 */ 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48,
/* 0x1df0 */ 68, 83, 32, 70, 79, 82, 32, 91, 77, 65, 67, 72, 77, 65, 73, 78, /* 0x1df0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 48, 32, 82, 95, 65,
/* 0x1e00 */ 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, /* 0x1e00 */ 65, 82, 67, 72, 54, 52, 95, 67, 65, 76, 76, 50, 54, 32, 32, 77,
/* 0x1e10 */ 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, /* 0x1e10 */ 65, 67, 72, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, 48, 48,
/* 0x1e20 */ 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, /* 0x1e20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48,101, 56, 10, 10, 82, 69, 76,
/* 0x1e30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 56, 32, 82, 95, /* 0x1e30 */ 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32,
/* 0x1e40 */ 65, 65, 82, 67, 72, 54, 52, 95, 65, 66, 83, 51, 50, 32, 32, 32, /* 0x1e40 */ 70, 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 93,
/* 0x1e50 */ 79, 95, 66, 73, 78, 70, 79, 10 /* 0x1e50 */ 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1e60 */ 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1e70 */ 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48,
/* 0x1e80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82, 95, 65, 65,
/* 0x1e90 */ 82, 67, 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, 49, 57, 32, 32,
/* 0x1ea0 */ 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, 10, 82, 69, 76, 79,
/* 0x1eb0 */ 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70,
/* 0x1ec0 */ 79, 82, 32, 91, 77, 65, 67, 72, 77, 65, 73, 78, 90, 93, 58, 10,
/* 0x1ed0 */ 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1ee0 */ 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1ef0 */ 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f00 */ 48, 48, 48, 48, 48, 48, 49, 51, 56, 32, 82, 95, 65, 65, 82, 67,
/* 0x1f10 */ 72, 54, 52, 95, 65, 68, 82, 95, 80, 82, 69, 76, 95, 76, 79, 50,
/* 0x1f20 */ 49, 32, 32, 95,115,116, 97,114,116, 45, 48,120, 48, 48, 48, 48,
/* 0x1f30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 10
}; };
+1 -1
View File
@@ -282,7 +282,7 @@ unfold:
// Remember new f_exp region for PROT_EXEC. // Remember new f_exp region for PROT_EXEC.
movq 2*NBPW(%rsp),%rdx // LENU movq 2*NBPW(%rsp),%rdx // LENU
movq 4*NBPW(%rsp),%rcx // &Mach_header64 movq 4*NBPW(%rsp),%rcx // &Mach_header64
addq %rax,%rdx // new last of unfoded addq %rax,%rdx // new last of unfolded
subq %rcx,%rax // new - old subq %rcx,%rax // new - old
movq %rax,%r_RELOC // relocation constant movq %rax,%r_RELOC // relocation constant
addq %rbp,%rax; push %rax // P_10 new f_exp addq %rbp,%rax; push %rax // P_10 new f_exp
+139 -29
View File
@@ -29,8 +29,8 @@
* <jreiser@users.sourceforge.net> * <jreiser@users.sourceforge.net>
*/ */
//#define SIMULATE_ON_DEBIAN_EABI4 1 #define SIMULATE_ON_DEBIAN_EABI4 1
#undef SIMULATE_ON_DEBIAN_EABI4 //#undef SIMULATE_ON_DEBIAN_EABI4
#ifdef SIMULATE_ON_DEBIAN_EABI4 /*{*/ #ifdef SIMULATE_ON_DEBIAN_EABI4 /*{*/
#define LINUX_ARM_CACHEFLUSH 1 /* SIMULATE_ON_DEBIAN_EABI4 */ #define LINUX_ARM_CACHEFLUSH 1 /* SIMULATE_ON_DEBIAN_EABI4 */
@@ -40,6 +40,7 @@
#define ARMEL_DARWIN 1 #define ARMEL_DARWIN 1
#endif /*}*/ #endif /*}*/
NBPW= 4
#include "arch/arm/v5a/macros.S" #include "arch/arm/v5a/macros.S"
#define bkpt .long 0xe1200070 #define bkpt .long 0xe1200070
@@ -60,20 +61,31 @@ MAP_FIXED= 0x10
MAP_ANONYMOUS= 0x20 MAP_ANONYMOUS= 0x20
PAGE_SHIFT= 12 PAGE_SHIFT= 12
PAGE_SIZE = -(~0<<PAGE_SHIFT) PAGE_MASK = (~0<<PAGE_SHIFT)
PAGE_SIZE = -PAGE_MASK
__NR_SYSCALL_BASE = 0
__NR_exit = 1 + __NR_SYSCALL_BASE __NR_exit = 1 + __NR_SYSCALL_BASE
__NR_write = 4 + __NR_SYSCALL_BASE __NR_write = 4 + __NR_SYSCALL_BASE
__NR_open = 5 + __NR_SYSCALL_BASE
#if defined(SIMULATE_ON_DEBIAN_EABI4) //{
__NR_mmap = 0xc0 + __NR_SYSCALL_BASE
__NR_mprotect=0x7d + __NR_SYSCALL_BASE
#else //}{ real Mach-o
__NR_mmap = 197 + __NR_SYSCALL_BASE __NR_mmap = 197 + __NR_SYSCALL_BASE
__NR_mprotect = 74 + __NR_SYSCALL_BASE
#endif //}
// DEBUG ONLY: // DEBUG ONLY:
__ARM_NR_BASE = 0xf0000 + __NR_SYSCALL_BASE __ARM_NR_BASE = 0xf0000 + __NR_SYSCALL_BASE
__ARM_NR_cacheflush = 2 + __ARM_NR_BASE __ARM_NR_cacheflush = 2 + __ARM_NR_BASE
//.long sz_pack2 // placed there by ::pack3() //0: .word 0b - &Mach_header // backwards distance to Mach_header
//0: .word 0b - l_info // backwards distance to l_info
section MACHMAINX section MACHMAINX
_start: .globl _start _start: .globl _start
sub sp,sp,#4 // space for mhdrp sub sp,sp,#NBPW // space for mhdrp
stmdb sp!,{r0-r12,r14,r15} // paranoia [omit sp===r13] stmdb sp!,{r0-r12,r14,r15} // paranoia [omit sp===r13]
bl main bl main
L20: L20:
@@ -101,37 +113,135 @@ end_decompress: .globl end_decompress
/* IDENTSTR goes here */ /* IDENTSTR goes here */
r_RELOC .req r12 // same as r_MHDR
r_MHDR .req r12
r_LENX .req r11
r_ADRX .req r10
r_FOLD .req r6
arg1 .req r0
arg2 .req r1
arg3 .req r2
arg4 .req r3
arg5 .req r4
arg6 .req r5
rdi .req r0
//rsi .req r1
rdx .req r2
rcx .req r3
rax .req r7
rbx .req r8
rbp .req r9
section MACHMAINZ section MACHMAINZ
unfold: // lr= &L100 unfold: // lr= &b_info; sp/ fd,%ADRU,%LENU,%entry,%&Mach_header
ldr ldst,[lr,#sz_unc] mov rbx,lr // &b_info:{sz_unc, sz_cpr, 4{byte}}, compressed_fold...}
ldr lsrc,[lr,#sz_cpr] ldr rax,[rbx,#sz_unc] // LENU.dynamic
add dst,lsrc,lr; add dst,dst,#sz_b_info mov rdx,rbx
add src,ldst,lr; add src,src,#GAP+NO_LAP // defend against prefetch and overlap sub rdx,rdx,r_MHDR // LENU.static
add rdx,rdx,rax
str rdx,[sp,#2*NBPW] // LENU
mov r4,lsrc // loop count // Reserve space for input file and unfolded stub.
movup: // descending copy folded_loader to higher address mov arg2,rdx // len
ldrb ip,[dst,#-1]! mov arg6,#0 // offset
subs r4,r4,#1 mov arg5,#-1 // FD_ANON
strb ip,[src,#-1]! mov arg4,#MAP_PRIVATE|MAP_ANONYMOUS
bne movup mov arg3,#PROT_READ|PROT_WRITE
mov arg1,#0 // kernel chooses addr
do_sys __NR_mmap
str r0,[sp,#1*NBPW] // ADRU
sub r_ADRX,r_ADRX,r_MHDR // offset(&l_info)
add r_ADRX,r_ADRX,r0 // new &l_info
ldr r4, [lr,#b_method] // Duplicate the input data.
add lr,lr,#GAP mov arg6,#0 // offset
PUSH {ldst}; mov ldst,sp // LZMA needs for EOF ldr arg5,[sp,#0*NBPW] // fd
mov dst,lr // unfolded result mov arg4,#MAP_PRIVATE|MAP_FIXED
sub r11,r5,#4+ L20 - _start // &sz_pack2 param to unfolded loader mov arg3,#PROT_READ|PROT_WRITE
PUSH {r4} // 5th param to decompressor sub arg2,rbx,r_MHDR // len
mov r10,lr // DEBUG ONLY // mov arg1,r0 // same address
blx r5 // bx r5 do_sys __NR_mmap
bx r10 // DEBUG ONLY
// Remember new f_exp region for PROT_EXEC.
ldr rdx,[sp,#2*NBPW] // LENU
ldr rcx,[sp,#4*NBPW] // &Mach_header
add rdx,rdx,rax // new last of unfolded
sub r_RELOC,rax,rcx // relocation constant = new - old
add rax,rax,rbp; str rbp,[sp,#-NBPW]! // P_10 new f_exp
mov rax,rax,lsr #PAGE_SHIFT
mov rax,rax,lsl #PAGE_SHIFT
str rax,[sp,#-NBPW]! // P_11 address
sub rdx,rdx,rax
str rdx,[sp,#-NBPW]! // P_12 length
// Unfold
ldr rax,[rbx,#sz_unc] // dstlen
str rax,[sp,#-NBPW]; mov arg4,sp // P_13 &dstlen
add arg3,rbx,r_RELOC // dst= new unfold
mov r_FOLD,arg3 // execute here
ldr rax,[rbx,#sz_cpr] // srclen
ldr arg5,[rbx,#b_method]
add arg1,rbx,#sz_b_info // src
mov arg2,rax // srclen
blx rbp // old f_exp
add sp,sp,#NBPW // P_13 toss dstlen
// PROT_EXEC
ldr arg2,[sp],#NBPW // P_12 length
ldr arg1,[sp],#NBPW // P_11 addr
ldr rbp,[sp],#NBPW // P_10 new f_exp
mov arg3,#PROT_READ|PROT_EXEC
do_sys __NR_mprotect
// Use the copy.
// r10= ADRX; r11= LENX; r9= f_exp
// rsp/ fd,ADRU,LENU,%entry,&Mach_header
bx r_FOLD
execp:
.ascii "executable_path=" // 16 bytes
L99:
bkpt
main: main:
mov r5,lr // &f_decompress mov r5,lr // &f_decompress
add r2,sp,#NBPW // &argv[0]
0:
ldr r0,[r2],#NBPW
cmp r0,#0; bne 0b // past argv
0:
ldr r0,[r2],#NBPW
cmp r0,#0; bne 0b // past envp
L30:
ldr r0,[r2],#NBPW // r0= *apple++
cmp r0,#0; beq L99
adr r1,execp; mov r3,#16
L40:
ldrb r4,[r0],#1
ldrb r5,[r1],#1
cmp r4,r5; bne L30 // mismatch ==> next apple[]
subs r3,r3,#1; bne L40 // not entire prefix
mov arg2,#0 // O_RDONLY
do_sys __NR_open
str r5,[sp,#-5*NBPW]! // fd,%ADRU,%LENU,%entry,%&Mach_header
adr r1,-2*4 + _start
mov r_MHDR,r1
ldr r0,[r1],#4
sub r_MHDR,r_MHDR,r0 // &Mach_header
str r_MHDR,[sp,#4*NBPW]
mov r_ADRX,r1
ldr r0,[r1],#4
sub r_ADRX,r_ADRX,r0 // &l_info
sub r_LENX,r0,#2*4 // omit words before _start
bl unfold bl unfold
L100:
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */ /* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
GAP= 128 // > farthest prefetch; must match ../../p_mach.cpp
NO_LAP= 64 // avoid overlap for folded loader; must match ../../p_mach.cpp
/* vim:set ts=8 sw=8 et: */ /* vim:set ts=8 sw=8 et: */
+132 -25
View File
@@ -29,6 +29,7 @@
* <jreiser@users.sourceforge.net> * <jreiser@users.sourceforge.net>
*/ */
NBPW= 8
#include "arch/arm64/v8/macros.S" #include "arch/arm64/v8/macros.S"
sz_b_info= 12 sz_b_info= 12
@@ -49,18 +50,25 @@ MAP_ANONYMOUS= 0x20
PAGE_SHIFT= 12 PAGE_SHIFT= 12
PAGE_SIZE = -(~0<<PAGE_SHIFT) PAGE_SIZE = -(~0<<PAGE_SHIFT)
__NR_SYSCALL_BASE = 0
__NR_exit = 1 + __NR_SYSCALL_BASE __NR_exit = 1 + __NR_SYSCALL_BASE
__NR_write = 4 + __NR_SYSCALL_BASE __NR_write = 4 + __NR_SYSCALL_BASE
__NR_open = 5 + __NR_SYSCALL_BASE
__NR_mmap = 197 + __NR_SYSCALL_BASE __NR_mmap = 197 + __NR_SYSCALL_BASE
__NR_mprotect= 74 + __NR_SYSCALL_BASE
// DEBUG ONLY: // DEBUG ONLY:
__ARM_NR_BASE = 0xf0000 + __NR_SYSCALL_BASE __ARM_NR_BASE = 0xf0000 + __NR_SYSCALL_BASE
__ARM_NR_cacheflush = 2 + __ARM_NR_BASE __ARM_NR_cacheflush = 2 + __ARM_NR_BASE
//.long sz_pack2 // placed there by ::pack3() //.long sz_pack2 // placed there by ::pack3()
//0: .word 0b - &Mach64_header // backwards distance to Mach64_header
//0: .word 0b - l_info // backwards distance to l_info
section MACHMAINX section MACHMAINX
_start: .globl _start _start: .globl _start
sub sp,sp,#8 // space for mhdrp sub sp,sp,#NBPW // space for mhdrp
stp x0,x1,[sp,#-30*8]! // paranoia; omit r30(lr), r31(sp) stp x0,x1,[sp,#-30*8]! // paranoia; omit r30(lr), r31(sp)
stp x2,x3,[sp,#2*8] stp x2,x3,[sp,#2*8]
stp x4,x5,[sp,#4*8] stp x4,x5,[sp,#4*8]
@@ -102,40 +110,139 @@ end_decompress: .globl end_decompress
/* IDENTSTR goes here */ /* IDENTSTR goes here */
r_RELOC .req x12 // same as r_MHDR
r_MHDR .req x12
r_LENX .req x11
r_ADRX .req x10
r_FOLD .req x6
arg1 .req x0; arg1w .req w0
arg2 .req x1; arg2w .req w1
arg3 .req x2; arg3w .req w2
arg4 .req x3; arg4w .req w3
arg5 .req x4; arg5w .req w4
arg6 .req x5; arg6w .req w5
rdi .req x0
//rsi .req x1
rdx .req x2
rcx .req x3
rax .req x7; eax .req w7
rbx .req x8
rbp .req x9
section MACHMAINZ section MACHMAINZ
lsrc .req w1 lsrc .req w1
ldst .req w3 ldst .req w3
ldstx .req x3 ldstx .req x3
unfold: // lr= -4+ &L100
ldr ldst,[lr,#sz_unc+sz_b_info]
ldr lsrc,[lr,#sz_cpr+sz_b_info]
add dst,lr,lsrc,uxtw; add dst,dst,#sz_b_info
add src,lr,ldst,uxtw; add src,src,#GAP+NO_LAP // defend against prefetch and overlap
mov w4,lsrc // loop count unfold: // lr= &b_info; sp/ fd,%ADRU,%LENU,%entry,%&Mach_header
t0 .req w9 mov rbx,lr // &b_info:{sz_unc, sz_cpr, 4{byte}}, compressed_fold...}
movup: // descending copy folded_loader to higher address ldr eax,[rbx,#sz_unc] // LENU.dynamic
ldr t0,[dst,#-4]!; sub w4,w4,#4 mov rdx,rbx
str t0,[src,#-4]!; cbnz w4,movup sub rdx,rdx,r_MHDR // LENU.static
add rdx,rdx,eax,uxtw
str rdx,[sp,#2*NBPW] // LENU
ldr w4, [lr,#b_method] // 5th param to decompressor // Reserve space for input file and unfolded stub.
add lr,lr,#GAP mov arg2,rdx // len
PUSH1(ldst); mov ldstx,sp // LZMA needs for EOF mov arg6w,#0 // offset
mov dst,lr // unfolded result mov arg5w,#-1 // FD_ANON
sub x11,x5,#4+ L20 - _start // &sz_pack2 param to unfolded loader mov arg4w,#MAP_PRIVATE|MAP_ANONYMOUS
mov x10,lr // DEBUG ONLY mov arg3w,#PROT_READ|PROT_WRITE
blr x5 // br r5 mov arg1,#0 // kernel chooses addr
br x10 // DEBUG ONLY do_sys __NR_mmap
str x0,[sp,#1*NBPW] // ADRU
sub r_ADRX,r_ADRX,r_MHDR // offset(&l_info)
add r_ADRX,r_ADRX,x0 // new &l_info
// Duplicate the input data.
mov arg6,#0 // offset
ldr arg5w,[sp,#0*NBPW] // fd
mov arg4w,#MAP_PRIVATE|MAP_FIXED
mov arg3w,#PROT_READ|PROT_WRITE
sub arg2,rbx,r_MHDR // len
// mov arg1,x0 // same address
do_sys __NR_mmap
// Remember new f_exp region for PROT_EXEC.
ldr rdx,[sp,#2*NBPW] // LENU
ldr rcx,[sp,#4*NBPW] // &Mach_header
add rdx,rdx,rax // new last of unfolded
sub r_RELOC,rax,rcx // relocation constant = new - old
add rax,rax,rbp; str rbp,[sp,#-NBPW]! // P_10 new f_exp
lsr rax,rax,#PAGE_SHIFT
lsl rax,rax,#PAGE_SHIFT
str rax,[sp,#-NBPW]! // P_11 address
sub rdx,rdx,rax
str rdx,[sp,#-NBPW]! // P_12 length
// Unfold
ldr eax,[rbx,#sz_unc] // dstlen
str rax,[sp,#-NBPW]; mov arg4,sp // P_13 &dstlen
add arg3,rbx,r_RELOC // dst= new unfold
mov r_FOLD,arg3 // execute here
ldr eax,[rbx,#sz_cpr] // srclen
ldr arg5w,[rbx,#b_method]
add arg1,rbx,#sz_b_info // src
mov arg2,rax // srclen
blr rbp // old f_exp
add sp,sp,#NBPW // P_13 toss dstlen
// PROT_EXEC
ldr arg2,[sp],#NBPW // P_12 length
ldr arg1,[sp],#NBPW // P_11 addr
ldr rbp,[sp],#NBPW // P_10 new f_exp
mov arg3w,#PROT_READ|PROT_EXEC
do_sys __NR_mprotect
// Use the copy.
// r10= ADRX; r11= LENX; r9= f_exp
// rsp/ fd,ADRU,LENU,%entry,&Mach_header
br r_FOLD
execp:
.ascii "executable_path=" // 16 bytes
L99:
brk #0
main: main:
mov x5,lr // &f_decompress mov x5,lr // &f_decompress
add x2,sp,#NBPW // &argv[0]
0:
ldr x0,[x2],#NBPW
cbnz x0,0b // past argv
0:
ldr x0,[x2],#NBPW
cbnz x0,0b // past envp
L30:
ldr x0,[x2],#NBPW // x0= *apple++
cbz x0,L99
adr x1,execp; mov w3,#16
L40:
ldrb w4,[x0],#1
ldrb w5,[x1],#1
sub w3,w3,#1
cmp w4,w5; bne L30 // mismatch ==> next apple[]
cbnz w3,L40 // not entire prefix
mov arg2,#0 // O_RDONLY
do_sys __NR_open
str x5,[sp,#-5*NBPW]! // fd,%ADRU,%LENU,%entry,%&Mach_header
adr x1,-2*4 + _start
mov r_MHDR,x1
ldr w0,[x1],#4
sub r_MHDR,r_MHDR,w0,uxtw // &Mach_header
str r_MHDR,[sp,#4*NBPW]
mov r_ADRX,x1
ldr w0,[x1],#4
sub r_ADRX,r_ADRX,w0,uxtw // &l_info
sub r_LENX,x0,#2*4 // omit words before _start
bl unfold bl unfold
o_binfo:
.long O_BINFO // .int4
L100:
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */ /* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
GAP= 128 // > farthest prefetch; must match ../../p_mach.cpp
NO_LAP= 64 // avoid overlap for folded loader; must match ../../p_mach.cpp
/* vim:set ts=8 sw=8 et: */ /* vim:set ts=8 sw=8 et: */
@@ -4,16 +4,16 @@ Sections:
Idx Name Size VMA LMA File off Algn Flags Idx Name Size VMA LMA File off Algn Flags
0 MACHMAINX 0000000c 00000000 00000000 00000034 2**0 CONTENTS, RELOC, READONLY 0 MACHMAINX 0000000c 00000000 00000000 00000034 2**0 CONTENTS, RELOC, READONLY
1 NRV_HEAD 00000000 00000000 00000000 00000040 2**0 CONTENTS, READONLY 1 NRV_HEAD 00000000 00000000 00000000 00000040 2**0 CONTENTS, READONLY
2 NRV2E 00000144 00000000 00000000 00000040 2**0 CONTENTS, RELOC, READONLY 2 NRV2E 0000013c 00000000 00000000 00000040 2**0 CONTENTS, RELOC, READONLY
3 NRV2D 00000130 00000000 00000000 00000184 2**0 CONTENTS, RELOC, READONLY 3 NRV2D 00000128 00000000 00000000 0000017c 2**0 CONTENTS, RELOC, READONLY
4 NRV2B 000000f4 00000000 00000000 000002b4 2**0 CONTENTS, RELOC, READONLY 4 NRV2B 000000ec 00000000 00000000 000002a4 2**0 CONTENTS, RELOC, READONLY
5 NRV_TAIL 00000000 00000000 00000000 000003a8 2**0 CONTENTS, READONLY 5 NRV_TAIL 00000000 00000000 00000000 00000390 2**0 CONTENTS, READONLY
6 LZMA_ELF00 000000bc 00000000 00000000 000003a8 2**0 CONTENTS, RELOC, READONLY 6 LZMA_ELF00 000000b8 00000000 00000000 00000390 2**0 CONTENTS, RELOC, READONLY
7 LZMA_DEC20 00000938 00000000 00000000 00000464 2**0 CONTENTS, RELOC, READONLY 7 LZMA_DEC20 00000938 00000000 00000000 00000448 2**0 CONTENTS, RELOC, READONLY
8 LZMA_DEC10 00000478 00000000 00000000 00000d9c 2**0 CONTENTS, RELOC, READONLY 8 LZMA_DEC10 00000478 00000000 00000000 00000d80 2**0 CONTENTS, RELOC, READONLY
9 LZMA_DEC30 00000000 00000000 00000000 00001214 2**0 CONTENTS, READONLY 9 LZMA_DEC30 00000000 00000000 00000000 000011f8 2**0 CONTENTS, READONLY
10 MACHMAINY 00000000 00000000 00000000 00001214 2**0 CONTENTS, READONLY 10 MACHMAINY 00000000 00000000 00000000 000011f8 2**0 CONTENTS, READONLY
11 MACHMAINZ 0000005c 00000000 00000000 00001214 2**0 CONTENTS, RELOC, READONLY 11 MACHMAINZ 0000018c 00000000 00000000 000011f8 2**0 CONTENTS, RELOC, READONLY
SYMBOL TABLE: SYMBOL TABLE:
00000000 l d NRV2E 00000000 NRV2E 00000000 l d NRV2E 00000000 NRV2E
00000000 l d NRV2D 00000000 NRV2D 00000000 l d NRV2D 00000000 NRV2D
@@ -28,9 +28,9 @@ SYMBOL TABLE:
00000000 l d NRV_TAIL 00000000 NRV_TAIL 00000000 l d NRV_TAIL 00000000 NRV_TAIL
00000000 l d MACHMAINY 00000000 MACHMAINY 00000000 l d MACHMAINY 00000000 MACHMAINY
00000000 g MACHMAINX 00000000 _start 00000000 g MACHMAINX 00000000 _start
00000000 g F NRV2E 00000144 ucl_nrv2e_decompress_8 00000000 g F NRV2E 0000013c ucl_nrv2e_decompress_8
00000000 g F NRV2D 00000130 ucl_nrv2d_decompress_8 00000000 g F NRV2D 00000128 ucl_nrv2d_decompress_8
00000000 g F NRV2B 000000f4 ucl_nrv2b_decompress_8 00000000 g F NRV2B 000000ec ucl_nrv2b_decompress_8
00000000 g LZMA_DEC10 00000000 LzmaDecode 00000000 g LZMA_DEC10 00000000 LzmaDecode
00000000 g MACHMAINY 00000000 end_decompress 00000000 g MACHMAINY 00000000 end_decompress
@@ -41,68 +41,68 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [NRV2E]: RELOCATION RECORDS FOR [NRV2E]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
00000010 R_ARM_PC24 NRV2E 00000010 R_ARM_PC24 NRV2E
00000074 R_ARM_PC24 NRV2E 0000006c R_ARM_PC24 NRV2E
00000070 R_ARM_PC24 NRV2E
00000078 R_ARM_PC24 NRV2E 00000078 R_ARM_PC24 NRV2E
00000080 R_ARM_PC24 NRV2E 00000084 R_ARM_PC24 NRV2E
0000008c R_ARM_PC24 NRV2E 00000090 R_ARM_PC24 NRV2E
00000098 R_ARM_PC24 NRV2E 0000009c R_ARM_PC24 NRV2E
000000a4 R_ARM_PC24 NRV2E 000000a0 R_ARM_PC24 NRV2E
000000a8 R_ARM_PC24 NRV2E 000000ac R_ARM_PC24 NRV2E
000000b4 R_ARM_PC24 NRV2E 000000bc R_ARM_PC24 NRV2E
000000c4 R_ARM_PC24 NRV2E 000000c4 R_ARM_PC24 NRV2E
000000cc R_ARM_PC24 NRV2E 000000c8 R_ARM_PC24 NRV2E
000000d0 R_ARM_PC24 NRV2E 000000d0 R_ARM_PC24 NRV2E
000000d8 R_ARM_PC24 NRV2E 000000d4 R_ARM_PC24 NRV2E
000000dc R_ARM_PC24 NRV2E 000000e0 R_ARM_PC24 NRV2E
000000e8 R_ARM_PC24 NRV2E 000000e4 R_ARM_PC24 NRV2E
000000ec R_ARM_PC24 NRV2E 000000ec R_ARM_PC24 NRV2E
000000f4 R_ARM_PC24 NRV2E 000000f8 R_ARM_PC24 NRV2E
00000100 R_ARM_PC24 NRV2E 000000fc R_ARM_PC24 NRV2E
00000104 R_ARM_PC24 NRV2E 00000104 R_ARM_PC24 NRV2E
0000010c R_ARM_PC24 NRV2E 0000010c R_ARM_PC24 NRV2E
00000114 R_ARM_PC24 NRV2E 00000134 R_ARM_PC24 NRV2E
0000013c R_ARM_PC24 NRV2E 00000138 R_ARM_PC24 NRV2E
00000140 R_ARM_PC24 NRV2E
RELOCATION RECORDS FOR [NRV2D]: RELOCATION RECORDS FOR [NRV2D]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
00000010 R_ARM_PC24 NRV2D 00000010 R_ARM_PC24 NRV2D
00000074 R_ARM_PC24 NRV2D 0000006c R_ARM_PC24 NRV2D
00000070 R_ARM_PC24 NRV2D
00000078 R_ARM_PC24 NRV2D 00000078 R_ARM_PC24 NRV2D
00000080 R_ARM_PC24 NRV2D 00000084 R_ARM_PC24 NRV2D
0000008c R_ARM_PC24 NRV2D 00000090 R_ARM_PC24 NRV2D
00000098 R_ARM_PC24 NRV2D 0000009c R_ARM_PC24 NRV2D
000000a4 R_ARM_PC24 NRV2D 000000a0 R_ARM_PC24 NRV2D
000000a8 R_ARM_PC24 NRV2D 000000ac R_ARM_PC24 NRV2D
000000b4 R_ARM_PC24 NRV2D 000000bc R_ARM_PC24 NRV2D
000000c4 R_ARM_PC24 NRV2D 000000c4 R_ARM_PC24 NRV2D
000000cc R_ARM_PC24 NRV2D 000000cc R_ARM_PC24 NRV2D
000000d4 R_ARM_PC24 NRV2D 000000d8 R_ARM_PC24 NRV2D
000000e0 R_ARM_PC24 NRV2D 000000e0 R_ARM_PC24 NRV2D
000000e8 R_ARM_PC24 NRV2D 000000ec R_ARM_PC24 NRV2D
000000f4 R_ARM_PC24 NRV2D 000000f8 R_ARM_PC24 NRV2D
00000100 R_ARM_PC24 NRV2D 000000fc R_ARM_PC24 NRV2D
00000104 R_ARM_PC24 NRV2D 00000120 R_ARM_PC24 NRV2D
00000128 R_ARM_PC24 NRV2D 00000124 R_ARM_PC24 NRV2D
0000012c R_ARM_PC24 NRV2D
RELOCATION RECORDS FOR [NRV2B]: RELOCATION RECORDS FOR [NRV2B]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
00000010 R_ARM_PC24 NRV2B 00000010 R_ARM_PC24 NRV2B
00000070 R_ARM_PC24 NRV2B
00000078 R_ARM_PC24 NRV2B 00000078 R_ARM_PC24 NRV2B
00000080 R_ARM_PC24 NRV2B 0000007c R_ARM_PC24 NRV2B
00000084 R_ARM_PC24 NRV2B 0000008c R_ARM_PC24 NRV2B
00000090 R_ARM_PC24 NRV2B
00000094 R_ARM_PC24 NRV2B 00000094 R_ARM_PC24 NRV2B
00000098 R_ARM_PC24 NRV2B 000000a0 R_ARM_PC24 NRV2B
0000009c R_ARM_PC24 NRV2B 000000b0 R_ARM_PC24 NRV2B
000000a8 R_ARM_PC24 NRV2B 000000b4 R_ARM_PC24 NRV2B
000000b8 R_ARM_PC24 NRV2B
000000bc R_ARM_PC24 NRV2B 000000bc R_ARM_PC24 NRV2B
000000c4 R_ARM_PC24 NRV2B 000000c4 R_ARM_PC24 NRV2B
000000cc R_ARM_PC24 NRV2B 000000c8 R_ARM_PC24 NRV2B
000000d0 R_ARM_PC24 NRV2B 000000e4 R_ARM_PC24 NRV2B
000000ec R_ARM_PC24 NRV2B 000000e8 R_ARM_PC24 NRV2B
000000f0 R_ARM_PC24 NRV2B
RELOCATION RECORDS FOR [LZMA_ELF00]: RELOCATION RECORDS FOR [LZMA_ELF00]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
@@ -245,5 +245,9 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [MACHMAINZ]: RELOCATION RECORDS FOR [MACHMAINZ]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
00000028 R_ARM_PC24 MACHMAINZ 00000110 R_ARM_PC24 MACHMAINZ
00000058 R_ARM_PC24 MACHMAINZ 0000011c R_ARM_PC24 MACHMAINZ
00000128 R_ARM_PC24 MACHMAINZ
00000140 R_ARM_PC24 MACHMAINZ
00000148 R_ARM_PC24 MACHMAINZ
00000188 R_ARM_PC24 MACHMAINZ
@@ -13,7 +13,7 @@ Idx Name Size VMA LMA File off Algn
8 LZMA_DEC10 0000049c 0000000000000000 0000000000000000 00000df0 2**0 CONTENTS, READONLY 8 LZMA_DEC10 0000049c 0000000000000000 0000000000000000 00000df0 2**0 CONTENTS, READONLY
9 LZMA_DEC30 00000000 0000000000000000 0000000000000000 0000128c 2**0 CONTENTS, READONLY 9 LZMA_DEC30 00000000 0000000000000000 0000000000000000 0000128c 2**0 CONTENTS, READONLY
10 MACHMAINY 00000000 0000000000000000 0000000000000000 0000128c 2**0 CONTENTS, READONLY 10 MACHMAINY 00000000 0000000000000000 0000000000000000 0000128c 2**0 CONTENTS, READONLY
11 MACHMAINZ 0000005c 0000000000000000 0000000000000000 0000128c 2**0 CONTENTS, RELOC, READONLY 11 MACHMAINZ 00000160 0000000000000000 0000000000000000 0000128c 2**0 CONTENTS, RELOC, READONLY
SYMBOL TABLE: SYMBOL TABLE:
0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30 0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30
0000000000000000 l d MACHMAINZ 0000000000000000 MACHMAINZ 0000000000000000 l d MACHMAINZ 0000000000000000 MACHMAINZ
@@ -33,11 +33,10 @@ SYMBOL TABLE:
0000000000000000 g F NRV2B 00000000000000f0 ucl_nrv2b_decompress_32 0000000000000000 g F NRV2B 00000000000000f0 ucl_nrv2b_decompress_32
0000000000000000 g LZMA_DEC10 0000000000000000 LzmaDecode 0000000000000000 g LZMA_DEC10 0000000000000000 LzmaDecode
0000000000000000 g MACHMAINY 0000000000000000 end_decompress 0000000000000000 g MACHMAINY 0000000000000000 end_decompress
0000000000000000 *UND* 0000000000000000 O_BINFO
RELOCATION RECORDS FOR [MACHMAINX]: RELOCATION RECORDS FOR [MACHMAINX]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
0000000000000040 R_AARCH64_CALL26 MACHMAINZ+0x0000000000000050 0000000000000040 R_AARCH64_CALL26 MACHMAINZ+0x00000000000000e8
RELOCATION RECORDS FOR [LZMA_ELF00]: RELOCATION RECORDS FOR [LZMA_ELF00]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
@@ -45,4 +44,4 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [MACHMAINZ]: RELOCATION RECORDS FOR [MACHMAINZ]:
OFFSET TYPE VALUE OFFSET TYPE VALUE
0000000000000058 R_AARCH64_ABS32 O_BINFO 0000000000000138 R_AARCH64_ADR_PREL_LO21 _start-0x0000000000000008