Revamp --android-shlib

Android "Oreo" wants to deal with ElfXX_Shdr[].  So splice 4KiB into PT_LOAD[0]
with an "extra" copy of them.  This requires careful relocation processing.
It also costs a page at run time, and an average of a page in the file
(depending on fragmentation at the boundary between r-x and rw- .)

https://github.com/upx/upx/issues/124
https://github.com/upx/upx/issues/139
https://github.com/upx/upx/issues/142

	modified:   p_elf_enum.h
	modified:   p_lx_elf.cpp
	modified:   p_lx_elf.h
	modified:   stub/src/arm.v4a-linux.shlib-init.S
	modified:   stub/src/arm.v4t-linux.shlib-init.S
	modified:   stub/src/arm64-linux.shlib-init.S

	modified:   stub/arm.v5a-linux.shlib-init.h
	modified:   stub/arm.v5t-linux.shlib-init.h
	modified:   stub/arm64-linux.shlib-init.h

	modified:   ../.github/travis_testsuite_1.sh
This commit is contained in:
John Reiser 2018-01-15 16:08:34 -08:00
parent f3a7620ae8
commit c34fe09a79
12 changed files with 1497 additions and 1283 deletions

View File

@ -149,81 +149,81 @@ c3f44b4d00a87384c03a6f9e7aec809c1addfe3e271244d38a474f296603088c *mipsel-linux.e
b8c35fa2956da17ca505956e9f5017bb5f3a746322647e24ccb8ff28059cafa4 *powerpc-linux.elf/upx-3.91
"
expected_sha256sums__t110_compress_ucl_nrv2b_3_no_filter="\
e79af02f04b86c01fde5bf1da7817da60ad8d7edef6c683d23b4f760f9fbe07c *amd64-linux.elf/upx-3.91
ba63d6b8b6e142c5f0bfba0226770dee457d1c119cb1ea712d8217641e9afe5e *amd64-linux.elf/upx-3.91
c1a6ef9d0b8a26f1d6e3307af6f119bc95411a54421c7da3bd6ade9c4eead187 *arm-wince.pe/upx-3.91.exe
7e35e651e9018cfe7c6935d6faa9ae31b5c7324be1112238dd407060a20286d9 *armeb-linux.elf/upx-3.91
4207fa9fadeacc18e239b651cacdf689f63aea8ea45b38306d8d41d83eda752e *armeb-linux.elf/upx-3.91
7d5f0fd6f18e4cd16655ef58805f228bcaddd5b035ce998faed446e290aea3d9 *i386-dos32.djgpp2.coff/upx-3.91.exe
fa905c6fa718ad2f85e0b082506ff48fbee2524d64eadeacd90651a27b8f4672 *i386-linux.elf/upx-3.91
207c5a73eff5a03e0f77b2a5b2c3591d7a5ab65c2831e630e1b9c9c25b817384 *i386-linux.elf/upx-3.91
d3cfb5347758ee54e54cfc92ae502a3e19702cd4fec115d74f84f8a5ab7a9bc2 *i386-win32.pe/upx-3.91.exe
c4c8b912a48bcaaef72fd94cd0c307659a03be2ec359bf01a42a2a39307dd964 *m68k-atari.tos/upx-3.91.ttp
b45b537b1c3641a9993f908c5f19504c2ae83f727135bdd63b19a8ae06da31ec *mipsel-linux.elf/upx-3.91
9b9ec6cc491ddc78752966f5be57d12e47c0c3105172ae599de3fce520526190 *powerpc-linux.elf/upx-3.91
f372c28f71220ac8f58e949f938bf665ae964a8b8683c30200f5c9334965d7aa *mipsel-linux.elf/upx-3.91
8f71602f4c0ca50201fa4243bdbe7214353ee5e2ff12c0bc733d5ccb6cfd867b *powerpc-linux.elf/upx-3.91
"
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
67bf4666f95245059b82c78fb579fb205fdc7efb7d7ef561ec27099ef9343d05 *amd64-linux.elf/upx-3.91
7f75b3ad70fa9b4bd7954fe0897fa9338f05a9acef3e1723caa93e84b87f85b9 *amd64-linux.elf/upx-3.91
2bb2477bdf4643954b4bb707b1017459238b03f66883303cd20e9e8740764dd7 *arm-wince.pe/upx-3.91.exe
174c480d7ad1262fa1b1a2ae91f06e2adb53e49443da043b2b7930f8f3cf0709 *armeb-linux.elf/upx-3.91
6e1d412bcf05093967eefe59cbe60aad8d0c2484c69bcab0bf1c2b820d87b8e5 *armeb-linux.elf/upx-3.91
c52473f5dbdac560c05d5d173e5342b5e696e604517359baef581672eb25a9e6 *i386-dos32.djgpp2.coff/upx-3.91.exe
3b5e674c34842bd4bc76a1a61fec6343401d09627280e8e7634cc5e7f41fedf1 *i386-linux.elf/upx-3.91
b4cb46ec0743fbc062fe6286a9a140d0723de0ad35b24028502a18cadd5fa116 *i386-linux.elf/upx-3.91
5bebadb8455b052580b1f22a949c3eb5a441c8b6ba9c6b50506cb703fc3f65ce *i386-win32.pe/upx-3.91.exe
ef94d8b0e02a650c302bec9f2d50462f2accc2fbb8003cc4977bc550d2e5b9f2 *m68k-atari.tos/upx-3.91.ttp
5ef57048d510d1d0fea630e4622e60f0fd54e5b64b65774d6e785670f43d9c54 *mipsel-linux.elf/upx-3.91
50babab276c089f8562e0d38587c7ccc9e0bd84f8c6f0af523d6a07c94568094 *powerpc-linux.elf/upx-3.91
4aaed45f46a515a44647a29c6afe8b82cedaa49543d4b76fa710fd7139df3da1 *mipsel-linux.elf/upx-3.91
11da243fd33499df01a0b0924d07169e104e124823fc06c0243d118540d36ee6 *powerpc-linux.elf/upx-3.91
"
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
d79bf044efd7fa79ccc9258e7f18fd96516f65e92314afe5d2106c12a7657b16 *amd64-linux.elf/upx-3.91
09d1e3a6dfec9fc640e6c203a5baec53a5e1b41feb0493c10ab816fe6639a291 *amd64-linux.elf/upx-3.91
0915344e0ee8e7c006e6cce71c024f518e097a88820c7ab3ca183ab1c614ce82 *arm-wince.pe/upx-3.91.exe
40f6d18e983239020f5139d5c641d5504922d2ac42583fd0d67cf115da92b3b9 *armeb-linux.elf/upx-3.91
da4f1e158b1ae542d296955b93042a67b839eae35d1b0d437651c189b90f6445 *armeb-linux.elf/upx-3.91
5c5ff78652e76834f3f9ab110c42e3a34ef54c748bce212b0e942049f43f5d4d *i386-dos32.djgpp2.coff/upx-3.91.exe
0e0f2a23c87a9f7a8ce2b9d53ea8478f40cfbc319228e5ce02ab5f5eff2727c5 *i386-linux.elf/upx-3.91
82682bc17933e803d6d9a16a2f368044a034db3aaa1bf2751501950908831457 *i386-linux.elf/upx-3.91
ef5e25c79d356e9ed0736f34dc5ee7a8f4c66d0c330b8d16672fac7d829b5a7c *i386-win32.pe/upx-3.91.exe
dfc6abff2d3417b9708b1232d5791a9232c6623dcedb9dcb59428b67bbf864e9 *m68k-atari.tos/upx-3.91.ttp
141d33cb386ef9aee02c0be946777c8fa556a64965392a030207a2e07af89504 *mipsel-linux.elf/upx-3.91
f0c96dba224cafa2e1a3ffe92609c48235289337fac3761491bf2f0680017841 *powerpc-linux.elf/upx-3.91
62c0033cc2ac497b13c93d8a2e95b760c0f3d3e5650df7f61bc3b2ef8ea236b6 *mipsel-linux.elf/upx-3.91
e9f0ed15b0bee40046f2136281fd4af2e9e9f26e79aa6f6779f0cce3022be7ae *powerpc-linux.elf/upx-3.91
"
expected_sha256sums__t140_compress_lzma_2_no_filter="\
3915741d762e15df607d0c32c0343bcf0906eb5409d7c34888da4a6a0f0fd88c *amd64-linux.elf/upx-3.91
72032e223a3ede0372f6ed8e45584bdea72f6ff248f9c705493af55a148af856 *amd64-linux.elf/upx-3.91
3af2a2346a252dfacefb6209725907b2947dc1ccf5e99af139608354f852507c *arm-wince.pe/upx-3.91.exe
4d6dbb67cea5b89956bab304633de379ed4ad4dfa808217a0d5014efe5f047fc *armeb-linux.elf/upx-3.91
b44c77de2906264285a92a46951aca07cd3a8b531b70b01a7207745ed6264d45 *armeb-linux.elf/upx-3.91
964fb400b0b4a2b1926ce7076610db8c3a8e41807fe030209af1615d43b6a020 *i386-dos32.djgpp2.coff/upx-3.91.exe
91ef93aef322d72c94d867ea8e9413025340dda67e6f8f3acdc8569982009877 *i386-linux.elf/upx-3.91
2708ce0b985540e5dc027ac4c21b7821ec3841446fdc8ee63dda787b6430f647 *i386-linux.elf/upx-3.91
171bde9f27a5571b524e9d7cdba6cefa142bb8a0b114c4d5294944ee5781e0bb *i386-win32.pe/upx-3.91.exe
8826c1f910007360ba6cec02c91bd7cdc87bce1ce27804ca728846b92d9086c9 *m68k-atari.tos/upx-3.91.ttp
f34a9691c617178582ab8b8cc50d9ccce1c37cd6074f9e146459121b1cdbaff9 *mipsel-linux.elf/upx-3.91
85a97fbde61dcb34e6f32e9bd7dc13a74969f82baada2e1880777197b86dacd2 *powerpc-linux.elf/upx-3.91
f1f9c9d940f519e89198e38cbb6e7f95abb5b28188118e7bb24aa30747baa4af *mipsel-linux.elf/upx-3.91
d1fd973ea522b5ba0e5f89377dc6cc166fffaa260c6263ecea67d72779fab200 *powerpc-linux.elf/upx-3.91
"
expected_sha256sums__t150_compress_ucl_2_all_filters="\
476c5e7deadae76336cb2d659bd7004073af2eb6059feaa5e146d1670da5296d *amd64-linux.elf/upx-3.91
162ad39ad701ddd65aea45d7d665721627f4c3cadb27377ccea155f8a6116b83 *amd64-linux.elf/upx-3.91
dc7323e753ce62e6a1c22112f139953dbaa1e5268530479f8ad48e0c54062295 *arm-wince.pe/upx-3.91.exe
a63e457b523ba78919a00c0d818f697ff51d005ea1b8108a4bc96afe26e721db *armeb-linux.elf/upx-3.91
f35804016b9edce8594d85d56267ea725ca49d832afd4a42ffc8e1d827cdd7ca *armeb-linux.elf/upx-3.91
8614d93ba30def6866b3be92ae5bdd5f294266e0fc4a26c078682917f127656d *i386-dos32.djgpp2.coff/upx-3.91.exe
a85707417a7ee7f81685272f460fde6cd3406cfe1457d656e337b1839d3cd3f2 *i386-linux.elf/upx-3.91
c07736b3a35201202d8b52990bc4b9fc090b447264a1bf14947de7e185e9f429 *i386-linux.elf/upx-3.91
7c3d7398f63eb9e235992d2d8fd6de9e355f6f21621c45032a6ae6c9009067e6 *i386-win32.pe/upx-3.91.exe
25e9e84bf4e01350b362d088f8107d8228b4576bc47b6b718e9e742f7e4a5205 *m68k-atari.tos/upx-3.91.ttp
43d1d7d49b540aae1986d0cce90bd9ea7b6ee4e891f99f6a0b57c9e74db1f1f7 *mipsel-linux.elf/upx-3.91
794737f95430181e3abe03a5e4ba879230afcef47bbbd984def7b05854e3032a *powerpc-linux.elf/upx-3.91
e7289c2fc37f219199a9e183763ad2556ac65e0ec4eaeeffbb658cdf1a36a1be *mipsel-linux.elf/upx-3.91
333b2c35662c100f0ba42b4fd4d16f69d6ad7149acff24b2f353171a02a1122b *powerpc-linux.elf/upx-3.91
"
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
c8b21f16e6e5fbc4786286d49a35abe9c8d6d088af14c642edd35e53b98b841e *amd64-linux.elf/upx-3.91
6235f2ead5866256580f97d43160aac30032f236ac1a3639f3c9f5fcc96b4cac *amd64-linux.elf/upx-3.91
1c9c618741739404f40d198d2fc77010539589379bf260502af9f10f1ec0d05b *arm-wince.pe/upx-3.91.exe
34412ce06f8ec8e0ff494803374caef537afeede157f705086cb5a7ec8c32bf3 *armeb-linux.elf/upx-3.91
48af335c1c7ec6ff63dfea56be4c6c79588cece14fbebcf9f39bb8404a7752cc *armeb-linux.elf/upx-3.91
863bbf7f3cf41296987b085a4db8acba372e3d65d8d9c656f9a7276f2e7aa4d3 *i386-dos32.djgpp2.coff/upx-3.91.exe
80c07fc48353d7124332467d10d55fc102cc3b8ab87c7fb24e6356614377bf6b *i386-linux.elf/upx-3.91
37f6c6ff11451a1d725fb9d3f370178ff18c4f400aad5502101085dbf414224a *i386-linux.elf/upx-3.91
4c73a38e81fe12f36dc37e514f8580c12bdf5d8cb92e9a07b7070db291a2f7eb *i386-win32.pe/upx-3.91.exe
0f902defbce3c9a8ea08910ff2ac62b9f06e7ceed0570501cb3b6287bfd6d797 *m68k-atari.tos/upx-3.91.ttp
8c88676582049d0add7245f3f137f4716ac122c27b03032922b48bd405a3454a *mipsel-linux.elf/upx-3.91
f9a432e027c4bb8c4c9dbb6855a5fbd0af170506ba2bf794fe800a45c3191ce6 *powerpc-linux.elf/upx-3.91
0dcdc66732ab3032b7d666f27a27fc112b75a98b7af525a827189059441571b3 *mipsel-linux.elf/upx-3.91
9a225a7c37702237b8712761165a7d437c716e041d8f714f2f64601c3fd032f2 *powerpc-linux.elf/upx-3.91
"
expected_sha256sums__t170_compress_all_methods_no_lzma_5_no_filter="\
55b7aa381930b82856d1b8074b1afc38a9fd25874bdf5ff5b43ca7874d000f62 *amd64-linux.elf/upx-3.91
ef82f7aa0ebfffa59c0d6e57de884615d3614187cba20a2ef921389975fa3ad1 *amd64-linux.elf/upx-3.91
66653a91c355a1ad1ab7b07c6c20b2d2899d0f42078683d0f4d540df476b1afb *arm-wince.pe/upx-3.91.exe
9b979047e8849e30c38632f20a5f06a74240cf66e589897470676f8326119ee4 *armeb-linux.elf/upx-3.91
17ef04c40670aa265a1388762d8c5af50f7e8e98576424683f518056715683d3 *armeb-linux.elf/upx-3.91
490a196fbba4a8f21bfb9ac2a3b92a6dc7e287f255a3ab987f7d29d5a75d8db4 *i386-dos32.djgpp2.coff/upx-3.91.exe
12f7fc10d0410ccf90f2963aed6bcb24aa7b4a289d52fd7517f2be59627aaca5 *i386-linux.elf/upx-3.91
f2e83d8f05c2317149d871c75e3c4a0c5dc9e6dfb1badf208f0e67f8086ced64 *i386-linux.elf/upx-3.91
14b192b5419ca0ec2b3f238dc6ed9c17596e82ff2674a299d4b0a76d118a73de *i386-win32.pe/upx-3.91.exe
2eb756cf3c7e4f80fea379a267071c981f3ab1fbb3eaab7057ca18a2b400fb8f *m68k-atari.tos/upx-3.91.ttp
0e620b76b639eb8bf5dac62b493ad9293b179f9653bcca062d03e736a2c9c26e *mipsel-linux.elf/upx-3.91
52ad6d57fae67e41198484c0a80ddb54cdd53169baf3b841aa6a99b89d5f8a03 *powerpc-linux.elf/upx-3.91
d13aa0361ce8354705e62ead463d8688c0db0fb0ca671af65e2a10aad9ad7eae *mipsel-linux.elf/upx-3.91
4aeef0d4ce290cf77036ba668e20c42b6aacb276505726fa62afd4d2094454fe *powerpc-linux.elf/upx-3.91
"
########## end .sha256sums.recreate

View File

@ -148,6 +148,7 @@
DT_NULL = 0, /* End flag */
DT_NEEDED = 1, /* Name of needed library */
DT_PLTRELSZ = 2, /* Size in bytes of PLT relocs */
DT_PLTGOT = 3, /* Processor defined value */
DT_HASH = 4, /* Hash table of symbol names */
DT_STRTAB = 5, /* String table */
DT_SYMTAB = 6, /* Symbol table */
@ -155,6 +156,7 @@
DT_RELASZ = 8, /* Total size of Rela relocs */
DT_RELAENT = 9, /* Size of one RELA relocation */
DT_INIT = 12, /* Address of init function */
DT_FINI = 13, /* Address of termination function */
DT_REL = 17, /* Relocations which contain no addend */
DT_RELSZ = 18, /* Total size of Rel relocs */
DT_RELENT = 19, /* Size of one Rel relocation */
@ -162,6 +164,9 @@
DT_PLTREL = 20, /* Type of reloc in PLT */
DT_TEXTREL = 22, /* Reloc might modify .text */
DT_JMPREL = 23, /* Address of PLT relocs */
DT_INIT_ARRAY = 25, /* Array with addresses of init fct */
DT_FINI_ARRAY = 26, /* Array with addresses of fini fct */
DT_PREINIT_ARRAY = 32, /* Array with addresses of preinit fct*/
DT_CHECKSUM = 0x6ffffdf8, /* Only for prelink? */
DT_GNU_HASH = 0x6ffffef5, /* GNU-style hash table */
DT_VERSYM = 0x6ffffff0, /* version[] for each symbol */
@ -209,6 +214,27 @@
#endif
#ifdef WANT_REL_ENUM //{
static unsigned ELF32_R_TYPE(unsigned x) { return 0xff & x; }
static unsigned ELF64_R_TYPE(upx_uint64_t x) { return 0xffffffff & x; }
enum { // relocation types
R_386_RELATIVE = 8,
R_AARCH64_RELATIVE = 1027,
R_ARM_RELATIVE = 23,
R_PPC_RELATIVE = 22,
R_PPC64_RELATIVE = R_PPC_RELATIVE,
R_X86_64_RELATIVE = 8,
R_386_JMP_SLOT = 7,
R_AARCH64_JUMP_SLOT = 1026,
R_ARM_JUMP_SLOT = 22,
R_PPC_JMP_SLOT = 21,
R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT,
R_X86_64_JUMP_SLOT = 7
};
#endif //}
#ifdef WANT_NHDR_ENUM
#undef WANT_NHDR_ENUM
enum { // ELF PT_NOTE types

View File

@ -87,6 +87,7 @@ fpad4(OutputFile *fo)
return d + len;
}
#if 0 //{ unused
static off_t
fpad8(OutputFile *fo)
{
@ -96,6 +97,7 @@ fpad8(OutputFile *fo)
fo->write(&zero, d);
return d + len;
}
#endif //}
static unsigned
funpad4(InputFile *fi)
@ -269,7 +271,7 @@ PackLinuxElf32::PackLinuxElf32help1(InputFile *f)
f->seek(0, SEEK_SET);
f->readx(file_image, file_size);
phdri= (Elf32_Phdr *)(e_phoff + file_image); // do not free() !!
shdri= (Elf32_Shdr const *)(e_shoff + file_image); // do not free() !!
shdri= (Elf32_Shdr *)(e_shoff + file_image); // do not free() !!
sec_dynsym = elf_find_section_type(Elf32_Shdr::SHT_DYNSYM);
if (sec_dynsym) {
unsigned t = get_te32(&sec_dynsym->sh_link);
@ -307,8 +309,8 @@ off_t PackLinuxElf::pack3(OutputFile *fo, Filter &ft) // return length of output
fo->write(&zero, t);
len += t;
set_te32(&disp, 2*sizeof(disp) + len - (sz_elf_hdrs + sizeof(p_info) + sizeof(l_info)));
fo->write(&disp, sizeof(disp)); // .e_entry - &first_b_info
set_te32(&disp, sz_elf_hdrs + sizeof(p_info) + sizeof(l_info));
fo->write(&disp, sizeof(disp)); // offset(b_info)
len += sizeof(disp);
set_te32(&disp, len); // distance back to beginning (detect dynamic reloc)
fo->write(&disp, sizeof(disp));
@ -319,15 +321,21 @@ off_t PackLinuxElf::pack3(OutputFile *fo, Filter &ft) // return length of output
? jni_onload_va
: elf_unsigned_dynamic(Elf32_Dyn::DT_INIT) );
set_te32(&disp, firstpc_va - load_va);
fo->write(&disp, sizeof(disp));
if (opt->o_unix.android_shlib) { // the extra page
set_te32(&disp, asl_delta + firstpc_va - load_va);
}
fo->write(&disp, sizeof(disp)); // DT_INIT.d_val
len += sizeof(disp);
set_te32(&disp, hatch_off);
fo->write(&disp, sizeof(disp));
fo->write(&disp, sizeof(disp)); // offset(hatch)
len += sizeof(disp);
if (opt->o_unix.android_shlib) {
xct_off += asl_delta; // the extra page
}
set_te32(&disp, xct_off);
fo->write(&disp, sizeof(disp));
fo->write(&disp, sizeof(disp)); // offset(dst for f_exp)
len += sizeof(disp);
}
sz_pack2 = len; // 0 mod 8
@ -362,6 +370,8 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
fo->write(&hdr, sizeof(hdr));
flen = fpad4(fo);
set_te32(&elfout.phdr[0].p_filesz, sz_pack2 + lsize);
set_te32(&elfout.phdr[0].p_memsz, sz_pack2 + lsize);
if (0==xct_off) { // not shared library; adjust PT_LOAD
v_hole = page_mask & (~page_mask + v_hole + get_te32(&elfout.phdr[0].p_vaddr));
set_te32(&elfout.phdr[1].p_vaddr, v_hole);
@ -398,8 +408,8 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
set_te32(&phdr->p_align, align);
}
off += (align-1) & (ioff - off);
fi->seek(ioff, SEEK_SET); fi->readx(ibuf, len);
fo->seek( off, SEEK_SET); fo->write(ibuf, len);
fo->seek( off, SEEK_SET);
fo->write(ioff + file_image, len);
so_slide = off - ioff;
set_te32(&phdr->p_offset, so_slide + ioff);
}
@ -436,10 +446,26 @@ off_t PackLinuxElf32::pack3(OutputFile *fo, Filter &ft)
fo->rewrite(&word, sizeof(word));
flen = fo->seek(0, SEEK_END);
}
if (opt->o_unix.android_shlib) {
// Update {DYNAMIC}.sh_offset by so_slide.
Elf32_Shdr *shdr = shdri;
for (unsigned j = 0; j < e_shnum; ++shdr, ++j) {
if (Elf32_Shdr::SHT_DYNAMIC == get_te32(&shdr->sh_type)) {
upx_uint32_t offset = get_te32(&shdr->sh_offset);
set_te32(&shdr->sh_offset, so_slide - asl_delta + offset );
fo->seek(j * sizeof(Elf32_Shdr) - asl_delta + xct_off, SEEK_SET);
fo->rewrite(shdr, sizeof(*shdr));
fo->seek(0, SEEK_END);
break;
}
}
}
else { // !opt->o_unix.android_shlib)
ehdri.e_shnum = 0;
ehdri.e_shoff = 0;
ehdri.e_shstrndx = 0;
}
}
return flen;
}
@ -522,8 +548,8 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
set_te64(&phdr->p_align, align);
}
off += (align-1) & (ioff - off);
fi->seek(ioff, SEEK_SET); fi->readx(ibuf, len);
fo->seek( off, SEEK_SET); fo->write(ibuf, len);
fo->seek( off, SEEK_SET);
fo->write(ioff + file_image, len);
so_slide = off - ioff;
set_te64(&phdr->p_offset, so_slide + ioff);
}
@ -553,16 +579,41 @@ off_t PackLinuxElf64::pack3(OutputFile *fo, Filter &ft)
if (xct_off < ioff)
set_te64(&phdr->p_offset, so_slide + ioff);
} // end each Phdr
if (off_init) { // change DT_INIT.d_val
fo->seek(off_init, SEEK_SET);
upx_uint64_t word; set_te64(&word, va_init);
fo->rewrite(&word, sizeof(word));
flen = fo->seek(0, SEEK_END);
}
if (opt->o_unix.android_shlib) {
// Update {DYNAMIC}.sh_offset by so_slide.
Elf64_Shdr *shdr = shdri;
for (unsigned j = 0; j < e_shnum; ++shdr, ++j) {
unsigned sh_type = get_te32(&shdr->sh_type);
if (Elf64_Shdr::SHT_DYNAMIC == sh_type) {
upx_uint64_t offset = get_te64(&shdr->sh_offset);
set_te64(&shdr->sh_offset, so_slide - asl_delta + offset );
fo->seek(j * sizeof(Elf64_Shdr) - asl_delta + xct_off, SEEK_SET);
fo->rewrite(shdr, sizeof(*shdr));
fo->seek(0, SEEK_END);
break;
}
if (Elf64_Shdr::SHT_RELA == sh_type
&& n_jmp_slot
&& !strcmp(".rela.plt", get_te32(&shdr->sh_name) + shstrtab)) {
upx_uint64_t f_off = elf_get_offset_from_address(plt_off);
fo->seek(f_off, SEEK_SET);
fo->rewrite(&file_image[f_off - so_slide], n_jmp_slot * sizeof(void *));
}
}
}
else { // !opt->o_unix.android_shlib)
ehdri.e_shnum = 0;
ehdri.e_shoff = 0;
ehdri.e_shstrndx = 0;
}
}
return flen;
}
@ -704,7 +755,7 @@ PackLinuxElf64::PackLinuxElf64help1(InputFile *f)
f->seek(0, SEEK_SET);
f->readx(file_image, file_size);
phdri= (Elf64_Phdr *)(e_phoff + file_image); // do not free() !!
shdri= (Elf64_Shdr const *)(e_shoff + file_image); // do not free() !!
shdri= (Elf64_Shdr *)(e_shoff + file_image); // do not free() !!
sec_dynsym = elf_find_section_type(Elf64_Shdr::SHT_DYNSYM);
if (sec_dynsym) {
unsigned t = get_te32(&sec_dynsym->sh_link);
@ -1718,7 +1769,37 @@ bool PackLinuxElf32::canPack()
// Also allow __uClibc_main and __uClibc_start_main .
if (Elf32_Ehdr::ET_DYN==get_te16(&ehdr->e_type)) {
// The DT_SYMTAB has no designated length. Read the whole file.
alloc_file_image(file_image, file_size);
fi->seek(0, SEEK_SET);
fi->readx(file_image, file_size);
memcpy(&ehdri, ehdr, sizeof(Elf32_Ehdr));
phdri= (Elf32_Phdr *)((size_t)e_phoff + file_image); // do not free() !!
shdri= (Elf32_Shdr *)((size_t)e_shoff + file_image); // do not free() !!
sec_strndx = &shdri[get_te16(&ehdr->e_shstrndx)];
shstrtab = (char const *)(get_te32(&sec_strndx->sh_offset) + file_image);
sec_dynsym = elf_find_section_type(Elf32_Shdr::SHT_DYNSYM);
if (sec_dynsym)
sec_dynstr = get_te32(&sec_dynsym->sh_link) + shdri;
sec_strndx = &shdri[get_te16(&ehdr->e_shstrndx)];
shstrtab = (char const *)(get_te32(&sec_strndx->sh_offset) + file_image);
if (Elf32_Shdr::SHT_STRTAB != get_te32(&sec_strndx->sh_type)
|| 0!=strcmp((char const *)".shstrtab",
&shstrtab[get_te32(&sec_strndx->sh_name)]) ) {
throwCantPack("bad e_shstrndx");
}
phdr= phdri;
for (int j= e_phnum; --j>=0; ++phdr)
if (Elf32_Phdr::PT_DYNAMIC==get_te32(&phdr->p_type)) {
dynseg= (Elf32_Dyn const *)(check_pt_dynamic(phdr) + file_image);
break;
}
// elf_find_dynamic() returns 0 if 0==dynseg.
dynstr= (char const *)elf_find_dynamic(Elf32_Dyn::DT_STRTAB);
dynsym= (Elf32_Sym const *)elf_find_dynamic(Elf32_Dyn::DT_SYMTAB);
if (Elf32_Dyn::DF_1_PIE & elf_unsigned_dynamic(Elf32_Dyn::DT_FLAGS_1)
|| calls_crt1((Elf32_Rel const *)elf_find_dynamic(Elf32_Dyn::DT_REL),
@ -1899,13 +1980,19 @@ PackLinuxElf64::canPack()
fi->readx(file_image, file_size);
memcpy(&ehdri, ehdr, sizeof(Elf64_Ehdr));
phdri= (Elf64_Phdr *)((size_t)e_phoff + file_image); // do not free() !!
shdri= (Elf64_Shdr const *)((size_t)e_shoff + file_image); // do not free() !!
shdri= (Elf64_Shdr *)((size_t)e_shoff + file_image); // do not free() !!
//sec_strndx = &shdri[ehdr->e_shstrndx];
//shstrtab = (char const *)(sec_strndx->sh_offset + file_image);
sec_dynsym = elf_find_section_type(Elf64_Shdr::SHT_DYNSYM);
if (sec_dynsym)
sec_dynstr = get_te64(&sec_dynsym->sh_link) + shdri;
sec_dynstr = get_te32(&sec_dynsym->sh_link) + shdri;
sec_strndx = &shdri[get_te16(&ehdr->e_shstrndx)];
shstrtab = (char const *)(get_te64(&sec_strndx->sh_offset) + file_image);
if (Elf64_Shdr::SHT_STRTAB != get_te32(&sec_strndx->sh_type)
|| 0!=strcmp((char const *)".shstrtab",
&shstrtab[get_te32(&sec_strndx->sh_name)]) ) {
throwCantPack("bad e_shstrndx");
}
phdr= phdri;
for (int j= e_phnum; --j>=0; ++phdr)
@ -1945,11 +2032,25 @@ PackLinuxElf64::canPack()
}
Elf64_Shdr const *shdr = shdri;
xct_va = ~0ull;
if (e_shnum) {
for (int j= e_shnum; --j>=0; ++shdr) {
if (Elf64_Shdr::SHF_EXECINSTR & get_te32(&shdr->sh_flags)) {
xct_va = umin64(xct_va, get_te64(&shdr->sh_addr));
}
}
}
else { // no Sections; use heuristics
upx_uint64_t const strsz = elf_unsigned_dynamic(Elf64_Dyn::DT_STRSZ);
upx_uint64_t const strtab = elf_unsigned_dynamic(Elf64_Dyn::DT_STRTAB);
upx_uint64_t const relsz = elf_unsigned_dynamic(Elf64_Dyn::DT_RELSZ);
upx_uint64_t const rel = elf_unsigned_dynamic(Elf64_Dyn::DT_REL);
upx_uint64_t const init = elf_unsigned_dynamic(Elf64_Dyn::DT_INIT);
if ((init == (relsz + rel ) && rel == (strsz + strtab))
|| (init == (strsz + strtab) && strtab == (relsz + rel ))
) {
xct_va = init;
}
}
// Rely on 0==elf_unsigned_dynamic(tag) if no such tag.
upx_uint64_t const va_gash = elf_unsigned_dynamic(Elf64_Dyn::DT_GNU_HASH);
upx_uint64_t const va_hash = elf_unsigned_dynamic(Elf64_Dyn::DT_HASH);
@ -2404,6 +2505,10 @@ PackLinuxElf64::generateElfHdr(
}
}
#define WANT_REL_ENUM
#include "p_elf_enum.h"
#undef WANT_REL_ENUM
void PackLinuxElf32::pack1(OutputFile *fo, Filter & /*ft*/)
{
fi->seek(0, SEEK_SET);
@ -2412,7 +2517,7 @@ void PackLinuxElf32::pack1(OutputFile *fo, Filter & /*ft*/)
sz_phdrs = e_phnum * get_te16(&ehdri.e_phentsize);
// Remember all PT_NOTE, and find lg2_page from PT_LOAD.
Elf32_Phdr const *phdr = phdri;
Elf32_Phdr *phdr = phdri;
note_size = 0;
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
if (phdr->PT_NOTE32 == get_te32(&phdr->p_type)) {
@ -2450,34 +2555,143 @@ void PackLinuxElf32::pack1(OutputFile *fo, Filter & /*ft*/)
progid = 0; // getRandomId(); not useful, so do not clutter
if (0!=xct_off) { // shared library
fi->seek(0, SEEK_SET);
fi->readx(ibuf, xct_off);
sz_elf_hdrs = xct_off;
fo->write(ibuf, xct_off);
fo->write(file_image, xct_off); // before the first SHF_EXECINSTR (typ ".plt")
if (opt->o_unix.android_shlib) {
// In order to pacify the runtime linker on Android "O" ("Oreo"),
// we will splice-in a 4KiB page that contains an "extra" copy
// of the Shdr and shstrtab.
xct_va += asl_delta;
//xct_off += asl_delta; // not yet
// Relocate PT_DYNAMIC (in 2nd PT_LOAD)
Elf32_Dyn *dyn = const_cast<Elf32_Dyn *>(dynseg);
for (; dyn->d_tag; ++dyn) {
unsigned d_tag = get_te32(&dyn->d_tag);
if (Elf32_Dyn::DT_FINI == d_tag
|| Elf32_Dyn::DT_FINI_ARRAY == d_tag
|| Elf32_Dyn::DT_INIT_ARRAY == d_tag
|| Elf32_Dyn::DT_PREINIT_ARRAY == d_tag
|| Elf32_Dyn::DT_PLTGOT == d_tag) {
unsigned d_val = get_te32(&dyn->d_val);
set_te32(&dyn->d_val, asl_delta + d_val);
}
}
// Relocate dynsym (DT_SYMTAB) which is below xct_va
Elf32_Sym *sym = const_cast<Elf32_Sym *>(dynsym);
unsigned off_dynsym = get_te32(&sec_dynsym->sh_offset);
unsigned sz_dynsym = get_te32(&sec_dynsym->sh_size);
for (int j = sz_dynsym / sizeof(Elf32_Sym); --j>=0; ++sym) {
unsigned symval = get_te32(&sym->st_value);
unsigned symsec = get_te16(&sym->st_shndx);
if (Elf32_Sym::SHN_UNDEF != symsec
&& Elf32_Sym::SHN_ABS != symsec
&& xct_off <= symval) {
set_te32(&sym->st_value, asl_delta + symval);
}
}
fo->seek(off_dynsym, SEEK_SET); fo->rewrite(dynsym, sz_dynsym);
set_te32(&ehdri.e_shoff, sz_elf_hdrs);
fo->seek(0, SEEK_SET); fo->rewrite(&ehdri, sizeof(ehdri));
// Relocate Phdr virtual addresses, but not physical offsets and sizes
/* Elf32_Phdr * */ phdr = phdri;
for (int j = e_phnum; --j>=0; ++phdr) {
unsigned offset = get_te32(&phdr->p_offset);
if (xct_off <= offset) { // above the extra page
//set_te32(&phdr->p_offset, asl_delta + offset); // physical
unsigned addr = get_te32(&phdr->p_paddr);
set_te32(&phdr->p_paddr, asl_delta + addr);
addr = get_te32(&phdr->p_vaddr);
set_te32(&phdr->p_vaddr, asl_delta + addr);
}
// .p_filesz,.p_memsz are updated in ::pack3
}
fo->rewrite(phdri, e_phnum * sizeof(Elf32_Phdr)); // adjacent to Ehdr
// Relocate Shdr; and Rela, Rel (below xct_off)
Elf32_Shdr *shdr = shdri;
unsigned sz_shstrtab = get_te32(&sec_strndx->sh_size);
for (int j = e_shnum; --j>=0; ++shdr) {
unsigned sh_type = get_te32(&shdr->sh_type);
unsigned sh_size = get_te32(&shdr->sh_size);
unsigned sh_offset = get_te32(&shdr->sh_offset);
unsigned sh_entsize = get_te32(&shdr->sh_entsize);
if (xct_off <= sh_offset) {
set_te32(&shdr->sh_offset, asl_delta + sh_offset);
uint32_t addr = get_te32(&shdr->sh_addr);
set_te32(&shdr->sh_addr, asl_delta + addr);
}
if (Elf32_Shdr::SHT_RELA== sh_type) {
if (sizeof(Elf32_Rela) != sh_entsize) {
char msg[50];
snprintf(msg, sizeof(msg), "bad Rela.sh_entsize %u", sh_entsize);
throwCantPack(msg);
}
Elf32_Rela *rela = (Elf32_Rela *)(sh_offset + file_image);
for (int k = sh_size / sh_entsize; --k >= 0; ++rela) {
unsigned r_offset = get_te32(&rela->r_offset);
if (xct_off <= r_offset) {
set_te32(&rela->r_offset, asl_delta + r_offset);
}
}
fo->seek(sh_offset, SEEK_SET);
fo->rewrite(sh_offset + file_image, sh_size);
}
if (Elf32_Shdr::SHT_REL == sh_type) {
if (sizeof(Elf32_Rel) != sh_entsize) {
char msg[50];
snprintf(msg, sizeof(msg), "bad Rel.sh_entsize %u", sh_entsize);
throwCantPack(msg);
}
Elf32_Rel *rel = (Elf32_Rel *)(sh_offset + file_image);
for (int k = sh_size / sh_entsize; --k >= 0; ++rel) {
unsigned r_offset = get_te32(&rel->r_offset);
if (xct_off <= r_offset) {
set_te32(&rel->r_offset, asl_delta + r_offset);
}
// r_offset must be in 2nd PT_LOAD; .p_vaddr was already relocated
unsigned d = elf_get_offset_from_address(asl_delta + r_offset);
unsigned w = get_te32(&file_image[d]);
unsigned r_info = get_te32(&rel->r_info);
unsigned r_type = ELF32_R_TYPE(r_info);
if (xct_off <= w
&& Elf32_Ehdr::EM_ARM == e_machine
&& ( R_ARM_RELATIVE == r_type
|| R_ARM_JUMP_SLOT == r_type)) {
set_te32(&file_image[d], asl_delta + w);
}
}
fo->seek(sh_offset, SEEK_SET);
fo->rewrite(sh_offset + file_image, sh_size);
}
}
// New copy of Shdr
set_te32(&sec_strndx->sh_offset, (e_shnum * sizeof(Elf32_Shdr)) + sz_elf_hdrs);
fo->seek(xct_off, SEEK_SET); fo->write(shdri, e_shnum * sizeof(Elf32_Shdr));
// New copy of Shdr[.e_shstrndx].[ sh_offset, +.sh_size )
fo->write(shstrtab, sz_shstrtab);
sz_elf_hdrs = fpad4(fo);
//xct_off += asl_delta; // wait until ::pack3
}
memset(&linfo, 0, sizeof(linfo));
fo->write(&linfo, sizeof(linfo));
}
// if the preserve build-id option was specified
if (opt->o_unix.preserve_build_id) {
Elf32_Shdr *shdr = NULL;
Elf32_Shdr const *tmp = shdri;
if (! shdri) {
shdr = New(Elf32_Shdr, e_shnum);
fi->seek(0,SEEK_SET);
fi->seek(ehdri.e_shoff,SEEK_SET);
fi->readx((void*)shdr,ehdri.e_shentsize*ehdri.e_shnum);
// set this so we can use elf_find_section_name
shdri = (Elf32_Shdr *)shdr;
e_shnum = get_te16(&ehdri.e_shnum);
if (!shdri) {
shdri = (Elf32_Shdr *)&file_image[get_te32(&ehdri.e_shoff)];
}
//set the shstrtab
sec_strndx = &shdri[ehdri.e_shstrndx];
sec_strndx = &shdri[get_te16(&ehdri.e_shstrndx)];
char *strtab = New(char, sec_strndx->sh_size);
fi->seek(0,SEEK_SET);
@ -2500,22 +2714,14 @@ void PackLinuxElf32::pack1(OutputFile *fo, Filter & /*ft*/)
memset(&shdrout,0,sizeof(shdrout));
//setup the build-id
memcpy(&shdrout.shdr[1],buildid, sizeof(shdrout.shdr[1]));
memcpy(&shdrout.shdr[1], buildid, sizeof(shdrout.shdr[1]));
shdrout.shdr[1].sh_name = 1;
//setup the shstrtab
memcpy(&shdrout.shdr[2],sec_strndx, sizeof(shdrout.shdr[2]));
memcpy(&shdrout.shdr[2], sec_strndx, sizeof(shdrout.shdr[2]));
shdrout.shdr[2].sh_name = 20;
shdrout.shdr[2].sh_size = 29; //size of our static shstrtab
}
// repoint shdr in case it is used by code some where else
if (shdr) {
shdri = tmp;
delete [] shdr;
shdr = NULL;
sec_strndx = NULL;
}
}
}
@ -2620,7 +2826,7 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/)
assert(e_phoff == sizeof(Elf64_Ehdr)); // checked by canPack()
sz_phdrs = e_phnum * get_te16(&ehdri.e_phentsize);
Elf64_Phdr const *phdr = phdri;
Elf64_Phdr *phdr = phdri;
note_size = 0;
for (unsigned j=0; j < e_phnum; ++phdr, ++j) {
if (phdr->PT_NOTE64 == get_te32(&phdr->p_type)) {
@ -2655,11 +2861,154 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/)
progid = 0; // getRandomId(); not useful, so do not clutter
if (0!=xct_off) { // shared library
fi->seek(0, SEEK_SET);
fi->readx(ibuf, xct_off);
sz_elf_hdrs = xct_off;
fo->write(ibuf, xct_off);
fo->write(file_image, xct_off); // before the first SHF_EXECINSTR (typ ".plt")
if (opt->o_unix.android_shlib) {
// In order to pacify the runtime linker on Android "O" ("Oreo"),
// we will splice-in a 4KiB page that contains an "extra" copy
// of the Shdr and shstrtab.
xct_va += asl_delta;
//xct_off += asl_delta; // not yet
// Relocate PT_DYNAMIC (in 2nd PT_LOAD)
Elf64_Dyn *dyn = const_cast<Elf64_Dyn *>(dynseg);
for (; dyn->d_tag; ++dyn) {
upx_uint64_t d_tag = get_te64(&dyn->d_tag);
if (Elf64_Dyn::DT_FINI == d_tag
|| Elf64_Dyn::DT_FINI_ARRAY == d_tag
|| Elf64_Dyn::DT_INIT_ARRAY == d_tag
|| Elf64_Dyn::DT_PREINIT_ARRAY == d_tag
|| Elf64_Dyn::DT_PLTGOT == d_tag) {
upx_uint64_t d_val = get_te64(&dyn->d_val);
set_te64(&dyn->d_val, asl_delta + d_val);
}
}
// Relocate dynsym (DT_SYMTAB) which is below xct_va
Elf64_Sym *sym = const_cast<Elf64_Sym *>(dynsym);
upx_uint64_t off_dynsym = get_te64(&sec_dynsym->sh_offset);
upx_uint64_t sz_dynsym = get_te64(&sec_dynsym->sh_size);
for (int j = sz_dynsym / sizeof(Elf64_Sym); --j>=0; ++sym) {
upx_uint64_t symval = get_te64(&sym->st_value);
unsigned symsec = get_te16(&sym->st_shndx);
if (Elf64_Sym::SHN_UNDEF != symsec
&& Elf64_Sym::SHN_ABS != symsec
&& xct_off <= symval) {
set_te64(&sym->st_value, asl_delta + symval);
}
}
fo->seek(off_dynsym, SEEK_SET); fo->rewrite(dynsym, sz_dynsym);
set_te64(&ehdri.e_shoff, sz_elf_hdrs);
fo->seek(0, SEEK_SET); fo->rewrite(&ehdri, sizeof(ehdri));
// Relocate Phdr virtual addresses, but not physical offsets and sizes
/* Elf64_Phdr * */ phdr = phdri;
for (int j = e_phnum; --j>=0; ++phdr) {
upx_uint64_t offset = get_te64(&phdr->p_offset);
if (xct_off <= offset) { // above the extra page
//set_te64(&phdr->p_offset, asl_delta + offset); // physical
upx_uint64_t addr = get_te64(&phdr->p_paddr);
set_te64(&phdr->p_paddr, asl_delta + addr);
addr = get_te64(&phdr->p_vaddr);
set_te64(&phdr->p_vaddr, asl_delta + addr);
}
// .p_filesz,.p_memsz are updated in ::pack3
}
fo->rewrite(phdri, e_phnum * sizeof(Elf64_Phdr)); // adjacent to Ehdr
// Relocate Shdr; and Rela, Rel (below xct_off)
Elf64_Shdr *shdr = shdri;
upx_uint64_t sz_shstrtab = get_te64(&sec_strndx->sh_size);
for (int j = e_shnum; --j>=0; ++shdr) {
unsigned sh_type = get_te32(&shdr->sh_type);
upx_uint64_t sh_size = get_te64(&shdr->sh_size);
upx_uint64_t sh_offset = get_te64(&shdr->sh_offset);
upx_uint64_t sh_entsize = get_te64(&shdr->sh_entsize);
if (xct_off <= sh_offset) {
set_te64(&shdr->sh_offset, asl_delta + sh_offset);
upx_uint64_t addr = get_te64(&shdr->sh_addr);
set_te64(&shdr->sh_addr, asl_delta + addr);
}
if (Elf64_Shdr::SHT_RELA == sh_type) {
if (sizeof(Elf64_Rela) != sh_entsize) {
char msg[50];
snprintf(msg, sizeof(msg), "bad Rela.sh_entsize %lu", (long)sh_entsize);
throwCantPack(msg);
}
n_jmp_slot = 0;
plt_off = ~0ull;
Elf64_Rela *rela = (Elf64_Rela *)(sh_offset + file_image);
for (int k = sh_size / sh_entsize; --k >= 0; ++rela) {
upx_uint64_t r_addend = get_te64(&rela->r_addend);
upx_uint64_t r_offset = get_te64(&rela->r_offset);
upx_uint64_t r_info = get_te64(&rela->r_info);
unsigned r_type = ELF64_R_TYPE(r_info);
if (xct_off <= r_offset) {
set_te64(&rela->r_offset, asl_delta + r_offset);
}
if (Elf64_Ehdr::EM_AARCH64 == e_machine) {
if (R_AARCH64_RELATIVE == r_type) {
if (xct_off <= r_addend) {
set_te64(&rela->r_addend, asl_delta + r_addend);
}
}
if (R_AARCH64_JUMP_SLOT == r_type) {
// .rela.plt contains offset of the "first time" target
if (plt_off > (asl_delta + r_offset)) {
plt_off = (asl_delta + r_offset);
}
upx_uint64_t d = elf_get_offset_from_address(asl_delta + r_offset);
upx_uint64_t w = get_te64(&file_image[d]);
if (xct_off <= w) {
set_te64(&file_image[d], asl_delta + w);
}
++n_jmp_slot;
}
}
}
fo->seek(sh_offset, SEEK_SET);
fo->rewrite(sh_offset + file_image, sh_size);
}
if (Elf64_Shdr::SHT_REL == sh_type) {
if (sizeof(Elf64_Rel) != sh_entsize) {
char msg[50];
snprintf(msg, sizeof(msg), "bad Rel.sh_entsize %lu", (long)sh_entsize);
throwCantPack(msg);
}
Elf64_Rel *rel = (Elf64_Rel *)(sh_offset + file_image);
for (int k = sh_size / sh_entsize; --k >= 0; ++rel) {
upx_uint64_t r_offset = get_te64(&rel->r_offset);
if (xct_off <= r_offset) {
set_te64(&rel->r_offset, asl_delta + r_offset);
}
// r_offset must be in 2nd PT_LOAD; .p_vaddr was already relocated
upx_uint64_t d = elf_get_offset_from_address(asl_delta + r_offset);
upx_uint64_t w = get_te64(&file_image[d]);
upx_uint64_t r_info = get_te32(&rel->r_info);
unsigned r_type = ELF64_R_TYPE(r_info);
if (xct_off <= w
&& Elf64_Ehdr::EM_AARCH64 == e_machine
&& ( R_AARCH64_RELATIVE == r_type
|| R_AARCH64_JUMP_SLOT == r_type)) {
set_te64(&file_image[d], asl_delta + w);
}
}
fo->seek(sh_offset, SEEK_SET);
fo->rewrite(sh_offset + file_image, sh_size);
}
}
// New copy of Shdr
set_te64(&sec_strndx->sh_offset, (e_shnum * sizeof(Elf64_Shdr)) + sz_elf_hdrs);
fo->seek(xct_off, SEEK_SET); fo->write(shdri, e_shnum * sizeof(Elf64_Shdr));
// New copy of Shdr[.e_shstrndx].[ sh_offset, +.sh_size )
fo->write(shstrtab, sz_shstrtab);
sz_elf_hdrs = fpad4(fo);
//xct_off += asl_delta; // wait until ::pack3
}
memset(&linfo, 0, sizeof(linfo));
fo->write(&linfo, sizeof(linfo));
}
@ -2667,27 +3016,12 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/)
// only execute if option present
if (opt->o_unix.preserve_build_id) {
// set this so we can use elf_find_section_name
e_shnum = ehdri.e_shnum;
// there is a class member similar to this, but I did not
// want to assume it would be available
Elf64_Shdr const *tmp = shdri;
Elf64_Shdr *shdr = NULL;
if (! shdri) {
shdr = New(Elf64_Shdr, e_shnum);
fi->seek(0,SEEK_SET);
fi->seek(ehdri.e_shoff,SEEK_SET);
fi->readx((void*)shdr,ehdri.e_shentsize*ehdri.e_shnum);
// set this so we can use elf_find_section_name
shdri = (Elf64_Shdr *)shdr;
e_shnum = get_te16(&ehdri.e_shnum);
if (!shdri) {
shdri = (Elf64_Shdr *)&file_image[get_te32(&ehdri.e_shoff)];
}
//set the shstrtab
sec_strndx = &shdri[ehdri.e_shstrndx];
sec_strndx = &shdri[get_te16(&ehdri.e_shstrndx)];
char *strtab = New(char, sec_strndx->sh_size);
fi->seek(0,SEEK_SET);
@ -2710,20 +3044,14 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/)
memset(&shdrout,0,sizeof(shdrout));
//setup the build-id
memcpy(&shdrout.shdr[1],buildid, sizeof(shdrout.shdr[1]));
memcpy(&shdrout.shdr[1], buildid, sizeof(shdrout.shdr[1]));
shdrout.shdr[1].sh_name = 1;
//setup the shstrtab
memcpy(&shdrout.shdr[2],sec_strndx, sizeof(shdrout.shdr[2]));
memcpy(&shdrout.shdr[2], sec_strndx, sizeof(shdrout.shdr[2]));
shdrout.shdr[2].sh_name = 20;
shdrout.shdr[2].sh_size = 29; //size of our static shstrtab
}
if (shdr) {
shdri = tmp;
delete [] shdr;
shdr = NULL;
}
}
}
@ -2822,7 +3150,7 @@ int PackLinuxElf32::pack2(OutputFile *fo, Filter &ft)
? (sizeof(Elf32_Ehdr) + sz_phdrs) // main executable
: xct_off; // shared library
if (ft.id < 0x40) {
// FIXME: ?? ft.addvalue += delta;
// FIXME: ?? ft.addvalue += asl_delta;
}
x.offset += delta;
x.size -= delta;
@ -2931,7 +3259,7 @@ int PackLinuxElf64::pack2(OutputFile *fo, Filter &ft)
? (sizeof(Elf64_Ehdr) + sz_phdrs) // main executable
: xct_off; // shared library
if (ft.id < 0x40) {
// FIXME: ?? ft.addvalue += delta;
// FIXME: ?? ft.addvalue += asl_delta;
}
x.offset += delta;
x.size -= delta;
@ -3096,82 +3424,6 @@ void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft)
fo->write(buildid_data,shdrout.shdr[1].sh_size);
}
if (0!=xct_off) { // shared library
if (opt->o_unix.android_shlib && shdri) { // dlopen() checks Elf32_Shdr vs Elf32_Phdr
unsigned load0_hi = ~0u;
Elf32_Phdr const *phdr = phdri;
for (unsigned j = 0; j < e_phnum; ++j, ++phdr) {
unsigned load0_lo = get_te32(&phdr->p_vaddr);
unsigned load0_sz = get_te32(&phdr->p_memsz);
if (PT_LOAD32==get_te32(&phdr->p_type)
&& (xct_off - load0_lo) < load0_sz) {
load0_hi = load0_lo + load0_sz;
break;
}
}
MemBuffer smap(e_shnum); smap.clear(); // smap[0] = 0; // SHN_UNDEF
MemBuffer snew(e_shnum * sizeof(*shdri));
Elf32_Shdr const *shdr = shdri;
unsigned k = 0;
for (unsigned j = 0; j < e_shnum; ++j, ++shdr) {
// Select some Elf32_Shdr by .sh_type
unsigned const type = get_te32(&shdr->sh_type);
unsigned const flags = get_te32(&shdr->sh_flags);
if (((Elf32_Shdr::SHT_STRTAB == type) && (Elf32_Shdr::SHF_ALLOC & flags))
|| ((Elf32_Shdr::SHT_DYNAMIC == type) && (Elf32_Shdr::SHF_ALLOC & flags))
|| ((Elf32_Shdr::SHT_ARM_ATTRIBUTES == type))
|| ( ((1+ Elf32_Shdr::SHT_LOOS) <= type) // SHT_ANDROID_REL
&& ((2+ Elf32_Shdr::SHT_LOOS) >= type)) // SHT_ANDROID_RELA
) {
Elf32_Shdr *const sptr = k + (Elf32_Shdr *)(void *)snew;
unsigned va = get_te32(&shdr->sh_addr);
if (xct_off <= va && va <= load0_hi) {
throwCantPack("Android-required Shdr in packed region");
}
*sptr = *shdr; // copy old Elf32_Shdr
smap[j] = 1+ k++; // for later forwarding
}
}
if (k && fo) {
unsigned const new_shoff = fpad4(fo);
unsigned xtra_off = ((1+ k) * sizeof(*shdri)) + new_shoff; // 1+: shdr_undef
set_te32(&ehdri.e_shoff, new_shoff);
set_te16(&ehdri.e_shentsize, sizeof(*shdri));
set_te16(&ehdri.e_shnum, 1+ k);
Elf32_Shdr shdr_undef; memset(&shdr_undef, 0, sizeof(shdr_undef));
fo->write(&shdr_undef, sizeof(shdr_undef));
unsigned arm_attr_offset = 0;
unsigned arm_attr_size = 0;
for (unsigned j = 0; j < k; ++j) { // forward .sh_link
Elf32_Shdr *const sptr = j + (Elf32_Shdr *)(void *)snew;
unsigned const type = get_te32(&sptr->sh_type);
// work-around for https://bugs.launchpad.net/bugs/1712938
if (Elf32_Shdr::SHT_ARM_ATTRIBUTES == type) {
arm_attr_offset = get_te32(&sptr->sh_offset);
arm_attr_size = get_te32(&sptr->sh_size);
set_te32(&sptr->sh_offset, xtra_off);
xtra_off += get_te32(&sptr->sh_size);
}
if (Elf32_Shdr::SHT_STRTAB == type) { // any SHT_STRTAB should work
set_te16(&elfout.ehdr.e_shstrndx, 1+ j); // 1+: shdr_undef
set_te16( &ehdri.e_shstrndx, 1+ j); // 1+: shdr_undef
}
unsigned sh_offset = get_te32(&sptr->sh_offset);
if (xct_off <= sh_offset) {
set_te32(&sptr->sh_offset, so_slide + sh_offset);
}
sptr->sh_name = 0; // we flushed .e_shstrndx
set_te16(&sptr->sh_link, smap[sptr->sh_link]);
set_te16(&sptr->sh_info, smap[sptr->sh_info]); // ?
}
fo->write(snew, k * sizeof(*shdri));
if (arm_attr_offset) {
fo->write(&file_image[arm_attr_offset], arm_attr_size);
}
}
}
}
// Cannot pre-round .p_memsz. If .p_filesz < .p_memsz, then kernel
// tries to make .bss, which requires PF_W.
// But strict SELinux (or PaX, grSecurity) disallows PF_W with PF_X.
@ -3234,82 +3486,6 @@ void PackLinuxElf64::pack4(OutputFile *fo, Filter &ft)
fo->write(buildid_data,shdrout.shdr[1].sh_size);
}
if (0!=xct_off) { // shared library
if (opt->o_unix.android_shlib && shdri) { // dlopen() checks Elf64_Shdr vs Elf64_Phdr
unsigned load0_hi = ~0u;
Elf64_Phdr const *phdr = phdri;
for (unsigned j = 0; j < e_phnum; ++j, ++phdr) {
upx_uint64_t load0_lo = get_te64(&phdr->p_vaddr);
upx_uint64_t load0_sz = get_te64(&phdr->p_memsz);
if (PT_LOAD64==get_te32(&phdr->p_type)
&& (xct_off - load0_lo) < load0_sz) {
load0_hi = load0_lo + load0_sz;
break;
}
}
MemBuffer smap(e_shnum); smap.clear(); // smap[0] = 0; // SHN_UNDEF
MemBuffer snew(e_shnum * sizeof(*shdri));
Elf64_Shdr const *shdr = shdri;
unsigned k = 0;
for (unsigned j = 0; j < e_shnum; ++j, ++shdr) {
// Select some Elf64_Shdr by .sh_type
unsigned const type = get_te32(&shdr->sh_type);
unsigned const flags = get_te32(&shdr->sh_flags);
if (((Elf64_Shdr::SHT_STRTAB == type) && (Elf64_Shdr::SHF_ALLOC & flags))
|| ((Elf64_Shdr::SHT_DYNAMIC == type) && (Elf64_Shdr::SHF_ALLOC & flags))
|| ((Elf64_Shdr::SHT_ARM_ATTRIBUTES == type))
|| ( ((1+ Elf64_Shdr::SHT_LOOS) <= type) // SHT_ANDROID_REL
&& ((2+ Elf64_Shdr::SHT_LOOS) >= type)) // SHT_ANDROID_RELA
) {
Elf64_Shdr *const sptr = k + (Elf64_Shdr *)(void *)snew;
upx_uint64_t va = get_te64(&shdr->sh_addr);
if (xct_off <= va && va <= load0_hi) {
throwCantPack("Android-required Shdr in packed region");
}
*sptr = *shdr; // copy old Elf64_Shdr
smap[j] = 1+ k++; // for later forwarding
}
}
if (k && fo) {
unsigned long const new_shoff = fpad8(fo);
unsigned long xtra_off = ((1+ k) * sizeof(*shdri)) + new_shoff; // 1+: shdr_undef
set_te64(&ehdri.e_shoff, new_shoff);
set_te16(&ehdri.e_shentsize, sizeof(*shdri));
set_te16(&ehdri.e_shnum, 1+ k);
Elf64_Shdr shdr_undef; memset(&shdr_undef, 0, sizeof(shdr_undef));
fo->write(&shdr_undef, sizeof(shdr_undef));
unsigned long arm_attr_offset = 0;
unsigned long arm_attr_size = 0;
for (unsigned j = 0; j < k; ++j) { // forward .sh_link
Elf64_Shdr *const sptr = j + (Elf64_Shdr *)(void *)snew;
unsigned const type = get_te32(&sptr->sh_type);
// work-around for https://bugs.launchpad.net/bugs/1712938
if (Elf64_Shdr::SHT_ARM_ATTRIBUTES == type) {
arm_attr_offset = get_te64(&sptr->sh_offset);
arm_attr_size = get_te64(&sptr->sh_size);
set_te64(&sptr->sh_offset, xtra_off);
xtra_off += get_te64(&sptr->sh_size);
}
if (Elf64_Shdr::SHT_STRTAB == type) { // any SHT_STRTAB should work
set_te16(&elfout.ehdr.e_shstrndx, 1+ j); // 1+: shdr_undef
set_te16( &ehdri.e_shstrndx, 1+ j); // 1+: shdr_undef
}
upx_uint64_t sh_offset = get_te64(&sptr->sh_offset);
if (xct_off <= sh_offset) {
set_te64(&sptr->sh_offset, so_slide + sh_offset);
}
sptr->sh_name = 0; // we flushed .e_shstrndx
set_te16(&sptr->sh_link, smap[sptr->sh_link]);
set_te16(&sptr->sh_info, smap[sptr->sh_info]); // ?
}
fo->write(snew, k * sizeof(*shdri));
if (arm_attr_offset) {
fo->write(&file_image[arm_attr_offset], arm_attr_size);
}
}
}
}
// Cannot pre-round .p_memsz. If .p_filesz < .p_memsz, then kernel
// tries to make .bss, which requires PF_W.
// But strict SELinux (or PaX, grSecurity) disallows PF_W with PF_X.
@ -3321,7 +3497,7 @@ void PackLinuxElf64::pack4(OutputFile *fo, Filter &ft)
if (0!=xct_off) { // shared library
fo->rewrite(&ehdri, sizeof(ehdri));
fo->rewrite(phdri, e_phnum * sizeof(*phdri));
fo->seek(xct_off, SEEK_SET);
fo->seek(sz_elf_hdrs, SEEK_SET);
fo->rewrite(&linfo, sizeof(linfo));
}
else {
@ -3865,7 +4041,7 @@ PackLinuxElf64::elf_find_dynamic(unsigned int key) const
&& Elf64_Dyn::DT_NULL!=dynp->d_tag; ++dynp) if (get_te64(&dynp->d_tag)==key) {
upx_uint64_t const t= elf_get_offset_from_address(get_te64(&dynp->d_val));
if (t) {
return (size_t)t + file_image;
return &((unsigned char const *)file_image)[(size_t)t];
}
break;
}

View File

@ -68,6 +68,7 @@ protected:
static unsigned gnu_hash(char const *) /*const*/;
protected:
unsigned int const asl_delta = (1u<<12); // --android-shlib extra page
unsigned e_type;
unsigned e_phnum; /* Program header table entry count */
unsigned e_shnum;
@ -157,7 +158,7 @@ protected:
protected:
Elf32_Ehdr ehdri; // from input file
Elf32_Phdr *phdri; // for input file
Elf32_Shdr const *shdri; // from input file
Elf32_Shdr *shdri; // from input file
Elf32_Phdr const *gnu_stack; // propagate NX
unsigned e_phoff;
unsigned e_shoff;
@ -174,7 +175,7 @@ protected:
Elf32_Sym const *jni_onload_sym;
char const *shstrtab; // via Elf32_Shdr
Elf32_Shdr const *sec_strndx;
Elf32_Shdr *sec_strndx;
Elf32_Shdr const *sec_dynsym;
Elf32_Shdr const *sec_dynstr;
@ -282,7 +283,7 @@ protected:
protected:
Elf64_Ehdr ehdri; // from input file
Elf64_Phdr *phdri; // for input file
Elf64_Shdr const *shdri; // from input file
Elf64_Shdr *shdri; // from input file
Elf64_Phdr const *gnu_stack; // propagate NX
upx_uint64_t e_phoff;
upx_uint64_t e_shoff;
@ -290,6 +291,8 @@ protected:
upx_uint64_t so_slide;
unsigned char *note_body; // concatenated contents of PT_NOTEs, if any
unsigned note_size; // total size of PT_NOTEs
unsigned n_jmp_slot;
upx_uint64_t plt_off;
upx_uint64_t page_mask; // AND clears the offset-within-page
Elf64_Dyn const *dynseg; // from PT_DYNAMIC
@ -299,7 +302,7 @@ protected:
Elf64_Sym const *jni_onload_sym;
char const *shstrtab; // via Elf64_Shdr
Elf64_Shdr const *sec_strndx;
Elf64_Shdr *sec_strndx;
Elf64_Shdr const *sec_dynsym;
Elf64_Shdr const *sec_dynstr;

File diff suppressed because it is too large Load Diff

View File

@ -32,15 +32,15 @@
#define STUB_ARM_V5T_LINUX_SHLIB_INIT_SIZE 15566
#define STUB_ARM_V5T_LINUX_SHLIB_INIT_ADLER32 0x4b0e1f0a
#define STUB_ARM_V5T_LINUX_SHLIB_INIT_CRC32 0x0f45a16c
#define STUB_ARM_V5T_LINUX_SHLIB_INIT_ADLER32 0x0d0d1f66
#define STUB_ARM_V5T_LINUX_SHLIB_INIT_CRC32 0x43a6af0c
unsigned char stub_arm_v5t_linux_shlib_init[15566] = {
/* 0x0000 */ 127, 69, 76, 70, 1, 1, 1, 97, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0, 40, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 236, 20, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0,
/* 0x0030 */ 0, 0, 0, 0,192, 70,255,181, 0,161, 24, 57, 13, 28, 12,104,
/* 0x0040 */ 45, 27, 75,104, 91, 25, 8,147,200,104, 64, 25, 24, 33, 9, 24,
/* 0x0030 */ 0, 0, 0, 0,192, 70,255,181, 0,161, 28, 57, 11,104, 13, 29,
/* 0x0040 */ 76,104, 45, 27,140,104,100, 25, 8,148, 8,105, 64, 25, 89, 25,
/* 0x0050 */ 131,176, 0,181, 76,104, 12, 49, 9, 25, 0,240,166,248, 3, 5,
/* 0x0060 */ 27, 13,228, 24, 16,180,192, 26, 1,180,228, 26,192, 24,155, 8,
/* 0x0070 */ 8,180, 0, 0, 0,240, 57,248, 27, 6,137, 8, 27, 14,137, 0,

View File

@ -1,5 +1,5 @@
/* arm64-linux.shlib-init.h
created from arm64-linux.shlib-init.bin, 8646 (0x21c6) bytes
created from arm64-linux.shlib-init.bin, 8654 (0x21ce) bytes
This file is part of the UPX executable compressor.
@ -31,14 +31,14 @@
*/
#define STUB_ARM64_LINUX_SHLIB_INIT_SIZE 8646
#define STUB_ARM64_LINUX_SHLIB_INIT_ADLER32 0xe9b387bd
#define STUB_ARM64_LINUX_SHLIB_INIT_CRC32 0xb2aee707
#define STUB_ARM64_LINUX_SHLIB_INIT_SIZE 8654
#define STUB_ARM64_LINUX_SHLIB_INIT_ADLER32 0x8c2f89f3
#define STUB_ARM64_LINUX_SHLIB_INIT_CRC32 0x0cefe3fe
unsigned char stub_arm64_linux_shlib_init[8646] = {
unsigned char stub_arm64_linux_shlib_init[8654] = {
/* 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,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,176, 24, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,184, 24, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
/* 0x0040 */ 224, 7,180,169,226, 3, 1,169,254, 23, 0,249, 0, 0, 0,148,
/* 0x0050 */ 254, 15, 31,248,226, 15,191,169, 7, 64, 33,139, 5, 0,128, 18,
@ -336,245 +336,245 @@ unsigned char stub_arm64_linux_shlib_init[8646] = {
/* 0x1290 */ 108,101,100, 46, 10, 0, 67,132, 64,248,227,255,255,181, 3, 0,
/* 0x12a0 */ 130,210, 64, 4,193,168, 96, 0, 0,180, 31, 24, 0,241,161,255,
/* 0x12b0 */ 255, 84, 33, 0,131,154,225, 3, 1,203,225,255,129,146,225, 19,
/* 0x12c0 */ 0,249,226, 3, 30,170, 65,128, 0,209,229, 3, 1,170, 36, 68,
/* 0x12d0 */ 64,184,165, 0, 4,203, 36, 68, 64,184,164, 0, 4,139,228, 15,
/* 0x12e0 */ 0,249, 36, 68, 64,184,164, 0, 4,139,228, 27, 0,249, 36, 68,
/* 0x12f0 */ 64,184,160, 0, 4,139, 1, 96, 0,145, 36, 4, 64,185, 33, 48,
/* 0x1300 */ 0,145, 33, 0, 4,139,229, 35, 64,185, 36, 68, 64,184, 5, 0,
/* 0x1310 */ 37, 10,165, 12, 0, 17,165,116, 30, 18,132, 0, 5, 11, 0, 64,
/* 0x1320 */ 37,203,224,147, 4,169, 0, 64, 37,139,132, 0, 5, 75, 16, 0,
/* 0x1330 */ 0,148, 99, 28, 0, 18,127, 72, 1,113,129, 1, 0, 84, 33,252,
/* 0x1340 */ 66,211, 65, 1, 0,180, 33, 4, 0,209, 2,120, 97,184, 67,120,
/* 0x1350 */ 26, 83,127, 20, 0,113,129, 0, 0, 84, 67, 0, 1, 75, 98,100,
/* 0x1360 */ 0, 51, 2,120, 33,184, 1,255,255,181,192, 3, 95,214,165,124,
/* 0x1370 */ 2, 83,254,151, 5,169, 35, 20, 64, 57, 38, 24, 64, 57,224,147,
/* 0x1380 */ 6,169,230,143, 7,169, 36, 68, 64,184,229, 3, 4, 42, 36, 68,
/* 0x1390 */ 64,184,226,147, 8,169,227,195, 1,145,225,151, 9,169,224,143,
/* 0x13a0 */ 10,169,165, 12, 0,145,227, 99, 64,185, 98, 8, 69,139,227, 71,
/* 0x13b0 */ 64,249, 99, 0, 0,148,227, 47, 64,249, 97, 0, 0,148, 53, 0,
/* 0x13c0 */ 0,148, 5, 0,128,210, 4, 0,128,146, 67, 6,128,210, 98, 0,
/* 0x13d0 */ 128,210,224,135, 68,169,230, 3, 0,170,200, 27,128, 82, 1, 0,
/* 0x13e0 */ 0,212, 31, 0, 6,235, 64, 0, 0, 84, 0, 0, 32,212,229, 99,
/* 0x13f0 */ 64,185,225, 31, 64,249, 29, 0, 0,148,228, 71, 64,249,224,135,
/* 0x1400 */ 73,169,226,143, 74,169,128, 0, 63,214, 4, 0, 0,148, 1, 0,
/* 0x1410 */ 0,212,224, 7,204,168, 96, 0, 31,214,228, 27, 64,249,192, 7,
/* 0x1420 */ 64,169,128, 0, 0,249,129, 8, 0,185,228, 47, 64,249,226,143,
/* 0x1430 */ 71,169,224,135, 70,169, 67, 0, 0,180,128, 0, 63,214,224,135,
/* 0x1440 */ 68,169,162, 0,128,210, 72, 28,128, 82, 1, 0, 0,212,254,147,
/* 0x1450 */ 66,169,224,135, 67,169,232, 26,128, 82,226, 15, 65,169,128, 0,
/* 0x1460 */ 31,214, 37,192, 95,184,165, 92, 0, 18,133, 0, 0, 54, 35, 68,
/* 0x1470 */ 64,184,165, 4, 0, 81, 3, 68, 0,184,165, 0, 0, 52, 34, 12,
/* 0x1480 */ 193, 40,165, 8, 0, 81, 2, 12,129, 40,165,255,255, 53,192, 3,
/* 0x1490 */ 95,214,254, 95, 0,249,227, 3, 30,170, 41, 0, 0,148, 65,244,
/* 0x14a0 */ 126,211, 5, 0,128,210, 4, 0,128,146, 67, 4,128,210, 98, 0,
/* 0x14b0 */ 128,210,225, 35, 0,249, 0, 0,128,210,200, 27,128, 82, 1, 0,
/* 0x14c0 */ 0,212, 31, 4, 64,177, 67, 0, 0, 84, 0, 0, 32,212,224, 31,
/* 0x14d0 */ 0,249,225, 39, 64,249,229, 99, 64,185,228,255,255,151,225,151,
/* 0x14e0 */ 73,169,224, 79, 0,249,165, 12, 0, 17,165,124, 2, 83,223,255,
/* 0x14f0 */ 255,151,226, 3, 0,170,225, 71, 64,249,224, 71, 0,249,217,255,
/* 0x1500 */ 255,151,225, 47, 64,249,224, 47, 0,249,214,255,255,151,225, 95,
/* 0x1510 */ 64,249,224, 95, 0,249,211,255,255,151,224,135, 67,169,162, 0,
/* 0x1520 */ 128,210, 72, 28,128, 82, 1, 0, 0,212, 31, 4, 64,177, 67, 0,
/* 0x1530 */ 0, 84, 0, 0, 32,212,254, 95, 64,249,192, 3, 31,214, 99,192,
/* 0x1540 */ 95,184, 99, 92, 0, 18, 66, 0, 3,139,192, 3, 95,214,102,105,
/* 0x1550 */ 108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,
/* 0x1560 */ 108,105,116,116,108,101, 97, 97,114, 99,104, 54, 52, 10, 10, 83,
/* 0x1570 */ 101, 99,116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,
/* 0x1580 */ 101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32,
/* 0x1590 */ 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x15a0 */ 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32,
/* 0x15b0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,
/* 0x15c0 */ 102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32,
/* 0x15d0 */ 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32,
/* 0x15e0 */ 32, 48, 48, 48, 48, 48, 48, 49, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x15f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1600 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1610 */ 48, 48, 48, 48, 48, 52, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x1620 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32,
/* 0x1630 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 78, 82, 86,
/* 0x1640 */ 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x1650 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1660 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53,
/* 0x1680 */ 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x1690 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 50, 32,
/* 0x16a0 */ 78, 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, 32, 32, 48, 48,
/* 0x16b0 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x16d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x16e0 */ 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x16f0 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32,
/* 0x1700 */ 32, 51, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x1710 */ 32, 48, 48, 48, 48, 48, 49, 50, 56, 32, 32, 48, 48, 48, 48, 48,
/* 0x1720 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1730 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1740 */ 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x1750 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76,
/* 0x1760 */ 89, 10, 32, 32, 52, 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32,
/* 0x1770 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 49, 99, 32, 32, 48, 48,
/* 0x1780 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x1790 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17a0 */ 32, 32, 48, 48, 48, 48, 48, 49, 55, 56, 32, 32, 50, 42, 42, 48,
/* 0x17b0 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68,
/* 0x17c0 */ 79, 78, 76, 89, 10, 32, 32, 53, 32, 78, 82, 86, 50, 66, 32, 32,
/* 0x17d0 */ 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,102, 48, 32,
/* 0x17e0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17f0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1800 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 57, 52, 32, 32, 50,
/* 0x1810 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82,
/* 0x1820 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 54, 32, 76, 90, 77, 65,
/* 0x1830 */ 95, 69, 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1840 */ 100, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1850 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1860 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 51, 56, 52,
/* 0x1870 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x1880 */ 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76,
/* 0x1890 */ 89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48,
/* 0x18a0 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 57, 54, 56, 32, 32, 48, 48,
/* 0x18b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x18c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18d0 */ 32, 32, 48, 48, 48, 48, 48, 52, 53, 52, 32, 32, 50, 42, 42, 48,
/* 0x18e0 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68,
/* 0x18f0 */ 79, 78, 76, 89, 10, 32, 32, 56, 32, 76, 90, 77, 65, 95, 68, 69,
/* 0x1900 */ 67, 49, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 52, 57, 99, 32,
/* 0x1910 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1920 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1930 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,100, 98, 99, 32, 32, 50,
/* 0x1940 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82,
/* 0x1950 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 57, 32, 76, 90, 77, 65,
/* 0x1960 */ 95, 68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1970 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1980 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1990 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 53, 56,
/* 0x19a0 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x19b0 */ 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 48, 32, 69,
/* 0x19c0 */ 76, 70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, 32, 48, 48, 48,
/* 0x19d0 */ 48, 48, 48, 51,101, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x19e0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x19f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49,
/* 0x1a00 */ 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69,
/* 0x1a10 */ 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49,
/* 0x1a20 */ 49, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, 32,
/* 0x1a30 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1a40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1a50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1a60 */ 48, 48, 49, 50, 57, 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79,
/* 0x1a70 */ 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89,
/* 0x1a80 */ 10, 32, 49, 50, 32, 69, 76, 70, 77, 65, 74, 78, 90, 32, 32, 32,
/* 0x1a90 */ 32, 32, 32, 48, 48, 48, 48, 48, 48, 50, 52, 32, 32, 48, 48, 48,
/* 0x1aa0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1ab0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1ac0 */ 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32, 50, 42, 42, 48, 32,
/* 0x1ad0 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79,
/* 0x1ae0 */ 78, 76, 89, 10, 32, 49, 51, 32, 65, 78, 68, 77, 65, 74, 78, 90,
/* 0x1af0 */ 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 52, 32, 32,
/* 0x1b00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b10 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b20 */ 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 98, 97, 32, 32, 50, 42,
/* 0x1b30 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69,
/* 0x1b40 */ 65, 68, 79, 78, 76, 89, 10, 32, 49, 52, 32, 69, 76, 70, 77, 65,
/* 0x1b50 */ 75, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 50, 57,
/* 0x1b60 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b70 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b80 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 98,101, 32,
/* 0x1b90 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x1ba0 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, 77, 66, 79, 76,
/* 0x1bb0 */ 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1bc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1bd0 */ 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 9, 48, 48, 48, 48,
/* 0x1be0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77,
/* 0x1bf0 */ 65, 95, 68, 69, 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c00 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1c10 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48,
/* 0x1c20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65,
/* 0x1c30 */ 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c40 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70,
/* 0x1c50 */ 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c60 */ 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 10,
/* 0x1c70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c80 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 72, 69, 65,
/* 0x1c90 */ 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ca0 */ 48, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, 10, 48, 48, 48, 48,
/* 0x1cb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1cc0 */ 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, 9, 48, 48,
/* 0x1cd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78,
/* 0x1ce0 */ 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1cf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1d00 */ 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d10 */ 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, 10, 48, 48,
/* 0x1d20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1d30 */ 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68, 9, 48, 48, 48,
/* 0x1d40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82,
/* 0x1d50 */ 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d60 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86,
/* 0x1d70 */ 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d80 */ 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, 48, 48,
/* 0x1d90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1da0 */ 100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 9, 48, 48,
/* 0x1db0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,
/* 0x1dc0 */ 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, 48,
/* 0x1dd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1de0 */ 100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 9, 48, 48,
/* 0x1df0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,
/* 0x1e00 */ 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, 48,
/* 0x1e10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1e20 */ 100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9, 48, 48,
/* 0x1e30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,
/* 0x1e40 */ 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48,
/* 0x1e50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1e60 */ 100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48,
/* 0x1e70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70,
/* 0x1e80 */ 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e90 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69,
/* 0x1ea0 */ 76, 70, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1eb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 74, 78,
/* 0x1ec0 */ 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ed0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 65, 78, 68, 77, 65,
/* 0x1ee0 */ 74, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ef0 */ 48, 48, 48, 48, 32, 65, 78, 68, 77, 65, 74, 78, 90, 10, 48, 48,
/* 0x1f00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1f10 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 75, 78, 90, 9,
/* 0x1f20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f30 */ 32, 69, 76, 70, 77, 65, 75, 78, 90, 10, 48, 48, 48, 48, 48, 48,
/* 0x1f40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32,
/* 0x1f50 */ 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48,
/* 0x1f60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116,
/* 0x1f70 */ 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f80 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86,
/* 0x1f90 */ 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fa0 */ 49, 50, 56, 32,117, 99,108, 95,110,114,118, 50,101, 95,100,101,
/* 0x1fb0 */ 99,111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48,
/* 0x1fc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x1fd0 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 68, 9, 48, 48, 48, 48, 48,
/* 0x1fe0 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 99, 32,117, 99,108, 95,
/* 0x1ff0 */ 110,114,118, 50,100, 95,100,101, 99,111,109,112,114,101,115,115,
/* 0x2000 */ 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2010 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86,
/* 0x2020 */ 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2030 */ 48,102, 48, 32,117, 99,108, 95,110,114,118, 50, 98, 95,100,101,
/* 0x2040 */ 99,111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48,
/* 0x2050 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x2060 */ 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 9,
/* 0x2070 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2080 */ 32, 76,122,109, 97, 68,101, 99,111,100,101, 10, 48, 48, 48, 48,
/* 0x2090 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x20a0 */ 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, 48, 48,
/* 0x20b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,101,
/* 0x20c0 */ 110,100, 95,100,101, 99,111,109,112,114,101,115,115, 10, 10, 82,
/* 0x20d0 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68,
/* 0x20e0 */ 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, 93,
/* 0x20f0 */ 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2100 */ 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2110 */ 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48,
/* 0x2120 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 99, 32, 82, 95, 65, 65,
/* 0x2130 */ 82, 67, 72, 54, 52, 95, 67, 65, 76, 76, 50, 54, 32, 32, 69, 76,
/* 0x2140 */ 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73,
/* 0x2150 */ 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91,
/* 0x2160 */ 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, 70,
/* 0x2170 */ 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89,
/* 0x2180 */ 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2190 */ 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x21a0 */ 48, 48, 48, 48, 48, 52, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52,
/* 0x21b0 */ 95, 67, 79, 78, 68, 66, 82, 49, 57, 32, 32, 76, 90, 77, 65, 95,
/* 0x21c0 */ 68, 69, 67, 51, 48, 10
/* 0x12c0 */ 0,249,226, 3, 30,170, 65,144, 0,209, 36, 68, 64,184,227, 3,
/* 0x12d0 */ 4, 42,229, 3, 1,170, 36, 68, 64,184,165, 0, 4,203, 36, 68,
/* 0x12e0 */ 64,184,132, 0, 5,139,228, 15, 0,249, 36, 68, 64,184,132, 0,
/* 0x12f0 */ 5,139,228, 27, 0,249, 36, 68, 64,184,128, 0, 5,139, 97, 0,
/* 0x1300 */ 5,139, 36, 4, 64,185, 33, 48, 0,145, 33, 0, 4,139,229, 35,
/* 0x1310 */ 64,185, 36, 68, 64,184, 5, 0, 37, 10,165, 12, 0, 17,165,116,
/* 0x1320 */ 30, 18,132, 0, 5, 11, 0, 64, 37,203,224,147, 4,169, 0, 64,
/* 0x1330 */ 37,139,132, 0, 5, 75, 16, 0, 0,148, 99, 28, 0, 18,127, 72,
/* 0x1340 */ 1,113,129, 1, 0, 84, 33,252, 66,211, 65, 1, 0,180, 33, 4,
/* 0x1350 */ 0,209, 2,120, 97,184, 67,120, 26, 83,127, 20, 0,113,129, 0,
/* 0x1360 */ 0, 84, 67, 0, 1, 75, 98,100, 0, 51, 2,120, 33,184, 1,255,
/* 0x1370 */ 255,181,192, 3, 95,214,165,124, 2, 83,254,151, 5,169, 35, 20,
/* 0x1380 */ 64, 57, 38, 24, 64, 57,224,147, 6,169,230,143, 7,169, 36, 68,
/* 0x1390 */ 64,184,229, 3, 4, 42, 36, 68, 64,184,226,147, 8,169,227,195,
/* 0x13a0 */ 1,145,225,151, 9,169,224,143, 10,169,165, 12, 0,145,227, 99,
/* 0x13b0 */ 64,185, 98, 8, 69,139,227, 71, 64,249, 99, 0, 0,148,227, 47,
/* 0x13c0 */ 64,249, 97, 0, 0,148, 53, 0, 0,148, 5, 0,128,210, 4, 0,
/* 0x13d0 */ 128,146, 67, 6,128,210, 98, 0,128,210,224,135, 68,169,230, 3,
/* 0x13e0 */ 0,170,200, 27,128, 82, 1, 0, 0,212, 31, 0, 6,235, 64, 0,
/* 0x13f0 */ 0, 84, 0, 0, 32,212,229, 99, 64,185,225, 31, 64,249, 29, 0,
/* 0x1400 */ 0,148,228, 71, 64,249,224,135, 73,169,226,143, 74,169,128, 0,
/* 0x1410 */ 63,214, 4, 0, 0,148, 1, 0, 0,212,224, 7,204,168, 96, 0,
/* 0x1420 */ 31,214,228, 27, 64,249,192, 7, 64,169,128, 0, 0,249,129, 8,
/* 0x1430 */ 0,185,228, 47, 64,249,226,143, 71,169,224,135, 70,169, 67, 0,
/* 0x1440 */ 0,180,128, 0, 63,214,224,135, 68,169,162, 0,128,210, 72, 28,
/* 0x1450 */ 128, 82, 1, 0, 0,212,254,147, 66,169,224,135, 67,169,232, 26,
/* 0x1460 */ 128, 82,226, 15, 65,169,128, 0, 31,214, 37,192, 95,184,165, 92,
/* 0x1470 */ 0, 18,133, 0, 0, 54, 35, 68, 64,184,165, 4, 0, 81, 3, 68,
/* 0x1480 */ 0,184,165, 0, 0, 52, 34, 12,193, 40,165, 8, 0, 81, 2, 12,
/* 0x1490 */ 129, 40,165,255,255, 53,192, 3, 95,214,254, 95, 0,249,227, 3,
/* 0x14a0 */ 30,170, 41, 0, 0,148, 65,244,126,211, 5, 0,128,210, 4, 0,
/* 0x14b0 */ 128,146, 67, 4,128,210, 98, 0,128,210,225, 35, 0,249, 0, 0,
/* 0x14c0 */ 128,210,200, 27,128, 82, 1, 0, 0,212, 31, 4, 64,177, 67, 0,
/* 0x14d0 */ 0, 84, 0, 0, 32,212,224, 31, 0,249,225, 39, 64,249,229, 99,
/* 0x14e0 */ 64,185,228,255,255,151,225,151, 73,169,224, 79, 0,249,165, 12,
/* 0x14f0 */ 0, 17,165,124, 2, 83,223,255,255,151,226, 3, 0,170,225, 71,
/* 0x1500 */ 64,249,224, 71, 0,249,217,255,255,151,225, 47, 64,249,224, 47,
/* 0x1510 */ 0,249,214,255,255,151,225, 95, 64,249,224, 95, 0,249,211,255,
/* 0x1520 */ 255,151,224,135, 67,169,162, 0,128,210, 72, 28,128, 82, 1, 0,
/* 0x1530 */ 0,212, 31, 4, 64,177, 67, 0, 0, 84, 0, 0, 32,212,254, 95,
/* 0x1540 */ 64,249,192, 3, 31,214, 99,192, 95,184, 99, 92, 0, 18, 66, 0,
/* 0x1550 */ 3,139,192, 3, 95,214,102,105,108,101, 32,102,111,114,109, 97,
/* 0x1560 */ 116, 32,101,108,102, 54, 52, 45,108,105,116,116,108,101, 97, 97,
/* 0x1570 */ 114, 99,104, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58,
/* 0x1580 */ 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32,
/* 0x1590 */ 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65,
/* 0x15a0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76,
/* 0x15b0 */ 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x15c0 */ 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32,
/* 0x15d0 */ 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65,
/* 0x15e0 */ 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49,
/* 0x15f0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1600 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1610 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32,
/* 0x1620 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x1630 */ 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89,
/* 0x1640 */ 10, 32, 32, 49, 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32,
/* 0x1650 */ 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1680 */ 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32,
/* 0x1690 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79,
/* 0x16a0 */ 78, 76, 89, 10, 32, 32, 50, 32, 78, 82, 86, 95, 84, 65, 73, 76,
/* 0x16b0 */ 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x16c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16d0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16e0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42,
/* 0x16f0 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69,
/* 0x1700 */ 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, 69,
/* 0x1710 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 50,
/* 0x1720 */ 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1730 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1740 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32,
/* 0x1750 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x1760 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82,
/* 0x1770 */ 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x1780 */ 48, 49, 49, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1790 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49,
/* 0x17b0 */ 55, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x17c0 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53,
/* 0x17d0 */ 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48,
/* 0x17e0 */ 48, 48, 48, 48, 48,102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x17f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x1800 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1810 */ 48, 48, 50, 57, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x1820 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x1830 */ 32, 32, 54, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 32,
/* 0x1840 */ 32, 32, 48, 48, 48, 48, 48, 48,100, 48, 32, 32, 48, 48, 48, 48,
/* 0x1850 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1860 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x1870 */ 48, 48, 48, 48, 48, 51, 56, 52, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x1880 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44,
/* 0x1890 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90,
/* 0x18a0 */ 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x18b0 */ 48, 57, 54, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18c0 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52,
/* 0x18e0 */ 53, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x18f0 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56,
/* 0x1900 */ 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48,
/* 0x1910 */ 48, 48, 48, 48, 52, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x1920 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x1930 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1940 */ 48, 48,100, 98, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x1950 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x1960 */ 32, 32, 57, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32,
/* 0x1970 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1980 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1990 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x19a0 */ 48, 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x19b0 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x19c0 */ 76, 89, 10, 32, 49, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32,
/* 0x19d0 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 51,101, 32, 32, 48,
/* 0x19e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x19f0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a00 */ 48, 32, 32, 48, 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42,
/* 0x1a10 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x1a20 */ 68, 79, 78, 76, 89, 10, 32, 49, 49, 32, 69, 76, 70, 77, 65, 73,
/* 0x1a30 */ 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a40 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a50 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a60 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32,
/* 0x1a70 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x1a80 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 50, 32, 69, 76, 70,
/* 0x1a90 */ 77, 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x1aa0 */ 48, 50, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ab0 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ac0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57,
/* 0x1ad0 */ 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x1ae0 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 51, 32,
/* 0x1af0 */ 65, 78, 68, 77, 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48,
/* 0x1b00 */ 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b10 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1b20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1b30 */ 49, 50, 98, 97, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x1b40 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32,
/* 0x1b50 */ 49, 52, 32, 69, 76, 70, 77, 65, 75, 78, 90, 32, 32, 32, 32, 32,
/* 0x1b60 */ 32, 48, 48, 48, 48, 48, 50, 57, 56, 32, 32, 48, 48, 48, 48, 48,
/* 0x1b70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1b80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1b90 */ 48, 48, 48, 49, 50, 98,101, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x1ba0 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76,
/* 0x1bb0 */ 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10,
/* 0x1bc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1bd0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69,
/* 0x1be0 */ 67, 51, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1bf0 */ 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10,
/* 0x1c00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c10 */ 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x1c20 */ 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c30 */ 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48,
/* 0x1c40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1c50 */ 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48,
/* 0x1c60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69,
/* 0x1c70 */ 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c80 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1c90 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 9, 48, 48, 48, 48, 48, 48,
/* 0x1ca0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 72,
/* 0x1cb0 */ 69, 65, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1cc0 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86,
/* 0x1cd0 */ 95, 84, 65, 73, 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ce0 */ 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10,
/* 0x1cf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d00 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48,
/* 0x1d10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1d20 */ 78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d30 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78,
/* 0x1d40 */ 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d50 */ 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48,
/* 0x1d60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1d70 */ 32, 32,100, 32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48,
/* 0x1d80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50,
/* 0x1d90 */ 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1da0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95,
/* 0x1db0 */ 69, 76, 70, 48, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1dc0 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48,
/* 0x1dd0 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1de0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95,
/* 0x1df0 */ 68, 69, 67, 50, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e00 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50,
/* 0x1e10 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e20 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95,
/* 0x1e30 */ 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e40 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49,
/* 0x1e50 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e60 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65,
/* 0x1e70 */ 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e80 */ 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48,
/* 0x1e90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1ea0 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 74, 78, 90, 9,
/* 0x1eb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ec0 */ 32, 69, 76, 70, 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48,
/* 0x1ed0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1ee0 */ 100, 32, 32, 65, 78, 68, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48,
/* 0x1ef0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 78, 68,
/* 0x1f00 */ 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f10 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69,
/* 0x1f20 */ 76, 70, 77, 65, 75, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f30 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 75, 78,
/* 0x1f40 */ 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f50 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65,
/* 0x1f60 */ 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f70 */ 48, 48, 48, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48,
/* 0x1f80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x1f90 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48,
/* 0x1fa0 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 50, 56, 32,117, 99,108, 95,
/* 0x1fb0 */ 110,114,118, 50,101, 95,100,101, 99,111,109,112,114,101,115,115,
/* 0x1fc0 */ 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fd0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86,
/* 0x1fe0 */ 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ff0 */ 49, 49, 99, 32,117, 99,108, 95,110,114,118, 50,100, 95,100,101,
/* 0x2000 */ 99,111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48,
/* 0x2010 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x2020 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48,
/* 0x2030 */ 48, 48, 48, 48, 48, 48, 48, 48, 48,102, 48, 32,117, 99,108, 95,
/* 0x2040 */ 110,114,118, 50, 98, 95,100,101, 99,111,109,112,114,101,115,115,
/* 0x2050 */ 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2060 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 76, 90, 77,
/* 0x2070 */ 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2080 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,122,109, 97, 68,101, 99,
/* 0x2090 */ 111,100,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20a0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70,
/* 0x20b0 */ 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20c0 */ 48, 48, 48, 48, 48, 48, 32,101,110,100, 95,100,101, 99,111,109,
/* 0x20d0 */ 112,114,101,115,115, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79,
/* 0x20e0 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69,
/* 0x20f0 */ 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84,
/* 0x2100 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32,
/* 0x2110 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76,
/* 0x2120 */ 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2130 */ 48, 48, 99, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65,
/* 0x2140 */ 76, 76, 50, 54, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10,
/* 0x2150 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82,
/* 0x2160 */ 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70,
/* 0x2170 */ 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32,
/* 0x2180 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x2190 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x21a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82,
/* 0x21b0 */ 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, 49,
/* 0x21c0 */ 57, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10
};

View File

@ -79,10 +79,11 @@ __ARM_NR_cacheflush = 2 + __ARM_NR_BASE
#define ecx r5
section ELFMAINX
// .long offset(b_info) src of f_exp
// .long offset(.) // detect relocation
// .long offset(user DT_INIT)
// .long offset(escape_hatch)
// .long offset({p_info; b_info; compressed data})
// .long offset(xct_off) dst of f_exp
_start: .globl _start
nop //; bkpt // for debugging
@ -176,15 +177,17 @@ main:
// 12. goto user DT_INIT
mov edx,lr // &f_decompress
add esi,edx,# _start - f_decompress - 5*4
add esi,edx,# _start - f_decompress - 4*4
lodsl; mov tmp,eax // distance back to 1st b_info
mov ecx,esi
lodsl; sub ecx,ecx,eax; //str ecx,[fp,#o_reloc]
sub tmp,esi,tmp // &b_info
lodsl; add eax,ecx,eax; str eax,[fp,#o_uinit] // reloc DT_INIT for step 12
lodsl; add eax,ecx,eax; push eax // reloc &hatch for step 10
o_hatch= -1*4
lodsl; add edi,ecx,eax // &l_info; also destination for decompress
add esi,edi,#sz_l_info + sz_p_info // &b_info
mov esi,tmp // &b_info
sub sp,sp,#2*4 // param space: munmap temp pages step 9
p_unmap= -3*4

View File

@ -29,13 +29,14 @@
* <jreiser@users.sourceforge.net>
*/
NBPW= 4
#define ARM_OLDABI 1
#include "arch/arm/v5a/macros.S"
#define bkpt .long 0xe7f001f0 /* reserved instr; Linux GNU eabi breakpoint */
#define bkpt_th .short 0xde01 /* reserved instr; Linux GNU eabi breakpoint */
sz_Elf32_Ehdr = 13*4
sz_Elf32_Phdr = 8*4
sz_Elf32_Ehdr = 13*NBPW
sz_Elf32_Phdr = 8*NBPW
sz_b_info= 12
sz_unc= 0
@ -111,36 +112,38 @@ _=-1+_ // one less word on stack
#define lodslu bl get4u
section ELFMAINX
// .long offset(b_info) src for f_exp
//D_INFO:
// .long offset(.) // detect relocation
// .long offset(user DT_INIT)
// .long offset(escape_hatch) // override with round_up(2, PT_LOAD[0]{.p_memsz + .p_vaddr})
// .long offset({l_info; p_info; b_info; compressed data})
// .long offset(dst for f_exp)
#define DEBUG 0
.code 16 //; .balign 4
.real_start_ofELFMAINX:
.thumb_func
_start: .globl _start
nop
#if DEBUG //{
bkpt_th // for debugging
#else //}{
nop
#endif //}
push {r0,r1,r2,r3,r4,r5,r6,r7,lr}
_=9
o_uinit= 1 // lr
adr esi,here
sub esi,esi,#4*4 + 2*(4+ DEBUG) // D_INFO
sub esi,#(here - _start) + 5*NBPW // -NBPW + &D_INFO
here:
mov ecx,esi
ldr eax,[esi,#0*4]; sub ecx,eax; //str ecx,[SP(o_reloc)]
ldr tmp,[esi,#0*NBPW] // offset(b_info)
add ecx,esi,#NBPW // &D_INFO
ldr eax,[esi,#1*NBPW]; sub ecx,eax; //str ecx,[SP(o_reloc)]
// reloc DT_INIT for step 12
ldr tmp,[esi,#1*4]; add tmp,ecx; str tmp,[SP(o_uinit)]
ldr edi,[esi,#3*4]; add edi,ecx // &l_info; also destination for decompress
mov esi,#sz_l_info+sz_p_info
add esi,edi // &b_info
ldr eax,[esi,#2*NBPW]; add eax,ecx; str eax,[SP(o_uinit)]
ldr edi,[esi,#4*NBPW]; add edi,ecx // dst for f_exp
add esi,tmp,ecx // &b_info src for f_exp
sub sp,#3*4 // 3 slots of space
sub sp,#3*NBPW // 3 slots of space
_=1+_ // &escape_hatch (step 10)
o_hatch=_ // 10
_=2+_ // param space: munmap temp pages (step 9)
@ -290,7 +293,7 @@ L710:
mov tmp,lr; sub tmp,#1; push_ tmp // &f_decompress (ARM mode)
o_uncpr=_ // 23
add tmp,SP(p_unflt)+1*4; push_ tmp // &dstlen
add tmp,SP(p_unflt)+1*NBPW; push_ tmp // &dstlen
push_ edi // dst
push_ ecx // srclen
push_ esi // src; arglist ready for decompress step 6
@ -347,8 +350,8 @@ _=-6+_ // 15
tst arg4,arg4; beq 0f // 0==ftid ==> no filter
blx eax // f_unfilter
0:
ldr arg1,[sp,#0*4] // lo(dst)
ldr arg2,[sp,#1*4] // len
ldr arg1,[sp,#0*NBPW] // lo(dst)
ldr arg2,[sp,#1*NBPW] // len
add arg2,arg1 // hi(dst)
bl x__ARM_NR_cacheflush
@ -439,7 +442,7 @@ o_super=_ // 28
mov arg5,#0; mvn arg5,arg5 // -1; cater to *BSD for fd of MAP_ANON
mov arg4,#MAP_PRIVATE|MAP_ANONYMOUS
mov arg3,#PROT_READ|PROT_WRITE|PROT_EXEC
str arg2,[SP(p_unmap)+1*4] // length to unmap
str arg2,[SP(p_unmap)+1*NBPW] // length to unmap
mov arg1,#0 // any addr
thumb_sys7t __NR_mmap64; asr tmp,r0,#12; add tmp,#1; bne 0f; bkpt_th; 0:
str r0,[SP(p_unmap)] // address to unmap
@ -449,14 +452,14 @@ o_super=_ // 28
ldr ecx,[SP(o_wfrag)] // w_fragment
bl movsl // copy the fragment
ldr esi,[SP(p_uncpr)+0*4] // src
ldr ecx,[SP(p_uncpr)+1*4] // len
ldr esi,[SP(p_uncpr)+0*NBPW] // src
ldr ecx,[SP(p_uncpr)+1*NBPW] // len
mov tmp,#3
and tmp,esi // length of prefix alignment
sub esi,tmp // down to word aligned
add ecx,tmp // prefix increases byte length
add tmp,edi // skip prefix at destination
str tmp,[SP(p_uncpr)+0*4] // dst
str tmp,[SP(p_uncpr)+0*NBPW] // dst
add ecx,#3 // round up to full words
lsr ecx,#2
bl movsl // copy all aligned words that contain compressed data

View File

@ -120,10 +120,13 @@ sp_frame = 24 * NBPW
.endm
section ELFMAINX
// .long offset(b_info) src of f_exp
// .long offset(.) // detect relocation
// .long offset(user DT_INIT)
// .long offset(escape_hatch)
// .long offset({l_info; p_info; b_info; compressed data})
// .long offset(xct_off) dst of f_exp
_start: .globl _start
// brk #0 // debugging
slot f_argc // 0
slot f_argv // 1
@ -132,8 +135,6 @@ sp_frame = 24 * NBPW
slot f_PMASK // 4 PAGE_MASK
slot f_my_ra // 5
_start: .globl _start
// brk #0 // debugging
stp arg1,arg2,[sp,#f_argc - sp_frame]! // f_argv
stp arg3,x0, [sp,#f_envp] // %f_uinit
str lr, [sp,#f_my_ra]
@ -213,22 +214,23 @@ main:
// 12. goto user DT_INIT
mov rdx,lr // &f_decompress
add rsi,rdx,# _start - f_decompress - 4*4
add rsi,rdx,# _start - f_decompress - 5*4
#define lodsl ldr eax,[rsi],#4
#define lodslu lodsl
lodsl; mov tmp,eax // offset(b_info)
mov rcx,rsi
lodsl; sub rcx,rcx,rax; //str ecx,[sp,#o_reloc]
lodsl; add rax,rcx,rax; str rax,[sp,#f_uinit] // reloc DT_INIT for step 12
lodsl; add rax,rax,rcx; str rax,[sp,#f_uinit] // reloc DT_INIT for step 12
slot o_hatch // 6
lodsl; add rax,rcx,rax; str rax,[sp,#o_hatch] // reloc &hatch for step 10
lodsl; add rdi,rcx,rax // &l_info; also destination for decompress
add rsi,rdi,#sz_l_info + sz_p_info // &b_info
lodsl; add rax,rax,rcx; str rax,[sp,#o_hatch] // reloc &hatch for step 10
lodsl; add rdi,rax,rcx // destination for decompress
add rsi,tmpx,rcx // &b_info src for f_exp
slot p_unmap,2 // 7
ldr eax,[rsi,#sz_cpr]; add rsi,rsi,#sz_b_info // sz_cpr
ldr eax,[rsi,#sz_cpr]; add rsi,rsi,#sz_b_info
add rsi,rsi,rax // skip unpack helper block
ldr ecx,[sp,#f_PMASK]

View File

@ -13,7 +13,7 @@ Idx Name Size VMA LMA File off Algn Flags
8 LZMA_DEC10 00000478 00000000 00000000 00000d84 2**0 CONTENTS, RELOC, READONLY
9 LZMA_DEC30 00000000 00000000 00000000 000011fc 2**0 CONTENTS, READONLY
10 ELFMAINY 0000003e 00000000 00000000 000011fc 2**0 CONTENTS, READONLY
11 ELFMAINZ 000002fc 00000000 00000000 0000123a 2**0 CONTENTS, RELOC, READONLY
11 ELFMAINZ 00000308 00000000 00000000 0000123a 2**0 CONTENTS, RELOC, READONLY
SYMBOL TABLE:
00000000 l d NRV2E 00000000 NRV2E
00000000 l d NRV2D 00000000 NRV2D
@ -245,26 +245,26 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [ELFMAINZ]:
OFFSET TYPE VALUE
00000048 R_ARM_PC24 ELFMAINZ
00000070 R_ARM_PC24 ELFMAINZ
0000009c R_ARM_PC24 ELFMAINZ
000000b8 R_ARM_PC24 ELFMAINZ
000000dc R_ARM_PC24 ELFMAINZ
000000e4 R_ARM_PC24 ELFMAINZ
0000011c R_ARM_PC24 ELFMAINZ
00000124 R_ARM_PC24 ELFMAINZ
00000054 R_ARM_PC24 ELFMAINZ
0000007c R_ARM_PC24 ELFMAINZ
000000a8 R_ARM_PC24 ELFMAINZ
000000c4 R_ARM_PC24 ELFMAINZ
000000e8 R_ARM_PC24 ELFMAINZ
000000f0 R_ARM_PC24 ELFMAINZ
00000128 R_ARM_PC24 ELFMAINZ
00000150 R_ARM_PC24 ELFMAINZ
00000160 R_ARM_PC24 ELFMAINZ
00000170 R_ARM_PC24 ELFMAINZ
00000190 R_ARM_PC24 ELFMAINZ
000001ec R_ARM_PC24 ELFMAINZ
000001f4 R_ARM_PC24 ELFMAINZ
00000208 R_ARM_PC24 ELFMAINZ
0000021c R_ARM_PC24 ELFMAINZ
00000244 R_ARM_PC24 ELFMAINZ
00000258 R_ARM_PC24 ELFMAINZ
00000280 R_ARM_PC24 ELFMAINZ
00000290 R_ARM_PC24 ELFMAINZ
00000130 R_ARM_PC24 ELFMAINZ
00000134 R_ARM_PC24 ELFMAINZ
0000015c R_ARM_PC24 ELFMAINZ
0000016c R_ARM_PC24 ELFMAINZ
0000017c R_ARM_PC24 ELFMAINZ
0000019c R_ARM_PC24 ELFMAINZ
000001f8 R_ARM_PC24 ELFMAINZ
00000200 R_ARM_PC24 ELFMAINZ
00000214 R_ARM_PC24 ELFMAINZ
00000228 R_ARM_PC24 ELFMAINZ
00000250 R_ARM_PC24 ELFMAINZ
00000264 R_ARM_PC24 ELFMAINZ
0000028c R_ARM_PC24 ELFMAINZ
0000029c R_ARM_PC24 ELFMAINZ
000002a8 R_ARM_PC24 ELFMAINZ
000002b4 R_ARM_PC24 ELFMAINZ

View File

@ -16,7 +16,7 @@ Idx Name Size VMA LMA File off Algn
11 ELFMAINZ 00000000 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY
12 ELFMAJNZ 00000024 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY
13 ANDMAJNZ 00000004 0000000000000000 0000000000000000 000012ba 2**0 CONTENTS, READONLY
14 ELFMAKNZ 00000290 0000000000000000 0000000000000000 000012be 2**0 CONTENTS, READONLY
14 ELFMAKNZ 00000298 0000000000000000 0000000000000000 000012be 2**0 CONTENTS, READONLY
SYMBOL TABLE:
0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30
0000000000000000 l d ELFMAINZ 0000000000000000 ELFMAINZ