Compare commits
3581 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3757579ffc | |||
| 2962dc351b | |||
| c04c685469 | |||
| 72c9769953 | |||
| 42759b94bd | |||
| aa9e69f03e | |||
| 0f3939df15 | |||
| 62265a1bc9 | |||
| 76b2cec8ee | |||
| 3d82f0cfe1 | |||
| e5546bc8b0 | |||
| 6fc0a00ac8 | |||
| 3e5ba5c064 | |||
| 4c32a8e3d4 | |||
| 2ea316d754 | |||
| 548227a55b | |||
| a831a20910 | |||
| 811f66de84 | |||
| 84d806328b | |||
| 285d4c4c65 | |||
| 8506f5b17c | |||
| a87fd56b3e | |||
| f0cb30e2b9 | |||
| 038743c694 | |||
| 0e6cef99a0 | |||
| 92c925fe95 | |||
| 4562d5459d | |||
| 8393ded1b3 | |||
| b0dc483165 | |||
| 3c0ca81311 | |||
| 157a63a023 | |||
| 80e22a7e38 | |||
| ddf2da3d76 | |||
| 0e6478a60f | |||
| aed2c085b8 | |||
| a7592b2ca2 | |||
| 265c100845 | |||
| 84e8288f61 | |||
| c69b4561fb | |||
| 6db0af8d04 | |||
| 842d2cbb0d | |||
| 9fb64ded10 | |||
| 9d26713b1a | |||
| eb3c55b5cb | |||
| 896596f672 | |||
| e4de14612f | |||
| 1d2b276425 | |||
| 35c6a200ad | |||
| 90a7faa15e | |||
| 91f5fe1c0e | |||
| d48a7d303d | |||
| bb816f0c74 | |||
| 93abe97ea5 | |||
| 97cf29ffbb | |||
| ed35613d64 | |||
| f5ec8363b4 | |||
| 87956de092 | |||
| 0f9315383c | |||
| 3538d796a7 | |||
| 24f3824524 | |||
| 70b20d7d89 | |||
| 7b21a0620b | |||
| 3949af6d3c | |||
| d1f62e3ab4 | |||
| 6e644fa480 | |||
| 5bef968068 | |||
| 543cfe0a73 | |||
| 3ba91b8072 | |||
| a27a9e6000 | |||
| 7e839e6962 | |||
| 809a1b3dae | |||
| 9b80628f84 | |||
| a21a006fe9 | |||
| 54d16a458a | |||
| cfc5f42ef2 | |||
| e3d24238e4 | |||
| 56e7b36959 | |||
| f29791470f | |||
| 52d9b53b74 | |||
| 839a78f2e0 | |||
| 680ce0a7af | |||
| 06b0de9c77 | |||
| 76b0b7b1ae | |||
| fabda4df3a | |||
| fdcdaf596a | |||
| be44cefbe7 | |||
| c1050e624b | |||
| ae6d3b9bff | |||
| 25aa0e2e46 | |||
| 8f7578eef1 | |||
| 29ce4807fb | |||
| 41f6945be1 | |||
| 718ec468ff | |||
| d429801498 | |||
| 024091e6b5 | |||
| d849e9de98 | |||
| c0e40da2ab | |||
| dff3766501 | |||
| 2767ec54e1 | |||
| ac72c02793 | |||
| 69c51eee4d | |||
| ff5a4eeb96 | |||
| b48f870701 | |||
| 10807ebdc2 | |||
| 5d649f83ec | |||
| 65b25adceb | |||
| d615985b8a | |||
| b019440980 | |||
| 38ed4b2017 | |||
| 2ad0d51226 | |||
| e4a611bcae | |||
| f3728d99b9 | |||
| b87f60a917 | |||
| 28f26da6ab | |||
| d3e780d617 | |||
| d549c2b5c9 | |||
| f310ce376e | |||
| 553fc9b1fb | |||
| 6dde9f7dc0 | |||
| 3dca1175e5 | |||
| 09c5e38322 | |||
| fe6f1f0bb6 | |||
| 250c656b9e | |||
| 9a0b5b65b8 | |||
| 57b2fb4c62 | |||
| 099c3d829e | |||
| a1a6d02b6f | |||
| f2ad7fb9c4 | |||
| 1bcf709fcf | |||
| 47fc230893 | |||
| be05d85570 | |||
| f598fa13a9 | |||
| 568859d16f | |||
| b5ed0a637b | |||
| 17eff0aed4 | |||
| 0a3f048eed | |||
| 3cde897557 | |||
| 0500e7d016 | |||
| 778663ae69 | |||
| 636cefb9f3 | |||
| 1236776aa2 | |||
| 51a6a5cca5 | |||
| 3326c86e91 | |||
| b0dbc3fe39 | |||
| decc1efb74 | |||
| 2cf1c32d18 | |||
| fc6e3840b7 | |||
| 5e85c1a11b | |||
| 468bfce599 | |||
| 1e6e4043ed | |||
| 67564513d2 | |||
| ed2633bf95 | |||
| 3e70021406 | |||
| bf8dd31914 | |||
| d4e94f5086 | |||
| ae77fd60bb | |||
| e79c790264 | |||
| 46029bb8a0 | |||
| f74c225338 | |||
| c479fe32b3 | |||
| dc23ee0ad2 | |||
| a5c32db01b | |||
| d7142312c9 | |||
| 283ab0e7ea | |||
| b6dd61cea8 | |||
| 11970d276d | |||
| d618716ec1 | |||
| 4f0f977f04 | |||
| 2c4b1d8a8c | |||
| b2810c6deb | |||
| ceb2b56b71 | |||
| d14fa5f8a4 | |||
| 79263a52ac | |||
| ecb3f83e83 | |||
| f6aedb35ce | |||
| 3b7d25ac49 | |||
| e964d4acf3 | |||
| e306085b81 | |||
| b094ad4f2b | |||
| 19c6b969ab | |||
| acfda848cd | |||
| 52400e2561 | |||
| f62576a2be | |||
| 19bf9f59e9 | |||
| fadf7cfc7b | |||
| ec0c9399fa | |||
| 37b923245d | |||
| 38a676f6f7 | |||
| cd1df6f6b1 | |||
| 4a24fe8c53 | |||
| 6dac3dd248 | |||
| 37d393cbc8 | |||
| 27f155374a | |||
| 8102137ad7 | |||
| 9c46f4653f | |||
| 29b4752d0e | |||
| 2724039c09 | |||
| 6ae4e88475 | |||
| facabd68d7 | |||
| 18f043015e | |||
| ab259a1af9 | |||
| 1dd96a7628 | |||
| 1ee7ecb1f0 | |||
| 67548a4d9a | |||
| 9fbe95ad48 | |||
| 91c15b2475 | |||
| c9550b48d8 | |||
| a1d090a6fd | |||
| 4870765e1b | |||
| d8be2ed276 | |||
| 2b371e99bd | |||
| 005e39871b | |||
| 96dd9eeb44 | |||
| 65b06f6046 | |||
| 0515be4334 | |||
| e32de83758 | |||
| e767461f65 | |||
| 632c7c4826 | |||
| 7f9d381c7b | |||
| 4d5d6661d5 | |||
| b0b87eda02 | |||
| f63a673a8b | |||
| 290dd0c5d2 | |||
| 194bf2b852 | |||
| d6d5e7ae3d | |||
| 39a6cc4b5f | |||
| a24de15060 | |||
| eb021accd1 | |||
| 98a77dde00 | |||
| 854988bc5f | |||
| bfeed2ab9a | |||
| d11fc71e79 | |||
| f1703fa322 | |||
| 06675acc67 | |||
| 57ad6bc37d | |||
| 0192b0b7e4 | |||
| 3b098b845a | |||
| ac398f1ffe | |||
| 92dfb9c83c | |||
| 38d6cb090c | |||
| e93172bd33 | |||
| 30fcca4b64 | |||
| 4f6320d3aa | |||
| 62dbf8485f | |||
| 9331ed39d4 | |||
| 35dd9cfd22 | |||
| 0ac6c36af2 | |||
| 3c4b959f78 | |||
| a00687b092 | |||
| bb6b087862 | |||
| bfb438dc89 | |||
| cd3f69c290 | |||
| d54315392e | |||
| cfa8107ab9 | |||
| f4e5b29708 | |||
| d65fea1147 | |||
| 25a3c109c1 | |||
| b526eed346 | |||
| 59c6a71b72 | |||
| c7a2a0faa1 | |||
| bfb5ea50a9 | |||
| 149d84edca | |||
| 7636abc158 | |||
| 6eace187e7 | |||
| dd1838a7eb | |||
| dd928cf956 | |||
| 38be230467 | |||
| 1f747a28a9 | |||
| 1a7732b285 | |||
| f8ea416a4d | |||
| b9bf81d548 | |||
| 8975e2a6b5 | |||
| 394cd77bec | |||
| a9ac4b5e23 | |||
| 10e759f1f1 | |||
| 777d4f5279 | |||
| c65c882ecc | |||
| a66ee9fafd | |||
| 757401dd0c | |||
| 11e3770864 | |||
| fbb317e9c8 | |||
| 9d7698a359 | |||
| 44fd11f4dd | |||
| 8779113131 | |||
| 26cfd0a616 | |||
| 75e153dd99 | |||
| fa364d6ea3 | |||
| 13e5c13695 | |||
| 43b3b54197 | |||
| 3a16d4a12e | |||
| 50fc9235de | |||
| 70287d3c49 | |||
| 41e9f7985f | |||
| c3327977da | |||
| 905bfacf44 | |||
| 053e95033f | |||
| 5a1203be0d | |||
| 745fef7425 | |||
| c9d625a237 | |||
| 334731f56b | |||
| d5e7672a45 | |||
| e702aa0252 | |||
| 2684e815e0 | |||
| efbc93229a | |||
| 05539ad5b6 | |||
| 670aae2e11 | |||
| e6ff68dc2c | |||
| 641b116f04 | |||
| f81f7194ed | |||
| 161d20e614 | |||
| fc4dcd46db | |||
| 891dc87064 | |||
| b866631448 | |||
| 672d69c68a | |||
| 507c31ec14 | |||
| 65cc40bdda | |||
| 067895fa5f | |||
| 3f7f26c74b | |||
| 9a6b5940cf | |||
| 828f4a63bf | |||
| 707fb55625 | |||
| 8d41ae09c8 | |||
| 7ec0faca1e | |||
| 300fa29446 | |||
| 6981f7b3ae | |||
| 682a1e97e4 | |||
| 1d71dd3851 | |||
| 5edfda46e5 | |||
| d7754a97c7 | |||
| c79aa6ad8a | |||
| 525e091472 | |||
| 16f6de677d | |||
| 12c36bab6c | |||
| c429859cbf | |||
| dc76b2af97 | |||
| b75e7687f4 | |||
| ece5af2895 | |||
| 1aaa33552e | |||
| f622871eb0 | |||
| 060b01260d | |||
| 871f8a4793 | |||
| c54e03d0f2 | |||
| aaf3f75990 | |||
| 512a26cee4 | |||
| b4a793ed26 | |||
| 5d2c74008e | |||
| 7fafc68940 | |||
| d1af2af499 | |||
| a5206eb696 | |||
| 1ff0d137ab | |||
| 07aa65b55e | |||
| 0fadddec65 | |||
| 1bebe53cef | |||
| 43019c744c | |||
| c585774162 | |||
| 75e87a58da | |||
| 19e84fea62 | |||
| db39f9c4dc | |||
| dae45ae0d4 | |||
| efeffc6e01 | |||
| ebf0f2f68a | |||
| 09bd1d8c40 | |||
| 40653e40a4 | |||
| b3e4efbabe | |||
| 279101d464 | |||
| f571feee72 | |||
| 900afd1c8c | |||
| 08a72d5251 | |||
| 736a6cd955 | |||
| 75ce5e5df3 | |||
| eaf2143162 | |||
| f0bdb8dea1 | |||
| 60093cfff6 | |||
| 56bb7b53cb | |||
| 0cffeca102 | |||
| 937d4462ca | |||
| db5a39572c | |||
| ecc9c67e1f | |||
| 0901ce1b68 | |||
| be6e77379a | |||
| 726f5de778 | |||
| 98b835e0a7 | |||
| 04ffb641a6 | |||
| 1b7233b673 | |||
| eaa0f33473 | |||
| c03b382d61 | |||
| e633694255 | |||
| 278b25bad2 | |||
| f89f0838dc | |||
| b1729e3bcf | |||
| d1ab85a1a6 | |||
| 7f5b64c91a | |||
| 78b68283c4 | |||
| 9e3b1c9f8a | |||
| 5dc54c7adc | |||
| 320e5b850f | |||
| d8395d8c42 | |||
| a20c5a1e7f | |||
| 3bdfcaa541 | |||
| 7b2faf2016 | |||
| 42902dabac | |||
| 14521eb6dd | |||
| b9533f409c | |||
| 4df68aafd2 | |||
| c72ceaa979 | |||
| 8ac79ca0ad | |||
| e0bfaf1028 | |||
| b361b91ec7 | |||
| b5d1eba4c1 | |||
| ba447344d6 | |||
| 7b68aa7bdc | |||
| 5d15e57294 | |||
| 0bf8ff151e | |||
| 06fae05910 | |||
| f68ac8155b | |||
| 15484aa296 | |||
| 5b113a5041 | |||
| 1320e3efdb | |||
| d32f447bda | |||
| b74c4e4ac1 | |||
| 35333403ef | |||
| a627648249 | |||
| 127fd095e7 | |||
| f8934c09ff | |||
| 7a09c88e30 | |||
| 17526d1132 | |||
| ff7939c1c0 | |||
| 96c196b1be | |||
| adb0ca8250 | |||
| fa56a1d9cd | |||
| 3d691645a4 | |||
| e1edc5f50a | |||
| 4a8efd2e2f | |||
| 8d364c82e2 | |||
| c5059231dc | |||
| f584c91386 | |||
| b8d9c2b755 | |||
| 163377d1a0 | |||
| 8944e90175 | |||
| 33cdcb0e82 | |||
| ec870a5aeb | |||
| 0653bb5a72 | |||
| 43b6ff29e3 | |||
| a444a8a704 | |||
| 3fa18c1799 | |||
| 19147963b9 | |||
| 5056215a1f | |||
| 340b7614e2 | |||
| 8a1bd67a20 | |||
| a094df7b55 | |||
| cc893dfc11 | |||
| 8ef17da082 | |||
| 7993e619cd | |||
| 1ab8d5fb3f | |||
| 213ac3ac73 | |||
| 0a8876443a | |||
| f37a3bb9bb | |||
| 2632342f44 | |||
| 8efcf6f099 | |||
| 58343fc78d | |||
| 6c41a4c9c8 | |||
| 334be287fc | |||
| aa050e0001 | |||
| cc994326a0 | |||
| 58de07629e | |||
| 9f830e0c41 | |||
| c52d302f07 | |||
| 44049ecf30 | |||
| e1b5904196 | |||
| 88e692791a | |||
| f00667ad7d | |||
| 696d0eec64 | |||
| 513b00a30e | |||
| 0cb0dbf6d8 | |||
| 9f00515da4 | |||
| 72f31787f6 | |||
| cd686cb1d9 | |||
| d9657e9831 | |||
| 72f3e9b25a | |||
| 811b15a5b3 | |||
| ab00825f37 | |||
| e86d9179aa | |||
| 26d8e9c4c5 | |||
| 5f3ebc8a7f | |||
| 425b1b44bc | |||
| 39442e6282 | |||
| 99575e1010 | |||
| 64aa7540e2 | |||
| 3ff5dbd179 | |||
| e25d04fb12 | |||
| dd1d5a92d2 | |||
| c6e0aad40b | |||
| 99b795ceaa | |||
| 33dc60df26 | |||
| 619aeb54ff | |||
| 77ba43328b | |||
| 01a30752c7 | |||
| e56b748435 | |||
| bb4cbdff44 | |||
| 0b47e474a7 | |||
| 8e85680eb4 | |||
| fefce0d5c4 | |||
| 0ac3cb2329 | |||
| 708ab1dcd7 | |||
| 9b87ddb621 | |||
| 5dc4eb4b03 | |||
| a203c72281 | |||
| 6cf85cee6e | |||
| 1eb6a40fdd | |||
| 1bed77e4d3 | |||
| f2a68023fa | |||
| 8ccffc40e3 | |||
| dd8c1d0441 | |||
| f9f28ff176 | |||
| 3649041195 | |||
| c23c7a9379 | |||
| 9934e33b99 | |||
| 9e75fdda66 | |||
| d873a26f41 | |||
| 91aa5b55ab | |||
| 3f460a76ce | |||
| 7256ea3b32 | |||
| 4cdf77e16f | |||
| d89813e911 | |||
| 7c57b10cae | |||
| 8d1a98e03b | |||
| 65a2da4b40 | |||
| 02f6786b2a | |||
| 9da4f7a6dc | |||
| 510505a85c | |||
| 741cb3a136 | |||
| 9f5d67e27c | |||
| 93c6496ba8 | |||
| 779b648c5f | |||
| 9d5e06232d | |||
| b221c44466 | |||
| 665296f7cf | |||
| 39778d5f47 | |||
| 0af9bbb623 | |||
| fdec47a83d | |||
| 7ff913bbd2 | |||
| 94775bef9f | |||
| 3cf102334f | |||
| 627e733a30 | |||
| d31b80da5b | |||
| eb231b65f3 | |||
| 59e3b1f98d | |||
| 8b174bb272 | |||
| 4199a44bef | |||
| 777392c0fe | |||
| ede1fec5e7 | |||
| 16de3e78a5 | |||
| d7508d8c09 | |||
| 2a136c1c1d | |||
| 2578102be9 | |||
| dadee7acfb | |||
| 28f0bb4e11 | |||
| 824c8a8efb | |||
| 37f27a1262 | |||
| 2b8a7a492a | |||
| db56bbb11b | |||
| 82d26f04a4 | |||
| 5045f7eb42 | |||
| 82a6ccac4d | |||
| 2d74298001 | |||
| ce21254ed2 | |||
| 874250fe49 | |||
| c8a3acbba8 | |||
| 81e11987a2 | |||
| 668cefec2f | |||
| 212bc04257 | |||
| db401fd05e | |||
| bebe72481c | |||
| 2b9e83256d | |||
| 5763518cce | |||
| 3e4c5bab72 | |||
| bce109ab54 | |||
| 69ca635c4c | |||
| e0bf460993 | |||
| 29762a8a96 | |||
| c7ef08dc2d | |||
| 50a6698715 | |||
| 7dd2cdea1e | |||
| af87f7f2bf | |||
| 295889023f | |||
| feef2e38cf | |||
| 80d30aab32 | |||
| e910a9dc3e | |||
| 504224696c | |||
| e2acd666df | |||
| e5c0d998b7 | |||
| 63f6fef964 | |||
| 983eb6d676 | |||
| 98fedef1a1 | |||
| 75a769759d | |||
| 2354b01bad | |||
| c331b9f1e2 | |||
| afeaeeddec | |||
| ab7ef9f511 | |||
| d3ad6d25d8 | |||
| 2e29f9fa5f | |||
| 5d9f71bb13 | |||
| 82ed25bb44 | |||
| f57393c0e8 | |||
| b54cced19c | |||
| 60a0544314 | |||
| 283c1cf931 | |||
| fff53efc05 | |||
| 07d368adca | |||
| 13276d93fa | |||
| 79b1b1a586 | |||
| 2f083f3e56 | |||
| 73b0b4db9d | |||
| ca0e614b56 | |||
| 72613d06a5 | |||
| 48ad5513ff | |||
| 201d9f1346 | |||
| 1e8f1f49d0 | |||
| 65707900bc | |||
| 39c5be43aa | |||
| c4437cb293 | |||
| e2b86a49db | |||
| 8fe83be87f | |||
| 17167d4905 | |||
| 05ff7e35a1 | |||
| f67cec4752 | |||
| fd4882abcf | |||
| 0f42579e68 | |||
| 7398d8f68f | |||
| ec33109b22 | |||
| 2cfa4c1eb7 | |||
| a13b4d10d9 | |||
| 36e94e58d0 | |||
| d0a52bd483 | |||
| 38a1d3179b | |||
| 0d639d6386 | |||
| 4256057c27 | |||
| b720b47c12 | |||
| 55e4a4f086 | |||
| b4cb9f8b2f | |||
| 63298ebd6d | |||
| 73c816e468 | |||
| 0492e650ef | |||
| b8b94ee89e | |||
| 81176716d5 | |||
| 26e7ae00e9 | |||
| c75d7a685d | |||
| 4318cc22ee | |||
| 575cb720c6 | |||
| 5db34fbf92 | |||
| 7cfef2f6bf | |||
| 4603f1df4b | |||
| c69fcfff9d | |||
| 70f14101ed | |||
| a9803459ed | |||
| 43034e8e92 | |||
| ef547034f6 | |||
| e87fc60391 | |||
| 45e6e73d85 | |||
| be30c26dbb | |||
| 79e9b0762c | |||
| a9a806c418 | |||
| c7d8b6fed1 | |||
| a723efd225 | |||
| cf429dfce4 | |||
| 3fcd64a0c0 | |||
| 83cb38022b | |||
| 93c04d1f66 | |||
| 3c47898cf4 | |||
| 61e1366122 | |||
| a20636fd63 | |||
| aa8cdca0a9 | |||
| 6931a3aa70 | |||
| d001a63bce | |||
| 0d3377f48b | |||
| aeb04d97c8 | |||
| eb68ab91cd | |||
| ee242ba987 | |||
| 44a53736ff | |||
| 1b21fef081 | |||
| 5f9c50cd3e | |||
| 793d8c1d2e | |||
| 81f868a0c6 | |||
| dadbbbdc64 | |||
| bfd2153f2b | |||
| 077793fa5e | |||
| acad3c3000 | |||
| 3b4627e17e | |||
| 05976ee1a7 | |||
| c1311c78a3 | |||
| 717150b7f3 | |||
| a68c62d938 | |||
| c11f8a569a | |||
| 03436d2415 | |||
| 4ae75375e0 | |||
| 2721ef0636 | |||
| 7a232cb330 | |||
| 52f19ae330 | |||
| 275477f914 | |||
| 2ed6755d5d | |||
| 78c555b4a6 | |||
| a127125707 | |||
| f853f91c5b | |||
| e7ca5c54ff | |||
| 663d6b466b | |||
| 0e2a9de2b2 | |||
| 34df0d6ef1 | |||
| 540164849b | |||
| 252143d0bb | |||
| 480ab51650 | |||
| 972c76eb42 | |||
| e5aeea9ed2 | |||
| f204670008 | |||
| 651155c64d | |||
| 660aee6d22 | |||
| a646231630 | |||
| 1050de5171 | |||
| b7a5b9437a | |||
| 620955a724 | |||
| 2e64a277f8 | |||
| ea567a8b14 | |||
| be23f93ee6 | |||
| fcdf0e92c1 | |||
| 2d6987252e | |||
| 4a9c46253e | |||
| 5bcf9dd8af | |||
| 284adb203f | |||
| adafa841f7 | |||
| fdc5d25d03 | |||
| 294a7077de | |||
| 990d0ec543 | |||
| bb90c4dff4 | |||
| 00e3d992e8 | |||
| 937bfa4e49 | |||
| 1d9c211eed | |||
| 76ddf6b8da | |||
| 7f1f29b0d8 | |||
| 222471744f | |||
| cc100be26e | |||
| 966b571b7c | |||
| f3e710394a | |||
| bfd1f1fbfa | |||
| a09146b5e0 | |||
| bbf2b08f48 | |||
| e2dbc661f1 | |||
| 7626e09f66 | |||
| 248a6980cf | |||
| f956bfc797 | |||
| 6da79783ea | |||
| 22329e0ab2 | |||
| a94b0329c9 | |||
| be8601f8cc | |||
| bd441e83ae | |||
| 02bd9cc403 | |||
| c9f6a3583c | |||
| 076aaf829a | |||
| 85f0c5a445 | |||
| d5263a56ce | |||
| ef5b55b4d1 | |||
| d65e65b2b1 | |||
| 6aa641e5aa | |||
| 504839951a | |||
| d55746f62d | |||
| 144010295e | |||
| 181c752488 | |||
| bd4aca5c12 | |||
| ad6d73c875 | |||
| c5cc83d424 | |||
| fe949bdf67 | |||
| 766fe466d6 | |||
| 333a288248 | |||
| 613df414ed | |||
| be050693f2 | |||
| bf957f435e | |||
| 3a6f688265 | |||
| 1084a7896c | |||
| 9ea2b31541 | |||
| 09da986742 | |||
| cb70a5fef5 | |||
| 4fa6a6aeef | |||
| ab31e8dde9 | |||
| 53d7b5449f | |||
| d33a34f016 | |||
| f6ff5a2805 | |||
| 1518e5bc98 | |||
| 78f48d65d5 | |||
| b81ec224b7 | |||
| 4be6cfebcd | |||
| 98973dd8b9 | |||
| 1218b6ff2a | |||
| ba5c77c9e5 | |||
| cbaedffce2 | |||
| cb60603950 | |||
| 0a69e7803b | |||
| baa9090198 | |||
| e78a08b8fc | |||
| 7e5e6012df | |||
| 0a1d24d1d9 | |||
| 35555bfb8a | |||
| c9cb42df40 | |||
| 2be03028f4 | |||
| 214dd0a522 | |||
| 182e0796df | |||
| fb844a8ed1 | |||
| 6be3e747ca | |||
| 23f63e4196 | |||
| fd6837b267 | |||
| 1c29f921e0 | |||
| 1ab6e01de2 | |||
| 801618740c | |||
| 2469563b26 | |||
| 00139caf43 | |||
| 21d102c84f | |||
| f17d9967c2 | |||
| 0569ef37ba | |||
| 984334c9a1 | |||
| 34a25e61c7 | |||
| ed3f45953e | |||
| 80de11bc5b | |||
| c9fe84c9aa | |||
| 5f98bb0ab0 | |||
| d86d5314ba | |||
| 700c8730cf | |||
| b4429e1a42 | |||
| a8fa3ca5cf | |||
| 9aef7b0d6f | |||
| 2575eef3c0 | |||
| 8236276a90 | |||
| fdc68812c5 | |||
| 9db6d18d11 | |||
| f962afe146 | |||
| adcd569852 | |||
| d045b7f223 | |||
| 57cb6a7530 | |||
| baa1ed9be3 | |||
| 16af6e1a29 | |||
| 0af8998be6 | |||
| c32f517fa5 | |||
| 9131d5216f | |||
| fb14a7991d | |||
| ff53862dab | |||
| 49245a20c5 | |||
| 13bc031163 | |||
| 0c18c1c35c | |||
| 63dc19ce25 | |||
| 6871c2fc0a | |||
| 4ae3a8b2b0 | |||
| f2e562b5de | |||
| f7e2266c3f | |||
| 361a3056cb | |||
| ca0437556d | |||
| 51899957a9 | |||
| 7b0b760d78 | |||
| 4f5866b5a7 | |||
| a6b5033cf1 | |||
| a6296ecd67 | |||
| bb1df15958 | |||
| 249431f45f | |||
| cbe129795e | |||
| 2a135e245b | |||
| 05a0b3557a | |||
| c7cfe8b608 | |||
| 8d3e1d28a7 | |||
| 7841e15583 | |||
| dd164fbc86 | |||
| 23fe02e84a | |||
| 94e72238f2 | |||
| 8f7ac520eb | |||
| bd193201b2 | |||
| 8ced672d24 | |||
| f218812858 | |||
| 8a7b980fc0 | |||
| 385c9877f8 | |||
| 10df93536e | |||
| 6cad27896f | |||
| 052392d97b | |||
| ce6b5a0688 | |||
| 1879185e42 | |||
| a928a08f9d | |||
| 1805cb6857 | |||
| 6ce625b535 | |||
| 4702f12818 | |||
| 4f3054f07d | |||
| 0d7bd52e21 | |||
| c3466f579c | |||
| 7c105d7af5 | |||
| 924b229afb | |||
| 890d66ecf0 | |||
| 143049922b | |||
| e6ccef2cf1 | |||
| be61e9f584 | |||
| 89d0fda9fa | |||
| 6a85bab5da | |||
| c1a55b063e | |||
| 77c914bce5 | |||
| cc60f03b2e | |||
| cc9ccdbbd1 | |||
| 9dfc8f573c | |||
| 4e2fdb464a | |||
| 73b854874e | |||
| 0016512df1 | |||
| 527139978a | |||
| 47bc68fa6b | |||
| 972b670a64 | |||
| d7c416f243 | |||
| 3ace7a0468 | |||
| d305023f5e | |||
| 963392a5ae | |||
| 2f453acf5d | |||
| 4ae1576726 | |||
| 17bd0b3248 | |||
| a1ad1aee99 | |||
| a817ed0692 | |||
| 828a6cf07b | |||
| 962c35aa08 | |||
| b327645e64 | |||
| e1b42616a2 | |||
| f96638c42a | |||
| 6272152dfe | |||
| 030a200c08 | |||
| 994da63b4d | |||
| 2315bff280 | |||
| 98dddf93d8 | |||
| fd2939e18d | |||
| 80c27e0822 | |||
| b463f24eda | |||
| 2a849444db | |||
| 69e106c0c5 | |||
| 926481dace | |||
| a3b2cde58d | |||
| 30f37d2cc6 | |||
| c4d61dd9fe | |||
| 210870f840 | |||
| 4cb4bd38eb | |||
| 58c6d19f7c | |||
| f99ae94747 | |||
| 6868ca7953 | |||
| 87a5a4ef32 | |||
| c67a5d677c | |||
| 1ce6f0e6f4 | |||
| 740b4ff865 | |||
| 1059f62566 | |||
| df3193c1ee | |||
| 67860e3704 | |||
| 35fbb1ecb6 | |||
| c63a71ad42 | |||
| f33645f739 | |||
| d7ba31cab8 | |||
| 342b1b7d6c | |||
| 936013f60c | |||
| fdf2eddc73 | |||
| 4409753014 | |||
| 9172ae3d19 | |||
| e2f60adc95 | |||
| 1bb93d4fce | |||
| eb90eab632 | |||
| 0f4975fd7f | |||
| b5b1f06a11 | |||
| 86f8eb0930 | |||
| 91ad0e7572 | |||
| b034ee98fe | |||
| ded07f8781 | |||
| 849bdd87e1 | |||
| 643e48efd7 | |||
| 92f072cf70 | |||
| 95bf2e2e41 | |||
| 6a6c6d84eb | |||
| 08a689c81e | |||
| d1174385ef | |||
| cb5f590e10 | |||
| 5ed9c66ed9 | |||
| b8f52d14f4 | |||
| 5d295c24f0 | |||
| 8be9da8280 | |||
| 819c33fee2 | |||
| 75a2cc4ecb | |||
| e2833cf303 | |||
| 801de73dbe | |||
| 6a53c0b3d4 | |||
| 58b122d97d | |||
| 276b748aa6 | |||
| 23570097cf | |||
| 62a07df45e | |||
| 593a69ce25 | |||
| c33603e324 | |||
| 29fa358077 | |||
| 49766388bc | |||
| f23267bddd | |||
| 4484acf9d6 | |||
| 47ddace96a | |||
| 8aadbcd786 | |||
| 517bc9db0b | |||
| 16bfa7b846 | |||
| 570b2d0e88 | |||
| 2653a0749a | |||
| 3de0008543 | |||
| d4e2d7e8a8 | |||
| a9c08c6f52 | |||
| c2aa5c35f7 | |||
| 423f1a8758 | |||
| cc5f684e33 | |||
| b6646d319a | |||
| 3667fa4e44 | |||
| d1c80154f6 | |||
| 3c2bfc742e | |||
| d60fef753f | |||
| 70ed2d0d03 | |||
| 716d203a78 | |||
| 9719a7dd56 | |||
| c097233bf3 | |||
| 69a583281f | |||
| 8e90c9af2b | |||
| a784284b7f | |||
| 0509edf08d | |||
| 7ca20f424f | |||
| b74d51c2a8 | |||
| 58061cd121 | |||
| b8f6be5389 | |||
| 7c766b3313 | |||
| 91b81b587b | |||
| 780a4347b8 | |||
| 606ad08dd1 | |||
| 75c31dff1d | |||
| 473b90419f | |||
| f88b85e126 | |||
| b122f8e9d0 | |||
| cb8b1595a1 | |||
| 1bee919276 | |||
| 78b1da5c00 | |||
| bb8239ccda | |||
| 2a594ad0a7 | |||
| b05073550c | |||
| 37d6a34e58 | |||
| 4f0cba9bb6 | |||
| 4d1c754af9 | |||
| c1cfde21d7 | |||
| bb1f9cdecd | |||
| b259b0ca28 | |||
| 0051dfc84f | |||
| 9f294e6ce5 | |||
| 153ea8be03 | |||
| f3f7f97f8d | |||
| 9bb6854e64 | |||
| 4bba1e6cb7 | |||
| 597e8fe407 | |||
| 556c541ffb | |||
| 5963f18f7c | |||
| 0dac6b7be3 | |||
| 296ede780b | |||
| faaa19331a | |||
| 88cb5886f3 | |||
| 2fcc3f86c0 | |||
| 9362fde9eb | |||
| 56f4d781c1 | |||
| 7a3637ff5a | |||
| 2923c0968e | |||
| 98cfe99d65 | |||
| bdd97fe0b2 | |||
| 6b500bc83b | |||
| 92a12a2ec1 | |||
| 04d79040f9 | |||
| 3201ddc680 | |||
| 2f06de54c5 | |||
| 6489ec9bba | |||
| 1a5ba22fe7 | |||
| 8f9713ed53 | |||
| 90eb68b3b9 | |||
| 95fcbcb4f2 | |||
| b97688d119 | |||
| 5ea3627cab | |||
| d9288213ec | |||
| 614c86fb7d | |||
| 9f651ee40f | |||
| 774c8c3fd4 | |||
| b711d2f750 | |||
| 8a793d5942 | |||
| 99f52c60ed | |||
| 2c2e108301 | |||
| 563165e6ae | |||
| f1a31b4793 | |||
| 5e9b6bd69d | |||
| 9b990c4eae | |||
| 7a625a449a | |||
| c2b62359d5 | |||
| 6722e8972e | |||
| fefe7a3452 | |||
| 90a1322929 | |||
| d698eb69e2 | |||
| 0ef00e9b82 | |||
| 95cedb6640 | |||
| d736da4208 | |||
| be83788666 | |||
| 5a28a51abc | |||
| 8a84df752c | |||
| 85f53b210d | |||
| 5d13c6cd01 | |||
| 98a0d381e9 | |||
| e1d20fd0b5 | |||
| d1035ecd8f | |||
| 0e651facdd | |||
| 9fdddfc332 | |||
| 7d2913709c | |||
| 3623199e8d | |||
| e4b23f7a47 | |||
| f056ecdcd5 | |||
| 857a03a074 | |||
| a34deee4f5 | |||
| fc9c8ae482 | |||
| 08c63f06eb | |||
| bbff510ef1 | |||
| f747435952 | |||
| e6edad8f46 | |||
| 05e44b9644 | |||
| 16bb7ab841 | |||
| 9248f02557 | |||
| 9485a56af1 | |||
| 021c8db58a | |||
| 8ab180edf8 | |||
| ab35b685d4 | |||
| 86745721ee | |||
| c34fe09a79 | |||
| 1fa9ff2c05 | |||
| e8ef0cf63f | |||
| 8c84efb8fb | |||
| f3a7620ae8 | |||
| c7969ed5a5 | |||
| 900926c0ed | |||
| df94f4288a | |||
| 969efe687d | |||
| ee3f1292d0 | |||
| cacb239040 | |||
| 28d1789783 | |||
| 633eb98e34 | |||
| 4854c03096 | |||
| e853119c77 | |||
| 161a58bafb | |||
| f5fd94e815 | |||
| edde6210f1 | |||
| 507e19945e | |||
| 4a35bf32ea | |||
| e04bf9e4bc | |||
| c384d224c0 | |||
| 35427f998e | |||
| 1174da2bc3 | |||
| 11e8a47030 | |||
| 8c4e9bcf0d | |||
| 9dfd624901 | |||
| 79e65503a9 | |||
| 59f18b9d9f | |||
| fb3699fb89 | |||
| 9d2d59b5d2 | |||
| aefb2fa3c3 | |||
| e8aa80f904 | |||
| 990988f920 | |||
| 576d9a4e7e | |||
| 1d462ee424 | |||
| c9b09555c4 | |||
| 860b5bf967 | |||
| 5063480a38 | |||
| 3400ae9dbe | |||
| 3385264eb2 | |||
| 34646f1c6a | |||
| 50aa63a5a0 | |||
| 64557bee43 | |||
| 7c21c4513e | |||
| c6d6378005 | |||
| 4f6979967d | |||
| e633c51b50 | |||
| 143f0accef | |||
| b413f3da26 | |||
| 6eafa552bb | |||
| 7a0514d9b4 | |||
| 7e7565299e | |||
| ed34a089c6 | |||
| d14a2c5282 | |||
| f014406b65 | |||
| 58771ecca6 | |||
| 5d9dcb634b | |||
| 19c2c1edcf | |||
| 0430e7931e | |||
| bb8e607442 | |||
| e61ada944d | |||
| 46730315e3 | |||
| 4869142034 | |||
| 8e42e17bbf | |||
| 38c8b84a26 | |||
| c652626a37 | |||
| 06f6e47ebf | |||
| 403b180b1d | |||
| ee008acfbd | |||
| d149092ac0 | |||
| eafa136c69 | |||
| 402c885987 | |||
| 5e7e0508b9 | |||
| ff1d5fb794 | |||
| ad3f63b5c4 | |||
| a3e51e6dee | |||
| c1b9c79f54 | |||
| e0bc040b0a | |||
| 85eb4c7537 | |||
| 1f929d47d0 | |||
| 608662d73b | |||
| 7841d23e77 | |||
| b72dda4ada | |||
| c59c8a1ea2 | |||
| 1522293be0 | |||
| b37bc99330 | |||
| 7f905724b1 | |||
| 2bf5bb1625 | |||
| 08d3376740 | |||
| 7bace76176 | |||
| ef336dbcc6 | |||
| ca7217e717 | |||
| 3931cb7871 | |||
| 9e8de4abe5 | |||
| 26be845563 | |||
| 2f11a629fa | |||
| a295437e11 | |||
| 04597fb804 | |||
| f2f002409b | |||
| 509de877ca | |||
| 63aea4a7dc | |||
| 6470c748db | |||
| 25a6429e6a | |||
| 4fa1c2a97e | |||
| 9ad39d77cc | |||
| 92527126a8 | |||
| 02b4a4c974 | |||
| ede570be21 | |||
| 08627e9df5 | |||
| 6d9f3adc86 | |||
| 96433b4e39 | |||
| f4947cc2ae | |||
| 7b554d4f72 | |||
| 5b54544438 | |||
| ef78d23494 | |||
| ef8a7f330d | |||
| b72e0f3060 | |||
| 2a0bab938b | |||
| cd637629c4 | |||
| b9adfd801d | |||
| 69355514c9 | |||
| 33dc947c21 | |||
| 6de021d8d8 | |||
| 9be86621bf | |||
| a7a0876298 | |||
| 31b42345c3 | |||
| 1b172e729e | |||
| 3bf387a2d4 | |||
| 9f20bbb046 | |||
| 82af555974 | |||
| 50638b5213 | |||
| 650df95b72 | |||
| b2115a4162 | |||
| d67bf16a08 | |||
| a4c9b64224 | |||
| 8f572e5fe6 | |||
| e58873044b | |||
| 8ada92a69f | |||
| 3c8ed5c000 | |||
| c127d5b64a | |||
| 2d3bd0809a | |||
| eef955a9dd | |||
| e59ce39dc6 | |||
| 62815f5c3c | |||
| f496010273 | |||
| 143c4e3322 | |||
| e7f1e99a5e | |||
| 140a031515 | |||
| b7c91941b8 | |||
| 33f0b6da67 | |||
| ee18fe9bba | |||
| a51330cf07 | |||
| a67aed2744 | |||
| d979e19315 | |||
| 4c74d16795 | |||
| 6e541a432f | |||
| d8f47e248a | |||
| d1a869496b | |||
| f42a37555d | |||
| d9e019bd87 | |||
| ce194fa5d8 | |||
| b5bdf57636 | |||
| a3a81ce7c6 | |||
| 61f347401c | |||
| d985a4c250 | |||
| d31947e1f0 | |||
| e4659b7d7c | |||
| 8827a534db | |||
| ddf48b45a5 | |||
| 8eabb9b02f | |||
| 8a195a0b35 | |||
| 955206aaf0 | |||
| 082dd7d5ee | |||
| 90714cf624 | |||
| 61798d33f0 | |||
| 6e2a41cb26 | |||
| 515897e180 | |||
| fe4a8f33b1 | |||
| 304d848f53 | |||
| b5f738abf3 | |||
| 7ebed06393 | |||
| 2e56fe82bb | |||
| 32019c61aa | |||
| f7ffae565c | |||
| cd11bb1606 | |||
| 24c924d668 | |||
| 9be94e4b58 | |||
| 15e9d8c99d | |||
| 391f511094 | |||
| 5b53c11a6b | |||
| 9df4b6ea24 | |||
| a440564ba4 | |||
| 9583cfcc93 | |||
| c4a921283a | |||
| 4e05f087f9 | |||
| 40b506d2e0 | |||
| 263f384810 | |||
| d80c145a18 | |||
| 8848fe35f6 | |||
| 7a681bd20d | |||
| ed31fb184b | |||
| 360b94dd6c | |||
| 8524e73f59 | |||
| 940514e5ca | |||
| a4e47625ac | |||
| 7c16872a6e | |||
| 994c3c3552 | |||
| c34f496600 | |||
| 8bca8629be | |||
| 85fdd579d6 | |||
| e88d2ff88c | |||
| bdf08baebd | |||
| 3dcdd25177 | |||
| 491e8640b2 | |||
| b23b7ef85e | |||
| b167374f13 | |||
| cd1f6e733f | |||
| d3fc7687b8 | |||
| 17a83d58da | |||
| 18a8e1b6d6 | |||
| 2c23cbb359 | |||
| cdd58cf757 | |||
| a0df325659 | |||
| a59005e836 | |||
| 5da6a27e6b | |||
| ef97af71e3 | |||
| 6ed67f4532 | |||
| 1278d663b4 | |||
| 0395c7b407 | |||
| df3d15ffb3 | |||
| 6f673310d2 | |||
| 978c3eca23 | |||
| 20bc848bd6 | |||
| ce7f1292dc | |||
| d97ff8bb40 | |||
| 8a9b46d82f | |||
| 12e5703541 | |||
| 1b87fc2ee6 | |||
| ebd0c780a1 | |||
| bd976cd562 | |||
| 0e511c3e07 | |||
| 300d489408 | |||
| 024d081167 | |||
| 348173d3f1 | |||
| 23e3814f8a | |||
| b818e2c4b8 | |||
| 6adb3dc142 | |||
| 0e154cc759 | |||
| 9dce8d9bce | |||
| 0aa3b9c487 | |||
| dc7ab3ed30 | |||
| 254259b354 | |||
| 9651c70efd | |||
| 5840190ed5 | |||
| a807b88694 | |||
| 0db82e09e9 | |||
| e5865f171a | |||
| 166d198dcb | |||
| 445795f2ec | |||
| 6be4a87dac | |||
| 17c47053d6 | |||
| b4e18f7521 | |||
| fbe4d287c7 | |||
| 543fa3ae79 | |||
| 7cf855413c | |||
| f5d65dc0bc | |||
| 2f6211a1d9 | |||
| 513a57330a | |||
| 715ddf0620 | |||
| 6bb31e276e | |||
| b10f1df49f | |||
| f999519b13 | |||
| aedbf02830 | |||
| bd5479b250 | |||
| 9d14715652 | |||
| 72156fcf1b | |||
| 1c6eab00d1 | |||
| f9738c5b55 | |||
| 3b63083619 | |||
| d5d7d8bc84 | |||
| f26118cf5a | |||
| 5d6c4b475c | |||
| 2c4ef392f6 | |||
| 2a128fe772 | |||
| bb7d3ca3a1 | |||
| a2bdba7eda | |||
| e8aabc9980 | |||
| 9f554a14fd | |||
| 68a2b91ccb | |||
| 4089cc6e6f | |||
| 4e8848eeca | |||
| 8c6133c115 | |||
| 483db31acd | |||
| 35dae3dab7 | |||
| 8232aedf78 | |||
| d30a0a2e67 | |||
| d913fe508f | |||
| 4029903301 | |||
| 5db7e826d3 | |||
| 7f3e7da7c7 | |||
| 93cefde8fc | |||
| 02e7981e10 | |||
| 0ecec10af0 | |||
| 00b8cba987 | |||
| 8486bff918 | |||
| 5305eb5b8a | |||
| 377a3bb7de | |||
| 5a47e8d2c6 | |||
| 71f4cd7c85 | |||
| f7751684af | |||
| 59df1d39b2 | |||
| 7e5933e6a0 | |||
| 2cefd34bb7 | |||
| eac891dc3a | |||
| abd3599408 | |||
| 1bcd259c00 | |||
| c4e835266c | |||
| 685953f6a5 | |||
| 03fffbc724 | |||
| e1a8c932ee | |||
| 1aa2a6b054 | |||
| 1ad96c9c81 | |||
| f69199909f | |||
| d063e77040 | |||
| bf3ddeb1eb | |||
| fc261ad8cd | |||
| 90fc018295 | |||
| cdc01d9a69 | |||
| da7e76c07d | |||
| ba9118aa58 | |||
| fdce705e55 | |||
| 81268e7064 | |||
| f502f41359 | |||
| 34c9cfb6b0 | |||
| 6da1790c46 | |||
| d333c940da | |||
| c940d2906f | |||
| ac4b51ba85 | |||
| ea7a1ad2c7 | |||
| 45ddd6a68d | |||
| acd99364e0 | |||
| 14710dea55 | |||
| 5d3be8da1d | |||
| 3026821f9f | |||
| fba51dabd0 | |||
| c4da5e81fa | |||
| bc80d81432 | |||
| 67797efead | |||
| c7cb036536 | |||
| 0ccbc5f139 | |||
| 2a6bbcaf8f | |||
| d46a8438ba | |||
| cc9d19da19 | |||
| 6e6aa6fd6d | |||
| 61652a2989 | |||
| edd7503607 | |||
| c9d6dab401 | |||
| d303038bcb | |||
| 0a0e7c3b7c | |||
| 0b4ac35bc9 | |||
| c51864ca39 | |||
| a1cabd5a68 | |||
| 9c1bc99d7a | |||
| c05fedcb76 | |||
| e11beeae4b | |||
| 4749e0d71e | |||
| 1c01b77a71 | |||
| 1dd8ad3685 | |||
| d6f6350b54 | |||
| 4f3b85e604 | |||
| efd5bc24b0 | |||
| a1d5dfa1ac | |||
| 597c2ba180 | |||
| 2c2fb1b70b | |||
| fc1287659a | |||
| 1a76630594 | |||
| 322f682d32 | |||
| 0e329336fc | |||
| b33bdabbb6 | |||
| 27d30121ab | |||
| 345278f309 | |||
| 4953e77161 | |||
| 8d61e037f9 | |||
| 33a51e69bf | |||
| d5dd9bbf24 | |||
| 8772e52513 | |||
| 9e1631ad4f | |||
| 134b829d59 | |||
| 3df7d26101 | |||
| cf56086f06 | |||
| a72aca4379 | |||
| edb0b7519a | |||
| 3a3248c88c | |||
| 3f14b9dab7 | |||
| b1c07c22ce | |||
| 3b2c411274 | |||
| e418af1ccd | |||
| 7dc004acb3 | |||
| 2635472896 | |||
| 5c0340f9ae | |||
| c2c970ee33 | |||
| b52dabe091 | |||
| 3fa2db8d6f | |||
| 1e7950f671 | |||
| 8fde05191a | |||
| 2557de6c4e | |||
| 44328aee76 | |||
| f606b5879b | |||
| 83607119df | |||
| 9b86e68268 | |||
| d688a05ac7 | |||
| 97e975b4f6 | |||
| 9dd0e3ce4f | |||
| ca2293f6d3 | |||
| 0cd1ef0c7a | |||
| b0207ce524 | |||
| fab0c3b09d | |||
| 8b35dd3358 | |||
| cadcbb27eb | |||
| 297d44c614 | |||
| 22178f2224 | |||
| 554f8a376c | |||
| 4157affbd7 | |||
| 4b991203df | |||
| 38a265741c | |||
| 56eb02280f | |||
| ed900b0476 | |||
| 42206364e5 | |||
| 82d9bb8f51 | |||
| 923a9d3f9b | |||
| ae7660068b | |||
| f466c1d764 | |||
| 6e76f8ef3a | |||
| b3a8d02caf | |||
| 022ba32c1a | |||
| 8f5e89c900 | |||
| d335d7bafd | |||
| 1f51ef7df6 | |||
| ec082ee023 | |||
| a6bc271e0d | |||
| 791fd9199e | |||
| 9e8baf1914 | |||
| 64b7080532 | |||
| 8fd5479f32 | |||
| 04eb9c02c3 | |||
| 07b41b9bc3 | |||
| 8ebadfafe9 | |||
| 3283896e4b | |||
| b444bcf418 | |||
| 13034577fc | |||
| 9feefc2e7f | |||
| a5393e985d | |||
| e3fe0dc89b | |||
| 42d49e9d50 | |||
| 06eb244800 | |||
| 870cdfa51f | |||
| 93787c74ee | |||
| 945323fe15 | |||
| 5e41e69b27 | |||
| 9d14185f7d | |||
| 0f74162551 | |||
| 00b1ff1ff6 | |||
| 977024ea94 | |||
| 3534ed21d7 | |||
| ee093e5232 | |||
| 807ab8d19f | |||
| 81f3ff098f | |||
| 85a5759afb | |||
| 490e7a56a5 | |||
| e41c475671 | |||
| b0841268bd | |||
| b9b3b67b95 | |||
| 0d57d2cfe3 | |||
| 32de5d0d7f | |||
| 51eab2a4b7 | |||
| 93cf170253 | |||
| f7554374ab | |||
| b4870f62c9 | |||
| f1d713ebf6 | |||
| 4134a512b9 | |||
| cf998f945c | |||
| a7386238dd | |||
| 6b39d122a6 | |||
| a0582c5380 | |||
| 1f37112969 | |||
| 361958db76 | |||
| 8bc7880b19 | |||
| ceddf29586 | |||
| 3fc78e21bc | |||
| 48e00b371c | |||
| aee52d3880 | |||
| bd54499537 | |||
| e6da9e8d1a | |||
| 156ca03b67 | |||
| 3f4419b177 | |||
| 676f860d7d | |||
| 5ce93ae0c7 | |||
| 43231826b9 | |||
| 899b393fcc | |||
| 5c3e02d2f0 | |||
| a29064107e | |||
| 4cdc969801 | |||
| 68159d457e | |||
| daafc29d2b | |||
| 3c786acf2b | |||
| 53c3817d4d | |||
| 9109254488 | |||
| df19f0d5ec | |||
| 093362e479 | |||
| 7826a3652b | |||
| c27b7e52e1 | |||
| 6f79cbb2a6 | |||
| 6f33929f91 | |||
| 2e8b649195 | |||
| 3841be7e20 | |||
| 2c28521283 | |||
| 1c735cc204 | |||
| f0b13ae8e4 | |||
| b1a2f8fec0 | |||
| 83828aa8a3 | |||
| 4eb81b4d66 | |||
| 96d9968db5 | |||
| 2781e37ec0 | |||
| 6d61e773b5 | |||
| c5171114d1 | |||
| 0ca0a832de | |||
| aef54a4bfd | |||
| 4c473acfec | |||
| 0de41e97ac | |||
| 0e52ab3f90 | |||
| 797679b42c | |||
| 1bc8b6f46e | |||
| f322b580ff | |||
| 2b2f33e3f5 | |||
| ce29cd2fad | |||
| 0d5843f44e | |||
| e36e8e3b33 | |||
| e251a1ca19 | |||
| 4aedb00e43 | |||
| 10a0469221 | |||
| d3419acada | |||
| 65ea4117ca | |||
| 8b0101dcab | |||
| 188f67cfca | |||
| a89f4bd4b8 | |||
| 053c9dc0e1 | |||
| 493d9f1b9d | |||
| e28793f128 | |||
| ea2bddf245 | |||
| 763b3c05af | |||
| 473cfb54be | |||
| a7fd742c17 | |||
| b66ba140cb | |||
| 242f606a29 | |||
| 60a1214d7e | |||
| 189ab8c8e8 | |||
| 3765ca4e92 | |||
| df87d76070 | |||
| 8fbf0b406b | |||
| 633073803f | |||
| 104da198d3 | |||
| b3121e4534 | |||
| 3bb654cc85 | |||
| d2830db94d | |||
| ad6914b938 | |||
| 57ba965b93 | |||
| 544ec21fc2 | |||
| 1bb0fa1809 | |||
| ffa0efc898 | |||
| af6b4b8c27 | |||
| 3f7c1f966b | |||
| 535515f296 | |||
| 7af6c4b10e | |||
| 2076bef95b | |||
| 48ce1f1814 | |||
| 5151c8a505 | |||
| 44248f19b5 | |||
| 8d433f2580 | |||
| 272fe5488c | |||
| c97765de14 | |||
| 7acf150ac5 | |||
| 077bbdfc78 | |||
| 2fb38ce13a | |||
| 22dc183f25 | |||
| 3c492c3fc7 | |||
| d71db2978e | |||
| e4723e0bad | |||
| dc56c4e530 | |||
| 9579a51a8b | |||
| 71f897ebf5 | |||
| 09d9f71ae9 | |||
| c678ccdfb1 | |||
| bbbebe343b | |||
| 033cb4f0c2 | |||
| d750034b79 | |||
| a2063f0628 | |||
| acf2f2ffc4 | |||
| d14f484c4b | |||
| 695e515a65 | |||
| 61089feee7 | |||
| ddc9b10cd3 | |||
| f95c92b431 | |||
| eba65a94e6 | |||
| c28a0c6bb8 | |||
| d6bacd9b47 | |||
| 70b1657323 | |||
| 1ef08bd169 | |||
| da68cc6a78 | |||
| 45c75d42ad | |||
| d4e55af2c2 | |||
| 48791a329d | |||
| 9b26ebed75 | |||
| e2160fb6c9 | |||
| 345a1c64f9 | |||
| 7ad1e7756b | |||
| 90caf19e9e | |||
| 8d0b3b7d44 | |||
| 4c253d68d4 | |||
| 73d1b331f1 | |||
| af2fddfd6d | |||
| 3e065ead65 | |||
| 3774704326 | |||
| 4a1100b6a4 | |||
| 63dec77ed6 | |||
| 1d3a66f890 | |||
| c1da92ca22 | |||
| 13475002d7 | |||
| 5bb6f246ed | |||
| 89df7451ef | |||
| 1334d544f7 | |||
| 3fefaa7362 | |||
| 15d62f7b96 | |||
| 83e0aaa511 | |||
| ee06ce1148 | |||
| 16d6124bb4 | |||
| 1197beaa13 | |||
| 98b428a8be | |||
| 17f47d3c0a | |||
| a9cc3b2a89 | |||
| 199102c106 | |||
| c7d76fb7ab | |||
| ba9b86c0dc | |||
| 5de83a606e | |||
| 01a0c8672d | |||
| fa522c0ffc | |||
| 16241d010f | |||
| 9cb8fbf178 | |||
| bd7ef27628 | |||
| 42e520e841 | |||
| d8f9cd237f | |||
| 33065ecf04 | |||
| 718a1da262 | |||
| b89c3ebb42 | |||
| 9d7e44feff | |||
| e48a60a4f0 | |||
| 163e1907a4 | |||
| ac1ccaa246 | |||
| 53b45279ad | |||
| f80daf5de1 | |||
| 298ea1f0d3 | |||
| 1d13d8c4a0 | |||
| 2238c99b61 | |||
| 7d4dfbef2b | |||
| 759827b404 | |||
| fca627d1b0 | |||
| 404da18aed | |||
| 330fca722a | |||
| 8939cd120b | |||
| 63afeb7373 | |||
| 6ba68a6455 | |||
| 1579c74302 | |||
| 373ca15c71 | |||
| a8a3caed1c | |||
| cb35ba4543 | |||
| cdd152d015 | |||
| 83ce7dc62f | |||
| b182b50f24 | |||
| 71a9941b84 | |||
| c777da263e | |||
| 2cb7b56a41 | |||
| 52f9ef14b9 | |||
| 8d6c594240 | |||
| 7ad77ff540 | |||
| acede72e9b | |||
| 771fd732d1 | |||
| 2a79a69f59 | |||
| 8c0321697f | |||
| 0151b3f9b3 | |||
| 82a51f35ea | |||
| 35944cbfc1 | |||
| f0aef9b28b | |||
| ae37c3902c | |||
| d612585582 | |||
| 7ca14d209c | |||
| c37f582c10 | |||
| 6272fb3822 | |||
| 2582fbac59 | |||
| 5abb578e47 | |||
| 015ebf89a5 | |||
| c6724968f1 | |||
| 9fa1772ae4 | |||
| 4551937812 | |||
| 51ee664cae | |||
| fb611a98f9 | |||
| a3d5face38 | |||
| 424cd497d3 | |||
| d46eeffaaf | |||
| 6520f2061e | |||
| 5d93f86b4b | |||
| b3f63ce7ae | |||
| 56de770682 | |||
| 940341bc9d | |||
| 804a0ce601 | |||
| 41054a4c56 | |||
| 7b8e5d4180 | |||
| ca2369f1c1 | |||
| 129cb0b3cd | |||
| 632b2ae1ba | |||
| 18e55061e1 | |||
| e49b65723f | |||
| 8e52894763 | |||
| 07cba6c774 | |||
| 9cb639b505 | |||
| 4cf6eeeee2 | |||
| c0f692792f | |||
| bd77e0945b | |||
| f0eb171b2a | |||
| fb93662b5c | |||
| a26c982e93 | |||
| 7db3e98944 | |||
| 4a87834e04 | |||
| bf6ecaeeb9 | |||
| f70ef86dfa | |||
| cd3132667a | |||
| 1c459a7bea | |||
| 4f0bfeab4c | |||
| c5c9921b59 | |||
| 6b63aba1fc | |||
| 382331fb11 | |||
| caf9af7ae4 | |||
| 45d2adeb9c | |||
| 96708d7592 | |||
| 13090d1219 | |||
| 8ab229cca9 | |||
| 583cd078dc | |||
| aa2ac1bbb8 | |||
| 928b426672 | |||
| 6766b14415 | |||
| 9d0f9e967f | |||
| d7609088e5 | |||
| b2643b6926 | |||
| 07b65ca069 | |||
| 25727f7f99 | |||
| 880ae89307 | |||
| 1496df1989 | |||
| 7d8ae6b4b1 | |||
| 312d4cccaf | |||
| ce5f9f95ea | |||
| d9bf8a76d9 | |||
| f7a35fb9fe | |||
| 3ba691ded5 | |||
| 7a7277d56f | |||
| 76be5dd1d3 | |||
| 53dc63f3bc | |||
| 80da0bc9d5 | |||
| bce7af4e11 | |||
| 9da09b51ed | |||
| 86392f197f | |||
| 1c13046297 | |||
| fbc756b531 | |||
| 6c64b06453 | |||
| 241834029a | |||
| 5b8a9c0b47 | |||
| 037c29d24a | |||
| 893f26ac9a | |||
| d43f8e3100 | |||
| 2b42acf7b8 | |||
| f65b80ed42 | |||
| e84abbdc82 | |||
| 66269eabe9 | |||
| 36c0928483 | |||
| 9237e15adc | |||
| 0d3a2072b2 | |||
| aa2ee5dfc2 | |||
| b515fa39ec | |||
| 76e3f4eb92 | |||
| 4959e5c6c2 | |||
| 7082594bbc | |||
| 36dd35f238 | |||
| 9c9fb6a485 | |||
| 5438a4837b | |||
| 84996e8cb6 | |||
| 87a368a857 | |||
| 21412d93dd | |||
| 0b11ff22b4 | |||
| 8fafa78796 | |||
| c43158f8a2 | |||
| 92ad524947 | |||
| b362a61863 | |||
| 468fec38d7 | |||
| 89830a5ae0 | |||
| 5977c296bd | |||
| 47d5792d97 | |||
| 25d706a913 | |||
| 048236aaaa | |||
| d442c58fd1 | |||
| f890f6bb09 | |||
| 036d466790 | |||
| dee47ba2d8 | |||
| be96c28b77 | |||
| ad1c0f578e | |||
| c8f7b1b72c | |||
| c89702ae84 | |||
| 2d29a82250 | |||
| b36c65e654 | |||
| 09b072b908 | |||
| 0ae9fee350 | |||
| 1579182ed9 | |||
| 074671aa71 | |||
| 36b7c47247 | |||
| 424d5b3025 | |||
| 8a5d352733 | |||
| f383629282 | |||
| a6d717cb04 | |||
| 84a5753301 | |||
| 5d2d9c7e81 | |||
| 82801d1411 | |||
| 340c3963d8 | |||
| ef15cf9847 | |||
| 4d613ccfa7 | |||
| 43ce34d547 | |||
| eda074cd80 | |||
| a2396d82f6 | |||
| a38721db93 | |||
| a06e811717 | |||
| 86e534ff75 | |||
| 640d5b2dec | |||
| 57e9b27085 | |||
| c56eefc739 | |||
| cf28306997 | |||
| 10acf3ddd1 | |||
| fed3ed9f9a | |||
| 260138ba11 | |||
| 67f7e0089c | |||
| d4a22c7851 | |||
| 06cf986490 | |||
| adf9aa04ce | |||
| 69f66fbe52 | |||
| d061005c89 | |||
| f6ee8b9f04 | |||
| 31af22c2ff | |||
| c421e3f243 | |||
| 6e92902407 | |||
| 6256381dc3 | |||
| b247b051ea | |||
| afbd553622 | |||
| 36bc14e884 | |||
| 9c5d0ff2ff | |||
| cfa6c8ddf6 | |||
| 21924bf022 | |||
| eea33f6019 | |||
| 66d48ae808 | |||
| de9b9fd0b1 | |||
| ece7384be4 | |||
| 0c052e4506 | |||
| 1996a0a3d6 | |||
| 679ad9b8c6 | |||
| d4983731e7 | |||
| 4fec3c8f34 | |||
| 836fd2565f | |||
| 54618064a1 | |||
| 519e3e01ae | |||
| aec8f81358 | |||
| c1d6bf4366 | |||
| 9bf2b79d9e | |||
| 4d98408995 | |||
| 7b466388f9 | |||
| b926fb3c66 | |||
| 6c8d5c0d0e | |||
| 5a1d234260 | |||
| fd6d42c297 | |||
| 7310ad6e92 | |||
| 7e47b1348d | |||
| 1e3555a6b7 | |||
| 9a67ce5968 | |||
| 279d7955f8 | |||
| db977c0bf5 | |||
| ba6bc59818 | |||
| 6e8be0578c | |||
| 92f7d16b5e | |||
| 40bb3c2f5e | |||
| 56a6096221 | |||
| ee37b42a91 | |||
| 0806e61df4 | |||
| 279ffeeefa | |||
| 80c5ee2479 | |||
| 16208544e5 | |||
| 6afeb24fdb | |||
| e6357b81eb | |||
| dfc2efe8a6 | |||
| f28b96f431 | |||
| a10293f8f7 | |||
| b1f02f91d7 | |||
| e76fa45d86 | |||
| 06f43892a5 | |||
| a094332b0d | |||
| 7b8779f534 | |||
| 371bf20d19 | |||
| 0f633ddd15 | |||
| 7886ca7f5f | |||
| 9b4c11954d | |||
| a1b724f30a | |||
| 7c3b2fb9cc | |||
| acef68d67e | |||
| 7e393d5f1e | |||
| 955c31b165 | |||
| e307cd48ad | |||
| 25f8b9e451 | |||
| e8ba14a2c1 | |||
| 9670d3341c | |||
| cec9778fd5 | |||
| 7451db4a68 | |||
| e31777ec53 | |||
| 7aa0b3dc7a | |||
| e7b2d5dc01 | |||
| 47d728667d | |||
| e1f8989d54 | |||
| 1d8cb47830 | |||
| faaa7c37a9 | |||
| 0aff9d8df4 | |||
| 30c3f8c1ac | |||
| bcd2469e01 | |||
| 983c6ae73d | |||
| 6d8e1fe776 | |||
| 99b4921309 | |||
| 3c231c3c9e | |||
| 175c0a6236 | |||
| 0031ceb06c | |||
| e3cc5a63df | |||
| 3cb61402c2 | |||
| 5336c51199 | |||
| 52aa658aaa | |||
| d08a51d7e4 | |||
| d97a557ac3 | |||
| 8a68d9cded | |||
| b031f7e902 | |||
| 963ffecb96 | |||
| 8f8aaca818 | |||
| 801f92b7e7 | |||
| 44db45700e | |||
| 25902005f6 | |||
| ffec71e0d8 | |||
| 99a208110b | |||
| e56799c993 | |||
| 957eb300f8 | |||
| 626025d539 | |||
| 9e8a0a020f | |||
| 40f592eade | |||
| 5e899f0be4 | |||
| f2748284b1 | |||
| a15ce00934 | |||
| 9e3e80261b | |||
| c72c685434 | |||
| 0177a8d277 | |||
| b6a9b0a4c9 | |||
| f4f8bd8d42 | |||
| 6e4aeffc0c | |||
| dba256d384 | |||
| 910008e9e7 | |||
| 8cb9545c41 | |||
| 59c16da6fb | |||
| 630df5bbd2 | |||
| f550111400 | |||
| 77377195aa | |||
| 7e2e72bd40 | |||
| aa7a13bd02 | |||
| 5895058a17 | |||
| ffb60d5149 | |||
| 1e2cb279b0 | |||
| e7f766f5ba | |||
| 8de5aa9409 | |||
| bf28a4df49 | |||
| fe1a0ab371 | |||
| 01daccfaf7 | |||
| 94e861e298 | |||
| d36af2ed5c | |||
| 7104b33214 | |||
| 32998e5377 | |||
| af0c9ef092 | |||
| 3bc3b3d10e | |||
| f03f42ca4d | |||
| 79783abeb1 | |||
| 895b0bd602 | |||
| 2ee5ee92f8 | |||
| 3e619423b1 | |||
| b524e18bdf | |||
| 6aa4579db8 | |||
| 17fb86c0f1 | |||
| 62ecfe4873 | |||
| 04e55e6b9a | |||
| f432aa1090 | |||
| 7add104313 | |||
| 36de249066 | |||
| b7a54dcffd | |||
| 6bb28deab2 | |||
| 7f88d15c86 | |||
| 94c5014e23 | |||
| c5a8256500 | |||
| 5f39884bf7 | |||
| d96825a242 | |||
| 443a938091 | |||
| 6bc3197721 | |||
| 269cc91fd5 | |||
| c1ddea479d | |||
| 5f3a95962c | |||
| ee1a8e6a32 | |||
| eeae73296e | |||
| 4ca8357af4 | |||
| 8a5b8c87fb | |||
| 6ab04d7bbc | |||
| a5a1380636 | |||
| eeab1aef64 | |||
| 4e1c342e55 | |||
| d8ed259bce | |||
| 9f6cb5de4c | |||
| ba634118d7 | |||
| 63da091d36 | |||
| ad0dc88a33 | |||
| 147acf4b57 | |||
| 5085f3a15e | |||
| 22a95ad8ea | |||
| df4bd6a60c | |||
| 813e7b05e4 | |||
| ab8b486b4a | |||
| 590f666ec9 | |||
| 9adaee915b | |||
| bce0f06fe9 | |||
| 856ecb84a0 | |||
| 90ddc06c98 | |||
| 405abc4e95 | |||
| 549c59ecf5 | |||
| 0a485eafcb | |||
| e0c11956a6 | |||
| da6a9bf3eb | |||
| dacd11e1cc | |||
| fc854b4c77 | |||
| 4dcc1f0374 | |||
| fc57390242 | |||
| bd15ef0a0c | |||
| 967ecafc33 | |||
| 29576da985 | |||
| 200a2556ef | |||
| ae0ab5025e | |||
| aa74276b25 | |||
| b03112a5dd | |||
| a3f49df62d | |||
| aa2af3f6dd | |||
| 20dcbc593c | |||
| 472ba8c1fd | |||
| d8345a44a4 | |||
| a187cb6c9c | |||
| b89c0b35d1 | |||
| 7ffcc0a5e7 | |||
| bde43fbdfb | |||
| 3728b2208f | |||
| dc52a756ee | |||
| 98dc886841 | |||
| d0cf104e43 | |||
| d7ed2412f6 | |||
| 7d38f0e234 | |||
| 3e8d072d24 | |||
| 84ac771893 | |||
| 3a9e0b5be6 | |||
| 9694ff433f | |||
| 2e82e78b98 | |||
| aaef4bee27 | |||
| 4ca8569488 | |||
| 8377ada3e0 | |||
| 8a034d59ed | |||
| 8e492d8798 | |||
| 7974ef80d7 | |||
| 3664d86430 | |||
| 9adef80d6b | |||
| be57adaee7 | |||
| d117e442a4 | |||
| 8820bc0796 | |||
| 57a64de023 | |||
| 5ed689ceb0 | |||
| 25f1765f36 | |||
| 063bd58802 | |||
| 901c6b34fa | |||
| 5b2d6488a2 | |||
| f6f35415d1 | |||
| 6c6069e963 | |||
| 6219d82560 | |||
| 1dcd7a16ab | |||
| b60caeb9dd | |||
| 4c4768aaf3 | |||
| 2f4ac0a663 | |||
| 23a446f852 | |||
| ec48334a1a | |||
| f4c061d412 | |||
| 31a076d7b3 | |||
| 6bd43d986c | |||
| dd32a2f15a | |||
| c88c20820f | |||
| 86de510731 | |||
| 0b31fbf827 | |||
| 34ad1450eb | |||
| e6ba71390d | |||
| f0c8dbe0ec | |||
| bf046a8ccb | |||
| b05ba7683e | |||
| aedf8dad15 | |||
| 74ebb7c722 | |||
| 1307f66494 | |||
| 448a24cb36 | |||
| 7266f23450 | |||
| c0ad31acfc | |||
| 25d3a0de27 | |||
| 1e38bbfbc1 | |||
| 1c62e95812 | |||
| d453cc27a3 | |||
| 2c3e841d8a | |||
| 50668c462f | |||
| 8d1192e832 | |||
| 4a8e2e9ed4 | |||
| 12fc45220a | |||
| 6bce68fbe7 | |||
| d54f947c98 | |||
| 6c8bb3a22e | |||
| ed29ce5183 | |||
| a51d269b7c | |||
| 8283e4e6d6 | |||
| 23ce91eb55 | |||
| 545ac7fcfa | |||
| 3926ccccad | |||
| f431307ef2 | |||
| ca368e0f9b | |||
| 8afeb56c11 | |||
| 2a6f90c5f3 | |||
| 271031128e | |||
| b991f954d0 | |||
| f12bb3f80d | |||
| 6dc978e8d8 | |||
| 9f05a873bc | |||
| 703d498772 | |||
| ed3b9543bb | |||
| fc7efba7d8 | |||
| b3178fe8f4 | |||
| e36798a993 | |||
| a143605465 | |||
| d3ad35b21e | |||
| 68134941bf | |||
| 54d0fef559 | |||
| 7f9c47176a | |||
| 9060ac7897 | |||
| d9073e4a17 | |||
| de1c1d7cc2 | |||
| 6ff1bd5917 | |||
| a6b04f426e | |||
| fa49dbe2cb | |||
| 682eb04a52 | |||
| 77064fb09e | |||
| be8d93563a | |||
| d4a6a5216d | |||
| 1cb1427050 | |||
| e4f4eace1c | |||
| 30a98b7e8c | |||
| d36c8d95ad | |||
| 506bd0abcf | |||
| 8dd810c41d | |||
| d9d0dc5201 | |||
| 72880d9e03 | |||
| 6c7ec6eb1b | |||
| 705fc5d116 | |||
| d20b575b9b | |||
| c949beab9c | |||
| 3fb857c435 | |||
| 0a4f999ade | |||
| f0b7147881 | |||
| b36a42cd0a | |||
| 000309b47f | |||
| 5cb12988f0 | |||
| 50c4b749ec | |||
| 5db2734e6f | |||
| e9e5507483 | |||
| d63dc7adfb | |||
| 27db44a8db | |||
| 1a035e2866 | |||
| 887aa20116 | |||
| 5e03d86695 | |||
| 95075aa28e | |||
| 0260f0790a | |||
| 34d65ba292 | |||
| 27a77a15ed | |||
| 76025bfae1 | |||
| 4957faf482 | |||
| 0d8e16d5c8 | |||
| 07baed1581 | |||
| eab5da075a | |||
| 0d1bbb19ce | |||
| 58d6cbc6ac | |||
| 4d3b627839 | |||
| 49455c99ad | |||
| 31bb6bedbd | |||
| 8d54678ea1 | |||
| 590767c299 | |||
| ec1bd342b8 | |||
| b031c9e7f6 | |||
| ea0dfe83b7 | |||
| bdd90f2c57 | |||
| 288dac5d70 | |||
| 9d22e1c35e | |||
| ace2359e7b | |||
| 617e6510a5 | |||
| 26024770b8 | |||
| d556f58e34 | |||
| b6f302dfc0 | |||
| 8e9b5f14af | |||
| 3635c00143 | |||
| abc71baaa6 | |||
| 959aaebede | |||
| d17f8c5049 | |||
| 42a7201a70 | |||
| 1f1744a49a | |||
| fd7dbe5bd9 | |||
| 984549400d | |||
| cf0c49277e | |||
| 16c3f9fa9c | |||
| 2f2539cf34 | |||
| e66823d017 | |||
| 881c32a3df | |||
| ea0a361c35 | |||
| dc60f8bb7b | |||
| 9e92c9ea12 | |||
| a503a54240 | |||
| 265957712a | |||
| c26962bb71 | |||
| a428eddf93 | |||
| dc4f7eb2f9 | |||
| d54ac1ba91 | |||
| a3d46b18ac | |||
| e81dd05666 | |||
| 29394935e3 | |||
| df8acc4ed7 | |||
| 81928d4ab1 | |||
| 3ebf93e03d | |||
| 59e4032f1f | |||
| 8f15777427 | |||
| 748c4bf780 | |||
| befcf6d2b3 | |||
| 48236ecd3c | |||
| f340f84de7 | |||
| 40e19293f9 | |||
| f252f824a4 | |||
| 1d7e5a8130 | |||
| cb2ff92c2f | |||
| ef373ab54f | |||
| 9141a78c29 | |||
| 10a6370738 | |||
| 573009eeb6 | |||
| c3363712d9 | |||
| faa33d89a2 | |||
| f347458c53 | |||
| 530e6d9196 | |||
| b398e18e12 | |||
| 747e8370e0 | |||
| 2c67875781 | |||
| c96e8a8c19 | |||
| 5f203fc082 | |||
| b943c9b471 | |||
| 1a90a1daa8 | |||
| 72dfc743fd | |||
| 465307655b | |||
| 6ce71e6694 | |||
| 7f01b3b92a | |||
| 76950d56b9 | |||
| c11e0d02b3 | |||
| 4c798c1718 | |||
| 450d7e9ad4 | |||
| b8ab79c83e | |||
| 6934bdd533 | |||
| 84dedb73a5 | |||
| 8964aa5221 | |||
| 3481ae236c | |||
| 46adc5f8a4 | |||
| 5296df5899 | |||
| 13dad4be16 | |||
| b5d0c343b4 | |||
| b00b945264 | |||
| 3bda09e105 | |||
| 32d32c4e4a | |||
| 497441b54e | |||
| 9c564fd4c7 | |||
| 0c2263d0e9 | |||
| 3d4d30766d | |||
| 99d84d44fc | |||
| 41ba7077ad | |||
| 8a929a91c3 | |||
| 0604f06841 | |||
| 229924adf9 | |||
| df988b7c69 | |||
| e8106e2e34 | |||
| c21d3e24f8 | |||
| 2d87aa0753 | |||
| b2ad4dc9a0 | |||
| 370f2ea98f | |||
| a05ca565ff | |||
| 52255637f2 | |||
| 0fcaa3a2f5 | |||
| 0e2fa6eb9d | |||
| 1aac462c83 | |||
| 2a0edfd8f7 | |||
| 1f59a9f846 | |||
| 80c20a90ea | |||
| 56a35649fe | |||
| f07cea0b79 | |||
| 4c1b08a281 | |||
| 117f9eddcd | |||
| 7bbbfce482 | |||
| f37a7811f9 | |||
| 9173c10239 | |||
| 318b31550d | |||
| c18ebc63a6 | |||
| d704694272 | |||
| 1cfec3bdf7 | |||
| fe6ea6bc10 | |||
| d29c8df45e | |||
| 71f996af95 | |||
| d9722ad6b3 | |||
| 398fd8028c | |||
| 1345a3cfd3 | |||
| 7eb0b195b8 | |||
| 009caee82d | |||
| 3bdc805a22 | |||
| ac457792b4 | |||
| 1377b54b9e | |||
| 66418ffc8c | |||
| b4c4b1fb70 | |||
| ffe4a4b047 | |||
| 753ce45310 | |||
| fece0d73e7 | |||
| edce076e68 | |||
| 675d0a009a | |||
| 5d41b5a4db | |||
| fe53b135eb | |||
| 5b1c154ee2 | |||
| 816d882611 | |||
| 12bcb09051 | |||
| c59c69a85f | |||
| bdd0daaf6f | |||
| cfad7c8356 | |||
| b2b8a128d0 | |||
| 1cfad80ca2 | |||
| a5a80e41b8 | |||
| 152f8e92bf | |||
| 0323560b49 | |||
| d3bc84a2f7 | |||
| 8a82c259bd | |||
| 46009c7658 | |||
| 6f760308bd | |||
| c346f8f17d | |||
| af1d059fff | |||
| 5562b21a20 | |||
| 8f68f31877 | |||
| ce7e94030c | |||
| ccf5a1b972 | |||
| 0d5ae77efc | |||
| 1695096d18 | |||
| 6db0b7cf18 | |||
| 575b43b0d4 | |||
| 7b39b05894 | |||
| 8bea9e0a5e | |||
| 2255b32e45 | |||
| b62573ae8f | |||
| 44ed84f5cf | |||
| d008c834be | |||
| 2d3a914aee | |||
| 7324f4c3d1 | |||
| 50c8860a50 | |||
| 6456de7188 | |||
| 23c629f2aa | |||
| 2bf154f74f | |||
| b598ad1bc0 | |||
| ace24ad68e | |||
| 750c1a0f27 | |||
| 52d89bd66b | |||
| 8cfb9d35e9 | |||
| 2f529158a0 | |||
| 6e68ab6d9e | |||
| 7a3c55af35 | |||
| fb39d6304a | |||
| 4cb57d9059 | |||
| 42d69bd0e5 | |||
| f27b399f81 | |||
| a545a3938f | |||
| d1e352c9ee | |||
| 99be1e798b | |||
| 2132a28a17 | |||
| 8b1cc28783 | |||
| 78364ac830 | |||
| 6e5f5732b5 | |||
| 87844254d1 | |||
| 08ef9f69fb | |||
| 5fbd1b78e7 | |||
| 39f5eb753f | |||
| f4cbe3f300 | |||
| 70632e5541 | |||
| 0bba700105 | |||
| b71aaccff3 | |||
| 7271ae9611 | |||
| 6e32dff2ad | |||
| 8f7c898c08 | |||
| f4a9815f48 | |||
| 0f8d5c7e98 | |||
| 5e83596a1b | |||
| 6361213e07 | |||
| 9c59a5d9b6 | |||
| bb04844bd5 | |||
| 0b988176fa | |||
| a354f18a2d | |||
| a7ca0fec88 | |||
| 06eec508df | |||
| 10dc580a3a | |||
| 2f6ae3ef01 | |||
| 392e803905 | |||
| 83a5fb585b | |||
| c6205ffbe0 | |||
| c04737ce20 | |||
| 11b92172fe | |||
| 3a6c574376 | |||
| b21ce925fb | |||
| de9dcc4ed6 | |||
| 9e77dbfe20 | |||
| 4cee0676a4 | |||
| 8ad9d21db3 | |||
| 8ba8317eea | |||
| d221187f24 | |||
| db54ec294f | |||
| 1d39796e3f | |||
| cd6a318903 | |||
| 73090b98ab | |||
| 745de1abab | |||
| 961031efc1 | |||
| 2487595778 | |||
| 5c4863d504 | |||
| 5e3a658932 | |||
| cb4704c821 | |||
| cc0b7d1492 | |||
| f8ebbf8b08 | |||
| 8795f60bf1 | |||
| f00c0a9436 | |||
| 767bc71870 | |||
| 4c068e3e00 | |||
| 277d862172 | |||
| dbed6a47bb | |||
| 94f3749784 | |||
| 728e6d851e | |||
| 11e863545f | |||
| dde49f0bb4 | |||
| a37a75aecc | |||
| e43e3aeb1c | |||
| a8fe529814 | |||
| d9f5e2bb08 | |||
| dfa83b0ac8 | |||
| bd5cef1411 | |||
| cd70b48831 | |||
| 50ebf8088a | |||
| c5cfb7eb40 | |||
| bccaafda6d | |||
| bf0086d7b5 | |||
| 7e65938ca6 | |||
| 112eff2509 | |||
| d7837d9179 | |||
| 6cdd057f80 | |||
| 5a03b213fb | |||
| f270213246 | |||
| 2e1795c5ba | |||
| 732d6710d3 | |||
| edf384d2ee | |||
| c307640826 | |||
| a77b598f82 | |||
| 217420cfa5 | |||
| f2b9dff596 | |||
| ae945ed315 | |||
| 770c153c76 | |||
| 29c4a7e606 | |||
| 8875470b37 | |||
| 6e52364bcb | |||
| 7015d616b4 | |||
| 92e6da3260 | |||
| 9220b6f1d5 | |||
| 1d0d538d0c | |||
| 83052eafae | |||
| fa95c3c4a2 | |||
| 665dcf221b | |||
| 8f73dbd253 | |||
| 826312cbad | |||
| 72a18f2b3f | |||
| a6b5e3d0ae | |||
| 1b321f4fa3 | |||
| fbde0b9f35 | |||
| 0e5f5e54cc | |||
| cbb5902066 | |||
| 92ec1b0598 | |||
| a62fc3abff | |||
| 08f8e55446 | |||
| 68f54a3247 | |||
| 29c099fe56 | |||
| 76b81c7b35 | |||
| d6b33ffd6b | |||
| 16b9873fa8 | |||
| ba4a686d1c | |||
| 4be3d79e12 | |||
| 2569b09dbe | |||
| 5d71e69941 | |||
| 16163bf20b | |||
| f1a97fecbd | |||
| a050f82f0e | |||
| ef7beea334 | |||
| 3f4acb33f9 | |||
| 14822e6395 | |||
| e82db4ed38 | |||
| 87b7ea9cf3 | |||
| 787b1fceff | |||
| 140d6ad839 | |||
| 46e8e22236 | |||
| c386db2b33 | |||
| 8dad091c6b | |||
| 3365ccbb9c | |||
| 2ced230965 | |||
| 989d10a3e1 | |||
| 62d8c69774 | |||
| cf704257b0 | |||
| a6cb6f57d3 | |||
| 141c703ed5 | |||
| 796d58867b | |||
| 2f483ec8e8 | |||
| e338918773 | |||
| d9effc58cf | |||
| 05d03f97fc | |||
| 03e891c0e8 | |||
| 4dfe9d52e9 | |||
| 9e65692b69 | |||
| 0687c9a57a | |||
| ffe1287016 | |||
| 75b7e7260f | |||
| d631e081bc | |||
| db5843d904 | |||
| 5ec16153f7 | |||
| 8c873ccdc8 | |||
| c95088f8d5 | |||
| 519fa55df7 | |||
| b8dda033ed | |||
| 0359e9c5c7 | |||
| d822b4a62a | |||
| d9e8c953b1 | |||
| 9eca502026 | |||
| cd0efe3edb | |||
| 8146e9cbcd | |||
| 5d95275024 | |||
| 49a97eea4b | |||
| 36e9c27e9c | |||
| 6e5153cd07 | |||
| c73da864c8 | |||
| 071bb75700 | |||
| 99374de340 | |||
| db7ae4ed5d | |||
| e61f481881 | |||
| 396a3ad2fc | |||
| be235ddc38 | |||
| 9e72ecd93d | |||
| 8e0bd936eb | |||
| 9d0270dcd6 | |||
| 713415c354 | |||
| 786550572e | |||
| 46caeddc81 | |||
| 71bfde2bfe | |||
| 76771b845a | |||
| a74e239e28 | |||
| 6e763b0b42 | |||
| 2f41ece017 | |||
| 01cd5fe0d5 | |||
| ed12ff7bb3 | |||
| f1386bb60d | |||
| 417bd06e76 | |||
| 91e46e3cf8 | |||
| deb5139c4d | |||
| 862ac5d014 | |||
| 028235d421 | |||
| 143d399849 | |||
| 375f171e47 | |||
| 387edcf4b2 | |||
| 011cd37cfb | |||
| 0d4254f319 | |||
| 4c407c2850 | |||
| 829e2d6c5d | |||
| a31c4bd474 | |||
| 17f24dc377 | |||
| de3e9f2809 | |||
| 4442a282e1 | |||
| 261010f23d | |||
| ede44ca6ee | |||
| 452a953234 | |||
| 2b122562ad | |||
| 6891bc3da3 | |||
| b31b8cd7f0 | |||
| e1379ac5ce | |||
| 0ef3f75d7a | |||
| 407a9e5be0 | |||
| 892bb9bf30 | |||
| 47ac871a12 | |||
| a38c3e7f6d | |||
| 08818355d1 | |||
| 0a68afef00 | |||
| 2c0783e327 | |||
| c2e5e45c84 | |||
| 014236c861 | |||
| 610fd7561b | |||
| d6f4480a4f | |||
| 28a6ac09ad | |||
| 86e4d24476 | |||
| 913a697ab2 | |||
| ebef2b1e44 | |||
| a61457b422 | |||
| 8f7f1135df | |||
| 89612c10c9 | |||
| d55bfb32f1 | |||
| d2b72cf496 | |||
| 8d90fffd46 | |||
| b84af27a86 | |||
| b45f28f3e9 | |||
| bfa1b5656a | |||
| 47f946cd65 | |||
| 970e7bfcda | |||
| a81c7a7cd6 | |||
| b0e1bd239f | |||
| 53ca41717a | |||
| 6a5bee0cdd | |||
| fd3ae51f83 | |||
| 5e5954a808 | |||
| add8540909 | |||
| 06a302aed0 | |||
| 147432d38d | |||
| 2a003ff72b | |||
| 8660d3324d | |||
| 6c59b73ae5 | |||
| 80218c1eca | |||
| f24d96d59f | |||
| d14bd49f46 | |||
| 1a692a0873 | |||
| 631a1a4ddc | |||
| 57df7601d9 | |||
| f7650000aa | |||
| 6f93c2d9b2 | |||
| 1654764968 | |||
| 1a1b8416e2 | |||
| 36c66d52a6 | |||
| 68fe43d488 | |||
| 877b9ee23b | |||
| 80ff93beeb | |||
| b9ddd2812b | |||
| ba54b56de4 | |||
| 85be67bc2d | |||
| ae20e01d2c | |||
| d094e8c3fc | |||
| f009fe1f63 | |||
| 2007fe5f49 | |||
| 84989ffa04 | |||
| 31b629a19c | |||
| e762d9e274 | |||
| 6833267b19 | |||
| 05f2833388 | |||
| 0d026ef18d | |||
| b756d93891 | |||
| f54513586d | |||
| 6c519c237e | |||
| 4ffde4db98 | |||
| 41847d31e7 | |||
| 24ce25bb5c | |||
| e051b69e80 | |||
| 59283d1164 | |||
| 0de32a5edc | |||
| 4f80066dcb | |||
| 04ddc8003f | |||
| 3213f98d66 | |||
| 1f16f85c51 | |||
| c03cb3a11c | |||
| 62e29a6546 | |||
| 3574b065d6 | |||
| c0c47f41be | |||
| 37761d580f | |||
| e075c8e691 | |||
| 0c61ca1a6b | |||
| 1846fa1f54 | |||
| 579ce20cad | |||
| 12e4bcba5d | |||
| b4f57dee3b | |||
| f11673ae3f | |||
| a27af7dd7e | |||
| 2b26a3cc14 | |||
| 47c4849694 | |||
| 30a4adf331 | |||
| 117a721166 | |||
| 1a219e62ba | |||
| c8d54b324b | |||
| 0ac2971fc1 | |||
| 348a40201b | |||
| 9f20ddc800 | |||
| 6f1cc2c1e5 | |||
| 601cd95277 | |||
| 8e9ce59ef2 | |||
| d76ef8e3cf | |||
| c19ffafd8d | |||
| 996a99ad75 | |||
| affb926d44 | |||
| c506e534aa | |||
| 9994315070 | |||
| 4f0d89ef8b | |||
| aab984618d | |||
| 8b662bc6b5 | |||
| 03ce7a8db3 | |||
| 033e7928b5 | |||
| b095f2a158 | |||
| 196c0e0ebc | |||
| 8ab309630b | |||
| 42bac47a71 | |||
| 3bc4de2236 | |||
| a6e4b45a38 | |||
| 28e97ccaf2 | |||
| 255781c029 | |||
| 7f5635ea8c | |||
| 4f18ec726c | |||
| 263622d628 | |||
| 1dfd2443ac | |||
| 881bd53f60 | |||
| ec4404b1ba | |||
| badaeac81f | |||
| 618d5ddaff | |||
| 4ed74af868 | |||
| 123d9af7d0 | |||
| 4f17b30915 | |||
| 1fc265b0aa | |||
| afae9b8d17 | |||
| 481be44879 | |||
| b8530b0f0b | |||
| 69de79684f | |||
| 6e6fd057b5 | |||
| 4b0ebf2b80 | |||
| ee82c32119 | |||
| 3fe6731035 | |||
| 1c3f3b5705 | |||
| def1ccffc4 | |||
| fa2e531343 | |||
| 814ddbc6cc | |||
| 267e8dcfb6 | |||
| 49ec1561f8 | |||
| e2dc612153 | |||
| 8f225431fe | |||
| 194be5e0b7 | |||
| 6788a05dd1 | |||
| 6a7066ac2f | |||
| ec5ff4e973 | |||
| fe6d460531 | |||
| 9cb97af10f | |||
| 1c784eea3d | |||
| 59dd33a461 | |||
| 97ebd912dc | |||
| 742fcc060c | |||
| 3ad5cb8a23 | |||
| 0d1f12e31a | |||
| a8ddf8f66d | |||
| f7a9c0a248 | |||
| 190badb395 | |||
| 3d91ab6c31 | |||
| c15b8d71bc | |||
| 5a707dba8a | |||
| ffd2fcde6b | |||
| 8e4056c1e4 | |||
| 1554e2b135 | |||
| 4715cbb70d | |||
| fd1611079a | |||
| 8edc03df64 | |||
| 9f5c0af5b8 | |||
| 6d6eeba5d5 | |||
| 5dfb64ef71 | |||
| e5bda7add7 | |||
| 77f9b336bd | |||
| cf930d0dde | |||
| f01c94e8bc | |||
| 0d774527b4 | |||
| 58ba9496d0 | |||
| 1993e94e53 | |||
| 3bcc06ed09 | |||
| 2f6ce88e28 | |||
| cd1dec9fc7 | |||
| 05872d7650 | |||
| 1dcee2ffa2 | |||
| 5f622efb77 | |||
| 52e8326d54 | |||
| 436532bed7 | |||
| d15e789200 | |||
| 98942f5528 | |||
| c7c21dc122 | |||
| 4500c1d1a4 | |||
| b8b983dded | |||
| d6a6673971 | |||
| 0580fe8db8 | |||
| c727e24138 | |||
| b83698ebf5 | |||
| 3fbbaa5130 | |||
| 2f48b840ae | |||
| efdee11d5a | |||
| 4c87e11aeb | |||
| e881e008b8 | |||
| 1b2837915d | |||
| d076a6724f | |||
| 386af71c39 | |||
| 49f277192c | |||
| 5974a6276b | |||
| e06a390771 | |||
| b34e204676 | |||
| 755d990dfd | |||
| 7185358b98 | |||
| 3843ec1e02 | |||
| cfc5631d5d | |||
| e64555aca0 | |||
| ef52ebb529 | |||
| c98136ca4f | |||
| 65f44d24ca | |||
| 44f20782fd | |||
| 9b1d76a5d0 | |||
| 21b5074ce8 | |||
| 0b8825fecb | |||
| 3d3c20e507 | |||
| 67a282f19f | |||
| 92023b533a | |||
| c1d14c150e | |||
| aa656c74d5 | |||
| e39b7ffe30 | |||
| 1897148abc | |||
| b76118802a | |||
| 8266aa3343 | |||
| ab0c349261 | |||
| d5e0e66426 | |||
| c5b3107f83 | |||
| 1a0a64e4de | |||
| 6bd9805bcc | |||
| f74c2af65c | |||
| 9531bdf674 | |||
| 76e705e7ee | |||
| d35211328e | |||
| b7bbd81dda | |||
| 9836dd5d10 | |||
| 2109ad320d | |||
| c026121c0e | |||
| ee0c87f7b1 | |||
| 709fb93a22 | |||
| b38cd0a48d | |||
| 264435c32d | |||
| c285929ad3 | |||
| 1cbea8157d | |||
| 0a10334f1b | |||
| f0d5a6ebac | |||
| db7086b5e6 | |||
| 0e92280b33 | |||
| 0d7255158a | |||
| 33564b68dd | |||
| ba942b952a | |||
| bd7f28896e | |||
| 18fe124696 | |||
| ea3a3b6e1c | |||
| e6c06aacff | |||
| 1aee92cd5c | |||
| 40c4cad491 | |||
| 013d46fb02 | |||
| f0f465411f | |||
| 32ce83475d | |||
| ec0d3f5b5d | |||
| 75294b9146 | |||
| 26a0eb68ef | |||
| b983e29fb0 | |||
| 68dadabc29 | |||
| ed9fd3f0e0 | |||
| fa9573436a | |||
| 6d2058c3b7 | |||
| 0d7f93b877 | |||
| f022c9d510 | |||
| 5964a06386 | |||
| f14dc4a4e9 | |||
| fd56e2534c | |||
| 08962a74ab | |||
| f850d36c52 | |||
| c5fb161477 | |||
| bfc2fab33f | |||
| ec9d6c4fd2 | |||
| 6135d61e3d | |||
| a677242a2c | |||
| 6602f30112 | |||
| a4b8dc18c1 | |||
| c0d4741f88 | |||
| b33718180c | |||
| 3872393b29 | |||
| 1d72a7df99 | |||
| 5455908772 | |||
| 8882192fac | |||
| 7b77491c06 | |||
| 20bf214d6e | |||
| 8ab3e63aeb | |||
| 0dc03214c5 | |||
| 362e98b43d | |||
| 193e085cf0 | |||
| e0df2a342b | |||
| ba19ccac43 | |||
| d7261b7a78 | |||
| 0d80173efd | |||
| 930f07d15e | |||
| 66df7389d2 | |||
| c7bf0b6ddd | |||
| 0bc361adeb | |||
| 4fff523a6d | |||
| 67e09fb342 | |||
| c360806f47 | |||
| 7b74b73b08 | |||
| e9a851c0d4 | |||
| b13b169149 | |||
| 455329a745 | |||
| a68b76c8b4 | |||
| 96e3899216 | |||
| 771ab5ea9a | |||
| 3c87e6b270 | |||
| 6d8afec510 | |||
| 89e25657d8 | |||
| 29387f1fcf | |||
| 58e885c052 | |||
| 984dfcd7e1 | |||
| 3785479086 | |||
| 8ed280907c | |||
| d742671205 | |||
| 87e72c28a4 | |||
| 4dee357362 | |||
| 431f4b9b0d | |||
| dd5b7825d5 | |||
| 02bc48925a | |||
| 4eb505755e | |||
| 83e94a70ea | |||
| 8a150b27c3 | |||
| 1a51451ec2 | |||
| 41e51bfb77 | |||
| 7e1d9bc768 | |||
| ba065ec1d8 | |||
| fe057a91c8 | |||
| d2c36eefc9 | |||
| 28d56bab04 | |||
| 2500eff90d | |||
| 153446b3a1 | |||
| 391f5caaa2 | |||
| cc0df92444 | |||
| 03910d67c3 | |||
| fec5cc864e | |||
| cb78362713 | |||
| 4c5b1a6ff4 | |||
| 83c5727698 | |||
| 80838ff1e9 | |||
| 29e8d072b7 | |||
| d7592f01e1 | |||
| 392f283d9e | |||
| bcd738ebbb | |||
| 8020c52c48 | |||
| 3f566e541d | |||
| be4a631dc8 | |||
| 0bfdf908c1 | |||
| 6f2fc23f77 | |||
| f3a47c7e70 | |||
| 36349ffabb | |||
| b13f7366cf | |||
| 9181bcd9a7 | |||
| 7dbc1d894b | |||
| 5720445d15 | |||
| a90027521d | |||
| e02d400bf6 | |||
| efadb8fd31 | |||
| a19d06561b | |||
| 0b685d11c9 | |||
| 28f019d672 | |||
| bf5cbfffc2 | |||
| fe021e7c51 | |||
| c42fb54bc6 | |||
| 9382b68781 | |||
| 178198a417 | |||
| 7068e90771 | |||
| 1c762f23d0 | |||
| fd2b9a6e21 | |||
| db43910288 | |||
| f248c0460e | |||
| b8e3c0ceb4 | |||
| b5053d889e | |||
| 12ba7776b3 | |||
| 7817e88d03 | |||
| 8dec65853d | |||
| 88e3cb3be1 | |||
| fa702b48e3 | |||
| 299dcf6686 | |||
| 27f9ae5bbb | |||
| 9cb3a853f1 | |||
| 95c8ef4148 | |||
| a41bb52014 | |||
| 914cd7221e | |||
| 2dfc0a58ab | |||
| 0c9f3c638a | |||
| a966d6acf1 | |||
| 1e0c38b5f9 | |||
| d3323d6550 | |||
| ebed0b9f20 | |||
| f654a453dc | |||
| 10decf94cc | |||
| 96dd4817f1 | |||
| 72906cdc6a | |||
| fba4375be0 | |||
| 75120676ad | |||
| 7daf63fd3f | |||
| 014de25f6f | |||
| 3fc6535012 | |||
| 4fc0a32572 | |||
| dcc704a357 | |||
| bd8acbde97 | |||
| 112b10c19d | |||
| d89e561a85 | |||
| 49c1da79c8 | |||
| 0a72f00175 | |||
| 1af5820db0 | |||
| c117491549 | |||
| d8748f4270 | |||
| c0ba6e13e4 | |||
| c34daf1a35 | |||
| d461b53235 | |||
| c3ee14eb67 | |||
| 869fb8e327 | |||
| fbbc3024d6 | |||
| f1ba0c0aa7 | |||
| 54340ab4bf | |||
| 39732eee5e | |||
| a9e4526a6d | |||
| 57a6d2abf9 | |||
| d6246941ac | |||
| 2eb91f9b91 | |||
| 34ae413607 | |||
| ee9f8c184b | |||
| 7a84afcbdb | |||
| b8a16ea99d | |||
| 095466d5c7 | |||
| 89cfa22c3f | |||
| 1f18050930 | |||
| 537b78d564 | |||
| 717fd57ce1 | |||
| 3fb7786868 | |||
| 17ecfc9765 | |||
| 5326260a76 | |||
| e7522f4bdf | |||
| 504deeff42 | |||
| b7785b64cf | |||
| f914cb6858 | |||
| 91051d2521 | |||
| 51536a7acd | |||
| 263ccab6e3 | |||
| 9f87755dcb | |||
| 60b4cca5e5 | |||
| d2718e99a4 | |||
| 69a00c0ab3 | |||
| 3272d23917 | |||
| 7f0545cae7 | |||
| 68f35deb86 | |||
| c4f4035072 | |||
| a7d8845952 | |||
| a3378393b0 | |||
| 3dfe0ad478 | |||
| 9a3b7a4f3f | |||
| 78579b1103 | |||
| 7d50344512 | |||
| 7a00c12065 | |||
| af71e67681 | |||
| b3e20fc324 | |||
| bd1014abb6 | |||
| 7f76664a5d | |||
| 0a5a80b05d | |||
| 2d63da0660 | |||
| 8387527d2e | |||
| 5d03ba7d63 | |||
| 0ece50c122 | |||
| f2ac297252 | |||
| 0ca8ae17d4 | |||
| 88ca87cf9e | |||
| 0d69d228e4 | |||
| a3afe95306 | |||
| 9fb4af8658 | |||
| 9bb6ba9311 | |||
| faa42ba341 | |||
| 596827a912 | |||
| 89b4292445 | |||
| dd88737414 | |||
| 5456cfc304 | |||
| 1e66096ea7 | |||
| 2b6ae3908c | |||
| 1924612479 | |||
| 2af5bdeaab | |||
| b28565b38d | |||
| fec602362b | |||
| 6753c5f45a | |||
| 2f3c108d42 | |||
| ce6d99bdb4 | |||
| 86d4125893 | |||
| 3a18f00379 | |||
| e6274904a7 | |||
| 3677395444 | |||
| 22ba35b3b5 | |||
| 9c1ab9979b | |||
| eaa463e1c9 | |||
| 6984be48c3 | |||
| b739bd3d79 | |||
| 23f3e4396c | |||
| c264750924 | |||
| c155f0a5d5 | |||
| 76734f086d | |||
| 4f2d1172dd | |||
| 75caf4e297 | |||
| 509ab8261f | |||
| 1e05b40d4f | |||
| 451390f835 | |||
| 58cce9d2f8 | |||
| 2eb6e3b0ea | |||
| fb1181ed26 | |||
| 6d5e1d529d | |||
| 0e0ca08924 | |||
| 5d948a67a8 | |||
| 6a4db2ecab | |||
| f700273624 | |||
| 0c198e0ccc | |||
| 71ffbbc420 | |||
| 4fd09b889d | |||
| 4cb2a3eebe | |||
| c25186b1f6 | |||
| 779033d0bc | |||
| 3e31560e7d | |||
| d23d7e8775 | |||
| f6fdf5cb7f | |||
| 1879ccd27d | |||
| 08c0796719 | |||
| edc7994ce5 | |||
| bcfcfbd064 | |||
| 9e79b3258d | |||
| 243873cd2d | |||
| c7b8a4b0c1 | |||
| e39e0c7140 | |||
| d4a3f11dbb | |||
| 0962f266b3 | |||
| 69e4d3fdad | |||
| c0908f463a | |||
| b00a61a17b | |||
| 553c2f886a | |||
| 4fd9c5772a | |||
| 04e0e06d85 | |||
| 4d7829d72b | |||
| 6b751aac57 | |||
| 813349fd23 | |||
| 16a2744782 | |||
| 7b6870db22 | |||
| 3e38e7d52c | |||
| 8142d3474d | |||
| 8773649de6 | |||
| c117920ff9 | |||
| c8dd2a3eb8 | |||
| 90b1817e92 | |||
| d6c3ff5997 | |||
| 984ec25132 | |||
| a7bff34784 | |||
| a6e7afbc91 | |||
| 33f1d63b64 | |||
| f95e171e11 | |||
| c82b50b212 | |||
| 2b402b77f1 | |||
| adcb551020 | |||
| 2680aabe06 | |||
| d5c0533b74 | |||
| 609307668b | |||
| cdaf36572a | |||
| 033c8d5d51 | |||
| 6216ec1d6a | |||
| 6c9c67f6c5 | |||
| 5bd32b5521 | |||
| 549336f75b | |||
| f0e75f30b3 | |||
| 144c09f175 | |||
| ee50c0f97c | |||
| ade921bf02 | |||
| 676cacff04 | |||
| a3097d5e25 | |||
| fd78148558 | |||
| a4d79d7375 | |||
| df04e8183d | |||
| c43c484a62 | |||
| 0608c35669 | |||
| 7dd4d06e26 | |||
| 1ee0310b86 | |||
| cc0a52038f | |||
| 6aed1fe231 | |||
| 680608fe18 | |||
| ec6acbc602 | |||
| cb7ee4c5d2 | |||
| 88d5798f45 | |||
| fcc22a0aa3 | |||
| aabefff298 | |||
| ed25c64e97 | |||
| b7dc870c2d | |||
| 9bea608843 | |||
| 9db1732c36 | |||
| 39f1a70174 | |||
| 1810440355 | |||
| 37ac8f179e | |||
| 626a09328f | |||
| 8d489d0d77 | |||
| 776f3db0d7 | |||
| 6046057b88 | |||
| 7e85d9e549 | |||
| 01c8a8b1c2 | |||
| c9bf6ac9ae | |||
| 62e4d69be9 | |||
| 62ac733b09 | |||
| c3b3e1b1b9 | |||
| a791e96e00 | |||
| e87f5521c1 | |||
| 366a708f3a | |||
| 70ba662574 | |||
| b389abd99f | |||
| 4aa2d14fe3 | |||
| af7de75ad4 | |||
| d461ebbda1 | |||
| 55ef94abcd | |||
| afaf489d99 | |||
| 20e4cbfd13 | |||
| f3b8c9f34e | |||
| 45e8ff25a5 | |||
| 268e322e1c | |||
| d3bcba6a05 | |||
| cc4ef1944d | |||
| 5aa8486265 | |||
| fd181673cd | |||
| 62c9547c4e | |||
| cdd117bfb9 | |||
| 304ba57dad | |||
| 69eaaa4177 | |||
| 452ac52fcb | |||
| 40cf489290 | |||
| 891d6be4a6 | |||
| 5d45ce5cf7 | |||
| a0f2241f3a | |||
| aa513bf7d3 | |||
| b2d65febc8 | |||
| 23a6d326e8 | |||
| 5b2f1b6d8b | |||
| b4e9ad031b | |||
| 8b7ebcf040 | |||
| af05296631 | |||
| 29d693de2d | |||
| 51ac5172f5 | |||
| 24ce1ef5e7 | |||
| f6d1e269d1 | |||
| 62c2f5228d | |||
| 9882d9683b | |||
| 45ce89ee1f | |||
| bfb9df1553 | |||
| a5f79204ce | |||
| e322613d84 | |||
| fbb60f5191 | |||
| 899e7d2f39 | |||
| 8e2aa07747 | |||
| a0d262cd76 | |||
| b43a7edee4 | |||
| 7760bbd77c | |||
| 9c0f1b02a7 | |||
| 4ecfff4d8d | |||
| ac03b89f38 | |||
| 620174aea9 | |||
| ab50d28bc4 | |||
| b5318602d1 | |||
| bff2a63ea2 | |||
| aacfb8820e | |||
| 98e8c031d0 | |||
| beb4319d1e | |||
| 2558243c83 | |||
| b670e8d1ac | |||
| 68f8358f06 | |||
| db5a099097 | |||
| ce33ffb62a | |||
| 59a2fb9cfd | |||
| 75bba319de | |||
| f78e9261f3 | |||
| 5f77562333 | |||
| 5c4f01a68d | |||
| 35f6f998e6 | |||
| 6737a3ae09 | |||
| 09559bee8c | |||
| f487ea27a8 | |||
| a3d95f239a | |||
| 023c06e178 | |||
| 414a6c1c9e | |||
| 910e18fb22 | |||
| ac441fd1cf | |||
| 0c328372b5 | |||
| 55ef60a6d4 | |||
| c33584e683 | |||
| ee8c7453bd | |||
| 0330369603 | |||
| 3f7b642c7d | |||
| eb6c51426a | |||
| 0337bdb9fd | |||
| 7aedc62058 | |||
| bfc835cbbf | |||
| 5c6ba30c48 | |||
| 8fe4824ed2 | |||
| d40cb3bd55 | |||
| 4bcd3ac5d7 | |||
| e2b8e9dea9 | |||
| 572314bf3f | |||
| 14d303d331 | |||
| 24ffaa0738 | |||
| 5d9b6d056d | |||
| 5c28ff15ba | |||
| 06ceb2f2a1 | |||
| 7373e1dd8b | |||
| 4b1a9e714d | |||
| 9d76136358 | |||
| b3502420ad | |||
| dd7ac7cca9 | |||
| 31dfa18e9b | |||
| 3e785008d3 | |||
| 6b7c7f755c | |||
| c55a8a8703 | |||
| 64c97308ac | |||
| 3551b0b95a | |||
| 9f16b5c4af | |||
| 9777e549cb | |||
| fbfced1b93 | |||
| 1a84b4681c | |||
| 4bf81b8e1c | |||
| c282e7fdb4 | |||
| d339ee3135 | |||
| 1de95de299 | |||
| 96c998a1d7 | |||
| b5413c0156 | |||
| 7371c195ff | |||
| 0866a1996b | |||
| 41f44c4e78 | |||
| 131712c3bd | |||
| bae12aaab7 | |||
| 74d5844d8c | |||
| c87908266a | |||
| f788d76b8c | |||
| 41031e572e | |||
| f8a0864c1b | |||
| 949587334c | |||
| 0bc6a1a7f1 | |||
| 0d9cbfe927 | |||
| 8742a524c3 | |||
| 79bf2297b5 | |||
| 32e9e23630 | |||
| 7f1cecba92 | |||
| efd30c61c3 | |||
| 4c97b11207 | |||
| 58ea0ab745 | |||
| 3547c71ad5 | |||
| 044d6b2ce2 | |||
| a0b26b6c06 | |||
| 8e3bfde439 | |||
| 6507de959b | |||
| 56d09bf3b5 | |||
| 232754b978 | |||
| 75ef603308 | |||
| a5a2fcee4d | |||
| f86d57bfe3 | |||
| 615615b1df | |||
| aeba0ce170 | |||
| 5ce60aad53 | |||
| dbc01de9a0 | |||
| dfaf3f24fc | |||
| 14b0527e79 | |||
| f0148c3161 | |||
| 6a5e3d924d | |||
| 664a82e7c9 | |||
| e2763b4826 | |||
| afb29b19c2 | |||
| 8d60343940 | |||
| 67a77f1880 | |||
| c933974174 | |||
| 19715903fb | |||
| c88f72fd15 | |||
| 7818596271 | |||
| 9cb8d7bca6 | |||
| 46f9256114 | |||
| c26ef87202 | |||
| 89fee5b835 | |||
| f5795eb01b | |||
| dbf0c9f016 | |||
| 586b43048f | |||
| 63b9ee61d2 | |||
| 3b9eff7f34 | |||
| 59668c5fc1 | |||
| 3ed786fb5c | |||
| 0cd5eb5472 | |||
| ff571b96cb | |||
| 36b852e6bf | |||
| f0c21c7203 | |||
| 0516d8260c | |||
| 1418f57b96 | |||
| b24fb59c94 | |||
| 8fcf2bcd59 | |||
| 079b808a56 | |||
| a4e01e28db | |||
| ec1ef9099f | |||
| ac724c7e6c | |||
| ec25835525 | |||
| d4841a641c | |||
| 5612460720 | |||
| 465ea6429f | |||
| ed9057ca83 | |||
| 14ced962db | |||
| 1aff6b862d | |||
| ef490c4220 | |||
| 0dda83cbbc | |||
| fa4efec3b5 | |||
| 814eabb88e | |||
| 95021e4977 | |||
| d17fb7ebf0 | |||
| df9aa9ac32 | |||
| 9110517893 | |||
| 8204c7deb6 | |||
| 6662f8985e | |||
| a2b305ed3b | |||
| ce3d3a850c | |||
| 212b674bc2 | |||
| 2980a6b4bb | |||
| 435c0a9e82 | |||
| 4102cd7c91 | |||
| b4b603819d | |||
| 20e3707e69 | |||
| fc6eeaaea8 | |||
| 41799955ce | |||
| efb4ec9cb8 | |||
| 4dbda29f82 | |||
| befaa3c501 | |||
| f41edf9e21 | |||
| 754f10f0b0 | |||
| 5d331fdf69 | |||
| cbf1dbe2cb | |||
| 3177de92fb | |||
| 3878890783 | |||
| 61594f7873 | |||
| f412b5e0cd | |||
| f14d594a1a | |||
| f0279d23d3 |
@@ -0,0 +1,27 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clang-format-15.0.6 from https://github.com/upx/upx-stubtools/releases
|
||||||
|
#
|
||||||
|
# "Gofmt's style is nobody's favourite, but gofmt is everybody's favourite." --Rob Pike
|
||||||
|
---
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
ColumnLimit: 100
|
||||||
|
IndentWidth: 4
|
||||||
|
---
|
||||||
|
# settings for C and C++
|
||||||
|
Language: Cpp
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignConsecutiveMacros: AcrossComments
|
||||||
|
AlwaysBreakTemplateDeclarations: true
|
||||||
|
AttributeMacros:
|
||||||
|
- DELETED_FUNCTION
|
||||||
|
- XSPAN_DELETED_FUNCTION
|
||||||
|
- may_throw
|
||||||
|
EmptyLineBeforeAccessModifier: Leave
|
||||||
|
# IndentPPDirectives: AfterHash # TODO later
|
||||||
|
SortIncludes: false
|
||||||
|
SpaceAfterCStyleCast: true
|
||||||
|
Standard: Cpp03
|
||||||
|
StatementMacros:
|
||||||
|
- CLANG_FORMAT_DUMMY_STATEMENT
|
||||||
|
...
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
|
---
|
||||||
|
Checks: >
|
||||||
|
-*,
|
||||||
|
bugprone-*,
|
||||||
|
-bugprone-assignment-in-if-condition,
|
||||||
|
-bugprone-branch-clone,
|
||||||
|
-bugprone-casting-through-void,
|
||||||
|
-bugprone-easily-swappable-parameters,
|
||||||
|
-bugprone-empty-catch,
|
||||||
|
-bugprone-implicit-widening-of-multiplication-result,
|
||||||
|
-bugprone-inc-dec-in-conditions,
|
||||||
|
-bugprone-macro-parentheses,
|
||||||
|
-bugprone-narrowing-conversions,
|
||||||
|
-bugprone-reserved-identifier,
|
||||||
|
-bugprone-sizeof-expression,
|
||||||
|
-bugprone-suspicious-include,
|
||||||
|
-bugprone-suspicious-memory-comparison,
|
||||||
|
-bugprone-suspicious-string-compare,
|
||||||
|
-bugprone-switch-missing-default-case,
|
||||||
|
clang-analyzer-*,
|
||||||
|
-clang-analyzer-optin.performance.Padding,
|
||||||
|
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||||
|
-clang-analyzer-security.insecureAPI.rand,
|
||||||
|
-clang-analyzer-security.insecureAPI.strcpy,
|
||||||
|
clang-diagnostic-*,
|
||||||
|
performance-*,
|
||||||
|
-performance-avoid-endl,
|
||||||
|
-performance-enum-size,
|
||||||
|
-performance-no-int-to-ptr,
|
||||||
|
-performance-unnecessary-value-param,
|
||||||
|
FormatStyle: file
|
||||||
|
HeaderFilterRegex: '.*'
|
||||||
|
InheritParentConfig: false
|
||||||
|
...
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clangd from https://clangd.llvm.org/
|
||||||
|
---
|
||||||
|
# treat *.h files as C++ source code
|
||||||
|
If:
|
||||||
|
PathMatch: src/.*\.h
|
||||||
|
PathExclude: vendor/.*
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
- -xc++
|
||||||
|
---
|
||||||
|
# C++ flags
|
||||||
|
If:
|
||||||
|
PathMatch: [ src/.*\.h, src/.*\.cpp ]
|
||||||
|
PathExclude: vendor/.*
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
- -std=gnu++17
|
||||||
|
# -std=gnu++20 # requires clangd >= 11.0
|
||||||
|
# -std=gnu++23 # requires clangd >= 18.0
|
||||||
|
---
|
||||||
|
# common flags for all C/C++ files
|
||||||
|
If:
|
||||||
|
PathMatch: [ src/.*\.h, src/.*\.c, src/.*\.cpp ]
|
||||||
|
PathExclude: vendor/.*
|
||||||
|
CompileFlags:
|
||||||
|
Add:
|
||||||
|
# see https://github.com/clangd/clangd/issues/1038 : Support deterministic relative include path
|
||||||
|
- -Ivendor
|
||||||
|
- -I../vendor
|
||||||
|
- -I../../vendor
|
||||||
|
- -DDEBUG
|
||||||
|
- -fno-strict-aliasing
|
||||||
|
- -fno-strict-overflow
|
||||||
|
- -funsigned-char
|
||||||
|
Diagnostics:
|
||||||
|
Includes:
|
||||||
|
# IgnoreHeader: A list of regexes. Include Cleaner will not produce diagnostics
|
||||||
|
# for headers whose path is a suffix match for any of these.
|
||||||
|
IgnoreHeader:
|
||||||
|
- src/.*\.h
|
||||||
|
UnusedIncludes: None
|
||||||
|
...
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
_darcs
|
|
||||||
B
|
|
||||||
ChangeLog.cvs*
|
|
||||||
build
|
|
||||||
doxygen
|
|
||||||
maint
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# see https://editorconfig.org/
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[{GNUmakefile*,MMakefile*,Makefile*,Makevars*,*.mk}]
|
||||||
|
indent_size = 8
|
||||||
|
indent_style = tab
|
||||||
|
|
||||||
|
[{*.asm,*.S}]
|
||||||
|
indent_size = 8
|
||||||
|
|
||||||
|
[{*.yaml,*.yml}]
|
||||||
|
indent_size = 2
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# see https://github.com/github-linguist/linguist
|
||||||
|
#
|
||||||
|
# HINT: check settings with
|
||||||
|
# git ls-files | git check-attr --stdin --all
|
||||||
|
# git ls-files --eol
|
||||||
|
|
||||||
|
# disable all line ending conversions
|
||||||
|
* -text
|
||||||
|
|
||||||
|
#
|
||||||
|
# tell diff tools that these files are generated automatically
|
||||||
|
#
|
||||||
|
|
||||||
|
/doc/upx.1 linguist-generated
|
||||||
|
/doc/upx-doc.* linguist-generated
|
||||||
|
|
||||||
|
/src/stub/*.h linguist-generated
|
||||||
|
/src/stub/src/arch/**/lzma_d_c[fns].S linguist-generated
|
||||||
|
/src/stub/tmp/** linguist-generated
|
||||||
|
|
||||||
|
/misc/podman/*/packages*.txt linguist-generated
|
||||||
|
/misc/testsuite/*expected_sha256sums* linguist-generated
|
||||||
|
|
||||||
|
#
|
||||||
|
# make GitHub language detection more accurate
|
||||||
|
#
|
||||||
|
|
||||||
|
/src/*.h linguist-language=C++
|
||||||
|
/src/*/*.h linguist-language=C++
|
||||||
|
|
||||||
|
/src/stub/**/*.ash linguist-language=Assembly
|
||||||
|
/src/stub/**/*.asm linguist-language=Assembly
|
||||||
|
/src/stub/**/*.S linguist-language=Assembly
|
||||||
|
|
||||||
|
/src/stub/tmp/** linguist-vendored
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
* @markus-oberhumer @jreiser
|
||||||
|
|
||||||
|
/src/p_lx_* @jreiser
|
||||||
|
/src/p_mach* @jreiser
|
||||||
|
/src/p_unix* @jreiser
|
||||||
|
/src/p_vmlin* @jreiser
|
||||||
|
|
||||||
|
/src/stub/src/*bsd.* @jreiser
|
||||||
|
/src/stub/src/*darwin.* @jreiser
|
||||||
|
/src/stub/src/*linux.* @jreiser
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
This issue tracker is **ONLY** used for reporting bugs.
|
||||||
|
Please use [stackoverflow](https://stackoverflow.com) for supporting issues.
|
||||||
|
|
||||||
|
<!---
|
||||||
|
|
||||||
|
IF YOU REMOVE THIS TEMPLATE WE WILL CLOSE YOUR ISSUE WITHOUT RESPONSE.
|
||||||
|
Just read it and fill in the details we're asking, it saves so much of our time. Thanks!
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
## What's the problem (or question)?
|
||||||
|
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
|
||||||
|
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
|
||||||
|
|
||||||
|
## What should have happened?
|
||||||
|
<!--- If you're describing a bug, tell us what should happen -->
|
||||||
|
<!--- If you're suggesting a change/improvement, tell us how it should work -->
|
||||||
|
|
||||||
|
## Do you have an idea for a solution?
|
||||||
|
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
|
||||||
|
<!--- or ideas how to implement the addition or change -->
|
||||||
|
|
||||||
|
## How can we reproduce the issue?
|
||||||
|
<!--- Provide unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant -->
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
4.
|
||||||
|
|
||||||
|
## Please tell us details about your environment.
|
||||||
|
<!--- Include as many relevant details about the environment you experienced the bug in -->
|
||||||
|
* UPX version used (`upx --version`):
|
||||||
|
* Host Operating System and version:
|
||||||
|
* Host CPU architecture:
|
||||||
|
* Target Operating System and version:
|
||||||
|
* Target CPU architecture:
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
This issue tracker is **ONLY** used for requesting sensible features.
|
||||||
|
Please use [stackoverflow](https://stackoverflow.com) for supporting issues.
|
||||||
|
|
||||||
|
<!---
|
||||||
|
|
||||||
|
IF YOU REMOVE THIS TEMPLATE WE WILL CLOSE YOUR ISSUE WITHOUT RESPONSE.
|
||||||
|
Just read it and fill in the details we're asking, it saves so much of our time. Thanks!
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
## What's the problem (or question)?
|
||||||
|
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
|
||||||
|
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
|
||||||
|
|
||||||
|
## What should have happened?
|
||||||
|
<!--- If you're describing a bug, tell us what should happen -->
|
||||||
|
<!--- If you're suggesting a change/improvement, tell us how it should work -->
|
||||||
|
|
||||||
|
## Do you have an idea for a solution?
|
||||||
|
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
|
||||||
|
<!--- or ideas how to implement the addition or change -->
|
||||||
|
|
||||||
|
## How can we reproduce the issue?
|
||||||
|
<!--- Provide unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant -->
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
4.
|
||||||
|
|
||||||
|
## Please tell us details about your environment.
|
||||||
|
<!--- Include as many relevant details about the environment you experienced the bug in -->
|
||||||
|
* UPX version used (`upx --version`):
|
||||||
|
* Host Operating System and version:
|
||||||
|
* Host CPU architecture:
|
||||||
|
* Target Operating System and version:
|
||||||
|
* Target CPU architecture:
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
UPX PULL REQUEST NOTES
|
||||||
|
======================
|
||||||
|
|
||||||
|
Handling pull requests is actually quite time consuming, so please
|
||||||
|
|
||||||
|
- if you want to contribute **a real C++ code bug-fix** then open an issue
|
||||||
|
on the main UPX issue tracker first
|
||||||
|
|
||||||
|
- if you want to contribute **a new feature** then by all means open an issue
|
||||||
|
on the main UPX issue tracker first before starting any coding!
|
||||||
|
|
||||||
|
- please refuse the temptation to "improve" the docs, scripts, CI, makefiles,
|
||||||
|
cmake build system, spelling errors, etc - we will NOT merge this; only open
|
||||||
|
an issue if you're sure there is a **real bug**
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# Security Context
|
||||||
|
|
||||||
|
IMPORTANT NOTE: UPX inherits the security context of any files it handles.
|
||||||
|
|
||||||
|
This means that packing, unpacking, or even testing or listing a file requires
|
||||||
|
the same security considerations as actually executing the file.
|
||||||
|
|
||||||
|
Use UPX on trusted files only!
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| --------- | ------------------ |
|
||||||
|
| git HEAD | :white_check_mark: |
|
||||||
|
| any other | :x: |
|
||||||
@@ -0,0 +1,590 @@
|
|||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
# note: GitHub Actions runner images are frequently updated, and
|
||||||
|
# unfortunately this sometimes breaks builds in mysterious ways...
|
||||||
|
# see https://github.com/actions/runner-images.git
|
||||||
|
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on: [push, workflow_dispatch]
|
||||||
|
|
||||||
|
env:
|
||||||
|
CMAKE_REQUIRED_QUIET: 'OFF'
|
||||||
|
CMAKE_VERBOSE_MAKEFILE: 'ON'
|
||||||
|
CTEST_OUTPUT_ON_FAILURE: 'ON'
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
UPX_CMAKE_BUILD_FLAGS: --verbose
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS: -Wdev --warn-uninitialized
|
||||||
|
UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 1
|
||||||
|
UPX_DEBUG_TEST_LIBC_QSORT: 1
|
||||||
|
# 2024-04-20
|
||||||
|
ZIG_DIST_VERSION: 0.12.0
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
job-rebuild-and-verify-stubs:
|
||||||
|
name: Rebuild stubs
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: ubuntu:24.04 # glibc-2.39
|
||||||
|
#container: debian:12-slim # also works; glibc-2.36
|
||||||
|
#container: debian:testing-slim # also works
|
||||||
|
steps:
|
||||||
|
- name: Install packages
|
||||||
|
run: |
|
||||||
|
uname -a; pwd; id; umask
|
||||||
|
dpkg --add-architecture i386
|
||||||
|
apt-get update && apt-get upgrade -y
|
||||||
|
# install system packages
|
||||||
|
apt-get install -y --no-install-recommends bash ca-certificates curl git libmpc3 make perl-base xz-utils libc6:i386 zlib1g:i386
|
||||||
|
# install python2-minimal packages from Debian-11
|
||||||
|
mkdir ../deps; cd ../deps; mkdir packages
|
||||||
|
curl -sS -L -O https://ftp.debian.org/debian/pool/main/p/python2.7/libpython2.7-minimal_2.7.18-8+deb11u1_amd64.deb
|
||||||
|
curl -sS -L -O https://ftp.debian.org/debian/pool/main/p/python2.7/python2.7-minimal_2.7.18-8+deb11u1_amd64.deb
|
||||||
|
dpkg -i ./*python2*.deb && rm ./*python2*.deb && ldconfig
|
||||||
|
ln -s -v python2.7 /usr/bin/python2
|
||||||
|
# manually unpack and install compat libs from Ubuntu-16.04
|
||||||
|
curl -sS -L -O https://archive.kernel.org/ubuntu-archive/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.6-1_amd64.deb
|
||||||
|
for f in ./*.deb; do dpkg -x $f ./packages; done
|
||||||
|
mv -v -n ./packages/usr/lib/x86_64-linux-gnu/lib* /usr/lib/x86_64-linux-gnu/
|
||||||
|
rm -rf ./*.deb ./packages && ldconfig
|
||||||
|
# install upx-stubtools
|
||||||
|
curl -sS -L https://github.com/upx/upx-stubtools/releases/download/v20221212/bin-upx-20221212.tar.xz | tar -xJ
|
||||||
|
- name: Check out code
|
||||||
|
run: |
|
||||||
|
git config --global --add safe.directory '*' # needed when running in a container
|
||||||
|
git clone --branch "$GITHUB_REF_NAME" --depth 1 "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY" .
|
||||||
|
git submodule update --init -- vendor/lzma-sdk
|
||||||
|
- name: Rebuild and verify stubs
|
||||||
|
run: |
|
||||||
|
export PATH="$(readlink -en ../deps/bin-upx-20221212):$PATH"
|
||||||
|
make -C src/stub maintainer-clean extra-clean
|
||||||
|
git status || true
|
||||||
|
make -C src/stub extra-all all
|
||||||
|
if ! git diff --quiet; then git diff; exit 1; fi
|
||||||
|
- run: bash ./misc/scripts/check_whitespace_git.sh
|
||||||
|
- name: Check source code formatting
|
||||||
|
run: |
|
||||||
|
export UPX_CLANG_FORMAT="$PWD/../deps/bin-upx-20221212/clang-format-15.0.6"
|
||||||
|
make -C src clang-format
|
||||||
|
if ! git diff --quiet; then git diff; exit 1; fi
|
||||||
|
- name: Rebuild docs
|
||||||
|
run: |
|
||||||
|
make -C doc clean all
|
||||||
|
if ! git diff --quiet; then git diff || true; fi # ignore diff error
|
||||||
|
|
||||||
|
job-linux-cmake: # uses cmake + make
|
||||||
|
if: true
|
||||||
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
|
name: ${{ format('{0}', matrix.os) }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- { os: ubuntu-22.04, use_extra: true, use_wine: true }
|
||||||
|
- { os: ubuntu-20.04, use_extra: true }
|
||||||
|
steps:
|
||||||
|
- name: Install extra 32-bit and MinGW packages
|
||||||
|
if: ${{ matrix.use_extra }}
|
||||||
|
run: |
|
||||||
|
sudo dpkg --add-architecture i386
|
||||||
|
sudo apt-get update && sudo apt-get upgrade -y
|
||||||
|
sudo apt-get install -y g++-multilib g++-mingw-w64-i686 g++-mingw-w64-x86-64
|
||||||
|
# make sure that we use posix-threads (pthread/winpthreads) and NOT win32-threads
|
||||||
|
for f in i686-w64-mingw32-g++ i686-w64-mingw32-gcc x86_64-w64-mingw32-g++ x86_64-w64-mingw32-gcc; do
|
||||||
|
if test -f /usr/bin/$f-posix; then sudo update-alternatives --set $f /usr/bin/$f-posix; fi
|
||||||
|
ls -l /usr/bin/${f}*
|
||||||
|
done
|
||||||
|
ls -l /etc/alternatives/*mingw* || true
|
||||||
|
sudo apt-get install -y libc6-dbg:i386 valgrind
|
||||||
|
- name: Install Wine
|
||||||
|
if: ${{ matrix.use_extra && matrix.use_wine }}
|
||||||
|
run: |
|
||||||
|
sudo apt-get install -y wine wine32:i386 wine64
|
||||||
|
ls -l /usr/bin/wine*
|
||||||
|
mkdir -p -v ~/.wine && wineboot --init
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { submodules: true }
|
||||||
|
- name: Check out test suite
|
||||||
|
run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
|
||||||
|
- run: make build/extra/gcc/all
|
||||||
|
- run: make build/extra/clang/all
|
||||||
|
- run: make build/extra/gcc-m32/all
|
||||||
|
if: ${{ matrix.use_extra }}
|
||||||
|
- run: make build/extra/gcc-mx32/all
|
||||||
|
if: ${{ matrix.use_extra }}
|
||||||
|
- run: make build/extra/cross-windows-mingw32/all
|
||||||
|
if: ${{ matrix.use_extra }}
|
||||||
|
- run: make build/extra/cross-windows-mingw64/all
|
||||||
|
if: ${{ matrix.use_extra }}
|
||||||
|
- name: Make artifact
|
||||||
|
run: |
|
||||||
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
||||||
|
mkdir -p "tmp/artifact/$N"
|
||||||
|
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
||||||
|
(cd tmp/artifact && tar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
||||||
|
echo "artifact_name=$N" >> $GITHUB_ENV
|
||||||
|
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
|
||||||
|
- name: Run install tests
|
||||||
|
run: |
|
||||||
|
(cd build/extra/gcc/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
||||||
|
(cd build/extra/gcc/release && DESTDIR="$PWD/Install with make" make install)
|
||||||
|
- name: Run ctest tests
|
||||||
|
run: |
|
||||||
|
jobs="gcc/debug gcc/release clang/debug clang/release"
|
||||||
|
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
|
||||||
|
command -v wine >/dev/null && jobs="$jobs cross-windows-mingw32/debug cross-windows-mingw32/release"
|
||||||
|
command -v wine >/dev/null && jobs="$jobs cross-windows-mingw64/debug cross-windows-mingw64/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
CTEST_JOBS=2 parallel -kv --lb 'make build/extra/{}+test' ::: $jobs
|
||||||
|
- name: Mimic ctest tests
|
||||||
|
run: |
|
||||||
|
jobs="gcc/debug gcc/release clang/debug clang/release"
|
||||||
|
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
|
||||||
|
- name: Mimic ctest tests with Valgrind
|
||||||
|
if: true # note: valgrind is SLOW
|
||||||
|
run: |
|
||||||
|
if command -v valgrind >/dev/null; then
|
||||||
|
export UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS=ON # valgrind is SLOW
|
||||||
|
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
|
||||||
|
# clang/debug does not work before valgrind-3.20, see https://bugs.kde.org/show_bug.cgi?id=452758
|
||||||
|
jobs="gcc/debug gcc/release clang/release"
|
||||||
|
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
|
||||||
|
fi
|
||||||
|
- name: Run file system test suite
|
||||||
|
run: |
|
||||||
|
jobs="gcc/debug gcc/release clang/debug clang/release"
|
||||||
|
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/test_symlinks.sh' ::: $jobs
|
||||||
|
- name: Run file system test suite with Valgrind
|
||||||
|
if: false # note: valgrind is SLOW
|
||||||
|
run: |
|
||||||
|
if command -v valgrind >/dev/null; then
|
||||||
|
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
|
||||||
|
# clang/debug does not work before valgrind-3.20, see https://bugs.kde.org/show_bug.cgi?id=452758
|
||||||
|
jobs="gcc/debug gcc/release clang/release"
|
||||||
|
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/test_symlinks.sh' ::: $jobs
|
||||||
|
fi
|
||||||
|
- name: Run test suite
|
||||||
|
run: |
|
||||||
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
|
jobs="gcc/debug gcc/release clang/debug clang/release"
|
||||||
|
test "${{ matrix.use_extra }}" = "true" && jobs="$jobs gcc-m32/debug gcc-m32/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/upx_testsuite_1.sh' ::: $jobs
|
||||||
|
|
||||||
|
job-macos-cmake: # uses cmake + make
|
||||||
|
if: true
|
||||||
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
|
name: ${{ format('{0} {1}{2}', matrix.os, matrix.xcode_version && 'xcode-' || '', matrix.xcode_version) }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
# NOTE: macos does not have "env -C"; only with brew coreutils
|
||||||
|
# NOTE: macos-11 does not have "readlink -f"; only on macos >= 12 or with brew coreutils
|
||||||
|
- { os: macos-11, gcc: gcc-10, gxx: g++-10, testsuite: true }
|
||||||
|
- { os: macos-12, gcc: gcc-11, gxx: g++-11, testsuite: true }
|
||||||
|
- { os: macos-13, testsuite: true } # use default Xcode-15; NOTE: gcc-12 on macos-13 does not work with Xcode-15
|
||||||
|
- { os: macos-13, gcc: gcc-12, gxx: g++-12, testsuite: true, xcode_version: 14.3.1 }
|
||||||
|
# { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true } # gcc-13: INTERNAL ERROR in ld64
|
||||||
|
# { os: macos-14, gcc: gcc-13, gxx: g++-13, testsuite: true, xcode_version: 14.3.1 } # gcc-13: MISSING HEADER FILES
|
||||||
|
- { os: macos-14, gcc: gcc-12, gxx: g++-12, testsuite: true } # => use gcc-12 for now
|
||||||
|
steps:
|
||||||
|
- uses: maxim-lobanov/setup-xcode@v1
|
||||||
|
if: ${{ matrix.xcode_version }}
|
||||||
|
with: { xcode-version: '${{ matrix.xcode_version }}' }
|
||||||
|
- name: Install brew packages
|
||||||
|
if: ${{ matrix.testsuite }}
|
||||||
|
run: |
|
||||||
|
test -z "$HOMEBREW_PREFIX" && HOMEBREW_PREFIX="$(brew --prefix)"
|
||||||
|
echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >> $GITHUB_ENV
|
||||||
|
# testsuite needs working "readlink -en" and "sha256sum -b"
|
||||||
|
packages="ninja parallel"
|
||||||
|
test -e "$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin/readlink" || packages="$packages coreutils"
|
||||||
|
if test -n "$packages"; then
|
||||||
|
echo "===== brew leaves:"; brew leaves; echo "===== brew list:"; brew list --versions
|
||||||
|
# only run "brew update" if needed
|
||||||
|
if ! brew install $packages; then brew update && brew install $packages; fi
|
||||||
|
fi
|
||||||
|
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
|
||||||
|
echo "UPX_DEBUG_FORCE_PACK_MACOS=1" >> $GITHUB_ENV
|
||||||
|
case "${{ matrix.os }}" in
|
||||||
|
# TODO FIXME: UPX on macos-13+ is broken => disable run-packed for now
|
||||||
|
macos-13 | macos-14) echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV ;;
|
||||||
|
esac
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { submodules: true }
|
||||||
|
- name: Check out test suite
|
||||||
|
if: ${{ matrix.testsuite }}
|
||||||
|
run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
|
||||||
|
- run: make build/extra/clang/all
|
||||||
|
- name: Build extra/gcc/all
|
||||||
|
if: ${{ matrix.gcc }}
|
||||||
|
run: make build/extra/gcc/all CC="${{ matrix.gcc }} -static-libgcc" CXX="${{ matrix.gxx }} -static-libgcc -static-libstdc++"
|
||||||
|
- name: Build xtarget/cross-darwin-arm64/all
|
||||||
|
run: |
|
||||||
|
make UPX_XTARGET=xtarget/cross-darwin-arm64 xtarget/all \
|
||||||
|
CC="clang -target arm64-apple-darwin" CXX="clang++ -target arm64-apple-darwin"
|
||||||
|
- name: Make artifact
|
||||||
|
run: |
|
||||||
|
X="${{ matrix.xcode_version }}"; test -n "$X" && X="-xcode-$X"
|
||||||
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}$X" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
||||||
|
mkdir -p "tmp/artifact/$N"
|
||||||
|
(cd build && rsync -R -a */*/*/upx "../tmp/artifact/$N/")
|
||||||
|
(cd tmp/artifact && gtar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
||||||
|
echo "artifact_name=$N" >> $GITHUB_ENV
|
||||||
|
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
|
||||||
|
- name: Run install tests
|
||||||
|
run: |
|
||||||
|
(cd build/extra/clang/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
||||||
|
(cd build/extra/clang/release && DESTDIR="$PWD/Install with make" make install)
|
||||||
|
- name: Run ctest tests
|
||||||
|
run: |
|
||||||
|
for f in ./build/extra/*/*/upx; do file $f; done
|
||||||
|
jobs="clang/debug clang/release"
|
||||||
|
test -n "${{ matrix.gcc }}" && jobs="$jobs gcc/debug gcc/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
CTEST_JOBS=2 parallel -kv --lb 'make build/extra/{}+test' ::: $jobs
|
||||||
|
- name: Mimic ctest tests
|
||||||
|
run: |
|
||||||
|
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
||||||
|
jobs="clang/debug clang/release"
|
||||||
|
test -n "${{ matrix.gcc }}" && jobs="$jobs gcc/debug gcc/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
|
||||||
|
- name: Run file system test suite
|
||||||
|
if: ${{ matrix.testsuite }} # for coreutils readlink
|
||||||
|
run: |
|
||||||
|
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
||||||
|
export upx_test_file="$PWD"/build/extra/clang/release/upx
|
||||||
|
jobs="clang/debug clang/release"
|
||||||
|
test -n "${{ matrix.gcc }}" && jobs="$jobs gcc/debug gcc/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/test_symlinks.sh' ::: $jobs
|
||||||
|
- name: Run test suite
|
||||||
|
if: ${{ matrix.testsuite }}
|
||||||
|
run: |
|
||||||
|
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
|
||||||
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
|
jobs="clang/debug clang/release"
|
||||||
|
test -n "${{ matrix.gcc }}" && jobs="$jobs gcc/debug gcc/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/extra/{} && bash ../../../../misc/testsuite/upx_testsuite_1.sh' ::: $jobs
|
||||||
|
|
||||||
|
job-windows-cmake: # uses cmake + msbuild
|
||||||
|
if: true
|
||||||
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
|
name: ${{ format('{0}', matrix.name) }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- { name: windows-2019-amd64, os: windows-2019, vsversion: 2019, vsarch: amd64 }
|
||||||
|
- { name: windows-2022-amd64, os: windows-2022, vsversion: 2022, vsarch: amd64 }
|
||||||
|
steps:
|
||||||
|
- run: git config --global core.autocrlf false
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { submodules: true }
|
||||||
|
- name: Check out test suite
|
||||||
|
run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
|
||||||
|
- uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with: { vsversion: '${{ matrix.vsversion }}', arch: '${{ matrix.vsarch }}' }
|
||||||
|
- run: make build/debug
|
||||||
|
- run: make build/release
|
||||||
|
- name: Make artifact
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.os }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
||||||
|
mkdir -p "tmp/artifact/$N"
|
||||||
|
(cd build && cp -ai --parents */*/upx.exe "../tmp/artifact/$N")
|
||||||
|
echo "artifact_name=$N" >> $GITHUB_ENV
|
||||||
|
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
|
||||||
|
- name: Run ctest tests
|
||||||
|
if: ${{ matrix.vsarch != 'amd64_arm64' }}
|
||||||
|
run: |
|
||||||
|
ctest --test-dir build/debug --parallel 8 -C Debug
|
||||||
|
ctest --test-dir build/release --parallel 8 -C Release
|
||||||
|
- name: Run test suite build/release
|
||||||
|
if: ${{ matrix.vsarch != 'amd64_arm64' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
|
env -C build/release/Release bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
||||||
|
|
||||||
|
job-windows-toolchains: # build "by hand" using cmd.exe
|
||||||
|
if: github.repository_owner == 'upx'
|
||||||
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
|
name: ${{ format('windows {0}', matrix.name) }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
env:
|
||||||
|
C: ${{ matrix.name }}
|
||||||
|
B: release
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- { name: amd64-win64-vs2019, os: windows-2019, vsversion: 2019, vsarch: amd64 }
|
||||||
|
- { name: amd64-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64 }
|
||||||
|
- { name: arm64-win64-vs2019, os: windows-2019, vsversion: 2019, vsarch: amd64_arm64 }
|
||||||
|
- { name: arm64-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64 }
|
||||||
|
- { name: arm64ec-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64ec' }
|
||||||
|
# { name: arm64x-win64-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_arm64, cl_machine_flags: -arm64EC, link_machine_flags: '/machine:arm64x' }
|
||||||
|
- { name: i386-win32-vs2019, os: windows-2019, vsversion: 2019, vsarch: amd64_x86 }
|
||||||
|
- { name: i386-win32-vs2022, os: windows-2022, vsversion: 2022, vsarch: amd64_x86 }
|
||||||
|
steps:
|
||||||
|
- run: git config --global core.autocrlf false
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { submodules: true }
|
||||||
|
- name: Prepare sources and Check out test suite
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
|
||||||
|
mkdir -p -v build/$C/$B/{bzip2,ucl,upx,zlib,zstd}
|
||||||
|
repository_name="${GITHUB_REPOSITORY##*/}" # basename
|
||||||
|
echo "H=d:\\a\\$repository_name\\$repository_name" >> $GITHUB_ENV
|
||||||
|
- uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with: { vsversion: '${{ matrix.vsversion }}', arch: '${{ matrix.vsarch }}' }
|
||||||
|
- name: Build by hand
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
@REM ===== set vars =====
|
||||||
|
where cl & where link
|
||||||
|
set RUN_CL=cl ${{ matrix.cl_machine_flags }} -MT
|
||||||
|
set RUN_LIB=link -lib ${{ matrix.link_machine_flags }}
|
||||||
|
@rem UPX only uses the very basic Windows API
|
||||||
|
set DEFS=-D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DWIN32_LEAN_AND_MEAN -D_WIN32_WINNT=0x0501
|
||||||
|
set BDIR=%H%\build\%C%\%B%
|
||||||
|
git rev-parse --short=12 HEAD > %BDIR%\upx\.GITREV.txt
|
||||||
|
@REM ===== build bzip2 =====
|
||||||
|
cd %BDIR%\bzip2
|
||||||
|
@rem %RUN_CL% -J -O2 -W4 -wd4127 -wd4244 -wd4267 -WX %DEFS% -DBZ_NO_STDIO -c %H%\vendor\bzip2\*.c
|
||||||
|
@rem %RUN_LIB% -out:bzip2.lib *.obj
|
||||||
|
@REM ===== build UCL =====
|
||||||
|
cd %BDIR%\ucl
|
||||||
|
set s=%H%\vendor\ucl
|
||||||
|
%RUN_CL% -J -O2 -W4 -WX %DEFS% -I%s%\include -I%s% -c %s%\src\*.c
|
||||||
|
%RUN_LIB% -out:ucl.lib *.obj
|
||||||
|
@REM ===== build zlib =====
|
||||||
|
cd %BDIR%\zlib
|
||||||
|
%RUN_CL% -J -O2 -W3 -WX %DEFS% -DHAVE_VSNPRINTF -c %H%\vendor\zlib\*.c
|
||||||
|
%RUN_LIB% -out:zlib.lib *.obj
|
||||||
|
@REM ===== build zstd =====
|
||||||
|
cd %BDIR%\zstd
|
||||||
|
set s=%H%\vendor\zstd\lib
|
||||||
|
@rem %RUN_CL% -J -O2 -W4 -WX %DEFS% -DDYNAMIC_BMI2=0 -DZSTD_DISABLE_ASM -c %s%\common\*.c %s%\compress\*.c %s%\decompress\*.c
|
||||||
|
@rem %RUN_LIB% -out:zstd.lib *.obj
|
||||||
|
@REM ===== build UPX =====
|
||||||
|
cd %BDIR%\upx
|
||||||
|
set s=%H%\src
|
||||||
|
cat .GITREV.txt
|
||||||
|
set /p GITREV=<.GITREV.txt
|
||||||
|
set UPX_DEFS=-DUPX_CONFIG_DISABLE_WSTRICT=0 -DUPX_CONFIG_DISABLE_WERROR=0 -DWITH_THREADS=0 -DWITH_BZIP2=0 -DWITH_ZSTD=0
|
||||||
|
set UPX_LIBS=%BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib
|
||||||
|
@rem set UPX_LIBS=%BDIR%\bzip2\bzip2.lib %BDIR%\ucl\ucl.lib %BDIR%\zlib\zlib.lib %BDIR%\zstd\zstd.lib
|
||||||
|
set sources=%s%\*.cpp %s%\check\*.cpp %s%\compress\*.cpp %s%\console\*.cpp %s%\filter\*.cpp %s%\util\*.cpp
|
||||||
|
%RUN_CL% -J -O2 -W4 -WX -std:c++17 -Zc:__cplusplus -EHsc -DUPX_VERSION_GITREV="""%GITREV%""" %DEFS% %UPX_DEFS% -I%H%\vendor -Feupx.exe %sources% %UPX_LIBS% /link ${{ matrix.link_machine_flags }} setargv.obj
|
||||||
|
- name: Make artifact
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-windows-${{ matrix.name }}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
||||||
|
mkdir -p "tmp/artifact/$N/$B"
|
||||||
|
cp -ai build/$C/$B/upx/upx*.exe "tmp/artifact/$N/$B"
|
||||||
|
echo "artifact_name=$N" >> $GITHUB_ENV
|
||||||
|
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
|
||||||
|
- name: Run basic tests
|
||||||
|
if: ${{ matrix.vsarch != 'amd64_arm64' }}
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = 'stop'
|
||||||
|
$ErrorView = 'NormalView'
|
||||||
|
cd $Env:H\build\$Env:C\$Env:B\upx
|
||||||
|
$Env:UPX = "--no-color --no-progress"
|
||||||
|
.\upx.exe --version
|
||||||
|
.\upx.exe --sysinfo -v
|
||||||
|
.\upx.exe upx.exe -o upx_packed.exe
|
||||||
|
dir *.exe
|
||||||
|
.\upx.exe -l upx_packed.exe
|
||||||
|
.\upx.exe -t upx_packed.exe
|
||||||
|
.\upx_packed.exe --version
|
||||||
|
- name: Run test suite
|
||||||
|
if: ${{ matrix.vsarch != 'amd64_arm64' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
||||||
|
env -C build/$C/$B/upx upx_exe=./upx.exe bash "$PWD"/misc/testsuite/upx_testsuite_1.sh
|
||||||
|
|
||||||
|
job-linux-zigcc: # uses cmake + make
|
||||||
|
if: github.repository_owner == 'upx'
|
||||||
|
needs: [ job-rebuild-and-verify-stubs ]
|
||||||
|
name: ${{ format('zigcc {0} {1}', matrix.zig_target, matrix.zig_pic) }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: alpine:3.19
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
# only build a few targets => more targets are tested in the Weekly CI
|
||||||
|
- { zig_target: aarch64-linux-musl, qemu: qemu-aarch64 }
|
||||||
|
# { zig_target: aarch64-linux-musl, qemu: qemu-aarch64, zig_pic: -fPIE }
|
||||||
|
# { zig_target: aarch64-macos-none }
|
||||||
|
- { zig_target: aarch64-macos.11.0-none }
|
||||||
|
# { zig_target: aarch64-macos.12.0-none }
|
||||||
|
# { zig_target: aarch64-macos.13.0-none }
|
||||||
|
- { zig_target: aarch64-windows-gnu }
|
||||||
|
- { zig_target: arm-linux-musleabihf, qemu: qemu-arm }
|
||||||
|
# { zig_target: arm-linux-musleabihf, qemu: qemu-arm, zig_pic: -fPIE }
|
||||||
|
- { zig_target: i386-linux-gnu.2.3.4, zig_flags: -march=i586 }
|
||||||
|
- { zig_target: i386-linux-musl, zig_flags: -march=i586, qemu: qemu-i386 }
|
||||||
|
# { zig_target: i386-linux-musl, zig_flags: -march=i586, qemu: qemu-i386, zig_pic: -fPIE }
|
||||||
|
- { zig_target: i386-windows-gnu }
|
||||||
|
# mips and mipsel: bad hard-float code generation(??); or QEMU bug; or UPX bug; see https://github.com/upx/upx/issues/788
|
||||||
|
- { zig_target: mips-linux-musl, zig_flags: -msoft-float, qemu: qemu-mips }
|
||||||
|
- { zig_target: mipsel-linux-musl, zig_flags: -msoft-float, qemu: qemu-mipsel }
|
||||||
|
- { zig_target: powerpc-linux-musl, qemu: qemu-ppc }
|
||||||
|
# powerpc64: obscure problem with C++ exceptions in UPX doctest checks; use -fPIC to work-around
|
||||||
|
- { zig_target: powerpc64-linux-musl, zig_flags: -fPIC, qemu: qemu-ppc64 }
|
||||||
|
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le }
|
||||||
|
- { zig_target: x86_64-linux-gnu.2.3.4, qemu: qemu-x86_64 } # can use QEMU because of gcompat
|
||||||
|
- { zig_target: x86_64-linux-musl, qemu: qemu-x86_64 }
|
||||||
|
# { zig_target: x86_64-linux-musl, qemu: qemu-x86_64, zig_pic: -fPIE }
|
||||||
|
# { zig_target: x86_64-macos-none }
|
||||||
|
- { zig_target: x86_64-macos.11.0-none }
|
||||||
|
# { zig_target: x86_64-macos.12.0-none }
|
||||||
|
# { zig_target: x86_64-macos.13.0-none }
|
||||||
|
- { zig_target: x86_64-windows-gnu }
|
||||||
|
env:
|
||||||
|
# zig is currently missing winpthreads; see https://github.com/ziglang/zig/issues/10989
|
||||||
|
UPX_CONFIG_EXPECT_THREADS: ${{ contains(matrix.zig_target, '-windows-') && 'OFF' || 'ON' }}
|
||||||
|
# for zig-cc wrapper scripts (see below):
|
||||||
|
ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING
|
||||||
|
ZIG_FLAGS: ${{ matrix.zig_flags }}
|
||||||
|
ZIG_PIC: ${{ matrix.zig_pic }}
|
||||||
|
ZIG_TARGET: ${{ matrix.zig_target }}
|
||||||
|
steps:
|
||||||
|
- name: Install Alpine Linux container packages
|
||||||
|
if: ${{ job.container }}
|
||||||
|
shell: sh
|
||||||
|
run: |
|
||||||
|
apk update && apk upgrade && apk add bash cmake curl file git make parallel tar xz
|
||||||
|
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
|
||||||
|
# set PATH like in Ubuntu
|
||||||
|
echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV
|
||||||
|
git config --global --add safe.directory '*' # needed when running in a container
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { submodules: true }
|
||||||
|
- name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
rev=$(git rev-parse --short=7 HEAD)
|
||||||
|
echo "UPX_GITREV_SHORT=$rev" >> $GITHUB_ENV
|
||||||
|
if [[ "${{ matrix.zig_target }}" == x86_64-linux-gnu.2.3.4 ]]; then
|
||||||
|
echo "NEED_GCOMPAT=1" >> $GITHUB_ENV
|
||||||
|
# TODO FIXME: problem with self-packed upx and musl+gcompat: "Not a valid dynamic program"
|
||||||
|
echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=ON" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
# update ZIG_TARGET (i386 => x86)
|
||||||
|
ZIG_TARGET=${ZIG_TARGET/i386-/x86-}
|
||||||
|
echo "ZIG_TARGET=$ZIG_TARGET" >> $GITHUB_ENV
|
||||||
|
# install zig; note that ~/.local/bin is included in the default $PATH on Ubuntu
|
||||||
|
mkdir -p -v ~/.local/bin
|
||||||
|
cd ~/.local/bin
|
||||||
|
ZIG_DIST_NAME=zig-linux-x86_64-${ZIG_DIST_VERSION}
|
||||||
|
curl -sS -L -O https://ziglang.org/builds/${ZIG_DIST_NAME}.tar.xz
|
||||||
|
ls -l ${ZIG_DIST_NAME}.tar.xz
|
||||||
|
tar -xoJf ${ZIG_DIST_NAME}.tar.xz
|
||||||
|
rm ${ZIG_DIST_NAME}.tar.xz
|
||||||
|
ln -s -v ${ZIG_DIST_NAME}/zig zig
|
||||||
|
#echo "PATH=$PATH" && which zig
|
||||||
|
echo -n 'zig version: '; zig version
|
||||||
|
# create wrapper scripts (needed for CMake)
|
||||||
|
echo -e '#!/bin/sh\nexec zig ar "$@"' > zig-ar
|
||||||
|
echo -e '#!/bin/sh\nexec zig cc -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CFLAGS "$@"' > zig-cc
|
||||||
|
echo -e '#!/bin/sh\nexec zig c++ -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CXXFLAGS "$@"' > zig-cxx
|
||||||
|
echo -e '#!/bin/sh\nexec zig ranlib "$@"' > zig-ranlib
|
||||||
|
chmod +x zig-ar zig-cc zig-cxx zig-ranlib
|
||||||
|
ls -la; head zig-ar zig-cc zig-cxx zig-ranlib
|
||||||
|
- name: ${{ format('Build Release with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
|
||||||
|
run: |
|
||||||
|
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/release \
|
||||||
|
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
|
||||||
|
file build/zig/${ZIG_TARGET}${ZIG_PIC}/release/upx*
|
||||||
|
- name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
|
||||||
|
run: |
|
||||||
|
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/debug \
|
||||||
|
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
|
||||||
|
file build/zig/${ZIG_TARGET}${ZIG_PIC}/debug/upx*
|
||||||
|
- name: ${{ format('Make artifact from upx-{0}-{1}', github.ref_name, env.UPX_GITREV_SHORT) }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-zigcc-${{ matrix.zig_target }}${ZIG_PIC}" | sed 's/[^0-9a-zA-Z_.-]/-/g')
|
||||||
|
mkdir -p "tmp/artifact/$N"
|
||||||
|
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
||||||
|
(cd tmp/artifact && tar --sort=name -czf "$N.tar.gz" "$N" && rm -rf "./$N")
|
||||||
|
echo "artifact_name=$N" >> $GITHUB_ENV
|
||||||
|
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
|
||||||
|
- name: Run install tests
|
||||||
|
if: ${{ contains(matrix.zig_target, '-linux') }}
|
||||||
|
run: |
|
||||||
|
(cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release && DESTDIR="$PWD/Install with cmake" cmake --install .)
|
||||||
|
(cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release && DESTDIR="$PWD/Install with make" make install)
|
||||||
|
- name: Run ctest tests
|
||||||
|
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }}
|
||||||
|
run: |
|
||||||
|
test -n "$NEED_GCOMPAT" && apk add gcompat
|
||||||
|
jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'make build/zig/{}+test' ::: $jobs
|
||||||
|
- name: Mimic ctest tests
|
||||||
|
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }}
|
||||||
|
run: |
|
||||||
|
test -n "$NEED_GCOMPAT" && apk add gcompat
|
||||||
|
jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/zig/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
|
||||||
|
- name: ${{ format('Mimic ctest tests with QEMU {0}', matrix.qemu) }}
|
||||||
|
if: ${{ matrix.qemu }}
|
||||||
|
run: |
|
||||||
|
qemu="${{ matrix.qemu }}"
|
||||||
|
apk add coreutils "${qemu%% *}"
|
||||||
|
test -n "$NEED_GCOMPAT" && apk add gcompat
|
||||||
|
export upx_exe_runner="$qemu"
|
||||||
|
jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/zig/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
|
||||||
|
- name: Mimic ctest tests with Valgrind
|
||||||
|
if: ${{ matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }}
|
||||||
|
run: |
|
||||||
|
export UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS=ON # valgrind is SLOW
|
||||||
|
apk add coreutils valgrind
|
||||||
|
test -n "$NEED_GCOMPAT" && apk add gcompat
|
||||||
|
export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet --gen-suppressions=all"
|
||||||
|
upx_exe_runner="$upx_exe_runner --suppressions=$PWD/misc/valgrind/musl.supp"
|
||||||
|
jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/zig/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
|
||||||
|
- name: Run file system test suite
|
||||||
|
if: ${{ matrix.zig_target == 'i386-linux-musl' || matrix.zig_target == 'x86_64-linux-musl' || matrix.zig_target == 'x86_64-linux-gnu.2.3.4' }}
|
||||||
|
run: |
|
||||||
|
apk add coreutils sudo
|
||||||
|
test -n "$NEED_GCOMPAT" && apk add gcompat
|
||||||
|
jobs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
|
||||||
|
echo "===== parallel jobs: $jobs"
|
||||||
|
parallel -kv --lb 'cd build/zig/{} && chmod a+w . && sudo -u nobody bash ../../../../misc/testsuite/test_symlinks.sh' ::: $jobs
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
# see https://docs.github.com/en/actions/managing-issues-and-pull-requests/closing-inactive-issues
|
||||||
|
# see https://github.com/actions/stale
|
||||||
|
|
||||||
|
# Automatically closing issues is far from perfect, but then we only
|
||||||
|
# have limited resources and this approach favors issues that people
|
||||||
|
# actually care about.
|
||||||
|
#
|
||||||
|
# also see:
|
||||||
|
# "Should I Stale or Should I Close? An Analysis of a Bot that Closes
|
||||||
|
# Abandoned Issues and Pull Request".
|
||||||
|
# https://igorwiese.com/images/papers/Paper_BotSE_19.pdf
|
||||||
|
|
||||||
|
name: GitHub - Close stale issues
|
||||||
|
on:
|
||||||
|
schedule: [cron: "50 0 * * 1"] # run weekly Monday 00:50 UTC
|
||||||
|
workflow_dispatch:
|
||||||
|
jobs:
|
||||||
|
job-close-stale-issues:
|
||||||
|
if: github.repository_owner == 'upx' && github.repository == 'upx/upx'
|
||||||
|
name: Close stale issues
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
operations-per-run: 300
|
||||||
|
exempt-all-milestones: true
|
||||||
|
exempt-issue-labels: 'blocker,bug,enhancement,help wanted,regression'
|
||||||
|
days-before-stale: 90
|
||||||
|
days-before-close: 30
|
||||||
|
stale-issue-message: 'This issue is stale because it has been open for 90 days with no activity. Please remove the stale label or add a comment or this issue will be closed in 30 days.'
|
||||||
|
stale-pr-message: 'This PR is stale because it has been open for 90 days with no activity. Please remove the stale label or add a comment or this PR will be closed in 30 days.'
|
||||||
|
close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity. Please feel free to reopen.'
|
||||||
|
close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity. Please feel free to reopen.'
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
/.hg*
|
||||||
|
/.vscode*
|
||||||
|
/Makevars[.-]global*
|
||||||
|
/Testing*
|
||||||
|
/build*
|
||||||
|
/maint*
|
||||||
|
/vendor*
|
||||||
|
|
||||||
|
GNUmakefile*
|
||||||
|
MMakefile*
|
||||||
|
Makevars[.-]local*
|
||||||
|
compile_flags*.txt
|
||||||
|
Tmp*
|
||||||
|
tmp*
|
||||||
|
|
||||||
|
*.a
|
||||||
|
*.bz2
|
||||||
|
*.d
|
||||||
|
*.diff
|
||||||
|
*.dll
|
||||||
|
*.dylib
|
||||||
|
*.exe
|
||||||
|
*.gz
|
||||||
|
*.lib
|
||||||
|
*.map
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.out
|
||||||
|
*.patch
|
||||||
|
*.py[cdo]
|
||||||
|
*.rar
|
||||||
|
*.so
|
||||||
|
*.swp
|
||||||
|
*.tmp
|
||||||
|
*.ttp
|
||||||
|
*.xz
|
||||||
|
*.zip
|
||||||
|
*.zst
|
||||||
|
|
||||||
|
doc/*.man
|
||||||
|
doc/*.ps
|
||||||
|
doc/*.tex
|
||||||
|
|
||||||
|
src/stub/**/.*-stamp
|
||||||
|
src/stub/tmp*/*.bin
|
||||||
|
src/stub/tmp*/*.bin.bindump
|
||||||
|
src/stub/tmp*/*.bin.disasm
|
||||||
|
src/stub/tmp*/*.o.disasm
|
||||||
|
src/stub/tmp*/mips.r3000-*.[is]
|
||||||
|
src/stub/tmp*/mipsel.r3000-*.[is]
|
||||||
|
src/stub/src/**/tmp*/*
|
||||||
|
|
||||||
|
src/stub/tools/sstrip/amd64-linux-sstrip
|
||||||
|
src/stub/tools/sstrip/i386-linux-sstrip
|
||||||
|
src/stub/tools/sstrip/sstrip
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
[submodule "vendor/doctest"]
|
||||||
|
path = vendor/doctest
|
||||||
|
url = https://github.com/upx/upx-vendor-doctest.git
|
||||||
|
branch = upx-vendor
|
||||||
|
shallow = true
|
||||||
|
[submodule "vendor/lzma-sdk"]
|
||||||
|
path = vendor/lzma-sdk
|
||||||
|
url = https://github.com/upx/upx-vendor-lzma-sdk.git
|
||||||
|
branch = upx-vendor
|
||||||
|
shallow = true
|
||||||
|
[submodule "vendor/ucl"]
|
||||||
|
path = vendor/ucl
|
||||||
|
url = https://github.com/upx/upx-vendor-ucl.git
|
||||||
|
branch = upx-vendor
|
||||||
|
shallow = true
|
||||||
|
[submodule "vendor/valgrind"]
|
||||||
|
path = vendor/valgrind
|
||||||
|
url = https://github.com/upx/upx-vendor-valgrind.git
|
||||||
|
branch = upx-vendor
|
||||||
|
shallow = true
|
||||||
|
[submodule "vendor/zlib"]
|
||||||
|
path = vendor/zlib
|
||||||
|
url = https://github.com/upx/upx-vendor-zlib.git
|
||||||
|
branch = upx-vendor
|
||||||
|
shallow = true
|
||||||
+520
@@ -0,0 +1,520 @@
|
|||||||
|
#
|
||||||
|
# UPX "CMake" build file; see https://cmake.org/
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
# Build requirements:
|
||||||
|
# A C++ compiler that fully implements C++17: clang-5, gcc-8 or msvc-2019-16.11
|
||||||
|
# (older or other compilers may work but are unsupported, use at your own risk)
|
||||||
|
|
||||||
|
# Sections of this CMakeLists.txt:
|
||||||
|
# - options
|
||||||
|
# - init
|
||||||
|
# - common compilation flags
|
||||||
|
# - targets
|
||||||
|
# - target compilation flags
|
||||||
|
# - test
|
||||||
|
# - install
|
||||||
|
# - print summary
|
||||||
|
|
||||||
|
# CMake version check; using a somewhat current CMake version is highly recommended
|
||||||
|
file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/.upx_cmake_config_done.txt")
|
||||||
|
if(DEFINED UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION)
|
||||||
|
cmake_minimum_required(VERSION "${UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION}" FATAL_ERROR)
|
||||||
|
else()
|
||||||
|
cmake_minimum_required(VERSION "3.8" FATAL_ERROR) # CMake >= 3.8 is needed for CXX_STANDARD 17
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# support functions and some utility
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/functions.cmake")
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# options
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(1_options)
|
||||||
|
|
||||||
|
# compilation config options
|
||||||
|
if(NOT USE_STRICT_DEFAULTS)
|
||||||
|
# permissive config defaults when building from source code tarball
|
||||||
|
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with Git version info." ON)
|
||||||
|
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with sanitize options." ON)
|
||||||
|
option(UPX_CONFIG_DISABLE_WERROR "Do not compile with -Werror option." ON)
|
||||||
|
option(UPX_CONFIG_DISABLE_WSTRICT "Do not compile with strict compiler warnings." ON)
|
||||||
|
else()
|
||||||
|
# strict config defaults for Git developer builds
|
||||||
|
message(STATUS "===== UPX info: strict config defaults enabled")
|
||||||
|
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with Git version info." OFF)
|
||||||
|
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with sanitize options." OFF)
|
||||||
|
option(UPX_CONFIG_DISABLE_WERROR "Do not compile with -Werror option." OFF)
|
||||||
|
option(UPX_CONFIG_DISABLE_WSTRICT "Do not compile with strict compiler warnings." OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# test config options (see below)
|
||||||
|
# IMPORTANT NOTE: self-pack test can only work if the host executable format is supported by UPX!
|
||||||
|
option(UPX_CONFIG_DISABLE_SELF_PACK_TEST "Do not test packing UPX with itself" OFF)
|
||||||
|
option(UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS "Do not run exhaustive tests" OFF)
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# init
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
set(UPX_VERSION_STRING "4.2.4") # this should match src/version.h
|
||||||
|
|
||||||
|
upx_cmake_include_hook(2_init)
|
||||||
|
|
||||||
|
# Disallow in-source build. Note that you will still have to manually
|
||||||
|
# clean up a few files if you accidentally try an in-source build.
|
||||||
|
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||||
|
upx_disallow_in_source_build()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# global settings
|
||||||
|
if(${CMAKE_VERSION} VERSION_GREATER "3.14.99" AND NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
|
||||||
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
|
||||||
|
cmake_policy(SET CMP0091 NEW)
|
||||||
|
endif()
|
||||||
|
# global CMake settings that default to ON
|
||||||
|
upx_cache_bool_vars(ON
|
||||||
|
CMAKE_C_STANDARD_REQUIRED CMAKE_CXX_STANDARD_REQUIRED
|
||||||
|
CMAKE_EXPORT_COMPILE_COMMANDS CMAKE_REQUIRED_QUIET
|
||||||
|
)
|
||||||
|
# internal UPX settings
|
||||||
|
upx_cache_bool_vars(OFF
|
||||||
|
UPX_CONFIG_CMAKE_DISABLE_TEST UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
||||||
|
UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK
|
||||||
|
UPX_CONFIG_DISABLE_C_STANDARD UPX_CONFIG_DISABLE_CXX_STANDARD
|
||||||
|
UPX_CONFIG_DISABLE_RUN_UNPACKED_TEST UPX_CONFIG_DISABLE_RUN_PACKED_TEST
|
||||||
|
UPX_CONFIG_REQUIRE_THREADS
|
||||||
|
)
|
||||||
|
upx_cache_bool_vars(ON UPX_CONFIG_EXPECT_THREADS)
|
||||||
|
upx_print_env_var(CC CXX)
|
||||||
|
|
||||||
|
# determine Git revision
|
||||||
|
set(GITREV_SHORT "")
|
||||||
|
set(GITREV_PLUS "")
|
||||||
|
set(GIT_DESCRIBE "")
|
||||||
|
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git" AND NOT UPX_CONFIG_DISABLE_GITREV)
|
||||||
|
find_package(Git)
|
||||||
|
if(Git_FOUND)
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" rev-parse --short=12 HEAD
|
||||||
|
RESULT_VARIABLE result ERROR_QUIET
|
||||||
|
OUTPUT_VARIABLE GITREV_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
string(LENGTH "${GITREV_SHORT}" l)
|
||||||
|
if(${result} EQUAL 0 AND ${l} EQUAL 12)
|
||||||
|
execute_process(RESULT_VARIABLE result COMMAND "${GIT_EXECUTABLE}" diff --quiet)
|
||||||
|
if(NOT ${result} EQUAL 0)
|
||||||
|
set(GITREV_PLUS "+")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(GITREV_SHORT "")
|
||||||
|
endif()
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" describe --match "v*.*.*" --tags --dirty
|
||||||
|
RESULT_VARIABLE result ERROR_QUIET
|
||||||
|
OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
if(GIT_DESCRIBE MATCHES "^v?([0-9]+\\.[0-9]+\\.[0-9]+)-([0-9]+)-g(.+)$")
|
||||||
|
set(GIT_DESCRIBE "${CMAKE_MATCH_1}-devel.${CMAKE_MATCH_2}+git-${CMAKE_MATCH_3}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(GITREV_SHORT)
|
||||||
|
message(STATUS "UPX_VERSION_GITREV = \"${GITREV_SHORT}${GITREV_PLUS}\"")
|
||||||
|
if(GIT_DESCRIBE)
|
||||||
|
message(STATUS "UPX_VERSION_GIT_DESCRIBE = \"${GIT_DESCRIBE}\"")
|
||||||
|
endif()
|
||||||
|
elseif(UPX_CONFIG_DISABLE_GITREV)
|
||||||
|
message(STATUS "UPX_VERSION_GITREV: disabled")
|
||||||
|
else()
|
||||||
|
message(STATUS "UPX_VERSION_GITREV: not set")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# CMake init
|
||||||
|
upx_set_default_build_type(Release) # default is CMAKE_BUILD_TYPE=Release
|
||||||
|
project(upx VERSION "${UPX_VERSION_STRING}" LANGUAGES C CXX)
|
||||||
|
upx_apply_build_type()
|
||||||
|
|
||||||
|
# set MSVC_FRONTEND, GNU_FRONTEND and MINGW
|
||||||
|
if(NOT DEFINED MSVC_FRONTEND AND (MSVC OR CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC"))
|
||||||
|
set(MSVC_FRONTEND 1)
|
||||||
|
elseif (NOT DEFINED GNU_FRONTEND AND (CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^GNU" OR CMAKE_C_COMPILER_ID MATCHES "(Clang|GNU)"))
|
||||||
|
set(GNU_FRONTEND 1)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED MINGW AND CMAKE_C_PLATFORM_ID MATCHES "^MinGW")
|
||||||
|
set(MINGW 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# common compilation flags
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
include(CheckFunctionExists)
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
include(CheckStructHasMember)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
|
||||||
|
upx_cmake_include_hook(3_common_compilation_flags)
|
||||||
|
|
||||||
|
if(NOT DEFINED HAVE_UNISTD_H)
|
||||||
|
check_include_file("unistd.h" HAVE_UNISTD_H)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED HAVE_UTIMENSAT)
|
||||||
|
# proper checking for utimensat() is somewhat messy
|
||||||
|
check_function_exists(utimensat HAVE_UTIMENSAT_FUNCTION__)
|
||||||
|
if(HAVE_UTIMENSAT_FUNCTION__)
|
||||||
|
check_symbol_exists(utimensat "sys/types.h;fcntl.h;sys/stat.h" HAVE_UTIMENSAT_SYMBOL__)
|
||||||
|
if(HAVE_UTIMENSAT_SYMBOL__)
|
||||||
|
CHECK_STRUCT_HAS_MEMBER("struct stat" "st_mtim.tv_nsec" "sys/types.h;fcntl.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) # POSIX.1-2008
|
||||||
|
if(NOT HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
|
||||||
|
CHECK_STRUCT_HAS_MEMBER("struct stat" "st_mtimespec.tv_nsec" "sys/types.h;fcntl.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC) # macOS
|
||||||
|
endif()
|
||||||
|
if(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC OR HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
|
||||||
|
set(HAVE_UTIMENSAT 1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(UPX_CONFIG_DISABLE_WSTRICT)
|
||||||
|
# enable all basic warnings
|
||||||
|
set(warn_Wall -Wall)
|
||||||
|
set(warn_WN -W3)
|
||||||
|
else()
|
||||||
|
# enable all basic warnings, and enable lots of strict warnings
|
||||||
|
set(warn_Wall -Wall -Wextra -Wcast-align -Wcast-qual -Wmissing-declarations -Wpointer-arith -Wshadow -Wvla -Wwrite-strings)
|
||||||
|
set(warn_WN -W4)
|
||||||
|
endif()
|
||||||
|
if(UPX_CONFIG_DISABLE_WERROR)
|
||||||
|
# warnings are just warnings
|
||||||
|
set(warn_Werror "")
|
||||||
|
set(warn_WX "")
|
||||||
|
else()
|
||||||
|
# warnings are fatal errors; annoy developers to keep the source code warning-free
|
||||||
|
set(warn_Werror -Werror)
|
||||||
|
set(warn_WX -WX)
|
||||||
|
endif()
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
# disable warning C5105 which may get triggered by some older versions of <windows.h>
|
||||||
|
set(warn_WX -wd5105 ${warn_WX})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_C_COMPILER_ID MATCHES "^MSVC")
|
||||||
|
# use -O2 instead of -O3 to reduce code size
|
||||||
|
string(REGEX REPLACE "(^| )-O3( |$$)" "\\1-O2\\2" a "${CMAKE_C_FLAGS_RELEASE}")
|
||||||
|
string(REGEX REPLACE "(^| )-O3( |$$)" "\\1-O2\\2" b "${CMAKE_CXX_FLAGS_RELEASE}")
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "${a}" CACHE STRING "Flags used by the C compiler during RELEASE builds." FORCE)
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "${b}" CACHE STRING "Flags used by the CXX compiler during RELEASE builds." FORCE)
|
||||||
|
endif()
|
||||||
|
if(MSVC_FRONTEND OR WIN32 OR MINGW OR CYGWIN)
|
||||||
|
# disable silly warnings about using "deprecated" POSIX functions like fopen()
|
||||||
|
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
|
||||||
|
add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
|
||||||
|
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||||
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
|
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
||||||
|
add_definitions(-D__USE_MINGW_ANSI_STDIO)
|
||||||
|
endif()
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
# use -funsigned-char; set __cplusplus according to selected C++ standard
|
||||||
|
add_definitions(-J -Zc:__cplusplus)
|
||||||
|
if(CMAKE_C_COMPILER_ID MATCHES "^MSVC")
|
||||||
|
upx_add_definitions(-Zc:preprocessor) # use new preprocessor
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_C_COMPILER_ID MATCHES "^MSVC")
|
||||||
|
# protect against security threats caused by misguided compiler "optimizations"
|
||||||
|
upx_add_definitions(-fno-delete-null-pointer-checks -fno-lifetime-dse)
|
||||||
|
upx_add_definitions(-fno-strict-aliasing -fno-strict-overflow -funsigned-char)
|
||||||
|
# disable overambitious auto-vectorization until this actually gains something
|
||||||
|
upx_add_definitions(-fno-tree-vectorize)
|
||||||
|
# disable annoying clang warnings which get added by the macOS Xcode cmake generator
|
||||||
|
if(CMAKE_GENERATOR MATCHES "Xcode")
|
||||||
|
upx_add_definitions(-Wno-shorten-64-to-32)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# examine compiler configuration
|
||||||
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO)
|
||||||
|
upx_print_common_symbols()
|
||||||
|
upx_print_mingw_symbols()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# targets
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# internal settings; these may change in a future versions
|
||||||
|
set(UPX_CONFIG_DISABLE_THREADS ON) # multithreading is currently not used; maybe in UPX version 5
|
||||||
|
set(UPX_CONFIG_DISABLE_BZIP2 ON) # bzip2 is currently not used; we might need it to decompress linux kernels
|
||||||
|
set(UPX_CONFIG_DISABLE_ZSTD ON) # zstd is currently not used; maybe in UPX version 5
|
||||||
|
|
||||||
|
upx_cmake_include_hook(4_targets)
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_THREADS)
|
||||||
|
find_package(Threads)
|
||||||
|
endif()
|
||||||
|
# make sure that threads are indeed fully supported in C++
|
||||||
|
if(Threads_FOUND)
|
||||||
|
foreach(f std_lock_guard.cpp types_abi.cpp)
|
||||||
|
set(CMAKE_TRY_COMPILE_TARGET_TYPE "EXECUTABLE")
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_CXX_STANDARD)
|
||||||
|
try_compile(result "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/try_compile/${f}"
|
||||||
|
OUTPUT_VARIABLE output CXX_STANDARD 17)
|
||||||
|
else()
|
||||||
|
try_compile(result "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/try_compile/${f}"
|
||||||
|
OUTPUT_VARIABLE output)
|
||||||
|
endif()
|
||||||
|
if(NOT result)
|
||||||
|
# failed; under MinGW be sure to use the posix-threads and NOT the win32-threads version
|
||||||
|
#message(STATUS "Threads FAILED ${f}: ${output}") # debug output from try_compile
|
||||||
|
set(Threads_FOUND OFF)
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
||||||
|
upx_add_glob_files(bzip2_SOURCES "vendor/bzip2/*.c")
|
||||||
|
add_library(upx_vendor_bzip2 STATIC ${bzip2_SOURCES})
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
|
set_property(TARGET upx_vendor_bzip2 PROPERTY C_STANDARD 11)
|
||||||
|
endif()
|
||||||
|
endif() # UPX_CONFIG_DISABLE_BZIP2
|
||||||
|
|
||||||
|
upx_add_glob_files(ucl_SOURCES "vendor/ucl/src/*.c")
|
||||||
|
add_library(upx_vendor_ucl STATIC ${ucl_SOURCES})
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
|
set_property(TARGET upx_vendor_ucl PROPERTY C_STANDARD 11)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
upx_add_glob_files(zlib_SOURCES "vendor/zlib/*.c")
|
||||||
|
add_library(upx_vendor_zlib STATIC ${zlib_SOURCES})
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
|
set_property(TARGET upx_vendor_zlib PROPERTY C_STANDARD 11)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||||
|
upx_add_glob_files(zstd_SOURCES "vendor/zstd/lib/*/*.c")
|
||||||
|
add_library(upx_vendor_zstd STATIC ${zstd_SOURCES})
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_C_STANDARD)
|
||||||
|
set_property(TARGET upx_vendor_zstd PROPERTY C_STANDARD 11)
|
||||||
|
endif()
|
||||||
|
endif() # UPX_CONFIG_DISABLE_ZSTD
|
||||||
|
|
||||||
|
upx_add_glob_files(upx_SOURCES "src/*.cpp" "src/[cfu]*/*.cpp")
|
||||||
|
add_executable(upx ${upx_SOURCES})
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_CXX_STANDARD)
|
||||||
|
set_property(TARGET upx PROPERTY CXX_STANDARD 17)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(upx upx_vendor_ucl upx_vendor_zlib)
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
||||||
|
target_link_libraries(upx upx_vendor_bzip2)
|
||||||
|
endif()
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||||
|
target_link_libraries(upx upx_vendor_zstd)
|
||||||
|
endif()
|
||||||
|
if(Threads_FOUND)
|
||||||
|
target_link_libraries(upx Threads::Threads)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# target compilation flags
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(5_target_compilation_flags)
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
||||||
|
set(t upx_vendor_bzip2)
|
||||||
|
upx_compile_target_debug_with_O2(${t})
|
||||||
|
upx_sanitize_target(${t})
|
||||||
|
target_compile_definitions(${t} PRIVATE BZ_NO_STDIO=1)
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_WN} -wd4127 -wd4244 -wd4267 ${warn_WX})
|
||||||
|
elseif(GNU_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2)
|
||||||
|
endif() # UPX_CONFIG_DISABLE_BZIP2
|
||||||
|
|
||||||
|
set(t upx_vendor_ucl)
|
||||||
|
target_include_directories(${t} PRIVATE vendor/ucl/include vendor/ucl)
|
||||||
|
upx_compile_target_debug_with_O2(${t})
|
||||||
|
upx_sanitize_target(${t})
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_WN} ${warn_WX})
|
||||||
|
elseif(GNU_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL)
|
||||||
|
|
||||||
|
set(t upx_vendor_zlib)
|
||||||
|
upx_compile_target_debug_with_O2(${t})
|
||||||
|
upx_sanitize_target(${t})
|
||||||
|
target_compile_definitions(${t} PRIVATE HAVE_VSNPRINTF=1)
|
||||||
|
if(HAVE_UNISTD_H)
|
||||||
|
target_compile_definitions(${t} PRIVATE HAVE_UNISTD_H=1)
|
||||||
|
endif()
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE -W3 ${warn_WX})
|
||||||
|
elseif(GNU_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_Wall} -Wno-cast-align -Wno-cast-qual ${warn_Werror})
|
||||||
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB)
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||||
|
set(t upx_vendor_zstd)
|
||||||
|
upx_compile_target_debug_with_O2(${t})
|
||||||
|
upx_sanitize_target(${t})
|
||||||
|
target_compile_definitions(${t} PRIVATE DYNAMIC_BMI2=0 ZSTD_DISABLE_ASM=1)
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_WN} ${warn_WX})
|
||||||
|
elseif(GNU_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD)
|
||||||
|
endif() # UPX_CONFIG_DISABLE_ZSTD
|
||||||
|
|
||||||
|
set(t upx)
|
||||||
|
target_include_directories(${t} PRIVATE vendor)
|
||||||
|
target_compile_definitions(${t} PRIVATE $<$<CONFIG:Debug>:DEBUG=1>)
|
||||||
|
if(GITREV_SHORT)
|
||||||
|
target_compile_definitions(${t} PRIVATE UPX_VERSION_GITREV="${GITREV_SHORT}${GITREV_PLUS}")
|
||||||
|
if(GIT_DESCRIBE)
|
||||||
|
target_compile_definitions(${t} PRIVATE UPX_VERSION_GIT_DESCRIBE="${GIT_DESCRIBE}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(Threads_FOUND)
|
||||||
|
target_compile_definitions(${t} PRIVATE WITH_THREADS=1)
|
||||||
|
endif()
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_WSTRICT)
|
||||||
|
target_compile_definitions(${t} PRIVATE UPX_CONFIG_DISABLE_WSTRICT=0)
|
||||||
|
endif()
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_WERROR)
|
||||||
|
target_compile_definitions(${t} PRIVATE UPX_CONFIG_DISABLE_WERROR=0)
|
||||||
|
endif()
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_BZIP2)
|
||||||
|
target_compile_definitions(${t} PRIVATE WITH_BZIP2=1)
|
||||||
|
endif()
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||||
|
target_compile_definitions(${t} PRIVATE WITH_ZSTD=1)
|
||||||
|
endif()
|
||||||
|
if(HAVE_UTIMENSAT)
|
||||||
|
target_compile_definitions(${t} PRIVATE USE_UTIMENSAT=1)
|
||||||
|
if(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
|
||||||
|
target_compile_definitions(${t} PRIVATE HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
# improve speed of the Debug versions
|
||||||
|
upx_compile_source_debug_with_O2(src/compress/compress_lzma.cpp)
|
||||||
|
upx_compile_source_debug_with_O2(src/filter/filter_impl.cpp)
|
||||||
|
#upx_compile_target_debug_with_O2(${t})
|
||||||
|
upx_sanitize_target(${t})
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE -EHsc ${warn_WN} ${warn_WX})
|
||||||
|
elseif(GNU_FRONTEND)
|
||||||
|
target_compile_options(${t} PRIVATE ${warn_Wall} ${warn_Werror})
|
||||||
|
endif()
|
||||||
|
upx_add_target_extra_compile_options(${t} UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX)
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# test
|
||||||
|
# ctest
|
||||||
|
# make test
|
||||||
|
# ninja test
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(6_test)
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_TEST)
|
||||||
|
|
||||||
|
include(CTest)
|
||||||
|
if(NOT CMAKE_CROSSCOMPILING OR CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
|
upx_add_test(upx-version upx --version)
|
||||||
|
upx_add_test(upx-version-short upx --version-short)
|
||||||
|
upx_add_test(upx-license upx --license)
|
||||||
|
upx_add_test(upx-help-1 upx --help)
|
||||||
|
upx_add_test(upx-help-2 upx --help-short)
|
||||||
|
upx_add_test(upx-help-3 upx --help-verbose)
|
||||||
|
upx_add_test(upx-sysinfo-1 upx --sysinfo)
|
||||||
|
upx_add_test(upx-sysinfo-2 upx --sysinfo -v)
|
||||||
|
upx_add_test(upx-sysinfo-3 upx --sysinfo -vv)
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_SELF_PACK_TEST)
|
||||||
|
# IMPORTANT NOTE: these tests can only work if the host executable format
|
||||||
|
# is supported by UPX!
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/self_pack_test.cmake")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif() # UPX_CONFIG_CMAKE_DISABLE_TEST
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# install
|
||||||
|
# cmake --install .
|
||||||
|
# make install
|
||||||
|
# ninja install
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(7_install)
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_INSTALL)
|
||||||
|
|
||||||
|
# installation prefix and directories
|
||||||
|
if(NOT CMAKE_INSTALL_PREFIX)
|
||||||
|
#message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined")
|
||||||
|
message(WARNING "WARNING: CMAKE_INSTALL_PREFIX is not defined")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_INSTALL_PREFIX)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
endif()
|
||||||
|
# install files
|
||||||
|
if(CMAKE_INSTALL_PREFIX AND DEFINED CMAKE_INSTALL_FULL_BINDIR)
|
||||||
|
install(TARGETS upx DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}")
|
||||||
|
install(FILES
|
||||||
|
COPYING LICENSE NEWS README doc/THANKS.txt doc/upx-doc.html doc/upx-doc.txt
|
||||||
|
DESTINATION "${CMAKE_INSTALL_FULL_DOCDIR}"
|
||||||
|
)
|
||||||
|
install(FILES doc/upx.1 DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man1")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif() # UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# summary
|
||||||
|
# print some info about the build configuration
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
upx_cmake_include_hook(8_summary)
|
||||||
|
|
||||||
|
upx_print_var(CMAKE_VERSION UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION CMAKE_GENERATOR)
|
||||||
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO)
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/print_info.cmake")
|
||||||
|
endif()
|
||||||
|
upx_print_var(CMAKE_INSTALL_PREFIX CMAKE_CONFIGURATION_TYPES CMAKE_TRY_COMPILE_CONFIGURATION CMAKE_BUILD_TYPE)
|
||||||
|
if(Threads_FOUND)
|
||||||
|
message(STATUS "WITH_THREADS = 1")
|
||||||
|
elseif(UPX_CONFIG_REQUIRE_THREADS)
|
||||||
|
message(FATAL_ERROR "ERROR: WITH_THREADS required")
|
||||||
|
elseif(UPX_CONFIG_EXPECT_THREADS AND NOT UPX_CONFIG_DISABLE_THREADS)
|
||||||
|
message(FATAL_ERROR "ERROR: WITH_THREADS expected; set UPX_CONFIG_EXPECT_THREADS=OFF")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|None|Release)$")
|
||||||
|
message(WARNING "WARNING: unsupported CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}; please use \"Debug\" or \"Release\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# extra sanity checks to detect incompatible C vs CXX settings
|
||||||
|
if(NOT UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK)
|
||||||
|
upx_platform_check_mismatch(CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID)
|
||||||
|
upx_platform_check_mismatch(CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI)
|
||||||
|
upx_platform_check_mismatch(CMAKE_C_COMPILER_FRONTEND_VARIANT CMAKE_CXX_COMPILER_FRONTEND_VARIANT)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
upx_cmake_include_hook(9_finish)
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/.upx_cmake_config_done.txt" "")
|
||||||
|
|
||||||
|
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
@@ -291,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least
|
|||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
Copyright (C) 19yy <name of author>
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License along
|
||||||
along with this program; if not, write to the Free Software
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
|
|||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Library General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
|||||||
@@ -1,36 +1,88 @@
|
|||||||
# Toplevel Makefile for UPX
|
#
|
||||||
|
# UPX top-level Makefile - needs GNU make and CMake >= 3.13
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
SHELL = /bin/sh
|
# INFO: this Makefile is just a convenience wrapper for calling CMake
|
||||||
|
|
||||||
srcdir = .
|
# HINT: if you only have an older CMake 3.x then you can invoke cmake manually like this:
|
||||||
top_srcdir = .
|
# mkdir -p build/release
|
||||||
|
# cd build/release
|
||||||
|
# cmake ../.. # run config
|
||||||
|
# make -j # and run build
|
||||||
|
|
||||||
|
CMAKE = cmake
|
||||||
|
UPX_CMAKE_BUILD_FLAGS += --parallel
|
||||||
|
ifneq ($(VERBOSE),)
|
||||||
|
#UPX_CMAKE_BUILD_FLAGS += --verbose # requires CMake >= 3.14
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += -DCMAKE_VERBOSE_MAKEFILE=ON
|
||||||
|
endif
|
||||||
|
# enable this if you prefer Ninja for the actual builds:
|
||||||
|
#UPX_CMAKE_CONFIG_FLAGS += -G Ninja
|
||||||
|
|
||||||
default:
|
#***********************************************************************
|
||||||
@echo "UPX info: please choose a target for 'make'"
|
# default
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
all mostlyclean clean distclean maintainer-clean:
|
.DEFAULT_GOAL = build/release
|
||||||
$(MAKE) -C src/stub/util/sstrip $@
|
|
||||||
$(MAKE) -C src/stub $@
|
run_cmake_config = $(CMAKE) -S . -B $1 $(UPX_CMAKE_CONFIG_FLAGS) -DCMAKE_BUILD_TYPE=$2
|
||||||
|
run_cmake_build = $(CMAKE) --build $1 $(UPX_CMAKE_BUILD_FLAGS) --config $2
|
||||||
|
# avoid re-running run_cmake_config if .upx_cmake_config_done.txt already exists
|
||||||
|
run_config = $(if $(wildcard $1/CMakeFiles/.upx_cmake_config_done.txt),,$(call run_cmake_config,$1,$2))
|
||||||
|
run_build = $(call run_cmake_build,$1,$2)
|
||||||
|
|
||||||
|
build/debug: PHONY
|
||||||
|
$(call run_config,$@,Debug)
|
||||||
|
$(call run_build,$@,Debug)
|
||||||
|
|
||||||
|
build/release: PHONY
|
||||||
|
$(call run_config,$@,Release)
|
||||||
|
$(call run_build,$@,Release)
|
||||||
|
|
||||||
|
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
|
||||||
|
.PHONY: PHONY
|
||||||
|
.SECONDEXPANSION:
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
|
# shortcuts (all => debug + release)
|
||||||
|
debug: build/debug PHONY
|
||||||
|
release: build/release PHONY
|
||||||
|
all build/all: build/debug build/release PHONY
|
||||||
|
build/%/all: $$(dir $$@)debug $$(dir $$@)release PHONY ;
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# test
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
CTEST = ctest
|
||||||
|
CTEST_JOBS ?= 8
|
||||||
|
CTEST_FLAGS = --output-on-failure --parallel $(CTEST_JOBS)
|
||||||
|
|
||||||
|
build/debug+test: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CTEST) $(CTEST_FLAGS) -C Debug
|
||||||
|
build/%/debug+test: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CTEST) $(CTEST_FLAGS) -C Debug
|
||||||
|
build/release+test: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CTEST) $(CTEST_FLAGS) -C Release
|
||||||
|
build/%/release+test: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CTEST) $(CTEST_FLAGS) -C Release
|
||||||
|
build/%/all+test: $$(dir $$@)debug+test $$(dir $$@)release+test PHONY ;
|
||||||
|
|
||||||
|
# shortcuts
|
||||||
|
debug+test: build/debug+test PHONY
|
||||||
|
release+test: build/release+test PHONY
|
||||||
|
all+test build/all+test: build/debug+test build/release+test PHONY
|
||||||
|
|
||||||
|
test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY
|
||||||
|
|
||||||
|
#
|
||||||
|
# END of Makefile
|
||||||
|
#
|
||||||
|
|
||||||
|
# extra pre-defined build configurations and some utility; optional
|
||||||
|
include ./misc/make/Makefile-extra.mk
|
||||||
|
|
||||||
|
# developer convenience
|
||||||
|
ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc.
|
||||||
|
ifneq ($(wildcard ./misc/scripts/.),)
|
||||||
|
check-whitespace clang-format run-testsuite run-testsuite-all run-testsuite-debug run-testsuite-release: src/Makefile PHONY
|
||||||
$(MAKE) -C src $@
|
$(MAKE) -C src $@
|
||||||
$(MAKE) -C doc $@
|
endif
|
||||||
|
endif
|
||||||
dist: distclean
|
|
||||||
false
|
|
||||||
|
|
||||||
zip:
|
|
||||||
cd .. && rm -f upx-current.zip && zip -r upx-current.zip upx
|
|
||||||
|
|
||||||
cvs-admin-ko:
|
|
||||||
cvs admin -ko .
|
|
||||||
cvs update -P -d
|
|
||||||
|
|
||||||
ChangeLog:
|
|
||||||
perl $(srcdir)/scripts/cvs2cl.pl --utc -f ChangeLog.cvs
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all mostlyclean clean distclean maintainer-clean
|
|
||||||
.PHONY: dist cvs-admin-ko ChangeLog
|
|
||||||
|
|
||||||
.NOEXPORT:
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,16 +2,260 @@
|
|||||||
User visible changes for UPX
|
User visible changes for UPX
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
[ UNSTABLE BETA VERSION - please see README.1ST for some more info ]
|
Changes in 4.2.4 (09 May 2024):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/17
|
||||||
|
|
||||||
|
Changes in 4.2.3 (27 Mar 2024):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/16
|
||||||
|
|
||||||
|
Changes in 4.2.2 (03 Jan 2024):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/15
|
||||||
|
|
||||||
|
Changes in 4.2.1 (01 Nov 2023):
|
||||||
|
* linux: /proc/self/exe now is optional
|
||||||
|
* windows: use SetFileTime to preserve sub-second file timestamps
|
||||||
|
* official Windows builds: revert activeCodePage change introduced in 4.2.0
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/14
|
||||||
|
|
||||||
|
Changes in 4.2.0 (26 Oct 2023):
|
||||||
|
* win32/pe and win64/pe: stricter relocation checks; please report regressions
|
||||||
|
* unix: use utimensat to preserve sub-second file timestamps
|
||||||
|
* new option '--link' to preserve hard-links (Unix only; use with care)
|
||||||
|
* add support for NO_COLOR env var; see https://no-color.org/
|
||||||
|
* disable macOS support until we fix compatibility with macOS 13+
|
||||||
|
* official Windows builds: set activeCodePage to UTF-8
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/13
|
||||||
|
|
||||||
|
Changes in 4.1.0 (08 Aug 2023):
|
||||||
|
* ELF: handle shared libraries with more than 2 PT_LOAD segments
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/11
|
||||||
|
|
||||||
|
Changes in 4.0.2 (30 Jan 2023):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/9
|
||||||
|
|
||||||
|
Changes in 4.0.1 (16 Nov 2022):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/8
|
||||||
|
|
||||||
|
Changes in 4.0.0 (28 Oct 2022):
|
||||||
|
* Switch to semantic versioning
|
||||||
|
* SECURITY NOTES: emphasize the security context in the docs
|
||||||
|
* Support easy building from source code with CMake
|
||||||
|
* Support easy rebuilding the stubs from source with Podman/Docker
|
||||||
|
* Add integrated doctest C++ testing framework
|
||||||
|
* Add support for EFI files (PE x86; Kornel Pal)
|
||||||
|
* win32/pe and win64/pe: set correct SizeOfHeaders in the PE header
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/6
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/7
|
||||||
|
|
||||||
|
Changes in 3.96 (23 Jan 2020):
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/5
|
||||||
|
|
||||||
|
Changes in 3.95 (26 Aug 2018):
|
||||||
|
* Flag --android-shlib to work around bad design in Android
|
||||||
|
* Flag --force-pie when ET_DYN main program is not marked as DF_1_PIE
|
||||||
|
* Better compatibility with varying layout of address space on Linux
|
||||||
|
* Support for 4 PT_LOAD layout in ELF generated by binutils-2.31
|
||||||
|
* bug fixes, particularly better diagnosis of malformed input
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/4
|
||||||
|
|
||||||
|
Changes in 3.94 (12 May 2017):
|
||||||
|
* Add support for arm64-linux (aka "aarch64").
|
||||||
|
* Add support for --lzma compression on 64-bit PowerPC (Thierry Fauck).
|
||||||
|
* For Mach, "upx -d" will unpack a prefix of the file (and warn).
|
||||||
|
* Various improvements to the ELF formats.
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/3
|
||||||
|
|
||||||
|
Changes in 3.93 (29 Jan 2017):
|
||||||
|
* Fixed some win32/pe and win64/pe regressions introduced in 3.92
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/2
|
||||||
|
|
||||||
|
Changes in 3.92 (11 Dec 2016):
|
||||||
|
* INFO: UPX has moved to GitHub - the new home page is https://upx.github.io
|
||||||
|
* IMPORTANT: all PE formats: internal changes: reunited the diverged source
|
||||||
|
files - please report all regressions into the bug tracker and try UPX 3.91
|
||||||
|
in case of problems.
|
||||||
|
* Support Apple MacOS 10.12 "Sierra", including more-robust de-compression.
|
||||||
|
* Explicitly diagnose Go-language bad PT_LOAD; recommend hemfix.c.
|
||||||
|
https://sourceforge.net/p/upx/bugs/195/ https://github.com/pwaller/goupx
|
||||||
|
* Fix CERT-FI Case 829767 UPX command line tools segfaults.
|
||||||
|
Received by UPX Team on 2015-May-08; originally reported
|
||||||
|
by Codenomicon to NCSC-FI on 2015-01-08.
|
||||||
|
The vulnerabilities were discovered by Joonas Kuorilehto and
|
||||||
|
Antti Häyrynen from Codenomicon.
|
||||||
|
* bug fixes - see https://github.com/upx/upx/milestone/1
|
||||||
|
|
||||||
|
Changes in 3.91 (30 Sep 2013):
|
||||||
|
* Added experimental support for Windows 64-bit PE files, based on
|
||||||
|
work by Stefan Widmann. Please use for testing only!
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
Changes in 3.09 (18 Feb 2013):
|
||||||
|
* New option --preserve-build-id for GNU ELF.
|
||||||
|
* Allow for code signing and LC_UUID on Mac OS X executables.
|
||||||
|
* Allow non-contiguous LC_SEGMENTs and 0==.vmsize for Mach-O.
|
||||||
|
* Allow zero-filled final page in PackUnix::canUnpack().
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.08 (12 Dec 2011):
|
||||||
|
* Fix allocation in runtime stub for darwin.macho-entry (i386 and amd64).
|
||||||
|
* Compress shared library on ELF i386 only [ld.so threatens even this case].
|
||||||
|
* Attempt to support ELF on QNX 6.3.0 for armel (experimental).
|
||||||
|
* Better diagnostic when ELF -fPIC is needed.
|
||||||
|
* PT_NOTE improvements for BSD.
|
||||||
|
* Preserve more ELF .e_flags on ARM.
|
||||||
|
* Minor code improvements for ELF stubs.
|
||||||
|
* Defend against another flavor of corrupt PE header.
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.07 (08 Sep 2010):
|
||||||
|
* win32/pe: fixed relocation handling for files with *no* TLS callbacks
|
||||||
|
[severe bug introduced in 3.06]
|
||||||
|
|
||||||
|
Changes in 3.06 (04 Sep 2010):
|
||||||
|
* win32/pe: TLS callback support contributed by Stefan Widmann. Thanks!
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.05 (27 Apr 2010):
|
||||||
|
* i386-linux and amd64-linux support shared libraries (DT_INIT must
|
||||||
|
exist, all info needed by runtime loader must be first in .text, etc.)
|
||||||
|
* Linux /proc/self/exe now is preserved by default, by leaving behind
|
||||||
|
one page. New compress-time option --unmap-all-pages is available.
|
||||||
|
* Withdraw support for shared libraries on Darwin (Apple Mac OS X)
|
||||||
|
because upx does not understand enough about .dylib.
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.04 (27 Sep 2009):
|
||||||
|
* new format Mach/AMD64 supports 64-bit programs on Apple Macintosh.
|
||||||
|
* new formats Dylib/i386 and Dylib/ppc32 support shared libraries
|
||||||
|
[such as browser plugins] on Darwin (Apple Macintosh). An existing
|
||||||
|
-init function (LC_ROUTINES command) is required.
|
||||||
|
* new format vmlinuz/armel for Debian NSLU2 (etc.) linux kernel
|
||||||
|
* bvmlinuz boot protocol 2.08 for 386 Linux kernel
|
||||||
|
* Extended ABI version 4 for armel-eabi ARM Linux ELF
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.03 (27 Apr 2008):
|
||||||
|
* implement cache flushing for PowerPC (esp. model 440)
|
||||||
|
* fix cache flushing on MIPS (>3 MiB compressed, or with holes)
|
||||||
|
* fix MIPS big-endian
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.02 (16 Dec 2007):
|
||||||
|
* fix unmapping on arm-linux.elf
|
||||||
|
* fix error checking in mmap for i386-linux.elf [triggered by -fPIE]
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.01 (31 Jul 2007):
|
||||||
|
* new options --no-mode, --no-owner and --no-time to disable preservation
|
||||||
|
of mode (file permissions), file ownership and timestamps.
|
||||||
|
* dos/exe: fixed an incorrect error message caused by a bug in
|
||||||
|
relocation handling
|
||||||
|
* new format linux/mipsel supports ELF on [32-bit] R3000
|
||||||
|
* fix argv[0] on PowerPC with --lzma
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 3.00 (27 Apr 2007):
|
||||||
|
* watcom/le & tmt/adam: fixed a problem when using certain filters
|
||||||
|
|
||||||
|
Changes in 2.93 beta (08 Mar 2007):
|
||||||
|
* new formats Mach/i386 and Mach/fat support Mac OS X i686 and
|
||||||
|
Universal binaries [i686 and PowerPC only]
|
||||||
|
* dos/exe: LZMA is now also supported for 16-bit dos/exe. Please note that
|
||||||
|
you have to explicitly use '--lzma' even for '--ultra-brute' here
|
||||||
|
because runtime decompression is about 30 times slower than NRV -
|
||||||
|
which is really noticeable on old machines.
|
||||||
|
* dos/exe: fixed a rarely occurring bug in relocation handling
|
||||||
|
* win32/pe & arm/pe: better icon compression handling
|
||||||
|
|
||||||
|
Changes in 2.92 beta (23 Jan 2007):
|
||||||
|
* new option '--ultra-brute' which tries even more variants
|
||||||
|
* slightly improved compression ratio for some files when
|
||||||
|
using '--brute' or '--ultra-brute'
|
||||||
|
* bug fixes
|
||||||
|
|
||||||
|
Changes in 2.91 beta (29 Nov 2006):
|
||||||
|
* assorted bug fixes
|
||||||
|
* wince/arm: fix "missing" icon & version info resource problem for WinCE 5
|
||||||
|
* win32/pe & arm/pe: added option --compress-icons=3 to compress all icons
|
||||||
|
|
||||||
|
Changes in 2.90 beta (08 Oct 2006):
|
||||||
|
* LZMA algorithm support for most of the 32-bit and 64-bit file formats;
|
||||||
|
use new option '--lzma' to enable
|
||||||
|
* new format: BSD/elf386 supporting FreeBSD, NetBSD and OpenBSD
|
||||||
|
via auto-detection of PT_NOTE or EI_OSABI
|
||||||
|
* arm/pe: all the NRV compression methods are now supported
|
||||||
|
(only NRV2D is missing in thumb mode)
|
||||||
|
* linux/elf386, linux/ElfAMD: remember /proc/self/exe in environment
|
||||||
|
* major source code changes: the runtime decompression stubs are now
|
||||||
|
built from internal ELF objects
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
Changes in 2.03 (07 Nov 2006):
|
||||||
|
* bvmlinuz/386: fix for kernels not at 0x100000; also allow x86_64
|
||||||
|
* linux/elf386: work around Linux kernel bug (0-length .bss needs PF_W)
|
||||||
|
|
||||||
|
Changes in 2.02 (13 Aug 2006):
|
||||||
|
* linux/386: work around Linux kernel bug (".bss" requires PF_W)
|
||||||
|
* linux/ppc32, mach/ppc32: compressed programs now work on a 405 CPU
|
||||||
|
* vmlinuz/386: fixed zlib uncompression problem on DOS
|
||||||
|
|
||||||
|
Changes in 2.01 (06 Jun 2006):
|
||||||
|
* arm/pe: better DLL support
|
||||||
|
* dos/exe: device driver support added
|
||||||
|
* linux/386: Fix --force-execve for PaX, grSecurity, and strict SELinux.
|
||||||
|
/tmp must support execve(); therefore /tmp cannot be mounted 'noexec'.
|
||||||
|
* win32/pe & arm/pe: added new option '--keep-resource=' for
|
||||||
|
excluding selected resources from compression
|
||||||
|
|
||||||
|
Changes in 2.00 (27 Apr 2006):
|
||||||
|
* linux/386: the stub now prints an error message if some strict
|
||||||
|
SELinux mode does prevent runtime decompression and execution
|
||||||
|
(for a fully SELinux-compatible but otherwise inferior compression
|
||||||
|
format you can use the '--force-execve' option)
|
||||||
|
* linux/386: worked around a problem where certain Linux kernels
|
||||||
|
clobber the %ebx register during a syscall
|
||||||
|
* win32/pe: disable filters for files with broken PE headers
|
||||||
|
|
||||||
|
Changes in 1.96 beta (13 Apr 2006):
|
||||||
|
* arm/pe: added filter support
|
||||||
|
* win32/pe: removed an unnecessary check so that Delphi 2006 and
|
||||||
|
Digital Mars C++ programs finally are supported
|
||||||
|
|
||||||
|
Changes in 1.95 beta (09 Apr 2006):
|
||||||
|
* arm/pe: added DLL support
|
||||||
|
* arm/pe: added thumb mode stub support
|
||||||
|
* arm/pe: added unpacking support
|
||||||
|
* win32/pe: really worked around R6002 runtime errors
|
||||||
|
|
||||||
|
Changes in 1.94 beta (11 Mar 2006):
|
||||||
|
* new format: added support for wince/arm (ARM executables running on WinCE)
|
||||||
|
* new format: added support for linux elf/amd64
|
||||||
|
* new format: added support for linux elf/ppc32
|
||||||
|
* new format: added support for mach/ppc32 (Apple Mac OS X)
|
||||||
|
* win32/pe: hopefully working "load config" support
|
||||||
|
* win32/pe: R6002 runtime errors worked around
|
||||||
|
* win32/pe: the stub now clears the dirty stack
|
||||||
|
|
||||||
|
Changes in 1.93 beta (07 Feb 2005):
|
||||||
|
* vmlinuz/386: fixes to support more kernels
|
||||||
|
|
||||||
|
Changes in 1.92 beta (20 Jul 2004):
|
||||||
|
* win32/pe: added option '--strip-loadconf' to strip the SEH load
|
||||||
|
config section [NOTE: this option is obsolete since UPX 1.94]
|
||||||
|
* win32/pe: try to detect .NET (win32/net) files [not yet supported by UPX]
|
||||||
|
* vmlinux/386: new format that directly supports building Linux kernels
|
||||||
|
* source code: now compiles cleanly under Win64
|
||||||
|
|
||||||
Changes in 1.91 beta (30 Jun 2004):
|
Changes in 1.91 beta (30 Jun 2004):
|
||||||
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
|
||||||
* djgpp2/coff: added support for recent binutils versions
|
* djgpp2/coff: added support for recent binutils versions
|
||||||
* linux/elf386, linux/sh386: lots of improvements
|
* linux/elf386, linux/sh386: lots of improvements
|
||||||
* vmlinuz/386: added support for recent kernels
|
* vmlinuz/386: added support for recent kernels
|
||||||
* watcom/le: don't crash on files without relocations
|
* watcom/le: don't crash on files without relocations
|
||||||
* win32/pe: stricter checks of some PE values
|
* win32/pe: stricter checks of some PE values
|
||||||
* option `--brute' now implies `--crp-ms=999999'.
|
* option '--brute' now implies '--crp-ms=999999'.
|
||||||
* source code: much improved portability using ACC, the
|
* source code: much improved portability using ACC, the
|
||||||
Automatic Compiler Configuration
|
Automatic Compiler Configuration
|
||||||
* source code: compile fixes for strict ISO C++ compilers
|
* source code: compile fixes for strict ISO C++ compilers
|
||||||
@@ -19,17 +263,15 @@ Changes in 1.91 beta (30 Jun 2004):
|
|||||||
* re-synced with upx 1.25 branch
|
* re-synced with upx 1.25 branch
|
||||||
|
|
||||||
Changes in 1.90 beta (11 Nov 2002):
|
Changes in 1.90 beta (11 Nov 2002):
|
||||||
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
|
||||||
* implemented several new options for finer compression control:
|
* implemented several new options for finer compression control:
|
||||||
`--all-methods', `--all-filters' and `--brute'
|
'--all-methods', '--all-filters' and '--brute'
|
||||||
* ps1/exe: new format - UPX now supports PlayStation One programs
|
* ps1/exe: new format - UPX now supports PlayStation One programs
|
||||||
* linux/386: added the option `--force-execve'
|
* linux/386: added the option '--force-execve'
|
||||||
* vmlinuz/386: better kernel detection and sanity checks
|
* vmlinuz/386: better kernel detection and sanity checks
|
||||||
* re-synced with upx 1.24 branch
|
* re-synced with upx 1.24 branch
|
||||||
* documentation updates
|
* documentation updates
|
||||||
|
|
||||||
Changes in 1.11 beta (20 Dec 2000):
|
Changes in 1.11 beta (20 Dec 2000):
|
||||||
* UNSTABLE BETA VERSION - DO NOT USE EXCEPT FOR TESTING
|
|
||||||
* vmlinuz/386: new format - UPX now supports bootable linux kernels
|
* vmlinuz/386: new format - UPX now supports bootable linux kernels
|
||||||
* linux/elf386: added the new ELF direct-to-memory executable format - no
|
* linux/elf386: added the new ELF direct-to-memory executable format - no
|
||||||
more temp files are needed for decompression!
|
more temp files are needed for decompression!
|
||||||
@@ -41,7 +283,7 @@ Changes in 1.11 beta (20 Dec 2000):
|
|||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
Changes in 1.25 (29 Jun 2004)
|
Changes in 1.25 (29 Jun 2004)
|
||||||
* INFO: http://upx.sourceforge.net is the permanent UPX home page
|
* INFO: http://upx.sourceforge.net is the new UPX home page
|
||||||
* watcom/le: don't crash on files without relocations
|
* watcom/le: don't crash on files without relocations
|
||||||
* win32/pe: stricter checks of some PE values
|
* win32/pe: stricter checks of some PE values
|
||||||
* source code: much improved portability using ACC, the
|
* source code: much improved portability using ACC, the
|
||||||
@@ -69,9 +311,9 @@ Changes in 1.22 (27 Jun 2002)
|
|||||||
Digital Mars C++ and Watcom C++
|
Digital Mars C++ and Watcom C++
|
||||||
|
|
||||||
Changes in 1.21 (01 Jun 2002)
|
Changes in 1.21 (01 Jun 2002)
|
||||||
* New option `--crp-ms=' for slightly better compression at the cost
|
* New option '--crp-ms=' for slightly better compression at the cost
|
||||||
of higher memory requirements during compression.
|
of higher memory requirements during compression.
|
||||||
Try `upx --best --crp-ms=100000'. See the docs for more info.
|
Try 'upx --best --crp-ms=100000'. See the docs for more info.
|
||||||
* source code: portability fixes
|
* source code: portability fixes
|
||||||
* source code: compile fixes for g++ 3.0 and g++ 3.1
|
* source code: compile fixes for g++ 3.0 and g++ 3.1
|
||||||
|
|
||||||
@@ -85,7 +327,6 @@ Changes in 1.20 (23 May 2001)
|
|||||||
our unstable development releases 1.1x and 1.9x]
|
our unstable development releases 1.1x and 1.9x]
|
||||||
|
|
||||||
Changes in 1.08 (30 Apr 2001)
|
Changes in 1.08 (30 Apr 2001)
|
||||||
* INFO: http://upx.sourceforge.net now is the new permanent UPX home page
|
|
||||||
* new native port to atari/tos
|
* new native port to atari/tos
|
||||||
* win32/pe: shortened the identstring
|
* win32/pe: shortened the identstring
|
||||||
* source code: portability fixes - UPX now builds cleanly under m68k CPUs
|
* source code: portability fixes - UPX now builds cleanly under m68k CPUs
|
||||||
@@ -110,7 +351,7 @@ Changes in 1.05 (24 Jan 2001)
|
|||||||
at the unstable UPX 1.1x beta versions for that)
|
at the unstable UPX 1.1x beta versions for that)
|
||||||
|
|
||||||
Changes in 1.04 (19 Dec 2000)
|
Changes in 1.04 (19 Dec 2000)
|
||||||
* dos/exe: fixed an internal error when using `--no-reloc'
|
* dos/exe: fixed an internal error when using '--no-reloc'
|
||||||
* win32/pe: fixed a rare bug in the relocation handling code
|
* win32/pe: fixed a rare bug in the relocation handling code
|
||||||
* some tunings for the default compression level
|
* some tunings for the default compression level
|
||||||
|
|
||||||
@@ -118,7 +359,7 @@ Changes in 1.03 (30 Nov 2000)
|
|||||||
* linked with a new version of the NRV compression library:
|
* linked with a new version of the NRV compression library:
|
||||||
- improved compression ratio a little bit
|
- improved compression ratio a little bit
|
||||||
- overall significantly faster compression
|
- overall significantly faster compression
|
||||||
- much faster when using high compression levels like `-9' or `--best'
|
- much faster when using high compression levels like '-9' or '--best'
|
||||||
- much faster with large files
|
- much faster with large files
|
||||||
* atari/tos: added support for FreeMiNT
|
* atari/tos: added support for FreeMiNT
|
||||||
* the 32-bit DOS version now uses the new CWSDSTUB extender
|
* the 32-bit DOS version now uses the new CWSDSTUB extender
|
||||||
@@ -126,7 +367,7 @@ Changes in 1.03 (30 Nov 2000)
|
|||||||
Changes in 1.02 (13 Sep 2000)
|
Changes in 1.02 (13 Sep 2000)
|
||||||
* watcom/le: fixed a problem with the Causeway extender
|
* watcom/le: fixed a problem with the Causeway extender
|
||||||
* win32/pe: don't automatically strip relocs if they seem needed
|
* win32/pe: don't automatically strip relocs if they seem needed
|
||||||
* support multiple backup generations when using `-k'
|
* support multiple backup generations when using '-k'
|
||||||
* updated the console screen driver
|
* updated the console screen driver
|
||||||
|
|
||||||
Changes in 1.01 (09 Apr 2000)
|
Changes in 1.01 (09 Apr 2000)
|
||||||
@@ -154,10 +395,12 @@ Changes in 0.99.1 (29 Feb 2000)
|
|||||||
|
|
||||||
Changes in 0.99 (25 Feb 2000)
|
Changes in 0.99 (25 Feb 2000)
|
||||||
* FULL SOURCE CODE RELEASED UNDER THE TERMS OF THE GNU GPL
|
* FULL SOURCE CODE RELEASED UNDER THE TERMS OF THE GNU GPL
|
||||||
* win32/pe: changed default to `--strip-relocs=1'
|
* win32/pe: changed default to '--strip-relocs=1'
|
||||||
* dos/com and dos/sys: fixed a bad decompressor problem
|
* dos/com and dos/sys: fixed a bad decompressor problem
|
||||||
* linux/386: the counter for the progress indicator was off by one
|
* linux/386: the counter for the progress indicator was off by one
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
|
||||||
Changes in 0.94 (06 Dec 1999)
|
Changes in 0.94 (06 Dec 1999)
|
||||||
* win32/pe: the stub now calls ExitProcess in case of import errors
|
* win32/pe: the stub now calls ExitProcess in case of import errors
|
||||||
* under DOS and Windows, the environment variable UPX now accepts
|
* under DOS and Windows, the environment variable UPX now accepts
|
||||||
@@ -177,7 +420,7 @@ Changes in 0.91 (13 Nov 1999)
|
|||||||
* dos/exe: correctly restore cs when uncompressing
|
* dos/exe: correctly restore cs when uncompressing
|
||||||
|
|
||||||
Changes in 0.90 (10 Nov 1999)
|
Changes in 0.90 (10 Nov 1999)
|
||||||
* all formats: `--overlay=copy' now is the default overlay mode
|
* all formats: '--overlay=copy' now is the default overlay mode
|
||||||
* improved compression ratio for most files
|
* improved compression ratio for most files
|
||||||
* win32/pe: uncompression is finally supported
|
* win32/pe: uncompression is finally supported
|
||||||
* win32/pe: never compress REGISTRY resources
|
* win32/pe: never compress REGISTRY resources
|
||||||
@@ -187,7 +430,7 @@ Changes in 0.90 (10 Nov 1999)
|
|||||||
* win32/pe: somewhat less memory is required during compression
|
* win32/pe: somewhat less memory is required during compression
|
||||||
* linux/386: fixed compression of scripts which was broken since 0.71
|
* linux/386: fixed compression of scripts which was broken since 0.71
|
||||||
* linux/386: more FreeBSD compatibility issues
|
* linux/386: more FreeBSD compatibility issues
|
||||||
* changed option: `-i' now prints some more details during compression
|
* changed option: '-i' now prints some more details during compression
|
||||||
(not finished yet)
|
(not finished yet)
|
||||||
|
|
||||||
Changes in 0.84 (04 Oct 1999)
|
Changes in 0.84 (04 Oct 1999)
|
||||||
@@ -203,7 +446,7 @@ Changes in 0.83 (17 Sep 1999)
|
|||||||
Changes in 0.82 (16 Aug 1999)
|
Changes in 0.82 (16 Aug 1999)
|
||||||
* dos/exe: fixed a decompressor bug which could cause crash on some files
|
* dos/exe: fixed a decompressor bug which could cause crash on some files
|
||||||
* linux/386: section headers are now stripped from the stub so that
|
* linux/386: section headers are now stripped from the stub so that
|
||||||
`strip' won't ruin a compressed file any longer
|
'strip' won't ruin a compressed file any longer
|
||||||
* wc/le: support for stack not in the last object disabled again
|
* wc/le: support for stack not in the last object disabled again
|
||||||
* win32/pe: removed some unneeded data
|
* win32/pe: removed some unneeded data
|
||||||
|
|
||||||
@@ -212,32 +455,32 @@ Changes in 0.81 (04 Aug 1999)
|
|||||||
* dos/com: fixed an internal error that could happen with very small files
|
* dos/com: fixed an internal error that could happen with very small files
|
||||||
|
|
||||||
Changes in 0.80 (03 Aug 1999)
|
Changes in 0.80 (03 Aug 1999)
|
||||||
* you can set some default options in the environment var `UPX'
|
* you can set some default options in the environment var 'UPX'
|
||||||
* dos/com: the decompressor stub now checks for enough free memory
|
* dos/com: the decompressor stub now checks for enough free memory
|
||||||
* dos/exe: decompressor rewritten, some bugs are fixed
|
* dos/exe: decompressor rewritten, some bugs are fixed
|
||||||
* dos/exe: new option `--no-reloc': no relocation data is put into
|
* dos/exe: new option '--no-reloc': no relocation data is put into
|
||||||
the DOS header
|
the DOS header
|
||||||
* tmt/adam: added support for more stubs, detect already packed files
|
* tmt/adam: added support for more stubs, detect already packed files
|
||||||
* tmt/adam: new option `--copy-overlay'
|
* tmt/adam: new option '--copy-overlay'
|
||||||
* wc/le: reduced memory requirement during uncompression
|
* wc/le: reduced memory requirement during uncompression
|
||||||
* wc/le: support files which do not contain their stack in the last object
|
* wc/le: support files which do not contain their stack in the last object
|
||||||
* wc/le: fixed a bug which could cause a crash, improved relocation
|
* wc/le: fixed a bug which could cause a crash, improved relocation
|
||||||
handling
|
handling
|
||||||
* wc/le: new option `--copy-overlay'
|
* wc/le: new option '--copy-overlay'
|
||||||
* win32/pe: `--compress-icons=2' is now the default
|
* win32/pe: '--compress-icons=2' is now the default
|
||||||
* win32/pe: even better TLS support
|
* win32/pe: even better TLS support
|
||||||
* win32/pe: versioninfo works on NT
|
* win32/pe: versioninfo works on NT
|
||||||
* win32/pe: import by ordinal from kernel32.dll works
|
* win32/pe: import by ordinal from kernel32.dll works
|
||||||
* win32/pe: other import improvements: importing a nonexistant DLL
|
* win32/pe: other import improvements: importing a nonexistent DLL
|
||||||
results in a usual Windows message, importing a nonexistant function
|
results in a usual Windows message, importing a nonexistent function
|
||||||
results in program exit (instead of crash ;-)
|
results in program exit (instead of crash ;-)
|
||||||
* win32/pe: new option: `--compress-resources=0'
|
* win32/pe: new option: '--compress-resources=0'
|
||||||
* win32/pe: reduced memory requirement during uncompression, some
|
* win32/pe: reduced memory requirement during uncompression, some
|
||||||
files might even require LESS memory when they're compressed
|
files might even require LESS memory when they're compressed
|
||||||
* win32/pe: TYPELIBs should work now
|
* win32/pe: TYPELIBs should work now
|
||||||
* win32/pe: improved relocation handling, 16-bit relocations should work
|
* win32/pe: improved relocation handling, 16-bit relocations should work
|
||||||
* win32/pe: new option `--strip-relocs' (only if you know what you are doing)
|
* win32/pe: new option '--strip-relocs' (only if you know what you are doing)
|
||||||
* win32/pe: new option `--copy-overlay'
|
* win32/pe: new option '--copy-overlay'
|
||||||
* important internal changes: now the stubs are built at runtime
|
* important internal changes: now the stubs are built at runtime
|
||||||
|
|
||||||
Changes in 0.72 (12 May 1999)
|
Changes in 0.72 (12 May 1999)
|
||||||
@@ -251,20 +494,20 @@ Changes in 0.72 (12 May 1999)
|
|||||||
* linux/386: minor decompressor stub updates, nicer progress bar
|
* linux/386: minor decompressor stub updates, nicer progress bar
|
||||||
|
|
||||||
Changes in 0.71 (19 Apr 1999)
|
Changes in 0.71 (19 Apr 1999)
|
||||||
* dos/exe: added option `--no-overlay'
|
* dos/exe: added option '--no-overlay'
|
||||||
* linux/386: various improvements in the stub, most notably the
|
* linux/386: various improvements in the stub, most notably the
|
||||||
overhead for an extra cleanup process has been removed
|
overhead for an extra cleanup process has been removed
|
||||||
* win32/pe: added support for export forwarders
|
* win32/pe: added support for export forwarders
|
||||||
* win32/pe: added support for DLLs without entry point or imports
|
* win32/pe: added support for DLLs without entry point or imports
|
||||||
* win32/pe: yet another .bss fix
|
* win32/pe: yet another .bss fix
|
||||||
* win32/pe: new option `--compress-icons=2': compress all icons
|
* win32/pe: new option '--compress-icons=2': compress all icons
|
||||||
which are not in the first icon directory
|
which are not in the first icon directory
|
||||||
* win32/pe: rearranged stub to avoid false alerts from some virus scanners
|
* win32/pe: rearranged stub to avoid false alerts from some virus scanners
|
||||||
|
|
||||||
Changes in 0.70 (30 Mar 1999)
|
Changes in 0.70 (30 Mar 1999)
|
||||||
* added support for linux/386 executables
|
* added support for linux/386 executables
|
||||||
* improved compression ratio quite a bit
|
* improved compression ratio quite a bit
|
||||||
* added new compression level `--best' to squeeze out even some more bytes
|
* added new compression level '--best' to squeeze out even some more bytes
|
||||||
* win32/pe: TLS support is much better now
|
* win32/pe: TLS support is much better now
|
||||||
* win32/pe: --compress-icons=0 should now work as well
|
* win32/pe: --compress-icons=0 should now work as well
|
||||||
* the usual minor fixes for win32/pe
|
* the usual minor fixes for win32/pe
|
||||||
@@ -281,7 +524,7 @@ Changes in 0.60 (06 Mar 1999)
|
|||||||
* win32/pe: fixed file corruption when the size of the export data is invalid
|
* win32/pe: fixed file corruption when the size of the export data is invalid
|
||||||
* win32/pe: fixed a problem with empty resource data
|
* win32/pe: fixed a problem with empty resource data
|
||||||
* win32/pe: compressed file alignment set to minimum value
|
* win32/pe: compressed file alignment set to minimum value
|
||||||
* win32/pe: made all compressed sections writeable
|
* win32/pe: made all compressed sections writable
|
||||||
* fixed some other win32/pe bugs
|
* fixed some other win32/pe bugs
|
||||||
* fixed an address optimization problem for some not Watcom LE files
|
* fixed an address optimization problem for some not Watcom LE files
|
||||||
* fixed a bug which could make UPX hang when an exe header contained
|
* fixed a bug which could make UPX hang when an exe header contained
|
||||||
@@ -305,12 +548,12 @@ Changes in 0.40 (05 Oct 1998)
|
|||||||
* fixed a small but fatal bug in dos/sys introduced in 0.30
|
* fixed a small but fatal bug in dos/sys introduced in 0.30
|
||||||
* fixed a rare bug in dos/exe
|
* fixed a rare bug in dos/exe
|
||||||
* worked around a bug in djgpp's strip 2.8
|
* worked around a bug in djgpp's strip 2.8
|
||||||
* Allegro packfile support should work now
|
* djgpp2/coff: Allegro packfile support should work now
|
||||||
* added dos/exeh compression method (works on 386+)
|
* added dos/exeh compression method (works on 386+)
|
||||||
|
|
||||||
Changes in 0.30 (27 Jul 1998)
|
Changes in 0.30 (27 Jul 1998)
|
||||||
* fixed a serious bug in the 32-bit compressors - please don't use
|
* fixed a serious bug in the 32-bit compressors - please don't use
|
||||||
djgpp/coff and watcom/le compressed files from previous versions,
|
djgpp2/coff and watcom/le compressed files from previous versions,
|
||||||
some of them are possibly damaged !
|
some of them are possibly damaged !
|
||||||
* the 16-bit uncompressors are a little bit shorter & faster
|
* the 16-bit uncompressors are a little bit shorter & faster
|
||||||
* fixed progress indicator for VESA and SVGA text modes
|
* fixed progress indicator for VESA and SVGA text modes
|
||||||
@@ -321,4 +564,5 @@ Changes in 0.20 (05 Jul 1998)
|
|||||||
|
|
||||||
Changes in 0.05 (26 May 1998)
|
Changes in 0.05 (26 May 1998)
|
||||||
* first public beta release
|
* first public beta release
|
||||||
|
* based on experience gained from our previous packers DJP (djgpp2/coff, 1996),
|
||||||
|
lzop (1996) and mfxpak (atari/tos, 1990)
|
||||||
|
|||||||
@@ -1,93 +0,0 @@
|
|||||||
ooooo ooo ooooooooo. ooooooo ooooo
|
|
||||||
`888' `8' `888 `Y88. `8888 d8'
|
|
||||||
888 8 888 .d88' Y888..8P
|
|
||||||
888 8 888ooo88P' `8888'
|
|
||||||
888 8 888 .8PY888.
|
|
||||||
`88. .8' 888 d8' `888b
|
|
||||||
`YbodP' o888o o888o o88888o
|
|
||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
|
||||||
http://upx.sourceforge.net
|
|
||||||
|
|
||||||
|
|
||||||
Here are some possible projects from which you can choose if you'd like to
|
|
||||||
contribute to UPX. Be sure to get in touch with us first to avoid
|
|
||||||
duplicate efforts.
|
|
||||||
|
|
||||||
|
|
||||||
User interface:
|
|
||||||
---------------
|
|
||||||
|
|
||||||
- Write a nifty Win32 GUI (in C++), but try to keep the size of the
|
|
||||||
final executable small. Compression should be in a separate
|
|
||||||
thread that calls do_one_file() [see src/work.cpp].
|
|
||||||
|
|
||||||
- Draw a nice UPX icon.
|
|
||||||
|
|
||||||
|
|
||||||
More formats:
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- Amiga
|
|
||||||
|
|
||||||
- BeOS
|
|
||||||
|
|
||||||
- C64
|
|
||||||
|
|
||||||
- elks/8086 (this is a 16-bit linux-8086 kernel)
|
|
||||||
See http://www.elks.ecs.soton.ac.uk/
|
|
||||||
|
|
||||||
- freebsd/386 (generic), freebsd/elf386 (specialized).
|
|
||||||
Probably could share most of the linux code.
|
|
||||||
|
|
||||||
- Windows CE
|
|
||||||
|
|
||||||
- add support for self-extracting HTML pages using a Javascript stub
|
|
||||||
(like the AlgART HTML Packer "AHP")
|
|
||||||
|
|
||||||
|
|
||||||
Existing formats:
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
- djgpp2/coff: add support for DLX dynamic loading
|
|
||||||
(see SEAL http://www.home.sk/public/seal/ )
|
|
||||||
|
|
||||||
- dos/com: add support for very long files - convert to exe if necessary
|
|
||||||
|
|
||||||
- dos/exe: implement filter support
|
|
||||||
|
|
||||||
- dos/sys: add support for sys/exe combos
|
|
||||||
|
|
||||||
- linux/i386:
|
|
||||||
- use the new assembly preprocessor stuff (ie. process the file
|
|
||||||
headers internally)
|
|
||||||
- UPX uncompressor daemon
|
|
||||||
- rewrite the stub in assembly (not sure if this is a good idea...)
|
|
||||||
|
|
||||||
- watcom/le: add support for per section compression, LX support, VXD
|
|
||||||
|
|
||||||
- win32/pe: display a nice dialog box in the stub in case
|
|
||||||
of problems (like importing a DLL or function fails)
|
|
||||||
- win32/pe: finer control over resource compression, per section
|
|
||||||
compression
|
|
||||||
|
|
||||||
|
|
||||||
Compression ratio:
|
|
||||||
------------------
|
|
||||||
|
|
||||||
- invent more effective filters
|
|
||||||
|
|
||||||
- I (Markus) will continue to work on better compression algorithms,
|
|
||||||
so be sure to do better than me if you plan working on this ;-)
|
|
||||||
|
|
||||||
|
|
||||||
Other:
|
|
||||||
------
|
|
||||||
|
|
||||||
- anything else you think that could improve UPX...
|
|
||||||
|
|
||||||
|
|
||||||
Thanks for your contribution.
|
|
||||||
|
|
||||||
@@ -1,47 +1,25 @@
|
|||||||
ooooo ooo ooooooooo. ooooooo ooooo
|
ooooo ooo ooooooooo. ooooooo ooooo
|
||||||
`888' `8' `888 `Y88. `8888 d8'
|
`888' `8' `888 `Y88. `8888 d8'
|
||||||
888 8 888 .d88' Y888..8P
|
888 8 888 .d88' Y888..8P
|
||||||
888 8 888ooo88P' `8888'
|
888 8 888ooo88P' `8888'
|
||||||
888 8 888 .8PY888.
|
888 8 888 .8PY888.
|
||||||
`88. .8' 888 d8' `888b
|
`88. .8' 888 d8' `888b
|
||||||
`YbodP' o888o o888o o88888o
|
`YbodP' o888o o888o o88888o
|
||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WARNING - UNSTABLE BETA VERSION
|
|
||||||
===============================
|
|
||||||
|
|
||||||
All versions 1.9x are unstable beta releases - use them only for testing,
|
|
||||||
and never distribute a program that is packed with them !
|
|
||||||
There will be hidden bugs. Really.
|
|
||||||
|
|
||||||
The current stable release is 1.24, and the next stable release
|
|
||||||
will be called version 2.00.
|
|
||||||
|
|
||||||
The main news since 1.24 are:
|
|
||||||
- slightly better compression using the new NRV2E algorithm
|
|
||||||
- new options for compression tuining (e.g. `--brute')
|
|
||||||
- support for bootable Linux kernels ("vmlinuz/386")
|
|
||||||
- direct Linux ELF-to-memory decompression ("linux/elf386") and
|
|
||||||
shell-to-memory decompression ("linux/sh386")
|
|
||||||
- support for playstation exes ("ps1/exe")
|
|
||||||
- lots of new bugs ;-) take care
|
|
||||||
|
|
||||||
|
|
||||||
WELCOME
|
WELCOME
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Welcome to UPX !
|
Welcome to UPX !
|
||||||
|
|
||||||
Please don't forget to read the file LICENSE - UPX is distributed
|
UPX is a free, secure, portable, extendable, high-performance
|
||||||
under the GNU General Public License (GPL) with special exceptions
|
executable packer for several executable formats.
|
||||||
allowing the distribution of all compressed executables, including
|
|
||||||
commercial programs.
|
|
||||||
|
|
||||||
|
|
||||||
INTRODUCTION
|
INTRODUCTION
|
||||||
@@ -57,105 +35,86 @@ and run exactly as before, with no runtime or memory penalty for most
|
|||||||
of the supported formats.
|
of the supported formats.
|
||||||
|
|
||||||
UPX supports a number of different executable formats, including
|
UPX supports a number of different executable formats, including
|
||||||
Windows 95/98/ME/NT/2000/XP programs and DLLs, DOS programs,
|
Windows programs and DLLs, and Linux executables.
|
||||||
and Linux executables and kernels.
|
|
||||||
|
|
||||||
UPX is free software distributed under the term of the GNU General
|
UPX is free software distributed under the term of the GNU General
|
||||||
Public License. Full source code is available.
|
Public License. Full source code is available.
|
||||||
|
|
||||||
UPX may be distributed and used freely, even with commercial applications.
|
UPX may be distributed and used freely, even with commercial applications.
|
||||||
See the UPX License Agreement for details.
|
See the UPX License Agreements for details.
|
||||||
|
|
||||||
UPX is rated number one in the well known Archive Comparison Test. Visit
|
|
||||||
http://compression.ca/ .
|
|
||||||
|
|
||||||
UPX aims to be Commercial Quality Freeware.
|
SECURITY CONTEXT
|
||||||
|
================
|
||||||
|
|
||||||
|
IMPORTANT NOTE: UPX inherits the security context of any files it handles.
|
||||||
|
|
||||||
|
This means that packing, unpacking, or even testing or listing a file requires
|
||||||
|
the same security considerations as actually executing the file.
|
||||||
|
|
||||||
|
Use UPX on trusted files only!
|
||||||
|
|
||||||
|
|
||||||
SHORT DOCUMENTATION
|
SHORT DOCUMENTATION
|
||||||
===================
|
===================
|
||||||
|
|
||||||
`upx program.exe' will compress a program or DLL. For best compression
|
'upx program.exe' will compress a program or DLL. For best compression
|
||||||
results try `upx --best program.exe'.
|
results try 'upx --best program.exe' or 'upx --brute program.exe'.
|
||||||
|
|
||||||
Please see the file UPX.DOC for the full documentation. The files
|
Please see the file UPX.DOC for the full documentation. The files
|
||||||
NEWS and BUGS also contain various tidbits of information.
|
NEWS and BUGS also contain various tidbits of information.
|
||||||
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
==========
|
|
||||||
|
|
||||||
UPX comes with ABSOLUTELY NO WARRANTY; for details see the file LICENSE.
|
|
||||||
|
|
||||||
Having said that, we think that UPX is quite stable now. Indeed we
|
|
||||||
have compressed lots of files without any problems. Also, the
|
|
||||||
current version has undergone several months of beta testing -
|
|
||||||
actually it's more than 4 years since our first public beta.
|
|
||||||
|
|
||||||
This is the first production quality release, and we plan that future
|
|
||||||
releases will be backward compatible with this version.
|
|
||||||
|
|
||||||
Please report all problems or suggestions to the authors. Thanks.
|
|
||||||
|
|
||||||
|
|
||||||
THE FUTURE
|
THE FUTURE
|
||||||
==========
|
==========
|
||||||
|
|
||||||
- We'd really love to support handheld systems like the PalmPilot because
|
- Stay up-to-date with ongoing OS and executable format changes
|
||||||
compression makes a lot of sense here. And - because of the atari/tos
|
|
||||||
format - we already have a working decompressor in 68000 assembly.
|
|
||||||
Unfortunately we know next to nothing about the operating system
|
|
||||||
architecture of such handhelds, so we need some information from
|
|
||||||
an expert. Please contact us if you think you can help.
|
|
||||||
|
|
||||||
- The Linux approach could probably get ported to a lot of other Unix
|
- RISC-V 64 for Linux
|
||||||
variants, at least for other i386 architectures it shouldn't be too
|
|
||||||
much work. If someone sends me a fresh hard disk and an official
|
- ARM64 for Windows (help wanted)
|
||||||
FreeBSD/OpenBSD/NetBSD/Solaris/BeOS... CD I might take a look at it ;-)
|
|
||||||
|
|
||||||
- We will *NOT* add any sort of protection and/or encryption.
|
- We will *NOT* add any sort of protection and/or encryption.
|
||||||
This only gives people a false feeling of security because
|
This only gives people a false feeling of security because
|
||||||
by definition all protectors/compressors can be broken.
|
all "protectors" can be broken by definition.
|
||||||
And don't trust any advertisment of authors of other executable
|
|
||||||
compressors about this topic - just do a websearch on "unpackers"...
|
|
||||||
|
|
||||||
- Fix all remaining bugs - keep your reports coming ;-)
|
- Fix all remaining bugs - please report any issues
|
||||||
|
https://github.com/upx/upx/issues
|
||||||
- See the file PROJECTS in the source code distribution if you want
|
|
||||||
to contribute.
|
|
||||||
|
|
||||||
|
|
||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
=========
|
=========
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2024 Laszlo Molnar
|
||||||
|
Copyright (C) 2000-2024 John F. Reiser
|
||||||
|
|
||||||
This program may be used freely, and you are welcome to
|
UPX is distributed with full source code under the terms of the
|
||||||
redistribute it under certain conditions.
|
GNU General Public License v2+; either under the pure GPLv2+ (see
|
||||||
|
the file COPYING), or (at your option) under the GPLv+2 with special
|
||||||
|
exceptions and restrictions granting the free usage for all binaries
|
||||||
|
including commercial programs (see the file LICENSE).
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
UPX License Agreement for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the UPX License Agreement along
|
You should have received a copy of the UPX License Agreements along
|
||||||
with this program; see the file LICENSE. If not, visit the UPX home page.
|
with this program; see the files COPYING and LICENSE. If not,
|
||||||
|
visit the UPX home page.
|
||||||
|
|
||||||
|
|
||||||
Share and enjoy,
|
Share and enjoy,
|
||||||
Markus & Laszlo
|
Markus & Laszlo & John
|
||||||
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer Laszlo Molnar
|
Markus F.X.J. Oberhumer Laszlo Molnar
|
||||||
markus@oberhumer.com ml1050@cdata.tvnet.hu
|
<markus@oberhumer.com> <ezerotven+github@gmail.com>
|
||||||
|
|
||||||
|
John F. Reiser
|
||||||
|
<jreiser@BitWagon.com>
|
||||||
|
|
||||||
|
|
||||||
[ The term UPX is a shorthand for the Ultimate Packer for eXecutables
|
[ The term UPX is a shorthand for the Ultimate Packer for eXecutables
|
||||||
and holds no connection with potential owners of registered trademarks
|
and holds no connection with potential owners of registered trademarks
|
||||||
or other rights. ]
|
or other rights. ]
|
||||||
|
|
||||||
[ Feel free to contact us if you have commercial compression requirements
|
|
||||||
or interesting job offers. ]
|
|
||||||
|
|
||||||
|
|||||||
-32
@@ -1,32 +0,0 @@
|
|||||||
ooooo ooo ooooooooo. ooooooo ooooo
|
|
||||||
`888' `8' `888 `Y88. `8888 d8'
|
|
||||||
888 8 888 .d88' Y888..8P
|
|
||||||
888 8 888ooo88P' `8888'
|
|
||||||
888 8 888 .8PY888.
|
|
||||||
`88. .8' 888 d8' `888b
|
|
||||||
`YbodP' o888o o888o o88888o
|
|
||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WARNING - UNSTABLE BETA VERSION
|
|
||||||
===============================
|
|
||||||
|
|
||||||
All versions 1.9x are unstable beta releases - use them only for testing,
|
|
||||||
and never distribute a program that is packed with them !
|
|
||||||
There will be hidden bugs. Really.
|
|
||||||
|
|
||||||
The current stable release is 1.25, and the next stable release
|
|
||||||
will be called version 2.00.
|
|
||||||
|
|
||||||
The main news since 1.25 are:
|
|
||||||
- slightly better compression using the new NRV2E algorithm
|
|
||||||
- new options for compression tuining (e.g. `--brute')
|
|
||||||
- support for bootable Linux kernels ("vmlinuz/386")
|
|
||||||
- direct Linux ELF-to-memory decompression ("linux/elf386") and
|
|
||||||
shell-to-memory decompression ("linux/sh386")
|
|
||||||
- support for playstation exes ("ps1/exe")
|
|
||||||
- lots of new bugs ;-) take care
|
|
||||||
|
|
||||||
+45
-65
@@ -27,21 +27,6 @@ Foreword
|
|||||||
Markus & Laszlo
|
Markus & Laszlo
|
||||||
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
------------
|
|
||||||
|
|
||||||
Welcome to the UPX source code release!
|
|
||||||
|
|
||||||
UPX is not a toy for kids. Apart from basic knowledge about executables
|
|
||||||
and data compression you will need to be firm in C++, assembler,
|
|
||||||
Perl and Makefiles. Probably some other things as well.
|
|
||||||
|
|
||||||
If you can't manage to compile it then the sources are
|
|
||||||
probably not for you. Don't email us for help.
|
|
||||||
|
|
||||||
The authors use Linux for development. You might want to as well.
|
|
||||||
|
|
||||||
|
|
||||||
Short overview
|
Short overview
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
@@ -56,59 +41,68 @@ Short overview
|
|||||||
are #included by the individual executable format handlers.
|
are #included by the individual executable format handlers.
|
||||||
|
|
||||||
|
|
||||||
Prerequisites
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- first of all you need to build the UCL compression library
|
|
||||||
http://www.oberhumer.com/opensource/ucl/
|
|
||||||
|
|
||||||
|
|
||||||
Tools needed to build/modify the UPX sources
|
Tools needed to build/modify the UPX sources
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|
||||||
- A C++ compiler supporting inner classes, templates, exceptions
|
- A C++ compiler that fully implements C++17: clang-5, gcc-8 or msvc-2019-16.11
|
||||||
and RTTI.
|
(older or other compilers may work but are unsupported, use at your own risk)
|
||||||
|
|
||||||
- GNU make for Win32
|
- GNU make
|
||||||
http://upx.sourceforge.net/download/tools/
|
|
||||||
|
|
||||||
- GNU make for DOS
|
- CMake 3.13 or better; see https://cmake.org/
|
||||||
ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/
|
|
||||||
|
|
||||||
|
|
||||||
To compile the packer sources
|
To compile the packer sources
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
set the environment variable UCLDIR to point to your UCL installation, e.g.
|
- just run "make" in the top-level source directory
|
||||||
|
|
||||||
set UCLDIR=c:\src\ucl-1.01 (DOS / Windows)
|
|
||||||
export UCLDIR=$HOME/local/src/ucl-1.01 (Unix)
|
|
||||||
|
|
||||||
then type
|
|
||||||
|
|
||||||
make target=linux # linux
|
|
||||||
make target=djgpp2 # dos32 - djgpp2
|
|
||||||
make target=cygwin # win32 - cygwin 1.3.x
|
|
||||||
make target=mingw32 # win32 - mingw32
|
|
||||||
make target=no-cygwin # win32 - mingw32 as included in cygwin
|
|
||||||
|
|
||||||
|
|
||||||
If you want to modify the stub sources you'll also need
|
If you want to modify the stub sources you'll also need
|
||||||
-------------------------------------------------------
|
-------------------------------------------------------
|
||||||
|
|
||||||
- Nasm 0.98.38 - the Netwide Assembler
|
- Podman/Docker: see misc/podman/rebuild-stubs - this
|
||||||
http://upx.sourceforge.net/download/tools/
|
is the preferred way of rebuilding the stubs
|
||||||
http://sourceforge.net/projects/nasm/
|
|
||||||
|
|
||||||
- A68K - a 68000 macro assembler
|
- otherwise you will need:
|
||||||
http://upx.sourceforge.net/download/tools/
|
- a Linux host system with Perl, Python2 and some older compat-libs
|
||||||
|
- upx-stubtools - a number of cross-assemblers and cross-compilers.
|
||||||
|
Precompiled binaries for amd64-linux hosts are available from
|
||||||
|
https://github.com/upx/upx-stubtools/releases
|
||||||
|
|
||||||
- djasm - an assembler for the djgpp stub
|
|
||||||
http://upx.sourceforge.net/download/tools/
|
|
||||||
|
|
||||||
- Perl 5.6 or better
|
Developer quick start
|
||||||
|
---------------------
|
||||||
|
1) $ mkdir my-upx; cd my-upx # new directory for safety and convenience
|
||||||
|
2) $ git clone https://github.com/upx/upx.git
|
||||||
|
3) $ git clone https://github.com/upx/upx-testsuite.git
|
||||||
|
4) # Optional for re-building stubs:
|
||||||
|
4a) $ pushd upx/src/stub # my-upx/upx/src/stub
|
||||||
|
4b) $ wget https://github.com/upx/upx-stubtools/releases/download/v20221212/bin-upx-20221212.tar.xz
|
||||||
|
# Extract to $HOME/bin/bin-upx or $HOME/local/bin/bin-upx.
|
||||||
|
# See directions in: https://github.com/upx/upx-stubtools
|
||||||
|
4c) $ make clean; make # verify that you can re-build stubs
|
||||||
|
4d) $ popd # my-upx
|
||||||
|
5) $ cd upx # my-upx/upx
|
||||||
|
6) $ git submodule update --init # compression algorithms, etc.
|
||||||
|
# DO NOT TOUCH vendor/...
|
||||||
|
# After a git merge/pull/etc, then use "git status"
|
||||||
|
# to check whether the vendor directory is clean;
|
||||||
|
# if not, then update via "git submodule update".
|
||||||
|
# If stuck, then reset via "rm -rf vendor; git submodule update --init".
|
||||||
|
7) $ mkdir -p build/debug build/release
|
||||||
|
8) $ pushd build/debug # my-upx/upx/build/debug
|
||||||
|
9) $ cmake ../.. # configure cmake
|
||||||
|
10) $ cmake --build . --verbose # optional "--verbose"
|
||||||
|
# This relies on stub/*.h, which YOU must re-build if necessary.
|
||||||
|
# When in doubt, then use "cd src/stub; make clean; make".
|
||||||
|
11) $ popd # my-upx/upx
|
||||||
|
12) $ cd src # my-upx/upx/src
|
||||||
|
12a) On MacOS: install homebrew (https:://brew.sh), then "brew install coreutils"
|
||||||
|
and put <some_prefix>/opt/coreutils/libexec/gnubin into PATH so that
|
||||||
|
"readlink -en" and "sha256sum -b" work.
|
||||||
|
13) $ make run-testsuite 2>&1 | tee testsuite.log
|
||||||
|
|
||||||
- Linux (for the linux/386 stubs)
|
|
||||||
|
|
||||||
|
|
||||||
Misc. notes
|
Misc. notes
|
||||||
@@ -123,13 +117,10 @@ Misc. notes
|
|||||||
stream.
|
stream.
|
||||||
- Use gcc extensions and other compiler specific stuff only through
|
- Use gcc extensions and other compiler specific stuff only through
|
||||||
macros.
|
macros.
|
||||||
- Keep in mind that it should be possible to build UPX on braindead
|
|
||||||
file systems (FAT). Don't use long file names or other things
|
|
||||||
that break building under plain DOS.
|
|
||||||
|
|
||||||
***
|
|
||||||
|
|
||||||
Some conventions:
|
Some conventions:
|
||||||
|
-----------------
|
||||||
|
|
||||||
- follow our coding style
|
- follow our coding style
|
||||||
- indent level = 4
|
- indent level = 4
|
||||||
@@ -138,15 +129,4 @@ Some conventions:
|
|||||||
- Use throwSomeException() functions instead of throw SomeException():
|
- Use throwSomeException() functions instead of throw SomeException():
|
||||||
this makes the code shorter if used often.
|
this makes the code shorter if used often.
|
||||||
|
|
||||||
***
|
# vim:set ts=4 sw=4 et:
|
||||||
|
|
||||||
Patches/Contributions
|
|
||||||
|
|
||||||
- Please send us bug fixes/contributions only using
|
|
||||||
|
|
||||||
diff -u oldfile newfile
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
diff -uNr olddirectory newdirectory
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,128 +0,0 @@
|
|||||||
UPX TODO list. Last updated 2004-06-30.
|
|
||||||
|
|
||||||
|
|
||||||
IMPORTANT PROBLEMS THAT SHOULD BE FIXED SOON:
|
|
||||||
|
|
||||||
- win32/pe should add support for PEDIR_LOADCONF (Visual C++ 7.1 generated
|
|
||||||
exes, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG)
|
|
||||||
|
|
||||||
- win32/pe should reliably detect .NET exes and somehow deal with them
|
|
||||||
|
|
||||||
- stub ctojr32 needs CPU 486 because of bswap
|
|
||||||
|
|
||||||
|
|
||||||
OTHER:
|
|
||||||
|
|
||||||
- check all <const_cast> to make sure they are not invalid
|
|
||||||
|
|
||||||
- throwNotCompressible() is not a real error, so make the output nicer
|
|
||||||
(info: bla bla). Also ui.cpp (total_*).
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
IMPROVED COMPRESSION RATIO
|
|
||||||
==========================
|
|
||||||
|
|
||||||
- experiment with new filters
|
|
||||||
|
|
||||||
- implement filters for dos/exe
|
|
||||||
|
|
||||||
- filters: could we exploit a f->firstcall info field ?
|
|
||||||
|
|
||||||
- for small programs (e.g. < 64k), try an additional algorithm
|
|
||||||
to see if it gives better compression
|
|
||||||
|
|
||||||
|
|
||||||
ALL FORMATS
|
|
||||||
===========
|
|
||||||
|
|
||||||
- more thoroughly test the exe-header in canPack()
|
|
||||||
and throw exceptions when encountering bad values.
|
|
||||||
|
|
||||||
- implement `--cpu=486' option to use bswap on the 32-bit formats
|
|
||||||
(if cpu >= 486)
|
|
||||||
|
|
||||||
- consider removing "or ebp,-1" when not needed
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT DJGPP2/COFF
|
|
||||||
==================
|
|
||||||
|
|
||||||
- handle overlays
|
|
||||||
|
|
||||||
- fix default file extension handling when the --coff option is set
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT DOS/EXE
|
|
||||||
==============
|
|
||||||
|
|
||||||
- implement filters
|
|
||||||
|
|
||||||
- add a check so that we don't pack djgpp1 binaries
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT LINUX/386
|
|
||||||
================
|
|
||||||
|
|
||||||
- don't mmap() the temporary output file - this seems to improve
|
|
||||||
file io speed
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT TMT/ADAM
|
|
||||||
===============
|
|
||||||
|
|
||||||
- the decompressors are already aligned, no need for an
|
|
||||||
extra alignment
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT WATCOM/LE
|
|
||||||
================
|
|
||||||
|
|
||||||
- handle files without relocations
|
|
||||||
|
|
||||||
- the decompressors are already aligned, no need for an
|
|
||||||
extra alignment
|
|
||||||
|
|
||||||
- fix default file extension handling when the --le option is set
|
|
||||||
|
|
||||||
- handle holes in the file
|
|
||||||
|
|
||||||
- implement compressWithFilters()
|
|
||||||
|
|
||||||
- add a call to verifyOverlappingDecompression()
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT WIN16/NE
|
|
||||||
===============
|
|
||||||
|
|
||||||
- implement readFileHeader() to correctly identify a win16/ne
|
|
||||||
executable, so that the call for contribution will get thrown
|
|
||||||
|
|
||||||
|
|
||||||
FORMAT WIN32/PE
|
|
||||||
===============
|
|
||||||
|
|
||||||
- fix the section alignment with the Intel compiler
|
|
||||||
|
|
||||||
- decrease runtime memory overhead
|
|
||||||
|
|
||||||
2 - easy - mfx + ml) new switch(es) : do not compress resource types x,y,z
|
|
||||||
or resource names a,b,c
|
|
||||||
|
|
||||||
3 - medium - ml) rebuild exports
|
|
||||||
|
|
||||||
3 - difficult) don't compress the BSS section and other holes.
|
|
||||||
|
|
||||||
4 - medium - ml) fix when objectalign < 0x1000
|
|
||||||
|
|
||||||
4 - easy - ml) put the original offset of moved resources somewhere into
|
|
||||||
the res.dir. (if it's safe to do)
|
|
||||||
|
|
||||||
4 - ??? - ml) fix FIXMEs
|
|
||||||
|
|
||||||
5 - medium - ml) try to put the preprocessed imports & relocs back to their
|
|
||||||
original section if possible. this could save some virtual memory
|
|
||||||
address space.
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
upx.1
|
|
||||||
upx.doc
|
|
||||||
upx.html
|
|
||||||
upx.man
|
|
||||||
upx.ps
|
|
||||||
upx.tex
|
|
||||||
+11
-12
@@ -1,15 +1,15 @@
|
|||||||
ooooo ooo ooooooooo. ooooooo ooooo
|
ooooo ooo ooooooooo. ooooooo ooooo
|
||||||
`888' `8' `888 `Y88. `8888 d8'
|
`888' `8' `888 `Y88. `8888 d8'
|
||||||
888 8 888 .d88' Y888..8P
|
888 8 888 .d88' Y888..8P
|
||||||
888 8 888ooo88P' `8888'
|
888 8 888ooo88P' `8888'
|
||||||
888 8 888 .8PY888.
|
888 8 888 .8PY888.
|
||||||
`88. .8' 888 d8' `888b
|
`88. .8' 888 d8' `888b
|
||||||
`YbodP' o888o o888o o88888o
|
`YbodP' o888o o888o o88888o
|
||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
Limitations and other things which are not (yet) supported:
|
Limitations and other things which are not (yet) supported:
|
||||||
@@ -28,7 +28,7 @@ dos/exe
|
|||||||
watcom/le
|
watcom/le
|
||||||
---------
|
---------
|
||||||
* 16-bit selector alias fixups
|
* 16-bit selector alias fixups
|
||||||
* 16-bit offset relocation for objects larger than 4 kB
|
* 16-bit offset relocation for objects larger than 4 KiB
|
||||||
* 16:16 fixups
|
* 16:16 fixups
|
||||||
|
|
||||||
If you need any of the above (they're very rare), send us an URL of a
|
If you need any of the above (they're very rare), send us an URL of a
|
||||||
@@ -44,8 +44,7 @@ test file.
|
|||||||
|
|
||||||
win32/pe
|
win32/pe
|
||||||
--------
|
--------
|
||||||
* writeable shared sections (`--force' *may* work)
|
* writable shared sections (`--force' *may* work)
|
||||||
* certificates in the image
|
* certificates in the image
|
||||||
* compressing files which contain a big BSS requires lots of memory
|
* compressing files which contain a big BSS requires lots of memory
|
||||||
during compression
|
during compression
|
||||||
|
|
||||||
+55
-47
@@ -1,68 +1,76 @@
|
|||||||
SHELL = /bin/sh
|
#
|
||||||
|
# UPX doc Makefile - needs GNU make, sed, pod2html, pod2man and pod2text
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
top_srcdir = ..
|
BUILT_SOURCES := upx.1 upx-doc.html upx-doc.txt
|
||||||
|
|
||||||
PACKAGE = upx
|
top_srcdir ?= ..
|
||||||
VERSION_DATE = 30 Jun 2004
|
|
||||||
VERSION := $(shell sed -n 's/^.*UPX_VERSION_STRING .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
|
|
||||||
|
|
||||||
TRIMSPACE = cat
|
PACKAGE = upx
|
||||||
TRIMSPACE = sed -e 's/ *$$//'
|
VERSION_DATE := $(shell sed -n 's/^.*UPX_VERSION_DATE_ISO .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
|
||||||
|
VERSION := $(shell sed -n 's/^.*UPX_VERSION_STRING .*"\(.*\)".*/\1/p' $(top_srcdir)/src/version.h)
|
||||||
|
|
||||||
BUILT_SOURCES = upx.1 upx.doc upx.html upx.man upx.ps upx.tex
|
# internal make variables
|
||||||
BUILT_SOURCES = upx.1 upx.doc upx.html
|
comma := ,
|
||||||
|
empty :=
|
||||||
|
space := $(empty) $(empty)
|
||||||
|
tab := $(empty) $(empty)
|
||||||
|
|
||||||
|
RTRIM := sed -e 's/[ $(tab)]*$$//'
|
||||||
|
DETAB2 := sed -e 's/$(tab)/ /g'
|
||||||
|
|
||||||
###
|
#***********************************************************************
|
||||||
###
|
# targets
|
||||||
###
|
#***********************************************************************
|
||||||
|
|
||||||
all: $(BUILT_SOURCES)
|
.DEFAULT_GOAL = all
|
||||||
|
|
||||||
mostlyclean:
|
.PHONY: PHONY
|
||||||
-rm -f $(BUILT_SOURCES) pod2htm*
|
.SECONDEXPANSION:
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
clean: mostlyclean
|
all: $(BUILT_SOURCES) PHONY
|
||||||
|
|
||||||
distclean: clean
|
mostlyclean clean distclean maintainer-clean: PHONY
|
||||||
|
rm -f $(BUILT_SOURCES) ./pod2htm*
|
||||||
|
|
||||||
maintainer-clean: distclean
|
#***********************************************************************
|
||||||
|
# rules
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
.SUFFIXES: .1 .doc .html .man .pod .ps .tex .texi
|
.SUFFIXES: .1 .html .man .pod .ps .tex .txt
|
||||||
|
|
||||||
.PHONY: all mostlyclean clean distclean maintainer-clean
|
%.1 : %.pod
|
||||||
|
pod2man --center=" " --release="$(PACKAGE) $(VERSION)" --date="$(VERSION_DATE)" $< | $(RTRIM) > $@
|
||||||
|
test -s $@
|
||||||
|
# # strip version number from "Pod::Man" comment
|
||||||
|
sed -i -e 's/^\(\.\\" Automatically generated by Pod::Man\).*/\1/' $@
|
||||||
|
|
||||||
|
%-doc.html : %.pod
|
||||||
|
pod2html --noindex $< | $(RTRIM) | $(DETAB2) > $@
|
||||||
|
@rm -f ./pod2htm*
|
||||||
|
test -s $@
|
||||||
|
|
||||||
###
|
%.man : %.1
|
||||||
### rules
|
nroff -man $< | $(RTRIM) > $@
|
||||||
###
|
test -s $@
|
||||||
|
|
||||||
.pod.1:
|
%.ps : %.1
|
||||||
pod2man --center=" " --release="$(PACKAGE) $(VERSION)" --date="$(VERSION_DATE)" $< | $(TRIMSPACE) > $@
|
groff -man $< | $(RTRIM) > $@
|
||||||
|
test -s $@
|
||||||
|
|
||||||
.pod.html:
|
%.tex : %.pod
|
||||||
### pod2html $< | $(TRIMSPACE) > $@
|
|
||||||
pod2html --noindex $< | $(TRIMSPACE) > $@
|
|
||||||
@-rm -f pod2htm*
|
|
||||||
|
|
||||||
.pod.tex:
|
|
||||||
pod2latex $<
|
pod2latex $<
|
||||||
|
test -s $@
|
||||||
|
|
||||||
.pod.doc:
|
%-doc.txt : %.pod
|
||||||
pod2text < $< | $(TRIMSPACE) > $@
|
pod2text < $< | $(RTRIM) > $@
|
||||||
|
test -s $@
|
||||||
|
|
||||||
.1.man:
|
#***********************************************************************
|
||||||
nroff -man $< | $(TRIMSPACE) > $@
|
# dependencies
|
||||||
|
#***********************************************************************
|
||||||
.1.ps:
|
|
||||||
groff -man $< | $(TRIMSPACE) > $@
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### dependencies
|
|
||||||
###
|
|
||||||
|
|
||||||
$(BUILT_SOURCES): $(top_srcdir)/src/version.h Makefile
|
|
||||||
|
|
||||||
.NOEXPORT:
|
|
||||||
|
|
||||||
|
$(BUILT_SOURCES): $(top_srcdir)/src/version.h $(MAKEFILE_LIST)
|
||||||
|
.DELETE_ON_ERROR: $(BUILT_SOURCES)
|
||||||
|
|||||||
+19
-14
@@ -1,15 +1,15 @@
|
|||||||
ooooo ooo ooooooooo. ooooooo ooooo
|
ooooo ooo ooooooooo. ooooooo ooooo
|
||||||
`888' `8' `888 `Y88. `8888 d8'
|
`888' `8' `888 `Y88. `8888 d8'
|
||||||
888 8 888 .d88' Y888..8P
|
888 8 888 .d88' Y888..8P
|
||||||
888 8 888ooo88P' `8888'
|
888 8 888ooo88P' `8888'
|
||||||
888 8 888 .8PY888.
|
888 8 888 .8PY888.
|
||||||
`88. .8' 888 d8' `888b
|
`88. .8' 888 d8' `888b
|
||||||
`YbodP' o888o o888o o88888o
|
`YbodP' o888o o888o o88888o
|
||||||
|
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
.___.. .
|
.___.. .
|
||||||
@@ -37,23 +37,28 @@ Charles W. Sandmann <sandmann@clio.rice.edu>
|
|||||||
for the idea with the stubless decompressor in djgpp2/coff
|
for the idea with the stubless decompressor in djgpp2/coff
|
||||||
Ice
|
Ice
|
||||||
for debugging the PE headersize problem down
|
for debugging the PE headersize problem down
|
||||||
|
Jens Medoch <jssg@users.sourceforge.net>
|
||||||
|
for the ps1/exe format
|
||||||
Joergen Ibsen <jibz@hotmail.com> and d'b
|
Joergen Ibsen <jibz@hotmail.com> and d'b
|
||||||
for the relocation & address optimization ideas
|
for the relocation & address optimization ideas
|
||||||
John F. Reiser <jreiser@BitWagon.com>
|
|
||||||
for the new Linux executable formats
|
|
||||||
John S. Fine <johnfine@erols.com>
|
John S. Fine <johnfine@erols.com>
|
||||||
for the new version of the dos/exe decompressor
|
for the new version of the dos/exe decompressor
|
||||||
|
Kornel Pal
|
||||||
|
for the EFI support
|
||||||
Lukundoo <Lukundoo@softhome.net>
|
Lukundoo <Lukundoo@softhome.net>
|
||||||
for beta testing
|
for beta testing
|
||||||
|
Michael Devore
|
||||||
|
for initial dos/exe device driver support
|
||||||
Oleg V. Volkov <rover@lglobus.ru>
|
Oleg V. Volkov <rover@lglobus.ru>
|
||||||
for various FreeBSD specific informations
|
for various FreeBSD specific information
|
||||||
The Owl & G-RoM
|
The Owl & G-RoM
|
||||||
for the --compress-icons fix
|
for the --compress-icons fix
|
||||||
Ralph Roth <RalphRoth@gmx.net>
|
Ralph Roth <RalphRoth@gmx.net>
|
||||||
for reporting several bugs
|
for reporting several bugs
|
||||||
Salvador Eduardo Tropea
|
Salvador Eduardo Tropea
|
||||||
for beta testing
|
for beta testing
|
||||||
The WINE project (http://www.winehq.com/)
|
Stefan Widmann
|
||||||
|
for the win32/pe TLS callback support
|
||||||
|
The WINE project (https://www.winehq.com/)
|
||||||
for lots of useful information found in their PE loader sources
|
for lots of useful information found in their PE loader sources
|
||||||
Natascha
|
Natascha
|
||||||
|
|
||||||
+70
-26
@@ -1,5 +1,5 @@
|
|||||||
Decompressing ELF Directly to Memory on Linux/x86
|
Decompressing ELF Directly to Memory on Linux/x86
|
||||||
Copyright 2000 John F. Reiser jreiser@BitWagon.com
|
Copyright (C) 2000-2024 John F. Reiser jreiser@BitWagon.com
|
||||||
|
|
||||||
References:
|
References:
|
||||||
<elf.h> definitions for the ELF file format
|
<elf.h> definitions for the ELF file format
|
||||||
@@ -15,9 +15,9 @@ the value that is manipulated by system call 45 (__NR_brk in
|
|||||||
there will be no execve() except for the execve() of the decompressor
|
there will be no execve() except for the execve() of the decompressor
|
||||||
program itself. So, the decompressor program (which contains the
|
program itself. So, the decompressor program (which contains the
|
||||||
compressed version of the original executable) must have the same
|
compressed version of the original executable) must have the same
|
||||||
brk() as the original executable. So, the second PT_LOAD
|
brk() as the original executable. So, the first PT_LOAD
|
||||||
ELF "segment" of the compressed program is used only to set the brk(0).
|
ELF "segment" of the compressed program is used only to set the brk(0).
|
||||||
See src/p_lx_elf.cpp, function PackLinuxI386elf::patchLoader().
|
See src/p_lx_elf.cpp, function PackLinuxElf32::generateElfHdr.
|
||||||
All of the decompressor's code, and all of the compressed image
|
All of the decompressor's code, and all of the compressed image
|
||||||
of the original executable, reside in the first PT_LOAD of the
|
of the original executable, reside in the first PT_LOAD of the
|
||||||
decompressor program.
|
decompressor program.
|
||||||
@@ -25,41 +25,85 @@ decompressor program.
|
|||||||
The decompressor program stub is just under 2K bytes when linked.
|
The decompressor program stub is just under 2K bytes when linked.
|
||||||
After linking, the decompressor code is converted to an initialized
|
After linking, the decompressor code is converted to an initialized
|
||||||
array, and #included into the compilation of the compressor;
|
array, and #included into the compilation of the compressor;
|
||||||
see src/stub/l_le_n2b.h. To make self-contained compressed
|
see stub/i386-linux.elf-entry.h. To make self-contained compressed
|
||||||
executables even smaller, the compressor also compresses all but the
|
executables even smaller, the compressor also compresses all but the
|
||||||
startup and decompression subroutine of the decompressor itself,
|
startup and decompression subroutine of the decompressor itself,
|
||||||
saving a few hundred bytes. The startup code first decompresses the
|
saving a few hundred bytes. The startup code first decompresses the
|
||||||
rest of the decompressor, then jumps to it. A nonstandard linker
|
rest of the decompressor, then jumps to it. A nonstandard linker
|
||||||
script src/stub/l_lx_elf86.lds places both the .text and .data
|
script src/stub/src/i386-linux.elf-entry.lds arranges the SECTIONS
|
||||||
of the decompressor into the same PT_LOAD at 0x00401000. The
|
so that PackLinuxElf32x86::buildLoader() and buildLinuxLoader()
|
||||||
compressor includes the compressed bytes of the original executable
|
generate the desired stub code, which goes into PT_LOAD[1].
|
||||||
at the end of this first PT_LOAD.
|
|
||||||
|
|
||||||
At runtime, the decompressed stub lives at 0x00400000. In order for the
|
At runtime, the decompressed stub lives close beyond the brk().
|
||||||
decompressed stub to work properly at an address that is different
|
In order for the decompressed stub to work properly at an address
|
||||||
from its link-time address, the compiled code must contain no absolute
|
that is different from its link-time address, the compiled code must
|
||||||
addresses. So, the data items in l_lx_elf.c must be only parameters
|
contain no absolute addresses. So, the data items in stub code
|
||||||
and automatic (on-stack) local variables; no global data, no static data,
|
must be only parameters and automatic (on-stack) local variables;
|
||||||
and no string constants. Use "size l_le_n2b.o l_6e_n2b.o" to check
|
no global data, no static data, and no string constants. Also,
|
||||||
that both data and bss have length zero. Also, the '&' operator
|
the '&' operator may not be used to take the address of a function.
|
||||||
may not be used to take the address of a function.
|
|
||||||
|
|
||||||
The address 0x00400000 was chosen to be out of the way of the usual
|
|
||||||
load address 0x08048000, and to minimize fragmentation in kernel
|
|
||||||
page tables; one page of page tables covers 4MB. The address
|
|
||||||
0x00401000 was chosen as 1 page up from a 64KB boundary, to
|
|
||||||
make the startup code and its constants smaller.
|
|
||||||
|
|
||||||
Decompression of the executable begins by decompressing the Elf32_Ehdr
|
Decompression of the executable begins by decompressing the Elf32_Ehdr
|
||||||
and Elf32_Phdr, and then uses the Ehdr and Phdrs to control decompression
|
and Elf32_Phdr, and then uses those Ehdr and Phdrs to control decompression
|
||||||
of the PT_LOAD segments.
|
of the PT_LOAD segments. Subroutine do_xmap() of src/stub/src/
|
||||||
Subroutine do_xmap() of src/stub/l_lx_elf.c performs the
|
i386-linux.elf-main.c performs the
|
||||||
"virtual execve()" using the compressed data as source, and stores
|
"virtual execve()" using the compressed data as source, and stores
|
||||||
the decompressed bytes directly into the appropriate virtual addresses.
|
the decompressed bytes directly into the appropriate virtual addresses.
|
||||||
|
|
||||||
Before transfering control to the PT_INTERP "program interpreter",
|
Before transferring control to the PT_INTERP "program interpreter",
|
||||||
minor tricks are required to setup the Elf32_auxv_t entries,
|
minor tricks are required to setup the Elf32_auxv_t entries,
|
||||||
clear the free portion of the stack (to compensate for ld-linux.so.2
|
clear the free portion of the stack (to compensate for ld-linux.so.2
|
||||||
assuming that its automatic stack variables are initialized to zero),
|
assuming that its automatic stack variables are initialized to zero),
|
||||||
and remove (all but 4 bytes of) the decompression program (and
|
and remove (all but 4 bytes of) the decompression program (and
|
||||||
compressed executable) from the address space.
|
compressed executable) from the address space.
|
||||||
|
|
||||||
|
As of upx-3.05, by default on Linux, upon decompression then one page
|
||||||
|
of the compressed executable remains mapped into the address space
|
||||||
|
of the process. If all of the pages of the compressed executable are
|
||||||
|
unmapped, then the Linux kernel erases the symlink /proc/self/exe,
|
||||||
|
and this can cause trouble for the runtime shared library loader
|
||||||
|
expanding $ORIGIN in -rpath, or for application code that relies on
|
||||||
|
/proc/self/exe. Use the compress-time command-line option
|
||||||
|
--unmap-all-pages to achieve that effect at run time. Upx-3.04
|
||||||
|
and previous versions did this by default with no option. However,
|
||||||
|
too much other software erroneously assumes that /proc/self/exe
|
||||||
|
always exists. upx-4.3.0 made /proc/self/exe optional so that
|
||||||
|
chroot() and related environments can work.
|
||||||
|
For Elf formats, UPX adds an environment variable named " " [three
|
||||||
|
spaces] which saves the results of readlink("/proc/self/exe",,)
|
||||||
|
If /proc/self/exe is ENOENT, then the variable has the same value
|
||||||
|
as its name "/proc/self/exe".
|
||||||
|
|
||||||
|
All of the above documentation refers to ET_EXEC main programs,
|
||||||
|
which always use the same virtual addresses. An ET_DYN executable
|
||||||
|
(main program or shared library) follows much the same scheme,
|
||||||
|
re-using the address space that the kernel chose originally.
|
||||||
|
|
||||||
|
Linux stores the pathname argument that was specified to execve()
|
||||||
|
immediately after the '\0' which terminates the character string of the
|
||||||
|
last environment variable [as of execve()]. This is true for at least
|
||||||
|
all Linux 2.6, 2.4, and 2.2 kernels. Linux kernel 2.6.29 and later
|
||||||
|
records a pointer to that character string in Elf32_auxv[AT_EXECFN].
|
||||||
|
The pathname is not "bound" to the file as strongly as /proc/self/exe
|
||||||
|
(the file may be changed without affecting the pathname), but the
|
||||||
|
pathname does provide some information. The pathname may be relative
|
||||||
|
to the working directory, so look before performing any chdir().
|
||||||
|
|
||||||
|
On any page, then SELinux in strictest enforcing mode prohibits
|
||||||
|
simultaneous PROT_EXEC and PROT_WRITE, and also prohibits adding
|
||||||
|
PROT_EXEC if the kernel VMA struct (Virtual Memory Area struct)
|
||||||
|
that manages that page ever has had PROT_WRITE. This implies that
|
||||||
|
the only way to get PROT_EXEC is to map the page directly from a file.
|
||||||
|
Therefore, in late 2023 the various decompression stubs are being
|
||||||
|
rewritten to "bounce" the decompressed data through pages in a
|
||||||
|
memory-resident file created by the memfd_create() system call,
|
||||||
|
and subsequently mapped PROT_EXEC. Actual copying of the pages
|
||||||
|
can be avoided by careful sequence mmap() modes, but the overhead
|
||||||
|
of an additional system call is required.
|
||||||
|
|
||||||
|
The not-as-strict "targeted enforcing" mode of
|
||||||
|
SELinux seems not to demand this extra work, except for executables
|
||||||
|
that run with elevated privileges, such as various system daemons.
|
||||||
|
So "ordinary" user-mode apps can run in current "targeted enforcing"
|
||||||
|
mode. But because the actual runtime mode of SELinux is unknown
|
||||||
|
at compression time, then the memfd_create method should be used
|
||||||
|
all the time.
|
||||||
|
|||||||
+2
-2
@@ -108,14 +108,14 @@ then skip another one - the unfiltering process needs some information
|
|||||||
to be able to reverse the filtering.
|
to be able to reverse the filtering.
|
||||||
|
|
||||||
UPX uses the following idea, which works nicely. First we assume that
|
UPX uses the following idea, which works nicely. First we assume that
|
||||||
the size of the area that should be filtered is less than 16MB. Then
|
the size of the area that should be filtered is less than 16 MiB. Then
|
||||||
UPX scans over this area and keeps a record of the bytes that are
|
UPX scans over this area and keeps a record of the bytes that are
|
||||||
following the 0xE8 bytes. If we are lucky, there will be bytes that
|
following the 0xE8 bytes. If we are lucky, there will be bytes that
|
||||||
were not found following 0xE8. These bytes are our candidates to be
|
were not found following 0xE8. These bytes are our candidates to be
|
||||||
used as markers.
|
used as markers.
|
||||||
|
|
||||||
Do you still remember that we assumed that the size of scanned area is
|
Do you still remember that we assumed that the size of scanned area is
|
||||||
less than 16MB? Well, this means that when we process a real call, the
|
less than 16 MiB? Well, this means that when we process a real call, the
|
||||||
resulting offset will be less than 0x00FFFFFF too. So the MSB is always
|
resulting offset will be less than 0x00FFFFFF too. So the MSB is always
|
||||||
0x00. Which is a nice place to store our marker. Of course we should
|
0x00. Which is a nice place to store our marker. Of course we should
|
||||||
reverse the byte order in the resulting offset - so this marker will
|
reverse the byte order in the resulting offset - so this marker will
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
This documentation is written for those brave souls who want to
|
||||||
|
understand and/or modify the UPX assembly stubs - the small snippets
|
||||||
|
that do the runtime decompression when a compressed program is started.
|
||||||
|
|
||||||
|
If you look at the C++ source files, you can find code fragments like
|
||||||
|
this:
|
||||||
|
|
||||||
|
addLoader("PEMAIN20",
|
||||||
|
ih.entry ? "PEDOJUMP" : "PERETURN",
|
||||||
|
"IDENTSTR""UPX1HEAD",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
linker->defineSymbol("original_entry", ih.entry);
|
||||||
|
|
||||||
|
and in the assembly files fragments like this:
|
||||||
|
|
||||||
|
section PEISDLL1
|
||||||
|
cmpb [esp + 8], 1
|
||||||
|
jnz reloc_end_jmp
|
||||||
|
|
||||||
|
section PEMAIN21
|
||||||
|
reloc_end_jmp:
|
||||||
|
|
||||||
|
section PERETURN
|
||||||
|
xor eax, eax
|
||||||
|
inc eax
|
||||||
|
ret 0x0C
|
||||||
|
section PEDOJUMP
|
||||||
|
jmp original_entry
|
||||||
|
|
||||||
|
Everything works as you would expect. If you want to add the code
|
||||||
|
fragment which is in `section PERETURN' to the runtime stub, then
|
||||||
|
simply use `addLoader("PERETURN")' in the C++ source.
|
||||||
|
|
||||||
|
That's nice, you could say, but how cross section jumps and calls are
|
||||||
|
handled? Well, that is the nicest part of this stuff - they are handled
|
||||||
|
automatically. All you have to do is to add the required sections to the
|
||||||
|
loader using `addLoader()' and the rest is done by upx. It will resolve
|
||||||
|
every conditional or unconditional jumps or subroutine calls for you.
|
||||||
|
|
||||||
|
You can also use (undefined) symbols in the assembly for values that
|
||||||
|
can only be computed during compression time (like `original_entry').
|
||||||
|
These symbols can be defined later in C++ using
|
||||||
|
|
||||||
|
linker->defineSymbol("xx", yy)
|
||||||
|
|
||||||
|
This functionality (we could say it's a simple linker) is achieved by
|
||||||
|
compiling the assembly into an ELF object file which a little C++
|
||||||
|
module (src/linker.cpp) can interpret and work with.
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
This documentation is written for those brave souls who want to
|
|
||||||
understand and/or modify the UPX assembly stubs - the small snippets
|
|
||||||
that do the runtime decompression when a compressed program is started.
|
|
||||||
|
|
||||||
So, how the runtime stub/loader generation works?
|
|
||||||
|
|
||||||
You might have already noticed that for some file formats the loaders
|
|
||||||
are quite simple (linux/i386 & tos) while in the other cases the
|
|
||||||
loaders look very suspicious: they're full of `%ifdef's and contain
|
|
||||||
loads of cryptic comments like `__PERELOC2__'.
|
|
||||||
|
|
||||||
If you look at the C++ source files, however you can notice that these
|
|
||||||
comment strings (without the leading and trailing underscores) are used
|
|
||||||
in the following way (they are all 8 character length strings):
|
|
||||||
|
|
||||||
addLoader("PEMAIN20",
|
|
||||||
ih.entry ? "PEDOJUMP" : "PERETURN",
|
|
||||||
"IDENTSTR""UPX1HEAD",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
Basically that's all you have to know: when you want to add a section
|
|
||||||
of assembly code to the runtime loader, you just write
|
|
||||||
|
|
||||||
l_foo.asm
|
|
||||||
---------
|
|
||||||
;__FOOBAR00__
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
label1:
|
|
||||||
jmps label1
|
|
||||||
|
|
||||||
;__FOOBARZZ__
|
|
||||||
|
|
||||||
p_foo.cpp
|
|
||||||
---------
|
|
||||||
|
|
||||||
addLoader("FOOBAR00", NULL);
|
|
||||||
|
|
||||||
This will add the assembly section starting from __FOOBAR00__ and ending
|
|
||||||
before __FOOBARZZ__ to the loader. You can add an %ifdef - %endif pair
|
|
||||||
before these comments if you wish - but these conditionals will NOT be
|
|
||||||
seen by the assembler, they are just syntactic sugar to make the code a
|
|
||||||
little bit more readable and understandable. (Note however, that only
|
|
||||||
%ifdefs which are started on the 1st column are removed by the upx
|
|
||||||
assembly preprocessor program, so you can still use preprocessor
|
|
||||||
conditionals if you wish - just write them starting from the 2nd
|
|
||||||
column.)
|
|
||||||
|
|
||||||
That's nice, you could say, but how cross section jumps and calls are
|
|
||||||
handled? Well, that is the nicest part of this stuff - they are handled
|
|
||||||
automatically. All you have to do is to add the required sections to the
|
|
||||||
loader using `addLoader()' and the rest is done by upx. It will resolve
|
|
||||||
every conditional or unconditional jumps or subrutine calls for you.
|
|
||||||
|
|
||||||
This functionality (we could say it's a simple linker) is achived by the
|
|
||||||
assembly preprocessor (src/stub/scripts/app.pl) and a little C++ module
|
|
||||||
(src/linker.cpp). And of course NASM - the Netwide Assembler. You can
|
|
||||||
see what's going on behind the scenes - just do:
|
|
||||||
|
|
||||||
cd src/stubs
|
|
||||||
make maintainer-clean
|
|
||||||
make all
|
|
||||||
|
|
||||||
This will rebuild all the loaders - and keep the temporary files (*.as[xy])
|
|
||||||
which are seen by the assembler.
|
|
||||||
|
|
||||||
Currently this loader/stub building method only works with ix86
|
|
||||||
assembly - both app.pl and linker.cpp heavily rely on this when dealing
|
|
||||||
with cross section references.
|
|
||||||
|
|
||||||
And finally some important features/requirements you should be aware of:
|
|
||||||
|
|
||||||
- as previously stated - preprocessor conditionals starting on the 1st
|
|
||||||
column are removed by app.pl
|
|
||||||
- sections are separated by comments in the form `;__X1234567__'
|
|
||||||
- jumps are recognized by searching for a word which starts with `j'
|
|
||||||
and followed by a label - this also means that `jmp short label1'
|
|
||||||
will NOT be recognized (but you can use a macro called `jmps' for it
|
|
||||||
by adding `%define jmps jmp short' to the beginning of the file)
|
|
||||||
- at the end of the file you need something like this
|
|
||||||
|
|
||||||
eof:
|
|
||||||
; __XTHEENDX__
|
|
||||||
section .data
|
|
||||||
dd -1
|
|
||||||
dw eof
|
|
||||||
|
|
||||||
That's all for now.
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
UPX and SELinux
|
||||||
|
March 6, 2006
|
||||||
|
|
||||||
|
|
||||||
|
When a program that has been compressed by UPX is run, the decompressor
|
||||||
|
must create and write new memory pages of executable instructions.
|
||||||
|
SELinux (Security Enhanced Linux) directly controls the conditions
|
||||||
|
under which generating and/or executing new instructions is allowed,
|
||||||
|
so the configuration settings of SELinux affect the running of programs
|
||||||
|
that have been compressed by UPX.
|
||||||
|
|
||||||
|
In SELinux "strict enforcing" mode (the most restrictive), generating
|
||||||
|
new instructions at runtime is not allowed at all: any page with
|
||||||
|
PROT_EXEC permission must be mapped from a file in a mounted filesystem
|
||||||
|
that has 'x' [eXecute] permission, and the generation of such files is
|
||||||
|
also tightly controlled. A program that was compressed by UPX will not
|
||||||
|
run in SELinux strict enforcing mode. Attempts will fail with exit
|
||||||
|
code 127, and a record will be added to the history file
|
||||||
|
/var/log/audit/audit.log.
|
||||||
|
|
||||||
|
In "targeted enforcing" mode, SELinux pays close attention mostly to
|
||||||
|
designated processes that run with elevated privileges: web server,
|
||||||
|
print server, login server, etc. Ordinary user executables receive
|
||||||
|
much less scrutiny. However, one of the eventual goals of SELinux is to
|
||||||
|
eradicate runtime generation of instructions because of the possibility
|
||||||
|
for exploitation by malware (virus, trojan, key logger, privilege
|
||||||
|
elevation exploit, etc.) Thus targeted enforcing mode notices and
|
||||||
|
logs the use of "execmem" capability that is used by a program which
|
||||||
|
was compressed by UPX. In keeping with the goal of eventual prohibition,
|
||||||
|
SELinux ordinarily would deny execmem. However, most current SELinux
|
||||||
|
systems, including Fedora Core 5 [set for release March 15, 2006],
|
||||||
|
override this with "allow_exemem=1" in /etc/selinux/targeted/booleans.
|
||||||
|
Thus a program compressed by UPX will run in the default installed
|
||||||
|
configuration (targeted enforcing, allow_execmem=1) of SELinux under
|
||||||
|
Fedora Core 5. Each invocation will add a few lines to the log file
|
||||||
|
/var/log/audit/audit.log, one line for each use of execmem. If the
|
||||||
|
SELinux policy becomes more restrictive in the future, then a special
|
||||||
|
SELinux class or other mechanism must be created for compressed programs,
|
||||||
|
or else UPX-compressed executables will not run then.
|
||||||
|
|
||||||
|
In its "permissive" modes, SELinux just logs the potential problems,
|
||||||
|
but otherwise does not interfere. A program compressed by UPX will run
|
||||||
|
in any permissive mode.
|
||||||
Generated
+803
@@ -0,0 +1,803 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>upx - compress or expand executable files</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rev="made" href="mailto:root@localhost" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h1 id="NAME">NAME</h1>
|
||||||
|
|
||||||
|
<p>upx - compress or expand executable files</p>
|
||||||
|
|
||||||
|
<h1 id="SYNOPSIS">SYNOPSIS</h1>
|
||||||
|
|
||||||
|
<p><b>upx</b> <span style="white-space: nowrap;">[ <i>command</i> ]</span> <span style="white-space: nowrap;">[ <i>options</i> ]</span> <i>filename</i>...</p>
|
||||||
|
|
||||||
|
<h1 id="ABSTRACT">ABSTRACT</h1>
|
||||||
|
|
||||||
|
<pre><code> The Ultimate Packer for eXecutables
|
||||||
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
|
https://upx.github.io</code></pre>
|
||||||
|
|
||||||
|
<p><b>UPX</b> is a portable, extendable, high-performance executable packer for several different executable formats. It achieves an excellent compression ratio and offers <i>*very*</i> fast decompression. Your executables suffer no memory overhead or other drawbacks for most of the formats supported, because of in-place decompression.</p>
|
||||||
|
|
||||||
|
<h1 id="DISCLAIMER">DISCLAIMER</h1>
|
||||||
|
|
||||||
|
<p><b>UPX</b> comes with ABSOLUTELY NO WARRANTY; for details see the file COPYING.</p>
|
||||||
|
|
||||||
|
<p>Please report all problems or suggestions to the authors. Thanks.</p>
|
||||||
|
|
||||||
|
<h1 id="SECURITY-CONTEXT">SECURITY CONTEXT</h1>
|
||||||
|
|
||||||
|
<p>IMPORTANT NOTE: <b>UPX</b> inherits the security context of any files it handles.</p>
|
||||||
|
|
||||||
|
<p>This means that packing, unpacking, or even testing or listing a file requires the same security considerations as actually executing the file.</p>
|
||||||
|
|
||||||
|
<p>Use <b>UPX</b> on trusted files only!</p>
|
||||||
|
|
||||||
|
<h1 id="DESCRIPTION">DESCRIPTION</h1>
|
||||||
|
|
||||||
|
<p><b>UPX</b> is a versatile executable packer with the following features:</p>
|
||||||
|
|
||||||
|
<pre><code>- secure: as UPX is documented Open Source since many years any relevant
|
||||||
|
Security/Antivirus software is able to peek inside UPX compressed
|
||||||
|
apps to verify them
|
||||||
|
|
||||||
|
- excellent compression ratio: typically compresses better than Zip,
|
||||||
|
use UPX to decrease the size of your distribution !
|
||||||
|
|
||||||
|
- very fast decompression: more than 500 MB/sec on any reasonably modern
|
||||||
|
machine
|
||||||
|
|
||||||
|
- no memory overhead for your compressed executables for most of the
|
||||||
|
supported formats because of in-place decompression
|
||||||
|
|
||||||
|
- safe: you can list, test and unpack your executables.
|
||||||
|
Also, a checksum of both the compressed and uncompressed file is
|
||||||
|
maintained internally.
|
||||||
|
|
||||||
|
- universal: UPX can pack a number of executable formats, including
|
||||||
|
Windows programs and DLLs, macOS apps and Linux executables
|
||||||
|
|
||||||
|
- portable: UPX is written in portable endian-neutral C++
|
||||||
|
|
||||||
|
- extendable: because of the class layout it's very easy to support
|
||||||
|
new executable formats or add new compression algorithms
|
||||||
|
|
||||||
|
- free: UPX is distributed with full source code under the GNU General
|
||||||
|
Public License v2+, with special exceptions granting the free usage
|
||||||
|
for commercial programs</code></pre>
|
||||||
|
|
||||||
|
<p>You probably understand now why we call <b>UPX</b> the "<i>ultimate</i>" executable packer.</p>
|
||||||
|
|
||||||
|
<h1 id="COMMANDS">COMMANDS</h1>
|
||||||
|
|
||||||
|
<h2 id="Compress">Compress</h2>
|
||||||
|
|
||||||
|
<p>This is the default operation, eg. <b>upx yourfile.exe</b> will compress the file specified on the command line.</p>
|
||||||
|
|
||||||
|
<h2 id="Decompress">Decompress</h2>
|
||||||
|
|
||||||
|
<p>All <b>UPX</b> supported file formats can be unpacked using the <b>-d</b> switch, eg. <b>upx -d yourfile.exe</b> will uncompress the file you've just compressed.</p>
|
||||||
|
|
||||||
|
<h2 id="Test">Test</h2>
|
||||||
|
|
||||||
|
<p>The <b>-t</b> command tests the integrity of the compressed and uncompressed data, eg. <b>upx -t yourfile.exe</b> check whether your file can be safely decompressed. Note, that this command doesn't check the whole file, only the part that will be uncompressed during program execution. This means that you should not use this command instead of a virus checker.</p>
|
||||||
|
|
||||||
|
<h2 id="List">List</h2>
|
||||||
|
|
||||||
|
<p>The <b>-l</b> command prints out some information about the compressed files specified on the command line as parameters, eg <b>upx -l yourfile.exe</b> shows the compressed / uncompressed size and the compression ratio of <i>yourfile.exe</i>.</p>
|
||||||
|
|
||||||
|
<h1 id="OPTIONS">OPTIONS</h1>
|
||||||
|
|
||||||
|
<p><b>-q</b>: be quiet, suppress warnings</p>
|
||||||
|
|
||||||
|
<p><b>-q -q</b> (or <b>-qq</b>): be very quiet, suppress errors</p>
|
||||||
|
|
||||||
|
<p><b>-q -q -q</b> (or <b>-qqq</b>): produce no output at all</p>
|
||||||
|
|
||||||
|
<p><b>--help</b>: prints the help</p>
|
||||||
|
|
||||||
|
<p><b>--version</b>: print the version of <b>UPX</b></p>
|
||||||
|
|
||||||
|
<p><b>--exact</b>: when compressing, require to be able to get a byte-identical file after decompression with option <b>-d</b>. [NOTE: this is work in progress and is not supported for all formats yet. If you do care, as a workaround you can compress and then decompress your program a first time - any further compress-decompress steps should then yield byte-identical results as compared to the first decompressed version.]</p>
|
||||||
|
|
||||||
|
<p><b>-k</b>: keep backup files</p>
|
||||||
|
|
||||||
|
<p><b>-o file</b>: write output to file</p>
|
||||||
|
|
||||||
|
<p>[ ...more docs need to be written... - type `<b>upx --help</b>' for now ]</p>
|
||||||
|
|
||||||
|
<h1 id="COMPRESSION-LEVELS-TUNING">COMPRESSION LEVELS & TUNING</h1>
|
||||||
|
|
||||||
|
<p><b>UPX</b> offers ten different compression levels from <b>-1</b> to <b>-9</b>, and <b>--best</b>. The default compression level is <b>-8</b> for files smaller than 512 KiB, and <b>-7</b> otherwise.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><p>Compression levels 1, 2 and 3 are pretty fast.</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li><p>Compression levels 4, 5 and 6 achieve a good time/ratio performance.</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li><p>Compression levels 7, 8 and 9 favor compression ratio over speed.</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li><p>Compression level <b>--best</b> may take a long time.</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Note that compression level <b>--best</b> can be somewhat slow for large files, but you definitely should use it when releasing a final version of your program.</p>
|
||||||
|
|
||||||
|
<p>Quick info for achieving the best compression ratio:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><p>Try <b>upx --brute --no-lzma myfile.exe</b> or even <b>upx --ultra-brute --no-lzma myfile.exe</b>.</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li><p>The option <b>--lzma</b> enables LZMA compression, which compresses better but is *significantly slower* at decompression. You probably do not want to use it for large files.</p>
|
||||||
|
|
||||||
|
<p>(Note that <b>--lzma</b> is automatically enabled by <b>--all-methods</b> and <b>--brute</b>, use <b>--no-lzma</b> to override.)</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li><p>Try if <b>--overlay=strip</b> works.</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li><p>For win32/pe programs there's <b>--strip-relocs=0</b>. See notes below.</p>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h1 id="OVERLAY-HANDLING-OPTIONS">OVERLAY HANDLING OPTIONS</h1>
|
||||||
|
|
||||||
|
<p>Info: An "overlay" means auxiliary data attached after the logical end of an executable, and it often contains application specific data (this is a common practice to avoid an extra data file, though it would be better to use resource sections).</p>
|
||||||
|
|
||||||
|
<p><b>UPX</b> handles overlays like many other executable packers do: it simply copies the overlay after the compressed image. This works with some files, but doesn't work with others, depending on how an application actually accesses this overlaid data.</p>
|
||||||
|
|
||||||
|
<pre><code>--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||||
|
|
||||||
|
--overlay=strip Strip any overlay from the program instead of
|
||||||
|
copying it. Be warned, this may make the compressed
|
||||||
|
program crash or otherwise unusable.
|
||||||
|
|
||||||
|
--overlay=skip Refuse to compress any program which has an overlay.</code></pre>
|
||||||
|
|
||||||
|
<h1 id="ENVIRONMENT-VARIABLE">ENVIRONMENT VARIABLE</h1>
|
||||||
|
|
||||||
|
<p>The environment variable <b>UPX</b> can hold a set of default options for <b>UPX</b>. These options are interpreted first and can be overwritten by explicit command line parameters. For example:</p>
|
||||||
|
|
||||||
|
<pre><code>for DOS/Windows: set UPX=-9 --compress-icons#0
|
||||||
|
for sh/ksh/zsh: UPX="-9 --compress-icons=0"; export UPX
|
||||||
|
for csh/tcsh: setenv UPX "-9 --compress-icons=0"</code></pre>
|
||||||
|
|
||||||
|
<p>Under DOS/Windows you must use '#' instead of '=' when setting the environment variable because of a COMMAND.COM limitation.</p>
|
||||||
|
|
||||||
|
<p>Not all of the options are valid in the environment variable - <b>UPX</b> will tell you.</p>
|
||||||
|
|
||||||
|
<p>You can explicitly use the <b>--no-env</b> option to ignore the environment variable.</p>
|
||||||
|
|
||||||
|
<h1 id="NOTES-FOR-THE-SUPPORTED-EXECUTABLE-FORMATS">NOTES FOR THE SUPPORTED EXECUTABLE FORMATS</h1>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-ATARI-TOS">NOTES FOR ATARI/TOS</h2>
|
||||||
|
|
||||||
|
<p>This is the executable format used by the Atari ST/TT, a Motorola 68000 based personal computer which was popular in the late '80s. Support of this format is only because of nostalgic feelings of one of the authors and serves no practical purpose :-). See https://freemint.github.io for more info.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression. All debug information will be stripped, though.</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-BVMLINUZ-I386">NOTES FOR BVMLINUZ/I386</h2>
|
||||||
|
|
||||||
|
<p>Same as vmlinuz/i386.</p>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-DOS-COM">NOTES FOR DOS/COM</h2>
|
||||||
|
|
||||||
|
<p>Obviously <b>UPX</b> won't work with executables that want to read data from themselves (like some commandline utilities that ship with Win95/98/ME).</p>
|
||||||
|
|
||||||
|
<p>Compressed programs only work on a 286+.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression.</p>
|
||||||
|
|
||||||
|
<p>Maximum uncompressed size: ~65100 bytes.</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--8086 Create an executable that works on any 8086 CPU.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-DOS-EXE">NOTES FOR DOS/EXE</h2>
|
||||||
|
|
||||||
|
<p>dos/exe stands for all "normal" 16-bit DOS executables.</p>
|
||||||
|
|
||||||
|
<p>Obviously <b>UPX</b> won't work with executables that want to read data from themselves (like some command line utilities that ship with Win95/98/ME).</p>
|
||||||
|
|
||||||
|
<p>Compressed programs only work on a 286+.</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--8086 Create an executable that works on any 8086 CPU.
|
||||||
|
|
||||||
|
--no-reloc Use no relocation records in the exe header.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-DOS-SYS">NOTES FOR DOS/SYS</h2>
|
||||||
|
|
||||||
|
<p>Compressed programs only work on a 286+.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression.</p>
|
||||||
|
|
||||||
|
<p>Maximum uncompressed size: ~65350 bytes.</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--8086 Create an executable that works on any 8086 CPU.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-DJGPP2-COFF">NOTES FOR DJGPP2/COFF</h2>
|
||||||
|
|
||||||
|
<p>First of all, it is recommended to use <b>UPX</b> *instead* of <b>strip</b>. strip has the very bad habit of replacing your stub with its own (outdated) version. Additionally <b>UPX</b> corrects a bug/feature in strip v2.8.x: it will fix the 4 KiB alignment of the stub.</p>
|
||||||
|
|
||||||
|
<p><b>UPX</b> includes the full functionality of stubify. This means it will automatically stubify your COFF files. Use the option <b>--coff</b> to disable this functionality (see below).</p>
|
||||||
|
|
||||||
|
<p><b>UPX</b> automatically handles Allegro packfiles.</p>
|
||||||
|
|
||||||
|
<p>The DLM format (a rather exotic shared library extension) is not supported.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression. All debug information and trailing garbage will be stripped, though.</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--coff Produce COFF output instead of EXE. By default
|
||||||
|
UPX keeps your current stub.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-LINUX-general">NOTES FOR LINUX [general]</h2>
|
||||||
|
|
||||||
|
<p>Introduction</p>
|
||||||
|
|
||||||
|
<pre><code>Linux/386 support in UPX consists of 3 different executable formats,
|
||||||
|
one optimized for ELF executables ("linux/elf386"), one optimized
|
||||||
|
for shell scripts ("linux/sh386"), and one generic format
|
||||||
|
("linux/386").
|
||||||
|
|
||||||
|
We will start with a general discussion first, but please
|
||||||
|
also read the relevant docs for each of the individual formats.
|
||||||
|
|
||||||
|
Also, there is special support for bootable kernels - see the
|
||||||
|
description of the vmlinuz/386 format.</code></pre>
|
||||||
|
|
||||||
|
<p>General user's overview</p>
|
||||||
|
|
||||||
|
<pre><code>Running a compressed executable program trades less space on a
|
||||||
|
``permanent'' storage medium (such as a hard disk, floppy disk,
|
||||||
|
CD-ROM, flash memory, EPROM, etc.) for more space in one or more
|
||||||
|
``temporary'' storage media (such as RAM, swap space, /tmp, etc.).
|
||||||
|
Running a compressed executable also requires some additional CPU
|
||||||
|
cycles to generate the compressed executable in the first place,
|
||||||
|
and to decompress it at each invocation.
|
||||||
|
|
||||||
|
How much space is traded? It depends on the executable, but many
|
||||||
|
programs save 30% to 50% of permanent disk space. How much CPU
|
||||||
|
overhead is there? Again, it depends on the executable, but
|
||||||
|
decompression speed generally is at least many megabytes per second,
|
||||||
|
and frequently is limited by the speed of the underlying disk
|
||||||
|
or network I/O.
|
||||||
|
|
||||||
|
Depending on the statistics of usage and access, and the relative
|
||||||
|
speeds of CPU, RAM, swap space, /tmp, and file system storage, then
|
||||||
|
invoking and running a compressed executable can be faster than
|
||||||
|
directly running the corresponding uncompressed program.
|
||||||
|
The operating system might perform fewer expensive I/O operations
|
||||||
|
to invoke the compressed program. Paging to or from swap space
|
||||||
|
or /tmp might be faster than paging from the general file system.
|
||||||
|
``Medium-sized'' programs which access about 1/3 to 1/2 of their
|
||||||
|
stored program bytes can do particularly well with compression.
|
||||||
|
Small programs tend not to benefit as much because the absolute
|
||||||
|
savings is less. Big programs tend not to benefit proportionally
|
||||||
|
because each invocation may use only a small fraction of the program,
|
||||||
|
yet UPX decompresses the entire program before invoking it.
|
||||||
|
But in environments where disk or flash memory storage is limited,
|
||||||
|
then compression may win anyway.
|
||||||
|
|
||||||
|
Currently, executables compressed by UPX do not share RAM at runtime
|
||||||
|
in the way that executables mapped from a file system do. As a
|
||||||
|
result, if the same program is run simultaneously by more than one
|
||||||
|
process, then using the compressed version will require more RAM and/or
|
||||||
|
swap space. So, shell programs (bash, csh, etc.) and ``make''
|
||||||
|
might not be good candidates for compression.
|
||||||
|
|
||||||
|
UPX recognizes three executable formats for Linux: Linux/elf386,
|
||||||
|
Linux/sh386, and Linux/386. Linux/386 is the most generic format;
|
||||||
|
it accommodates any file that can be executed. At runtime, the UPX
|
||||||
|
decompression stub re-creates in /tmp a copy of the original file,
|
||||||
|
and then the copy is (re-)executed with the same arguments.
|
||||||
|
ELF binary executables prefer the Linux/elf386 format by default,
|
||||||
|
because UPX decompresses them directly into RAM, uses only one
|
||||||
|
exec, does not use space in /tmp, and does not use /proc.
|
||||||
|
Shell scripts where the underlying shell accepts a ``-c'' argument
|
||||||
|
can use the Linux/sh386 format. UPX decompresses the shell script
|
||||||
|
into low memory, then maps the shell and passes the entire text of the
|
||||||
|
script as an argument with a leading ``-c''.</code></pre>
|
||||||
|
|
||||||
|
<p>General benefits:</p>
|
||||||
|
|
||||||
|
<pre><code>- UPX can compress all executables, be it AOUT, ELF, libc4, libc5,
|
||||||
|
libc6, Shell/Perl/Python/... scripts, standalone Java .class
|
||||||
|
binaries, or whatever...
|
||||||
|
All scripts and programs will work just as before.
|
||||||
|
|
||||||
|
- Compressed programs are completely self-contained. No need for
|
||||||
|
any external program.
|
||||||
|
|
||||||
|
- UPX keeps your original program untouched. This means that
|
||||||
|
after decompression you will have a byte-identical version,
|
||||||
|
and you can use UPX as a file compressor just like gzip.
|
||||||
|
[ Note that UPX maintains a checksum of the file internally,
|
||||||
|
so it is indeed a reliable alternative. ]
|
||||||
|
|
||||||
|
- As the stub only uses syscalls and isn't linked against libc it
|
||||||
|
should run under any Linux configuration that can run ELF
|
||||||
|
binaries.
|
||||||
|
|
||||||
|
- For the same reason compressed executables should run under
|
||||||
|
FreeBSD and other systems which can run Linux binaries.
|
||||||
|
[ Please send feedback on this topic ]</code></pre>
|
||||||
|
|
||||||
|
<p>General drawbacks:</p>
|
||||||
|
|
||||||
|
<pre><code>- It is not advisable to compress programs which usually have many
|
||||||
|
instances running (like `sh' or `make') because the common segments of
|
||||||
|
compressed programs won't be shared any longer between different
|
||||||
|
processes.
|
||||||
|
|
||||||
|
- `ldd' and `size' won't show anything useful because all they
|
||||||
|
see is the statically linked stub. Since version 0.82 the section
|
||||||
|
headers are stripped from the UPX stub and `size' doesn't even
|
||||||
|
recognize the file format. The file patches/patch-elfcode.h has a
|
||||||
|
patch to fix this bug in `size' and other programs which use GNU BFD.</code></pre>
|
||||||
|
|
||||||
|
<p>General notes:</p>
|
||||||
|
|
||||||
|
<pre><code>- As UPX leaves your original program untouched it is advantageous
|
||||||
|
to strip it before compression.
|
||||||
|
|
||||||
|
- If you compress a script you will lose platform independence -
|
||||||
|
this could be a problem if you are using NFS mounted disks.
|
||||||
|
|
||||||
|
- Compression of suid, guid and sticky-bit programs is rejected
|
||||||
|
because of possible security implications.
|
||||||
|
|
||||||
|
- For the same reason there is no sense in making any compressed
|
||||||
|
program suid.
|
||||||
|
|
||||||
|
- Obviously UPX won't work with executables that want to read data
|
||||||
|
from themselves. E.g., this might be a problem for Perl scripts
|
||||||
|
which access their __DATA__ lines.
|
||||||
|
|
||||||
|
- In case of internal errors the stub will abort with exitcode 127.
|
||||||
|
Typical reasons for this to happen are that the program has somehow
|
||||||
|
been modified after compression.
|
||||||
|
Running `strace -o strace.log compressed_file' will tell you more.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-LINUX-ELF386">NOTES FOR LINUX/ELF386</h2>
|
||||||
|
|
||||||
|
<p>Please read the general Linux description first.</p>
|
||||||
|
|
||||||
|
<p>The linux/elf386 format decompresses directly into RAM, uses only one exec, does not use space in /tmp, and does not use /proc.</p>
|
||||||
|
|
||||||
|
<p>Linux/elf386 is automatically selected for Linux ELF executables.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression.</p>
|
||||||
|
|
||||||
|
<p>How it works:</p>
|
||||||
|
|
||||||
|
<pre><code>For ELF executables, UPX decompresses directly to memory, simulating
|
||||||
|
the mapping that the operating system kernel uses during exec(),
|
||||||
|
including the PT_INTERP program interpreter (if any).
|
||||||
|
The brk() is set by a special PT_LOAD segment in the compressed
|
||||||
|
executable itself. UPX then wipes the stack clean except for
|
||||||
|
arguments, environment variables, and Elf_auxv entries (this is
|
||||||
|
required by bugs in the startup code of /lib/ld-linux.so as of
|
||||||
|
May 2000), and transfers control to the program interpreter or
|
||||||
|
the e_entry address of the original executable.
|
||||||
|
|
||||||
|
The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
and only uses kernel syscalls. It is not linked against any libc.</code></pre>
|
||||||
|
|
||||||
|
<p>Specific drawbacks:</p>
|
||||||
|
|
||||||
|
<pre><code>- For linux/elf386 and linux/sh386 formats, you will be relying on
|
||||||
|
RAM and swap space to hold all of the decompressed program during
|
||||||
|
the lifetime of the process. If you already use most of your swap
|
||||||
|
space, then you may run out. A system that is "out of memory"
|
||||||
|
can become fragile. Many programs do not react gracefully when
|
||||||
|
malloc() returns 0. With newer Linux kernels, the kernel
|
||||||
|
may decide to kill some processes to regain memory, and you
|
||||||
|
may not like the kernel's choice of which to kill. Running
|
||||||
|
/usr/bin/top is one way to check on the usage of swap space.</code></pre>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>(none)</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-LINUX-SH386">NOTES FOR LINUX/SH386</h2>
|
||||||
|
|
||||||
|
<p>Please read the general Linux description first.</p>
|
||||||
|
|
||||||
|
<p>Shell scripts where the underling shell accepts a ``-c'' argument can use the Linux/sh386 format. <b>UPX</b> decompresses the shell script into low memory, then maps the shell and passes the entire text of the script as an argument with a leading ``-c''. It does not use space in /tmp, and does not use /proc.</p>
|
||||||
|
|
||||||
|
<p>Linux/sh386 is automatically selected for shell scripts that use a known shell.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression.</p>
|
||||||
|
|
||||||
|
<p>How it works:</p>
|
||||||
|
|
||||||
|
<pre><code>For shell script executables (files beginning with "#!/" or "#! /")
|
||||||
|
where the shell is known to accept "-c <command>", UPX decompresses
|
||||||
|
the file into low memory, then maps the shell (and its PT_INTERP),
|
||||||
|
and passes control to the shell with the entire decompressed file
|
||||||
|
as the argument after "-c". Known shells are sh, ash, bash, bsh, csh,
|
||||||
|
ksh, tcsh, pdksh. Restriction: UPX cannot use this method
|
||||||
|
for shell scripts which use the one optional string argument after
|
||||||
|
the shell name in the script (example: "#! /bin/sh option3\n".)
|
||||||
|
|
||||||
|
The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
and only uses kernel syscalls. It is not linked against any libc.</code></pre>
|
||||||
|
|
||||||
|
<p>Specific drawbacks:</p>
|
||||||
|
|
||||||
|
<pre><code>- For linux/elf386 and linux/sh386 formats, you will be relying on
|
||||||
|
RAM and swap space to hold all of the decompressed program during
|
||||||
|
the lifetime of the process. If you already use most of your swap
|
||||||
|
space, then you may run out. A system that is "out of memory"
|
||||||
|
can become fragile. Many programs do not react gracefully when
|
||||||
|
malloc() returns 0. With newer Linux kernels, the kernel
|
||||||
|
may decide to kill some processes to regain memory, and you
|
||||||
|
may not like the kernel's choice of which to kill. Running
|
||||||
|
/usr/bin/top is one way to check on the usage of swap space.</code></pre>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>(none)</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-LINUX-386">NOTES FOR LINUX/386</h2>
|
||||||
|
|
||||||
|
<p>Please read the general Linux description first.</p>
|
||||||
|
|
||||||
|
<p>The generic linux/386 format decompresses to /tmp and needs /proc file system support. It starts the decompressed program via the execve() syscall.</p>
|
||||||
|
|
||||||
|
<p>Linux/386 is only selected if the specialized linux/elf386 and linux/sh386 won't recognize a file.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression.</p>
|
||||||
|
|
||||||
|
<p>How it works:</p>
|
||||||
|
|
||||||
|
<pre><code>For files which are not ELF and not a script for a known "-c" shell,
|
||||||
|
UPX uses kernel execve(), which first requires decompressing to a
|
||||||
|
temporary file in the file system. Interestingly -
|
||||||
|
because of the good memory management of the Linux kernel - this
|
||||||
|
often does not introduce a noticeable delay, and in fact there
|
||||||
|
will be no disk access at all if you have enough free memory as
|
||||||
|
the entire process takes places within the file system buffers.
|
||||||
|
|
||||||
|
A compressed executable consists of the UPX stub and an overlay
|
||||||
|
which contains the original program in a compressed form.
|
||||||
|
|
||||||
|
The UPX stub is a statically linked ELF executable and does
|
||||||
|
the following at program startup:
|
||||||
|
|
||||||
|
1) decompress the overlay to a temporary location in /tmp
|
||||||
|
2) open the temporary file for reading
|
||||||
|
3) try to delete the temporary file and start (execve)
|
||||||
|
the uncompressed program in /tmp using /proc/<pid>/fd/X as
|
||||||
|
attained by step 2)
|
||||||
|
4) if that fails, fork off a subprocess to clean up and
|
||||||
|
start the program in /tmp in the meantime
|
||||||
|
|
||||||
|
The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
and only uses kernel syscalls. It is not linked against any libc.</code></pre>
|
||||||
|
|
||||||
|
<p>Specific drawbacks:</p>
|
||||||
|
|
||||||
|
<pre><code>- You need additional free disk space for the uncompressed program
|
||||||
|
in your /tmp directory. This program is deleted immediately after
|
||||||
|
decompression, but you still need it for the full execution time
|
||||||
|
of the program.
|
||||||
|
|
||||||
|
- You must have /proc file system support as the stub wants to open
|
||||||
|
/proc/<pid>/exe and needs /proc/<pid>/fd/X. This also means that you
|
||||||
|
cannot compress programs that are used during the boot sequence
|
||||||
|
before /proc is mounted.
|
||||||
|
|
||||||
|
- Utilities like `top' will display numerical values in the process
|
||||||
|
name field. This is because Linux computes the process name from
|
||||||
|
the first argument of the last execve syscall (which is typically
|
||||||
|
something like /proc/<pid>/fd/3).
|
||||||
|
|
||||||
|
- Because of temporary decompression to disk the decompression speed
|
||||||
|
is not as fast as with the other executable formats. Still, I can see
|
||||||
|
no noticeable delay when starting programs like my ~3 MiB emacs (which
|
||||||
|
is less than 1 MiB when compressed :-).</code></pre>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--force-execve Force the use of the generic linux/386 "execve"
|
||||||
|
format, i.e. do not try the linux/elf386 and
|
||||||
|
linux/sh386 formats.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-PS1-EXE">NOTES FOR PS1/EXE</h2>
|
||||||
|
|
||||||
|
<p>This is the executable format used by the Sony PlayStation (PSone), a MIPS R3000 based gaming console which is popular since the late '90s. Support of this format is very similar to the Atari one, because of nostalgic feelings of one of the authors.</p>
|
||||||
|
|
||||||
|
<p>Packed programs will be byte-identical to the original after uncompression, until further notice.</p>
|
||||||
|
|
||||||
|
<p>Maximum uncompressed size: ~1.89 / ~7.60 MiB.</p>
|
||||||
|
|
||||||
|
<p>Notes:</p>
|
||||||
|
|
||||||
|
<pre><code>- UPX creates as default a suitable executable for CD-Mastering
|
||||||
|
and console transfer. For a CD-Master main executable you could also try
|
||||||
|
the special option "--boot-only" as described below.
|
||||||
|
It has been reported that upx packed executables are fully compatible with
|
||||||
|
the Sony PlayStation 2 (PS2, PStwo) and Sony PlayStation Portable (PSP) in
|
||||||
|
Sony PlayStation (PSone) emulation mode.
|
||||||
|
|
||||||
|
- Normally the packed files use the same memory areas like the uncompressed
|
||||||
|
versions, so they will not override other memory areas while unpacking.
|
||||||
|
If this isn't possible UPX will abort showing a 'packed data overlap'
|
||||||
|
error. With the "--force" option UPX will relocate the loading address
|
||||||
|
for the packed file, but this isn't a real problem if it is a single or
|
||||||
|
the main executable.</code></pre>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--8-bit Uses 8 bit size compression [default: 32 bit]
|
||||||
|
|
||||||
|
--8mib-ram PSone has 8 MiB ram available [default: 2 MiB]
|
||||||
|
|
||||||
|
--boot-only This format is for main exes and CD-Mastering only !
|
||||||
|
It may slightly improve the compression ratio,
|
||||||
|
decompression routines are faster than default ones.
|
||||||
|
But it cannot be used for console transfer !
|
||||||
|
|
||||||
|
--no-align This option disables CD mode 2 data sector format
|
||||||
|
alignment. May slightly improves the compression ratio,
|
||||||
|
but the compressed executable will not boot from a CD.
|
||||||
|
Use it for console transfer only !</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-RTM32-PE-and-ARM-PE">NOTES FOR RTM32/PE and ARM/PE</h2>
|
||||||
|
|
||||||
|
<p>Same as win32/pe.</p>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-TMT-ADAM">NOTES FOR TMT/ADAM</h2>
|
||||||
|
|
||||||
|
<p>This format is used by the TMT Pascal compiler - see http://www.tmt.com/ .</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-VMLINUZ-386">NOTES FOR VMLINUZ/386</h2>
|
||||||
|
|
||||||
|
<p>The vmlinuz/386 and bvmlinuz/386 formats take a gzip-compressed bootable Linux kernel image ("vmlinuz", "zImage", "bzImage"), gzip-decompress it and re-compress it with the <b>UPX</b> compression method.</p>
|
||||||
|
|
||||||
|
<p>vmlinuz/386 is completely unrelated to the other Linux executable formats, and it does not share any of their drawbacks.</p>
|
||||||
|
|
||||||
|
<p>Notes:</p>
|
||||||
|
|
||||||
|
<pre><code>- Be sure that "vmlinuz/386" or "bvmlinuz/386" is displayed
|
||||||
|
during compression - otherwise a wrong executable format
|
||||||
|
may have been used, and the kernel won't boot.</code></pre>
|
||||||
|
|
||||||
|
<p>Benefits:</p>
|
||||||
|
|
||||||
|
<pre><code>- Better compression (but note that the kernel was already compressed,
|
||||||
|
so the improvement is not as large as with other formats).
|
||||||
|
Still, the bytes saved may be essential for special needs like
|
||||||
|
boot disks.
|
||||||
|
|
||||||
|
For example, this is what I get for my 2.2.16 kernel:
|
||||||
|
1589708 vmlinux
|
||||||
|
641073 bzImage [original]
|
||||||
|
560755 bzImage.upx [compressed by "upx -9"]
|
||||||
|
|
||||||
|
- Much faster decompression at kernel boot time (but kernel
|
||||||
|
decompression speed is not really an issue these days).</code></pre>
|
||||||
|
|
||||||
|
<p>Drawbacks:</p>
|
||||||
|
|
||||||
|
<pre><code>(none)</code></pre>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-WATCOM-LE">NOTES FOR WATCOM/LE</h2>
|
||||||
|
|
||||||
|
<p><b>UPX</b> has been successfully tested with the following extenders: DOS4G, DOS4GW, PMODE/W, DOS32a, CauseWay. The WDOS/X extender is partly supported (for details see the file bugs BUGS).</p>
|
||||||
|
|
||||||
|
<p>DLLs and the LX format are not supported.</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--le Produce an unbound LE output instead of
|
||||||
|
keeping the current stub.</code></pre>
|
||||||
|
|
||||||
|
<h2 id="NOTES-FOR-WIN32-PE">NOTES FOR WIN32/PE</h2>
|
||||||
|
|
||||||
|
<p>The PE support in <b>UPX</b> is quite stable now, but probably there are still some incompatibilities with some files.</p>
|
||||||
|
|
||||||
|
<p>Because of the way <b>UPX</b> (and other packers for this format) works, you can see increased memory usage of your compressed files because the whole program is loaded into memory at startup. If you start several instances of huge compressed programs you're wasting memory because the common segments of the program won't get shared across the instances. On the other hand if you're compressing only smaller programs, or running only one instance of larger programs, then this penalty is smaller, but it's still there.</p>
|
||||||
|
|
||||||
|
<p>If you're running executables from network, then compressed programs will load faster, and require less bandwidth during execution.</p>
|
||||||
|
|
||||||
|
<p>DLLs are supported. But UPX compressed DLLs can not share common data and code when they got used by multiple applications. So compressing msvcrt.dll is a waste of memory, but compressing the dll plugins of a particular application may be a better idea.</p>
|
||||||
|
|
||||||
|
<p>Screensavers are supported, with the restriction that the filename must end with ".scr" (as screensavers are handled slightly different than normal exe files).</p>
|
||||||
|
|
||||||
|
<p>UPX compressed PE files have some minor memory overhead (usually in the 10 - 30 KiB range) which can be seen by specifying the "-i" command line switch during compression.</p>
|
||||||
|
|
||||||
|
<p>Extra options available for this executable format:</p>
|
||||||
|
|
||||||
|
<pre><code>--compress-exports=0 Don't compress the export section.
|
||||||
|
Use this if you plan to run the compressed
|
||||||
|
program under Wine.
|
||||||
|
--compress-exports=1 Compress the export section. [DEFAULT]
|
||||||
|
Compression of the export section can improve the
|
||||||
|
compression ratio quite a bit but may not work
|
||||||
|
with all programs (like winword.exe).
|
||||||
|
UPX never compresses the export section of a DLL
|
||||||
|
regardless of this option.
|
||||||
|
|
||||||
|
--compress-icons=0 Don't compress any icons.
|
||||||
|
--compress-icons=1 Compress all but the first icon.
|
||||||
|
--compress-icons=2 Compress all icons which are not in the
|
||||||
|
first icon directory. [DEFAULT]
|
||||||
|
--compress-icons=3 Compress all icons.
|
||||||
|
|
||||||
|
--compress-resources=0 Don't compress any resources at all.
|
||||||
|
|
||||||
|
--keep-resource=list Don't compress resources specified by the list.
|
||||||
|
The members of the list are separated by commas.
|
||||||
|
A list member has the following format: I<type[/name]>.
|
||||||
|
I<Type> is the type of the resource. Standard types
|
||||||
|
must be specified as decimal numbers, user types can be
|
||||||
|
specified by decimal IDs or strings. I<Name> is the
|
||||||
|
identifier of the resource. It can be a decimal number
|
||||||
|
or a string. For example:
|
||||||
|
|
||||||
|
--keep-resource=2/MYBITMAP,5,6/12345
|
||||||
|
|
||||||
|
UPX won't compress the named bitmap resource "MYBITMAP",
|
||||||
|
it leaves every dialog (5) resource uncompressed, and
|
||||||
|
it won't touch the string table resource with identifier
|
||||||
|
12345.
|
||||||
|
|
||||||
|
--force Force compression even when there is an
|
||||||
|
unexpected value in a header field.
|
||||||
|
Use with care.
|
||||||
|
|
||||||
|
--strip-relocs=0 Don't strip relocation records.
|
||||||
|
--strip-relocs=1 Strip relocation records. [DEFAULT]
|
||||||
|
This option only works on executables with base
|
||||||
|
address greater or equal to 0x400000. Usually the
|
||||||
|
compressed files becomes smaller, but some files
|
||||||
|
may become larger. Note that the resulting file will
|
||||||
|
not work under Windows 3.x (Win32s).
|
||||||
|
UPX never strips relocations from a DLL
|
||||||
|
regardless of this option.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.</code></pre>
|
||||||
|
|
||||||
|
<h1 id="DIAGNOSTICS">DIAGNOSTICS</h1>
|
||||||
|
|
||||||
|
<p>Exit status is normally 0; if an error occurs, exit status is 1. If a warning occurs, exit status is 2.</p>
|
||||||
|
|
||||||
|
<p><b>UPX</b>'s diagnostics are intended to be self-explanatory.</p>
|
||||||
|
|
||||||
|
<h1 id="BUGS">BUGS</h1>
|
||||||
|
|
||||||
|
<p>Please report all bugs immediately to the authors.</p>
|
||||||
|
|
||||||
|
<h1 id="AUTHORS">AUTHORS</h1>
|
||||||
|
|
||||||
|
<pre><code>Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||||
|
http://www.oberhumer.com
|
||||||
|
|
||||||
|
Laszlo Molnar <ezerotven+github@gmail.com>
|
||||||
|
|
||||||
|
John F. Reiser <jreiser@BitWagon.com></code></pre>
|
||||||
|
|
||||||
|
<h1 id="COPYRIGHT">COPYRIGHT</h1>
|
||||||
|
|
||||||
|
<p>Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer</p>
|
||||||
|
|
||||||
|
<p>Copyright (C) 1996-2024 Laszlo Molnar</p>
|
||||||
|
|
||||||
|
<p>Copyright (C) 2000-2024 John F. Reiser</p>
|
||||||
|
|
||||||
|
<p><b>UPX</b> is distributed with full source code under the terms of the GNU General Public License v2+; either under the pure GPLv2+ (see the file COPYING), or (at your option) under the GPLv+2 with special exceptions and restrictions granting the free usage for all binaries including commercial programs (see the file LICENSE).</p>
|
||||||
|
|
||||||
|
<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p>
|
||||||
|
|
||||||
|
<p>You should have received a copy of the UPX License Agreements along with this program; see the files COPYING and LICENSE. If not, visit the UPX home page.</p>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
|
||||||
|
|
||||||
Generated
+838
@@ -0,0 +1,838 @@
|
|||||||
|
NAME
|
||||||
|
upx - compress or expand executable files
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
upx [ *command* ] [ *options* ] *filename*...
|
||||||
|
|
||||||
|
ABSTRACT
|
||||||
|
The Ultimate Packer for eXecutables
|
||||||
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
|
https://upx.github.io
|
||||||
|
|
||||||
|
UPX is a portable, extendable, high-performance executable packer for
|
||||||
|
several different executable formats. It achieves an excellent
|
||||||
|
compression ratio and offers **very** fast decompression. Your
|
||||||
|
executables suffer no memory overhead or other drawbacks for most of the
|
||||||
|
formats supported, because of in-place decompression.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
UPX comes with ABSOLUTELY NO WARRANTY; for details see the file COPYING.
|
||||||
|
|
||||||
|
Please report all problems or suggestions to the authors. Thanks.
|
||||||
|
|
||||||
|
SECURITY CONTEXT
|
||||||
|
IMPORTANT NOTE: UPX inherits the security context of any files it
|
||||||
|
handles.
|
||||||
|
|
||||||
|
This means that packing, unpacking, or even testing or listing a file
|
||||||
|
requires the same security considerations as actually executing the
|
||||||
|
file.
|
||||||
|
|
||||||
|
Use UPX on trusted files only!
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
UPX is a versatile executable packer with the following features:
|
||||||
|
|
||||||
|
- secure: as UPX is documented Open Source since many years any relevant
|
||||||
|
Security/Antivirus software is able to peek inside UPX compressed
|
||||||
|
apps to verify them
|
||||||
|
|
||||||
|
- excellent compression ratio: typically compresses better than Zip,
|
||||||
|
use UPX to decrease the size of your distribution !
|
||||||
|
|
||||||
|
- very fast decompression: more than 500 MB/sec on any reasonably modern
|
||||||
|
machine
|
||||||
|
|
||||||
|
- no memory overhead for your compressed executables for most of the
|
||||||
|
supported formats because of in-place decompression
|
||||||
|
|
||||||
|
- safe: you can list, test and unpack your executables.
|
||||||
|
Also, a checksum of both the compressed and uncompressed file is
|
||||||
|
maintained internally.
|
||||||
|
|
||||||
|
- universal: UPX can pack a number of executable formats, including
|
||||||
|
Windows programs and DLLs, macOS apps and Linux executables
|
||||||
|
|
||||||
|
- portable: UPX is written in portable endian-neutral C++
|
||||||
|
|
||||||
|
- extendable: because of the class layout it's very easy to support
|
||||||
|
new executable formats or add new compression algorithms
|
||||||
|
|
||||||
|
- free: UPX is distributed with full source code under the GNU General
|
||||||
|
Public License v2+, with special exceptions granting the free usage
|
||||||
|
for commercial programs
|
||||||
|
|
||||||
|
You probably understand now why we call UPX the "*ultimate*" executable
|
||||||
|
packer.
|
||||||
|
|
||||||
|
COMMANDS
|
||||||
|
Compress
|
||||||
|
This is the default operation, eg. upx yourfile.exe will compress the
|
||||||
|
file specified on the command line.
|
||||||
|
|
||||||
|
Decompress
|
||||||
|
All UPX supported file formats can be unpacked using the -d switch, eg.
|
||||||
|
upx -d yourfile.exe will uncompress the file you've just compressed.
|
||||||
|
|
||||||
|
Test
|
||||||
|
The -t command tests the integrity of the compressed and uncompressed
|
||||||
|
data, eg. upx -t yourfile.exe check whether your file can be safely
|
||||||
|
decompressed. Note, that this command doesn't check the whole file, only
|
||||||
|
the part that will be uncompressed during program execution. This means
|
||||||
|
that you should not use this command instead of a virus checker.
|
||||||
|
|
||||||
|
List
|
||||||
|
The -l command prints out some information about the compressed files
|
||||||
|
specified on the command line as parameters, eg upx -l yourfile.exe
|
||||||
|
shows the compressed / uncompressed size and the compression ratio of
|
||||||
|
*yourfile.exe*.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
-q: be quiet, suppress warnings
|
||||||
|
|
||||||
|
-q -q (or -qq): be very quiet, suppress errors
|
||||||
|
|
||||||
|
-q -q -q (or -qqq): produce no output at all
|
||||||
|
|
||||||
|
--help: prints the help
|
||||||
|
|
||||||
|
--version: print the version of UPX
|
||||||
|
|
||||||
|
--exact: when compressing, require to be able to get a byte-identical
|
||||||
|
file after decompression with option -d. [NOTE: this is work in progress
|
||||||
|
and is not supported for all formats yet. If you do care, as a
|
||||||
|
workaround you can compress and then decompress your program a first
|
||||||
|
time - any further compress-decompress steps should then yield
|
||||||
|
byte-identical results as compared to the first decompressed version.]
|
||||||
|
|
||||||
|
-k: keep backup files
|
||||||
|
|
||||||
|
-o file: write output to file
|
||||||
|
|
||||||
|
[ ...more docs need to be written... - type `upx --help' for now ]
|
||||||
|
|
||||||
|
COMPRESSION LEVELS & TUNING
|
||||||
|
UPX offers ten different compression levels from -1 to -9, and --best.
|
||||||
|
The default compression level is -8 for files smaller than 512 KiB, and
|
||||||
|
-7 otherwise.
|
||||||
|
|
||||||
|
* Compression levels 1, 2 and 3 are pretty fast.
|
||||||
|
|
||||||
|
* Compression levels 4, 5 and 6 achieve a good time/ratio performance.
|
||||||
|
|
||||||
|
* Compression levels 7, 8 and 9 favor compression ratio over speed.
|
||||||
|
|
||||||
|
* Compression level --best may take a long time.
|
||||||
|
|
||||||
|
Note that compression level --best can be somewhat slow for large files,
|
||||||
|
but you definitely should use it when releasing a final version of your
|
||||||
|
program.
|
||||||
|
|
||||||
|
Quick info for achieving the best compression ratio:
|
||||||
|
|
||||||
|
* Try upx --brute --no-lzma myfile.exe or even upx --ultra-brute
|
||||||
|
--no-lzma myfile.exe.
|
||||||
|
|
||||||
|
* The option --lzma enables LZMA compression, which compresses better
|
||||||
|
but is *significantly slower* at decompression. You probably do not
|
||||||
|
want to use it for large files.
|
||||||
|
|
||||||
|
(Note that --lzma is automatically enabled by --all-methods and
|
||||||
|
--brute, use --no-lzma to override.)
|
||||||
|
|
||||||
|
* Try if --overlay=strip works.
|
||||||
|
|
||||||
|
* For win32/pe programs there's --strip-relocs=0. See notes below.
|
||||||
|
|
||||||
|
OVERLAY HANDLING OPTIONS
|
||||||
|
Info: An "overlay" means auxiliary data attached after the logical end
|
||||||
|
of an executable, and it often contains application specific data (this
|
||||||
|
is a common practice to avoid an extra data file, though it would be
|
||||||
|
better to use resource sections).
|
||||||
|
|
||||||
|
UPX handles overlays like many other executable packers do: it simply
|
||||||
|
copies the overlay after the compressed image. This works with some
|
||||||
|
files, but doesn't work with others, depending on how an application
|
||||||
|
actually accesses this overlaid data.
|
||||||
|
|
||||||
|
--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||||
|
|
||||||
|
--overlay=strip Strip any overlay from the program instead of
|
||||||
|
copying it. Be warned, this may make the compressed
|
||||||
|
program crash or otherwise unusable.
|
||||||
|
|
||||||
|
--overlay=skip Refuse to compress any program which has an overlay.
|
||||||
|
|
||||||
|
ENVIRONMENT VARIABLE
|
||||||
|
The environment variable UPX can hold a set of default options for UPX.
|
||||||
|
These options are interpreted first and can be overwritten by explicit
|
||||||
|
command line parameters. For example:
|
||||||
|
|
||||||
|
for DOS/Windows: set UPX=-9 --compress-icons#0
|
||||||
|
for sh/ksh/zsh: UPX="-9 --compress-icons=0"; export UPX
|
||||||
|
for csh/tcsh: setenv UPX "-9 --compress-icons=0"
|
||||||
|
|
||||||
|
Under DOS/Windows you must use '#' instead of '=' when setting the
|
||||||
|
environment variable because of a COMMAND.COM limitation.
|
||||||
|
|
||||||
|
Not all of the options are valid in the environment variable - UPX will
|
||||||
|
tell you.
|
||||||
|
|
||||||
|
You can explicitly use the --no-env option to ignore the environment
|
||||||
|
variable.
|
||||||
|
|
||||||
|
NOTES FOR THE SUPPORTED EXECUTABLE FORMATS
|
||||||
|
NOTES FOR ATARI/TOS
|
||||||
|
This is the executable format used by the Atari ST/TT, a Motorola 68000
|
||||||
|
based personal computer which was popular in the late '80s. Support of
|
||||||
|
this format is only because of nostalgic feelings of one of the authors
|
||||||
|
and serves no practical purpose :-). See https://freemint.github.io for
|
||||||
|
more info.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression. All debug information will be stripped, though.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
NOTES FOR BVMLINUZ/I386
|
||||||
|
Same as vmlinuz/i386.
|
||||||
|
|
||||||
|
NOTES FOR DOS/COM
|
||||||
|
Obviously UPX won't work with executables that want to read data from
|
||||||
|
themselves (like some commandline utilities that ship with Win95/98/ME).
|
||||||
|
|
||||||
|
Compressed programs only work on a 286+.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression.
|
||||||
|
|
||||||
|
Maximum uncompressed size: ~65100 bytes.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--8086 Create an executable that works on any 8086 CPU.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.
|
||||||
|
|
||||||
|
NOTES FOR DOS/EXE
|
||||||
|
dos/exe stands for all "normal" 16-bit DOS executables.
|
||||||
|
|
||||||
|
Obviously UPX won't work with executables that want to read data from
|
||||||
|
themselves (like some command line utilities that ship with
|
||||||
|
Win95/98/ME).
|
||||||
|
|
||||||
|
Compressed programs only work on a 286+.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--8086 Create an executable that works on any 8086 CPU.
|
||||||
|
|
||||||
|
--no-reloc Use no relocation records in the exe header.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
NOTES FOR DOS/SYS
|
||||||
|
Compressed programs only work on a 286+.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression.
|
||||||
|
|
||||||
|
Maximum uncompressed size: ~65350 bytes.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--8086 Create an executable that works on any 8086 CPU.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.
|
||||||
|
|
||||||
|
NOTES FOR DJGPP2/COFF
|
||||||
|
First of all, it is recommended to use UPX *instead* of strip. strip has
|
||||||
|
the very bad habit of replacing your stub with its own (outdated)
|
||||||
|
version. Additionally UPX corrects a bug/feature in strip v2.8.x: it
|
||||||
|
will fix the 4 KiB alignment of the stub.
|
||||||
|
|
||||||
|
UPX includes the full functionality of stubify. This means it will
|
||||||
|
automatically stubify your COFF files. Use the option --coff to disable
|
||||||
|
this functionality (see below).
|
||||||
|
|
||||||
|
UPX automatically handles Allegro packfiles.
|
||||||
|
|
||||||
|
The DLM format (a rather exotic shared library extension) is not
|
||||||
|
supported.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression. All debug information and trailing garbage will be
|
||||||
|
stripped, though.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--coff Produce COFF output instead of EXE. By default
|
||||||
|
UPX keeps your current stub.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.
|
||||||
|
|
||||||
|
NOTES FOR LINUX [general]
|
||||||
|
Introduction
|
||||||
|
|
||||||
|
Linux/386 support in UPX consists of 3 different executable formats,
|
||||||
|
one optimized for ELF executables ("linux/elf386"), one optimized
|
||||||
|
for shell scripts ("linux/sh386"), and one generic format
|
||||||
|
("linux/386").
|
||||||
|
|
||||||
|
We will start with a general discussion first, but please
|
||||||
|
also read the relevant docs for each of the individual formats.
|
||||||
|
|
||||||
|
Also, there is special support for bootable kernels - see the
|
||||||
|
description of the vmlinuz/386 format.
|
||||||
|
|
||||||
|
General user's overview
|
||||||
|
|
||||||
|
Running a compressed executable program trades less space on a
|
||||||
|
``permanent'' storage medium (such as a hard disk, floppy disk,
|
||||||
|
CD-ROM, flash memory, EPROM, etc.) for more space in one or more
|
||||||
|
``temporary'' storage media (such as RAM, swap space, /tmp, etc.).
|
||||||
|
Running a compressed executable also requires some additional CPU
|
||||||
|
cycles to generate the compressed executable in the first place,
|
||||||
|
and to decompress it at each invocation.
|
||||||
|
|
||||||
|
How much space is traded? It depends on the executable, but many
|
||||||
|
programs save 30% to 50% of permanent disk space. How much CPU
|
||||||
|
overhead is there? Again, it depends on the executable, but
|
||||||
|
decompression speed generally is at least many megabytes per second,
|
||||||
|
and frequently is limited by the speed of the underlying disk
|
||||||
|
or network I/O.
|
||||||
|
|
||||||
|
Depending on the statistics of usage and access, and the relative
|
||||||
|
speeds of CPU, RAM, swap space, /tmp, and file system storage, then
|
||||||
|
invoking and running a compressed executable can be faster than
|
||||||
|
directly running the corresponding uncompressed program.
|
||||||
|
The operating system might perform fewer expensive I/O operations
|
||||||
|
to invoke the compressed program. Paging to or from swap space
|
||||||
|
or /tmp might be faster than paging from the general file system.
|
||||||
|
``Medium-sized'' programs which access about 1/3 to 1/2 of their
|
||||||
|
stored program bytes can do particularly well with compression.
|
||||||
|
Small programs tend not to benefit as much because the absolute
|
||||||
|
savings is less. Big programs tend not to benefit proportionally
|
||||||
|
because each invocation may use only a small fraction of the program,
|
||||||
|
yet UPX decompresses the entire program before invoking it.
|
||||||
|
But in environments where disk or flash memory storage is limited,
|
||||||
|
then compression may win anyway.
|
||||||
|
|
||||||
|
Currently, executables compressed by UPX do not share RAM at runtime
|
||||||
|
in the way that executables mapped from a file system do. As a
|
||||||
|
result, if the same program is run simultaneously by more than one
|
||||||
|
process, then using the compressed version will require more RAM and/or
|
||||||
|
swap space. So, shell programs (bash, csh, etc.) and ``make''
|
||||||
|
might not be good candidates for compression.
|
||||||
|
|
||||||
|
UPX recognizes three executable formats for Linux: Linux/elf386,
|
||||||
|
Linux/sh386, and Linux/386. Linux/386 is the most generic format;
|
||||||
|
it accommodates any file that can be executed. At runtime, the UPX
|
||||||
|
decompression stub re-creates in /tmp a copy of the original file,
|
||||||
|
and then the copy is (re-)executed with the same arguments.
|
||||||
|
ELF binary executables prefer the Linux/elf386 format by default,
|
||||||
|
because UPX decompresses them directly into RAM, uses only one
|
||||||
|
exec, does not use space in /tmp, and does not use /proc.
|
||||||
|
Shell scripts where the underlying shell accepts a ``-c'' argument
|
||||||
|
can use the Linux/sh386 format. UPX decompresses the shell script
|
||||||
|
into low memory, then maps the shell and passes the entire text of the
|
||||||
|
script as an argument with a leading ``-c''.
|
||||||
|
|
||||||
|
General benefits:
|
||||||
|
|
||||||
|
- UPX can compress all executables, be it AOUT, ELF, libc4, libc5,
|
||||||
|
libc6, Shell/Perl/Python/... scripts, standalone Java .class
|
||||||
|
binaries, or whatever...
|
||||||
|
All scripts and programs will work just as before.
|
||||||
|
|
||||||
|
- Compressed programs are completely self-contained. No need for
|
||||||
|
any external program.
|
||||||
|
|
||||||
|
- UPX keeps your original program untouched. This means that
|
||||||
|
after decompression you will have a byte-identical version,
|
||||||
|
and you can use UPX as a file compressor just like gzip.
|
||||||
|
[ Note that UPX maintains a checksum of the file internally,
|
||||||
|
so it is indeed a reliable alternative. ]
|
||||||
|
|
||||||
|
- As the stub only uses syscalls and isn't linked against libc it
|
||||||
|
should run under any Linux configuration that can run ELF
|
||||||
|
binaries.
|
||||||
|
|
||||||
|
- For the same reason compressed executables should run under
|
||||||
|
FreeBSD and other systems which can run Linux binaries.
|
||||||
|
[ Please send feedback on this topic ]
|
||||||
|
|
||||||
|
General drawbacks:
|
||||||
|
|
||||||
|
- It is not advisable to compress programs which usually have many
|
||||||
|
instances running (like `sh' or `make') because the common segments of
|
||||||
|
compressed programs won't be shared any longer between different
|
||||||
|
processes.
|
||||||
|
|
||||||
|
- `ldd' and `size' won't show anything useful because all they
|
||||||
|
see is the statically linked stub. Since version 0.82 the section
|
||||||
|
headers are stripped from the UPX stub and `size' doesn't even
|
||||||
|
recognize the file format. The file patches/patch-elfcode.h has a
|
||||||
|
patch to fix this bug in `size' and other programs which use GNU BFD.
|
||||||
|
|
||||||
|
General notes:
|
||||||
|
|
||||||
|
- As UPX leaves your original program untouched it is advantageous
|
||||||
|
to strip it before compression.
|
||||||
|
|
||||||
|
- If you compress a script you will lose platform independence -
|
||||||
|
this could be a problem if you are using NFS mounted disks.
|
||||||
|
|
||||||
|
- Compression of suid, guid and sticky-bit programs is rejected
|
||||||
|
because of possible security implications.
|
||||||
|
|
||||||
|
- For the same reason there is no sense in making any compressed
|
||||||
|
program suid.
|
||||||
|
|
||||||
|
- Obviously UPX won't work with executables that want to read data
|
||||||
|
from themselves. E.g., this might be a problem for Perl scripts
|
||||||
|
which access their __DATA__ lines.
|
||||||
|
|
||||||
|
- In case of internal errors the stub will abort with exitcode 127.
|
||||||
|
Typical reasons for this to happen are that the program has somehow
|
||||||
|
been modified after compression.
|
||||||
|
Running `strace -o strace.log compressed_file' will tell you more.
|
||||||
|
|
||||||
|
NOTES FOR LINUX/ELF386
|
||||||
|
Please read the general Linux description first.
|
||||||
|
|
||||||
|
The linux/elf386 format decompresses directly into RAM, uses only one
|
||||||
|
exec, does not use space in /tmp, and does not use /proc.
|
||||||
|
|
||||||
|
Linux/elf386 is automatically selected for Linux ELF executables.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression.
|
||||||
|
|
||||||
|
How it works:
|
||||||
|
|
||||||
|
For ELF executables, UPX decompresses directly to memory, simulating
|
||||||
|
the mapping that the operating system kernel uses during exec(),
|
||||||
|
including the PT_INTERP program interpreter (if any).
|
||||||
|
The brk() is set by a special PT_LOAD segment in the compressed
|
||||||
|
executable itself. UPX then wipes the stack clean except for
|
||||||
|
arguments, environment variables, and Elf_auxv entries (this is
|
||||||
|
required by bugs in the startup code of /lib/ld-linux.so as of
|
||||||
|
May 2000), and transfers control to the program interpreter or
|
||||||
|
the e_entry address of the original executable.
|
||||||
|
|
||||||
|
The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
and only uses kernel syscalls. It is not linked against any libc.
|
||||||
|
|
||||||
|
Specific drawbacks:
|
||||||
|
|
||||||
|
- For linux/elf386 and linux/sh386 formats, you will be relying on
|
||||||
|
RAM and swap space to hold all of the decompressed program during
|
||||||
|
the lifetime of the process. If you already use most of your swap
|
||||||
|
space, then you may run out. A system that is "out of memory"
|
||||||
|
can become fragile. Many programs do not react gracefully when
|
||||||
|
malloc() returns 0. With newer Linux kernels, the kernel
|
||||||
|
may decide to kill some processes to regain memory, and you
|
||||||
|
may not like the kernel's choice of which to kill. Running
|
||||||
|
/usr/bin/top is one way to check on the usage of swap space.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
(none)
|
||||||
|
|
||||||
|
NOTES FOR LINUX/SH386
|
||||||
|
Please read the general Linux description first.
|
||||||
|
|
||||||
|
Shell scripts where the underling shell accepts a ``-c'' argument can
|
||||||
|
use the Linux/sh386 format. UPX decompresses the shell script into low
|
||||||
|
memory, then maps the shell and passes the entire text of the script as
|
||||||
|
an argument with a leading ``-c''. It does not use space in /tmp, and
|
||||||
|
does not use /proc.
|
||||||
|
|
||||||
|
Linux/sh386 is automatically selected for shell scripts that use a known
|
||||||
|
shell.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression.
|
||||||
|
|
||||||
|
How it works:
|
||||||
|
|
||||||
|
For shell script executables (files beginning with "#!/" or "#! /")
|
||||||
|
where the shell is known to accept "-c <command>", UPX decompresses
|
||||||
|
the file into low memory, then maps the shell (and its PT_INTERP),
|
||||||
|
and passes control to the shell with the entire decompressed file
|
||||||
|
as the argument after "-c". Known shells are sh, ash, bash, bsh, csh,
|
||||||
|
ksh, tcsh, pdksh. Restriction: UPX cannot use this method
|
||||||
|
for shell scripts which use the one optional string argument after
|
||||||
|
the shell name in the script (example: "#! /bin/sh option3\n".)
|
||||||
|
|
||||||
|
The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
and only uses kernel syscalls. It is not linked against any libc.
|
||||||
|
|
||||||
|
Specific drawbacks:
|
||||||
|
|
||||||
|
- For linux/elf386 and linux/sh386 formats, you will be relying on
|
||||||
|
RAM and swap space to hold all of the decompressed program during
|
||||||
|
the lifetime of the process. If you already use most of your swap
|
||||||
|
space, then you may run out. A system that is "out of memory"
|
||||||
|
can become fragile. Many programs do not react gracefully when
|
||||||
|
malloc() returns 0. With newer Linux kernels, the kernel
|
||||||
|
may decide to kill some processes to regain memory, and you
|
||||||
|
may not like the kernel's choice of which to kill. Running
|
||||||
|
/usr/bin/top is one way to check on the usage of swap space.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
(none)
|
||||||
|
|
||||||
|
NOTES FOR LINUX/386
|
||||||
|
Please read the general Linux description first.
|
||||||
|
|
||||||
|
The generic linux/386 format decompresses to /tmp and needs /proc file
|
||||||
|
system support. It starts the decompressed program via the execve()
|
||||||
|
syscall.
|
||||||
|
|
||||||
|
Linux/386 is only selected if the specialized linux/elf386 and
|
||||||
|
linux/sh386 won't recognize a file.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression.
|
||||||
|
|
||||||
|
How it works:
|
||||||
|
|
||||||
|
For files which are not ELF and not a script for a known "-c" shell,
|
||||||
|
UPX uses kernel execve(), which first requires decompressing to a
|
||||||
|
temporary file in the file system. Interestingly -
|
||||||
|
because of the good memory management of the Linux kernel - this
|
||||||
|
often does not introduce a noticeable delay, and in fact there
|
||||||
|
will be no disk access at all if you have enough free memory as
|
||||||
|
the entire process takes places within the file system buffers.
|
||||||
|
|
||||||
|
A compressed executable consists of the UPX stub and an overlay
|
||||||
|
which contains the original program in a compressed form.
|
||||||
|
|
||||||
|
The UPX stub is a statically linked ELF executable and does
|
||||||
|
the following at program startup:
|
||||||
|
|
||||||
|
1) decompress the overlay to a temporary location in /tmp
|
||||||
|
2) open the temporary file for reading
|
||||||
|
3) try to delete the temporary file and start (execve)
|
||||||
|
the uncompressed program in /tmp using /proc/<pid>/fd/X as
|
||||||
|
attained by step 2)
|
||||||
|
4) if that fails, fork off a subprocess to clean up and
|
||||||
|
start the program in /tmp in the meantime
|
||||||
|
|
||||||
|
The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
and only uses kernel syscalls. It is not linked against any libc.
|
||||||
|
|
||||||
|
Specific drawbacks:
|
||||||
|
|
||||||
|
- You need additional free disk space for the uncompressed program
|
||||||
|
in your /tmp directory. This program is deleted immediately after
|
||||||
|
decompression, but you still need it for the full execution time
|
||||||
|
of the program.
|
||||||
|
|
||||||
|
- You must have /proc file system support as the stub wants to open
|
||||||
|
/proc/<pid>/exe and needs /proc/<pid>/fd/X. This also means that you
|
||||||
|
cannot compress programs that are used during the boot sequence
|
||||||
|
before /proc is mounted.
|
||||||
|
|
||||||
|
- Utilities like `top' will display numerical values in the process
|
||||||
|
name field. This is because Linux computes the process name from
|
||||||
|
the first argument of the last execve syscall (which is typically
|
||||||
|
something like /proc/<pid>/fd/3).
|
||||||
|
|
||||||
|
- Because of temporary decompression to disk the decompression speed
|
||||||
|
is not as fast as with the other executable formats. Still, I can see
|
||||||
|
no noticeable delay when starting programs like my ~3 MiB emacs (which
|
||||||
|
is less than 1 MiB when compressed :-).
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--force-execve Force the use of the generic linux/386 "execve"
|
||||||
|
format, i.e. do not try the linux/elf386 and
|
||||||
|
linux/sh386 formats.
|
||||||
|
|
||||||
|
NOTES FOR PS1/EXE
|
||||||
|
This is the executable format used by the Sony PlayStation (PSone), a
|
||||||
|
MIPS R3000 based gaming console which is popular since the late '90s.
|
||||||
|
Support of this format is very similar to the Atari one, because of
|
||||||
|
nostalgic feelings of one of the authors.
|
||||||
|
|
||||||
|
Packed programs will be byte-identical to the original after
|
||||||
|
uncompression, until further notice.
|
||||||
|
|
||||||
|
Maximum uncompressed size: ~1.89 / ~7.60 MiB.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- UPX creates as default a suitable executable for CD-Mastering
|
||||||
|
and console transfer. For a CD-Master main executable you could also try
|
||||||
|
the special option "--boot-only" as described below.
|
||||||
|
It has been reported that upx packed executables are fully compatible with
|
||||||
|
the Sony PlayStation 2 (PS2, PStwo) and Sony PlayStation Portable (PSP) in
|
||||||
|
Sony PlayStation (PSone) emulation mode.
|
||||||
|
|
||||||
|
- Normally the packed files use the same memory areas like the uncompressed
|
||||||
|
versions, so they will not override other memory areas while unpacking.
|
||||||
|
If this isn't possible UPX will abort showing a 'packed data overlap'
|
||||||
|
error. With the "--force" option UPX will relocate the loading address
|
||||||
|
for the packed file, but this isn't a real problem if it is a single or
|
||||||
|
the main executable.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--8-bit Uses 8 bit size compression [default: 32 bit]
|
||||||
|
|
||||||
|
--8mib-ram PSone has 8 MiB ram available [default: 2 MiB]
|
||||||
|
|
||||||
|
--boot-only This format is for main exes and CD-Mastering only !
|
||||||
|
It may slightly improve the compression ratio,
|
||||||
|
decompression routines are faster than default ones.
|
||||||
|
But it cannot be used for console transfer !
|
||||||
|
|
||||||
|
--no-align This option disables CD mode 2 data sector format
|
||||||
|
alignment. May slightly improves the compression ratio,
|
||||||
|
but the compressed executable will not boot from a CD.
|
||||||
|
Use it for console transfer only !
|
||||||
|
|
||||||
|
NOTES FOR RTM32/PE and ARM/PE
|
||||||
|
Same as win32/pe.
|
||||||
|
|
||||||
|
NOTES FOR TMT/ADAM
|
||||||
|
This format is used by the TMT Pascal compiler - see http://www.tmt.com/
|
||||||
|
.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.
|
||||||
|
|
||||||
|
NOTES FOR VMLINUZ/386
|
||||||
|
The vmlinuz/386 and bvmlinuz/386 formats take a gzip-compressed bootable
|
||||||
|
Linux kernel image ("vmlinuz", "zImage", "bzImage"), gzip-decompress it
|
||||||
|
and re-compress it with the UPX compression method.
|
||||||
|
|
||||||
|
vmlinuz/386 is completely unrelated to the other Linux executable
|
||||||
|
formats, and it does not share any of their drawbacks.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- Be sure that "vmlinuz/386" or "bvmlinuz/386" is displayed
|
||||||
|
during compression - otherwise a wrong executable format
|
||||||
|
may have been used, and the kernel won't boot.
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
|
||||||
|
- Better compression (but note that the kernel was already compressed,
|
||||||
|
so the improvement is not as large as with other formats).
|
||||||
|
Still, the bytes saved may be essential for special needs like
|
||||||
|
boot disks.
|
||||||
|
|
||||||
|
For example, this is what I get for my 2.2.16 kernel:
|
||||||
|
1589708 vmlinux
|
||||||
|
641073 bzImage [original]
|
||||||
|
560755 bzImage.upx [compressed by "upx -9"]
|
||||||
|
|
||||||
|
- Much faster decompression at kernel boot time (but kernel
|
||||||
|
decompression speed is not really an issue these days).
|
||||||
|
|
||||||
|
Drawbacks:
|
||||||
|
|
||||||
|
(none)
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.
|
||||||
|
|
||||||
|
NOTES FOR WATCOM/LE
|
||||||
|
UPX has been successfully tested with the following extenders: DOS4G,
|
||||||
|
DOS4GW, PMODE/W, DOS32a, CauseWay. The WDOS/X extender is partly
|
||||||
|
supported (for details see the file bugs BUGS).
|
||||||
|
|
||||||
|
DLLs and the LX format are not supported.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--le Produce an unbound LE output instead of
|
||||||
|
keeping the current stub.
|
||||||
|
|
||||||
|
NOTES FOR WIN32/PE
|
||||||
|
The PE support in UPX is quite stable now, but probably there are still
|
||||||
|
some incompatibilities with some files.
|
||||||
|
|
||||||
|
Because of the way UPX (and other packers for this format) works, you
|
||||||
|
can see increased memory usage of your compressed files because the
|
||||||
|
whole program is loaded into memory at startup. If you start several
|
||||||
|
instances of huge compressed programs you're wasting memory because the
|
||||||
|
common segments of the program won't get shared across the instances. On
|
||||||
|
the other hand if you're compressing only smaller programs, or running
|
||||||
|
only one instance of larger programs, then this penalty is smaller, but
|
||||||
|
it's still there.
|
||||||
|
|
||||||
|
If you're running executables from network, then compressed programs
|
||||||
|
will load faster, and require less bandwidth during execution.
|
||||||
|
|
||||||
|
DLLs are supported. But UPX compressed DLLs can not share common data
|
||||||
|
and code when they got used by multiple applications. So compressing
|
||||||
|
msvcrt.dll is a waste of memory, but compressing the dll plugins of a
|
||||||
|
particular application may be a better idea.
|
||||||
|
|
||||||
|
Screensavers are supported, with the restriction that the filename must
|
||||||
|
end with ".scr" (as screensavers are handled slightly different than
|
||||||
|
normal exe files).
|
||||||
|
|
||||||
|
UPX compressed PE files have some minor memory overhead (usually in the
|
||||||
|
10 - 30 KiB range) which can be seen by specifying the "-i" command line
|
||||||
|
switch during compression.
|
||||||
|
|
||||||
|
Extra options available for this executable format:
|
||||||
|
|
||||||
|
--compress-exports=0 Don't compress the export section.
|
||||||
|
Use this if you plan to run the compressed
|
||||||
|
program under Wine.
|
||||||
|
--compress-exports=1 Compress the export section. [DEFAULT]
|
||||||
|
Compression of the export section can improve the
|
||||||
|
compression ratio quite a bit but may not work
|
||||||
|
with all programs (like winword.exe).
|
||||||
|
UPX never compresses the export section of a DLL
|
||||||
|
regardless of this option.
|
||||||
|
|
||||||
|
--compress-icons=0 Don't compress any icons.
|
||||||
|
--compress-icons=1 Compress all but the first icon.
|
||||||
|
--compress-icons=2 Compress all icons which are not in the
|
||||||
|
first icon directory. [DEFAULT]
|
||||||
|
--compress-icons=3 Compress all icons.
|
||||||
|
|
||||||
|
--compress-resources=0 Don't compress any resources at all.
|
||||||
|
|
||||||
|
--keep-resource=list Don't compress resources specified by the list.
|
||||||
|
The members of the list are separated by commas.
|
||||||
|
A list member has the following format: I<type[/name]>.
|
||||||
|
I<Type> is the type of the resource. Standard types
|
||||||
|
must be specified as decimal numbers, user types can be
|
||||||
|
specified by decimal IDs or strings. I<Name> is the
|
||||||
|
identifier of the resource. It can be a decimal number
|
||||||
|
or a string. For example:
|
||||||
|
|
||||||
|
--keep-resource=2/MYBITMAP,5,6/12345
|
||||||
|
|
||||||
|
UPX won't compress the named bitmap resource "MYBITMAP",
|
||||||
|
it leaves every dialog (5) resource uncompressed, and
|
||||||
|
it won't touch the string table resource with identifier
|
||||||
|
12345.
|
||||||
|
|
||||||
|
--force Force compression even when there is an
|
||||||
|
unexpected value in a header field.
|
||||||
|
Use with care.
|
||||||
|
|
||||||
|
--strip-relocs=0 Don't strip relocation records.
|
||||||
|
--strip-relocs=1 Strip relocation records. [DEFAULT]
|
||||||
|
This option only works on executables with base
|
||||||
|
address greater or equal to 0x400000. Usually the
|
||||||
|
compressed files becomes smaller, but some files
|
||||||
|
may become larger. Note that the resulting file will
|
||||||
|
not work under Windows 3.x (Win32s).
|
||||||
|
UPX never strips relocations from a DLL
|
||||||
|
regardless of this option.
|
||||||
|
|
||||||
|
--all-methods Compress the program several times, using all
|
||||||
|
available compression methods. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
|
--all-filters Compress the program several times, using all
|
||||||
|
available preprocessing filters. This may improve
|
||||||
|
the compression ratio in some cases, but usually
|
||||||
|
the default filter gives the best results anyway.
|
||||||
|
|
||||||
|
DIAGNOSTICS
|
||||||
|
Exit status is normally 0; if an error occurs, exit status is 1. If a
|
||||||
|
warning occurs, exit status is 2.
|
||||||
|
|
||||||
|
UPX's diagnostics are intended to be self-explanatory.
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
Please report all bugs immediately to the authors.
|
||||||
|
|
||||||
|
AUTHORS
|
||||||
|
Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||||
|
http://www.oberhumer.com
|
||||||
|
|
||||||
|
Laszlo Molnar <ezerotven+github@gmail.com>
|
||||||
|
|
||||||
|
John F. Reiser <jreiser@BitWagon.com>
|
||||||
|
|
||||||
|
COPYRIGHT
|
||||||
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
Copyright (C) 1996-2024 Laszlo Molnar
|
||||||
|
|
||||||
|
Copyright (C) 2000-2024 John F. Reiser
|
||||||
|
|
||||||
|
UPX is distributed with full source code under the terms of the GNU
|
||||||
|
General Public License v2+; either under the pure GPLv2+ (see the file
|
||||||
|
COPYING), or (at your option) under the GPLv+2 with special exceptions
|
||||||
|
and restrictions granting the free usage for all binaries including
|
||||||
|
commercial programs (see the file LICENSE).
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
You should have received a copy of the UPX License Agreements along with
|
||||||
|
this program; see the files COPYING and LICENSE. If not, visit the UPX
|
||||||
|
home page.
|
||||||
|
|
||||||
@@ -0,0 +1,960 @@
|
|||||||
|
.\" -*- mode: troff; coding: utf-8 -*-
|
||||||
|
.\" Automatically generated by Pod::Man
|
||||||
|
.\"
|
||||||
|
.\" Standard preamble:
|
||||||
|
.\" ========================================================================
|
||||||
|
.de Sp \" Vertical space (when we can't use .PP)
|
||||||
|
.if t .sp .5v
|
||||||
|
.if n .sp
|
||||||
|
..
|
||||||
|
.de Vb \" Begin verbatim text
|
||||||
|
.ft CW
|
||||||
|
.nf
|
||||||
|
.ne \\$1
|
||||||
|
..
|
||||||
|
.de Ve \" End verbatim text
|
||||||
|
.ft R
|
||||||
|
.fi
|
||||||
|
..
|
||||||
|
.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
|
||||||
|
.ie n \{\
|
||||||
|
. ds C` ""
|
||||||
|
. ds C' ""
|
||||||
|
'br\}
|
||||||
|
.el\{\
|
||||||
|
. ds C`
|
||||||
|
. ds C'
|
||||||
|
'br\}
|
||||||
|
.\"
|
||||||
|
.\" Escape single quotes in literal strings from groff's Unicode transform.
|
||||||
|
.ie \n(.g .ds Aq \(aq
|
||||||
|
.el .ds Aq '
|
||||||
|
.\"
|
||||||
|
.\" If the F register is >0, we'll generate index entries on stderr for
|
||||||
|
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
|
||||||
|
.\" entries marked with X<> in POD. Of course, you'll have to process the
|
||||||
|
.\" output yourself in some meaningful fashion.
|
||||||
|
.\"
|
||||||
|
.\" Avoid warning from groff about undefined register 'F'.
|
||||||
|
.de IX
|
||||||
|
..
|
||||||
|
.nr rF 0
|
||||||
|
.if \n(.g .if rF .nr rF 1
|
||||||
|
.if (\n(rF:(\n(.g==0)) \{\
|
||||||
|
. if \nF \{\
|
||||||
|
. de IX
|
||||||
|
. tm Index:\\$1\t\\n%\t"\\$2"
|
||||||
|
..
|
||||||
|
. if !\nF==2 \{\
|
||||||
|
. nr % 0
|
||||||
|
. nr F 2
|
||||||
|
. \}
|
||||||
|
. \}
|
||||||
|
.\}
|
||||||
|
.rr rF
|
||||||
|
.\" ========================================================================
|
||||||
|
.\"
|
||||||
|
.IX Title "UPX 1"
|
||||||
|
.TH UPX 1 2024-05-09 "upx 4.2.4" " "
|
||||||
|
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||||
|
.\" way too many mistakes in technical documents.
|
||||||
|
.if n .ad l
|
||||||
|
.nh
|
||||||
|
.SH NAME
|
||||||
|
upx \- compress or expand executable files
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.IX Header "SYNOPSIS"
|
||||||
|
\&\fBupx\fR [\ \fIcommand\fR\ ] [\ \fIoptions\fR\ ] \fIfilename\fR...
|
||||||
|
.SH ABSTRACT
|
||||||
|
.IX Header "ABSTRACT"
|
||||||
|
.Vb 3
|
||||||
|
\& The Ultimate Packer for eXecutables
|
||||||
|
\& Copyright (c) 1996\-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
|
\& https://upx.github.io
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
\&\fBUPX\fR is a portable, extendable, high-performance executable packer for
|
||||||
|
several different executable formats. It achieves an excellent compression
|
||||||
|
ratio and offers \fI*very*\fR fast decompression. Your executables suffer
|
||||||
|
no memory overhead or other drawbacks for most of the formats supported,
|
||||||
|
because of in-place decompression.
|
||||||
|
.SH DISCLAIMER
|
||||||
|
.IX Header "DISCLAIMER"
|
||||||
|
\&\fBUPX\fR comes with ABSOLUTELY NO WARRANTY; for details see the file COPYING.
|
||||||
|
.PP
|
||||||
|
Please report all problems or suggestions to the authors. Thanks.
|
||||||
|
.SH "SECURITY CONTEXT"
|
||||||
|
.IX Header "SECURITY CONTEXT"
|
||||||
|
IMPORTANT NOTE: \fBUPX\fR inherits the security context of any files it handles.
|
||||||
|
.PP
|
||||||
|
This means that packing, unpacking, or even testing or listing a file requires
|
||||||
|
the same security considerations as actually executing the file.
|
||||||
|
.PP
|
||||||
|
Use \fBUPX\fR on trusted files only!
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.IX Header "DESCRIPTION"
|
||||||
|
\&\fBUPX\fR is a versatile executable packer with the following features:
|
||||||
|
.PP
|
||||||
|
.Vb 3
|
||||||
|
\& \- secure: as UPX is documented Open Source since many years any relevant
|
||||||
|
\& Security/Antivirus software is able to peek inside UPX compressed
|
||||||
|
\& apps to verify them
|
||||||
|
\&
|
||||||
|
\& \- excellent compression ratio: typically compresses better than Zip,
|
||||||
|
\& use UPX to decrease the size of your distribution !
|
||||||
|
\&
|
||||||
|
\& \- very fast decompression: more than 500 MB/sec on any reasonably modern
|
||||||
|
\& machine
|
||||||
|
\&
|
||||||
|
\& \- no memory overhead for your compressed executables for most of the
|
||||||
|
\& supported formats because of in\-place decompression
|
||||||
|
\&
|
||||||
|
\& \- safe: you can list, test and unpack your executables.
|
||||||
|
\& Also, a checksum of both the compressed and uncompressed file is
|
||||||
|
\& maintained internally.
|
||||||
|
\&
|
||||||
|
\& \- universal: UPX can pack a number of executable formats, including
|
||||||
|
\& Windows programs and DLLs, macOS apps and Linux executables
|
||||||
|
\&
|
||||||
|
\& \- portable: UPX is written in portable endian\-neutral C++
|
||||||
|
\&
|
||||||
|
\& \- extendable: because of the class layout it\*(Aqs very easy to support
|
||||||
|
\& new executable formats or add new compression algorithms
|
||||||
|
\&
|
||||||
|
\& \- free: UPX is distributed with full source code under the GNU General
|
||||||
|
\& Public License v2+, with special exceptions granting the free usage
|
||||||
|
\& for commercial programs
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
You probably understand now why we call \fBUPX\fR the "\fIultimate\fR"
|
||||||
|
executable packer.
|
||||||
|
.SH COMMANDS
|
||||||
|
.IX Header "COMMANDS"
|
||||||
|
.SS Compress
|
||||||
|
.IX Subsection "Compress"
|
||||||
|
This is the default operation, eg. \fBupx yourfile.exe\fR will compress the file
|
||||||
|
specified on the command line.
|
||||||
|
.SS Decompress
|
||||||
|
.IX Subsection "Decompress"
|
||||||
|
All \fBUPX\fR supported file formats can be unpacked using the \fB\-d\fR switch, eg.
|
||||||
|
\&\fBupx \-d yourfile.exe\fR will uncompress the file you've just compressed.
|
||||||
|
.SS Test
|
||||||
|
.IX Subsection "Test"
|
||||||
|
The \fB\-t\fR command tests the integrity of the compressed and uncompressed
|
||||||
|
data, eg. \fBupx \-t yourfile.exe\fR check whether your file can be safely
|
||||||
|
decompressed. Note, that this command doesn't check the whole file, only
|
||||||
|
the part that will be uncompressed during program execution. This means
|
||||||
|
that you should not use this command instead of a virus checker.
|
||||||
|
.SS List
|
||||||
|
.IX Subsection "List"
|
||||||
|
The \fB\-l\fR command prints out some information about the compressed files
|
||||||
|
specified on the command line as parameters, eg \fBupx \-l yourfile.exe\fR
|
||||||
|
shows the compressed / uncompressed size and the compression ratio of
|
||||||
|
\&\fIyourfile.exe\fR.
|
||||||
|
.SH OPTIONS
|
||||||
|
.IX Header "OPTIONS"
|
||||||
|
\&\fB\-q\fR: be quiet, suppress warnings
|
||||||
|
.PP
|
||||||
|
\&\fB\-q \-q\fR (or \fB\-qq\fR): be very quiet, suppress errors
|
||||||
|
.PP
|
||||||
|
\&\fB\-q \-q \-q\fR (or \fB\-qqq\fR): produce no output at all
|
||||||
|
.PP
|
||||||
|
\&\fB\-\-help\fR: prints the help
|
||||||
|
.PP
|
||||||
|
\&\fB\-\-version\fR: print the version of \fBUPX\fR
|
||||||
|
.PP
|
||||||
|
\&\fB\-\-exact\fR: when compressing, require to be able to get a byte-identical file
|
||||||
|
after decompression with option \fB\-d\fR. [NOTE: this is work in progress and is
|
||||||
|
not supported for all formats yet. If you do care, as a workaround you can
|
||||||
|
compress and then decompress your program a first time \- any further
|
||||||
|
compress-decompress steps should then yield byte-identical results
|
||||||
|
as compared to the first decompressed version.]
|
||||||
|
.PP
|
||||||
|
\&\fB\-k\fR: keep backup files
|
||||||
|
.PP
|
||||||
|
\&\fB\-o file\fR: write output to file
|
||||||
|
.PP
|
||||||
|
[ ...more docs need to be written... \- type `\fBupx \-\-help\fR' for now ]
|
||||||
|
.SH "COMPRESSION LEVELS & TUNING"
|
||||||
|
.IX Header "COMPRESSION LEVELS & TUNING"
|
||||||
|
\&\fBUPX\fR offers ten different compression levels from \fB\-1\fR to \fB\-9\fR,
|
||||||
|
and \fB\-\-best\fR. The default compression level is \fB\-8\fR for files
|
||||||
|
smaller than 512 KiB, and \fB\-7\fR otherwise.
|
||||||
|
.IP \(bu 4
|
||||||
|
Compression levels 1, 2 and 3 are pretty fast.
|
||||||
|
.IP \(bu 4
|
||||||
|
Compression levels 4, 5 and 6 achieve a good time/ratio performance.
|
||||||
|
.IP \(bu 4
|
||||||
|
Compression levels 7, 8 and 9 favor compression ratio over speed.
|
||||||
|
.IP \(bu 4
|
||||||
|
Compression level \fB\-\-best\fR may take a long time.
|
||||||
|
.PP
|
||||||
|
Note that compression level \fB\-\-best\fR can be somewhat slow for large
|
||||||
|
files, but you definitely should use it when releasing a final version
|
||||||
|
of your program.
|
||||||
|
.PP
|
||||||
|
Quick info for achieving the best compression ratio:
|
||||||
|
.IP \(bu 4
|
||||||
|
Try \fBupx \-\-brute \-\-no\-lzma myfile.exe\fR or even
|
||||||
|
\&\fBupx \-\-ultra\-brute \-\-no\-lzma myfile.exe\fR.
|
||||||
|
.IP \(bu 4
|
||||||
|
The option \fB\-\-lzma\fR enables LZMA compression, which compresses better but
|
||||||
|
is *significantly slower* at decompression. You probably do not want
|
||||||
|
to use it for large files.
|
||||||
|
.Sp
|
||||||
|
(Note that \fB\-\-lzma\fR is automatically enabled by \fB\-\-all\-methods\fR and
|
||||||
|
\&\fB\-\-brute\fR, use \fB\-\-no\-lzma\fR to override.)
|
||||||
|
.IP \(bu 4
|
||||||
|
Try if \fB\-\-overlay=strip\fR works.
|
||||||
|
.IP \(bu 4
|
||||||
|
For win32/pe programs there's \fB\-\-strip\-relocs=0\fR. See notes below.
|
||||||
|
.SH "OVERLAY HANDLING OPTIONS"
|
||||||
|
.IX Header "OVERLAY HANDLING OPTIONS"
|
||||||
|
Info: An "overlay" means auxiliary data attached after the logical end of
|
||||||
|
an executable, and it often contains application specific data
|
||||||
|
(this is a common practice to avoid an extra data file, though
|
||||||
|
it would be better to use resource sections).
|
||||||
|
.PP
|
||||||
|
\&\fBUPX\fR handles overlays like many other executable packers do: it simply
|
||||||
|
copies the overlay after the compressed image. This works with some
|
||||||
|
files, but doesn't work with others, depending on how an application
|
||||||
|
actually accesses this overlaid data.
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& \-\-overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||||
|
\&
|
||||||
|
\& \-\-overlay=strip Strip any overlay from the program instead of
|
||||||
|
\& copying it. Be warned, this may make the compressed
|
||||||
|
\& program crash or otherwise unusable.
|
||||||
|
\&
|
||||||
|
\& \-\-overlay=skip Refuse to compress any program which has an overlay.
|
||||||
|
.Ve
|
||||||
|
.SH "ENVIRONMENT VARIABLE"
|
||||||
|
.IX Header "ENVIRONMENT VARIABLE"
|
||||||
|
The environment variable \fBUPX\fR can hold a set of default
|
||||||
|
options for \fBUPX\fR. These options are interpreted first and
|
||||||
|
can be overwritten by explicit command line parameters.
|
||||||
|
For example:
|
||||||
|
.PP
|
||||||
|
.Vb 3
|
||||||
|
\& for DOS/Windows: set UPX=\-9 \-\-compress\-icons#0
|
||||||
|
\& for sh/ksh/zsh: UPX="\-9 \-\-compress\-icons=0"; export UPX
|
||||||
|
\& for csh/tcsh: setenv UPX "\-9 \-\-compress\-icons=0"
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Under DOS/Windows you must use '#' instead of '=' when setting the
|
||||||
|
environment variable because of a COMMAND.COM limitation.
|
||||||
|
.PP
|
||||||
|
Not all of the options are valid in the environment variable \-
|
||||||
|
\&\fBUPX\fR will tell you.
|
||||||
|
.PP
|
||||||
|
You can explicitly use the \fB\-\-no\-env\fR option to ignore the
|
||||||
|
environment variable.
|
||||||
|
.SH "NOTES FOR THE SUPPORTED EXECUTABLE FORMATS"
|
||||||
|
.IX Header "NOTES FOR THE SUPPORTED EXECUTABLE FORMATS"
|
||||||
|
.SS "NOTES FOR ATARI/TOS"
|
||||||
|
.IX Subsection "NOTES FOR ATARI/TOS"
|
||||||
|
This is the executable format used by the Atari ST/TT, a Motorola 68000
|
||||||
|
based personal computer which was popular in the late '80s. Support
|
||||||
|
of this format is only because of nostalgic feelings of one of
|
||||||
|
the authors and serves no practical purpose :\-).
|
||||||
|
See https://freemint.github.io for more info.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
All debug information will be stripped, though.
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR BVMLINUZ/I386"
|
||||||
|
.IX Subsection "NOTES FOR BVMLINUZ/I386"
|
||||||
|
Same as vmlinuz/i386.
|
||||||
|
.SS "NOTES FOR DOS/COM"
|
||||||
|
.IX Subsection "NOTES FOR DOS/COM"
|
||||||
|
Obviously \fBUPX\fR won't work with executables that want to read data from
|
||||||
|
themselves (like some commandline utilities that ship with Win95/98/ME).
|
||||||
|
.PP
|
||||||
|
Compressed programs only work on a 286+.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
.PP
|
||||||
|
Maximum uncompressed size: ~65100 bytes.
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& \-\-8086 Create an executable that works on any 8086 CPU.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-filters Compress the program several times, using all
|
||||||
|
\& available preprocessing filters. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default filter gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR DOS/EXE"
|
||||||
|
.IX Subsection "NOTES FOR DOS/EXE"
|
||||||
|
dos/exe stands for all "normal" 16\-bit DOS executables.
|
||||||
|
.PP
|
||||||
|
Obviously \fBUPX\fR won't work with executables that want to read data from
|
||||||
|
themselves (like some command line utilities that ship with Win95/98/ME).
|
||||||
|
.PP
|
||||||
|
Compressed programs only work on a 286+.
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& \-\-8086 Create an executable that works on any 8086 CPU.
|
||||||
|
\&
|
||||||
|
\& \-\-no\-reloc Use no relocation records in the exe header.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR DOS/SYS"
|
||||||
|
.IX Subsection "NOTES FOR DOS/SYS"
|
||||||
|
Compressed programs only work on a 286+.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
.PP
|
||||||
|
Maximum uncompressed size: ~65350 bytes.
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& \-\-8086 Create an executable that works on any 8086 CPU.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-filters Compress the program several times, using all
|
||||||
|
\& available preprocessing filters. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default filter gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR DJGPP2/COFF"
|
||||||
|
.IX Subsection "NOTES FOR DJGPP2/COFF"
|
||||||
|
First of all, it is recommended to use \fBUPX\fR *instead* of \fBstrip\fR. strip has
|
||||||
|
the very bad habit of replacing your stub with its own (outdated) version.
|
||||||
|
Additionally \fBUPX\fR corrects a bug/feature in strip v2.8.x: it
|
||||||
|
will fix the 4 KiB alignment of the stub.
|
||||||
|
.PP
|
||||||
|
\&\fBUPX\fR includes the full functionality of stubify. This means it will
|
||||||
|
automatically stubify your COFF files. Use the option \fB\-\-coff\fR to
|
||||||
|
disable this functionality (see below).
|
||||||
|
.PP
|
||||||
|
\&\fBUPX\fR automatically handles Allegro packfiles.
|
||||||
|
.PP
|
||||||
|
The DLM format (a rather exotic shared library extension) is not supported.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
All debug information and trailing garbage will be stripped, though.
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 2
|
||||||
|
\& \-\-coff Produce COFF output instead of EXE. By default
|
||||||
|
\& UPX keeps your current stub.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-filters Compress the program several times, using all
|
||||||
|
\& available preprocessing filters. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default filter gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR LINUX [general]"
|
||||||
|
.IX Subsection "NOTES FOR LINUX [general]"
|
||||||
|
Introduction
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& Linux/386 support in UPX consists of 3 different executable formats,
|
||||||
|
\& one optimized for ELF executables ("linux/elf386"), one optimized
|
||||||
|
\& for shell scripts ("linux/sh386"), and one generic format
|
||||||
|
\& ("linux/386").
|
||||||
|
\&
|
||||||
|
\& We will start with a general discussion first, but please
|
||||||
|
\& also read the relevant docs for each of the individual formats.
|
||||||
|
\&
|
||||||
|
\& Also, there is special support for bootable kernels \- see the
|
||||||
|
\& description of the vmlinuz/386 format.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
General user's overview
|
||||||
|
.PP
|
||||||
|
.Vb 7
|
||||||
|
\& Running a compressed executable program trades less space on a
|
||||||
|
\& \`\`permanent\*(Aq\*(Aq storage medium (such as a hard disk, floppy disk,
|
||||||
|
\& CD\-ROM, flash memory, EPROM, etc.) for more space in one or more
|
||||||
|
\& \`\`temporary\*(Aq\*(Aq storage media (such as RAM, swap space, /tmp, etc.).
|
||||||
|
\& Running a compressed executable also requires some additional CPU
|
||||||
|
\& cycles to generate the compressed executable in the first place,
|
||||||
|
\& and to decompress it at each invocation.
|
||||||
|
\&
|
||||||
|
\& How much space is traded? It depends on the executable, but many
|
||||||
|
\& programs save 30% to 50% of permanent disk space. How much CPU
|
||||||
|
\& overhead is there? Again, it depends on the executable, but
|
||||||
|
\& decompression speed generally is at least many megabytes per second,
|
||||||
|
\& and frequently is limited by the speed of the underlying disk
|
||||||
|
\& or network I/O.
|
||||||
|
\&
|
||||||
|
\& Depending on the statistics of usage and access, and the relative
|
||||||
|
\& speeds of CPU, RAM, swap space, /tmp, and file system storage, then
|
||||||
|
\& invoking and running a compressed executable can be faster than
|
||||||
|
\& directly running the corresponding uncompressed program.
|
||||||
|
\& The operating system might perform fewer expensive I/O operations
|
||||||
|
\& to invoke the compressed program. Paging to or from swap space
|
||||||
|
\& or /tmp might be faster than paging from the general file system.
|
||||||
|
\& \`\`Medium\-sized\*(Aq\*(Aq programs which access about 1/3 to 1/2 of their
|
||||||
|
\& stored program bytes can do particularly well with compression.
|
||||||
|
\& Small programs tend not to benefit as much because the absolute
|
||||||
|
\& savings is less. Big programs tend not to benefit proportionally
|
||||||
|
\& because each invocation may use only a small fraction of the program,
|
||||||
|
\& yet UPX decompresses the entire program before invoking it.
|
||||||
|
\& But in environments where disk or flash memory storage is limited,
|
||||||
|
\& then compression may win anyway.
|
||||||
|
\&
|
||||||
|
\& Currently, executables compressed by UPX do not share RAM at runtime
|
||||||
|
\& in the way that executables mapped from a file system do. As a
|
||||||
|
\& result, if the same program is run simultaneously by more than one
|
||||||
|
\& process, then using the compressed version will require more RAM and/or
|
||||||
|
\& swap space. So, shell programs (bash, csh, etc.) and \`\`make\*(Aq\*(Aq
|
||||||
|
\& might not be good candidates for compression.
|
||||||
|
\&
|
||||||
|
\& UPX recognizes three executable formats for Linux: Linux/elf386,
|
||||||
|
\& Linux/sh386, and Linux/386. Linux/386 is the most generic format;
|
||||||
|
\& it accommodates any file that can be executed. At runtime, the UPX
|
||||||
|
\& decompression stub re\-creates in /tmp a copy of the original file,
|
||||||
|
\& and then the copy is (re\-)executed with the same arguments.
|
||||||
|
\& ELF binary executables prefer the Linux/elf386 format by default,
|
||||||
|
\& because UPX decompresses them directly into RAM, uses only one
|
||||||
|
\& exec, does not use space in /tmp, and does not use /proc.
|
||||||
|
\& Shell scripts where the underlying shell accepts a \`\`\-c\*(Aq\*(Aq argument
|
||||||
|
\& can use the Linux/sh386 format. UPX decompresses the shell script
|
||||||
|
\& into low memory, then maps the shell and passes the entire text of the
|
||||||
|
\& script as an argument with a leading \`\`\-c\*(Aq\*(Aq.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
General benefits:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \- UPX can compress all executables, be it AOUT, ELF, libc4, libc5,
|
||||||
|
\& libc6, Shell/Perl/Python/... scripts, standalone Java .class
|
||||||
|
\& binaries, or whatever...
|
||||||
|
\& All scripts and programs will work just as before.
|
||||||
|
\&
|
||||||
|
\& \- Compressed programs are completely self\-contained. No need for
|
||||||
|
\& any external program.
|
||||||
|
\&
|
||||||
|
\& \- UPX keeps your original program untouched. This means that
|
||||||
|
\& after decompression you will have a byte\-identical version,
|
||||||
|
\& and you can use UPX as a file compressor just like gzip.
|
||||||
|
\& [ Note that UPX maintains a checksum of the file internally,
|
||||||
|
\& so it is indeed a reliable alternative. ]
|
||||||
|
\&
|
||||||
|
\& \- As the stub only uses syscalls and isn\*(Aqt linked against libc it
|
||||||
|
\& should run under any Linux configuration that can run ELF
|
||||||
|
\& binaries.
|
||||||
|
\&
|
||||||
|
\& \- For the same reason compressed executables should run under
|
||||||
|
\& FreeBSD and other systems which can run Linux binaries.
|
||||||
|
\& [ Please send feedback on this topic ]
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
General drawbacks:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \- It is not advisable to compress programs which usually have many
|
||||||
|
\& instances running (like \`sh\*(Aq or \`make\*(Aq) because the common segments of
|
||||||
|
\& compressed programs won\*(Aqt be shared any longer between different
|
||||||
|
\& processes.
|
||||||
|
\&
|
||||||
|
\& \- \`ldd\*(Aq and \`size\*(Aq won\*(Aqt show anything useful because all they
|
||||||
|
\& see is the statically linked stub. Since version 0.82 the section
|
||||||
|
\& headers are stripped from the UPX stub and \`size\*(Aq doesn\*(Aqt even
|
||||||
|
\& recognize the file format. The file patches/patch\-elfcode.h has a
|
||||||
|
\& patch to fix this bug in \`size\*(Aq and other programs which use GNU BFD.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
General notes:
|
||||||
|
.PP
|
||||||
|
.Vb 2
|
||||||
|
\& \- As UPX leaves your original program untouched it is advantageous
|
||||||
|
\& to strip it before compression.
|
||||||
|
\&
|
||||||
|
\& \- If you compress a script you will lose platform independence \-
|
||||||
|
\& this could be a problem if you are using NFS mounted disks.
|
||||||
|
\&
|
||||||
|
\& \- Compression of suid, guid and sticky\-bit programs is rejected
|
||||||
|
\& because of possible security implications.
|
||||||
|
\&
|
||||||
|
\& \- For the same reason there is no sense in making any compressed
|
||||||
|
\& program suid.
|
||||||
|
\&
|
||||||
|
\& \- Obviously UPX won\*(Aqt work with executables that want to read data
|
||||||
|
\& from themselves. E.g., this might be a problem for Perl scripts
|
||||||
|
\& which access their _\|_DATA_\|_ lines.
|
||||||
|
\&
|
||||||
|
\& \- In case of internal errors the stub will abort with exitcode 127.
|
||||||
|
\& Typical reasons for this to happen are that the program has somehow
|
||||||
|
\& been modified after compression.
|
||||||
|
\& Running \`strace \-o strace.log compressed_file\*(Aq will tell you more.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR LINUX/ELF386"
|
||||||
|
.IX Subsection "NOTES FOR LINUX/ELF386"
|
||||||
|
Please read the general Linux description first.
|
||||||
|
.PP
|
||||||
|
The linux/elf386 format decompresses directly into RAM,
|
||||||
|
uses only one exec, does not use space in /tmp,
|
||||||
|
and does not use /proc.
|
||||||
|
.PP
|
||||||
|
Linux/elf386 is automatically selected for Linux ELF executables.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
.PP
|
||||||
|
How it works:
|
||||||
|
.PP
|
||||||
|
.Vb 9
|
||||||
|
\& For ELF executables, UPX decompresses directly to memory, simulating
|
||||||
|
\& the mapping that the operating system kernel uses during exec(),
|
||||||
|
\& including the PT_INTERP program interpreter (if any).
|
||||||
|
\& The brk() is set by a special PT_LOAD segment in the compressed
|
||||||
|
\& executable itself. UPX then wipes the stack clean except for
|
||||||
|
\& arguments, environment variables, and Elf_auxv entries (this is
|
||||||
|
\& required by bugs in the startup code of /lib/ld\-linux.so as of
|
||||||
|
\& May 2000), and transfers control to the program interpreter or
|
||||||
|
\& the e_entry address of the original executable.
|
||||||
|
\&
|
||||||
|
\& The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
\& and only uses kernel syscalls. It is not linked against any libc.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Specific drawbacks:
|
||||||
|
.PP
|
||||||
|
.Vb 9
|
||||||
|
\& \- For linux/elf386 and linux/sh386 formats, you will be relying on
|
||||||
|
\& RAM and swap space to hold all of the decompressed program during
|
||||||
|
\& the lifetime of the process. If you already use most of your swap
|
||||||
|
\& space, then you may run out. A system that is "out of memory"
|
||||||
|
\& can become fragile. Many programs do not react gracefully when
|
||||||
|
\& malloc() returns 0. With newer Linux kernels, the kernel
|
||||||
|
\& may decide to kill some processes to regain memory, and you
|
||||||
|
\& may not like the kernel\*(Aqs choice of which to kill. Running
|
||||||
|
\& /usr/bin/top is one way to check on the usage of swap space.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& (none)
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR LINUX/SH386"
|
||||||
|
.IX Subsection "NOTES FOR LINUX/SH386"
|
||||||
|
Please read the general Linux description first.
|
||||||
|
.PP
|
||||||
|
Shell scripts where the underling shell accepts a ``\-c'' argument
|
||||||
|
can use the Linux/sh386 format. \fBUPX\fR decompresses the shell script
|
||||||
|
into low memory, then maps the shell and passes the entire text of the
|
||||||
|
script as an argument with a leading ``\-c''.
|
||||||
|
It does not use space in /tmp, and does not use /proc.
|
||||||
|
.PP
|
||||||
|
Linux/sh386 is automatically selected for shell scripts that
|
||||||
|
use a known shell.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
.PP
|
||||||
|
How it works:
|
||||||
|
.PP
|
||||||
|
.Vb 8
|
||||||
|
\& For shell script executables (files beginning with "#!/" or "#! /")
|
||||||
|
\& where the shell is known to accept "\-c <command>", UPX decompresses
|
||||||
|
\& the file into low memory, then maps the shell (and its PT_INTERP),
|
||||||
|
\& and passes control to the shell with the entire decompressed file
|
||||||
|
\& as the argument after "\-c". Known shells are sh, ash, bash, bsh, csh,
|
||||||
|
\& ksh, tcsh, pdksh. Restriction: UPX cannot use this method
|
||||||
|
\& for shell scripts which use the one optional string argument after
|
||||||
|
\& the shell name in the script (example: "#! /bin/sh option3\en".)
|
||||||
|
\&
|
||||||
|
\& The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
\& and only uses kernel syscalls. It is not linked against any libc.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Specific drawbacks:
|
||||||
|
.PP
|
||||||
|
.Vb 9
|
||||||
|
\& \- For linux/elf386 and linux/sh386 formats, you will be relying on
|
||||||
|
\& RAM and swap space to hold all of the decompressed program during
|
||||||
|
\& the lifetime of the process. If you already use most of your swap
|
||||||
|
\& space, then you may run out. A system that is "out of memory"
|
||||||
|
\& can become fragile. Many programs do not react gracefully when
|
||||||
|
\& malloc() returns 0. With newer Linux kernels, the kernel
|
||||||
|
\& may decide to kill some processes to regain memory, and you
|
||||||
|
\& may not like the kernel\*(Aqs choice of which to kill. Running
|
||||||
|
\& /usr/bin/top is one way to check on the usage of swap space.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& (none)
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR LINUX/386"
|
||||||
|
.IX Subsection "NOTES FOR LINUX/386"
|
||||||
|
Please read the general Linux description first.
|
||||||
|
.PP
|
||||||
|
The generic linux/386 format decompresses to /tmp and needs
|
||||||
|
/proc file system support. It starts the decompressed program
|
||||||
|
via the \fBexecve()\fR syscall.
|
||||||
|
.PP
|
||||||
|
Linux/386 is only selected if the specialized linux/elf386
|
||||||
|
and linux/sh386 won't recognize a file.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
.PP
|
||||||
|
How it works:
|
||||||
|
.PP
|
||||||
|
.Vb 7
|
||||||
|
\& For files which are not ELF and not a script for a known "\-c" shell,
|
||||||
|
\& UPX uses kernel execve(), which first requires decompressing to a
|
||||||
|
\& temporary file in the file system. Interestingly \-
|
||||||
|
\& because of the good memory management of the Linux kernel \- this
|
||||||
|
\& often does not introduce a noticeable delay, and in fact there
|
||||||
|
\& will be no disk access at all if you have enough free memory as
|
||||||
|
\& the entire process takes places within the file system buffers.
|
||||||
|
\&
|
||||||
|
\& A compressed executable consists of the UPX stub and an overlay
|
||||||
|
\& which contains the original program in a compressed form.
|
||||||
|
\&
|
||||||
|
\& The UPX stub is a statically linked ELF executable and does
|
||||||
|
\& the following at program startup:
|
||||||
|
\&
|
||||||
|
\& 1) decompress the overlay to a temporary location in /tmp
|
||||||
|
\& 2) open the temporary file for reading
|
||||||
|
\& 3) try to delete the temporary file and start (execve)
|
||||||
|
\& the uncompressed program in /tmp using /proc/<pid>/fd/X as
|
||||||
|
\& attained by step 2)
|
||||||
|
\& 4) if that fails, fork off a subprocess to clean up and
|
||||||
|
\& start the program in /tmp in the meantime
|
||||||
|
\&
|
||||||
|
\& The UPX stub is about 1700 bytes long, partly written in assembler
|
||||||
|
\& and only uses kernel syscalls. It is not linked against any libc.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Specific drawbacks:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \- You need additional free disk space for the uncompressed program
|
||||||
|
\& in your /tmp directory. This program is deleted immediately after
|
||||||
|
\& decompression, but you still need it for the full execution time
|
||||||
|
\& of the program.
|
||||||
|
\&
|
||||||
|
\& \- You must have /proc file system support as the stub wants to open
|
||||||
|
\& /proc/<pid>/exe and needs /proc/<pid>/fd/X. This also means that you
|
||||||
|
\& cannot compress programs that are used during the boot sequence
|
||||||
|
\& before /proc is mounted.
|
||||||
|
\&
|
||||||
|
\& \- Utilities like \`top\*(Aq will display numerical values in the process
|
||||||
|
\& name field. This is because Linux computes the process name from
|
||||||
|
\& the first argument of the last execve syscall (which is typically
|
||||||
|
\& something like /proc/<pid>/fd/3).
|
||||||
|
\&
|
||||||
|
\& \- Because of temporary decompression to disk the decompression speed
|
||||||
|
\& is not as fast as with the other executable formats. Still, I can see
|
||||||
|
\& no noticeable delay when starting programs like my ~3 MiB emacs (which
|
||||||
|
\& is less than 1 MiB when compressed :\-).
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 3
|
||||||
|
\& \-\-force\-execve Force the use of the generic linux/386 "execve"
|
||||||
|
\& format, i.e. do not try the linux/elf386 and
|
||||||
|
\& linux/sh386 formats.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR PS1/EXE"
|
||||||
|
.IX Subsection "NOTES FOR PS1/EXE"
|
||||||
|
This is the executable format used by the Sony PlayStation (PSone),
|
||||||
|
a MIPS R3000 based gaming console which is popular since the late '90s.
|
||||||
|
Support of this format is very similar to the Atari one, because of
|
||||||
|
nostalgic feelings of one of the authors.
|
||||||
|
.PP
|
||||||
|
Packed programs will be byte-identical to the original after uncompression,
|
||||||
|
until further notice.
|
||||||
|
.PP
|
||||||
|
Maximum uncompressed size: ~1.89 / ~7.60 MiB.
|
||||||
|
.PP
|
||||||
|
Notes:
|
||||||
|
.PP
|
||||||
|
.Vb 6
|
||||||
|
\& \- UPX creates as default a suitable executable for CD\-Mastering
|
||||||
|
\& and console transfer. For a CD\-Master main executable you could also try
|
||||||
|
\& the special option "\-\-boot\-only" as described below.
|
||||||
|
\& It has been reported that upx packed executables are fully compatible with
|
||||||
|
\& the Sony PlayStation 2 (PS2, PStwo) and Sony PlayStation Portable (PSP) in
|
||||||
|
\& Sony PlayStation (PSone) emulation mode.
|
||||||
|
\&
|
||||||
|
\& \- Normally the packed files use the same memory areas like the uncompressed
|
||||||
|
\& versions, so they will not override other memory areas while unpacking.
|
||||||
|
\& If this isn\*(Aqt possible UPX will abort showing a \*(Aqpacked data overlap\*(Aq
|
||||||
|
\& error. With the "\-\-force" option UPX will relocate the loading address
|
||||||
|
\& for the packed file, but this isn\*(Aqt a real problem if it is a single or
|
||||||
|
\& the main executable.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
\&
|
||||||
|
\& \-\-8\-bit Uses 8 bit size compression [default: 32 bit]
|
||||||
|
\&
|
||||||
|
\& \-\-8mib\-ram PSone has 8 MiB ram available [default: 2 MiB]
|
||||||
|
\&
|
||||||
|
\& \-\-boot\-only This format is for main exes and CD\-Mastering only !
|
||||||
|
\& It may slightly improve the compression ratio,
|
||||||
|
\& decompression routines are faster than default ones.
|
||||||
|
\& But it cannot be used for console transfer !
|
||||||
|
\&
|
||||||
|
\& \-\-no\-align This option disables CD mode 2 data sector format
|
||||||
|
\& alignment. May slightly improves the compression ratio,
|
||||||
|
\& but the compressed executable will not boot from a CD.
|
||||||
|
\& Use it for console transfer only !
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR RTM32/PE and ARM/PE"
|
||||||
|
.IX Subsection "NOTES FOR RTM32/PE and ARM/PE"
|
||||||
|
Same as win32/pe.
|
||||||
|
.SS "NOTES FOR TMT/ADAM"
|
||||||
|
.IX Subsection "NOTES FOR TMT/ADAM"
|
||||||
|
This format is used by the TMT Pascal compiler \- see http://www.tmt.com/ .
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-filters Compress the program several times, using all
|
||||||
|
\& available preprocessing filters. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default filter gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR VMLINUZ/386"
|
||||||
|
.IX Subsection "NOTES FOR VMLINUZ/386"
|
||||||
|
The vmlinuz/386 and bvmlinuz/386 formats take a gzip-compressed
|
||||||
|
bootable Linux kernel image ("vmlinuz", "zImage", "bzImage"),
|
||||||
|
gzip-decompress it and re-compress it with the \fBUPX\fR compression method.
|
||||||
|
.PP
|
||||||
|
vmlinuz/386 is completely unrelated to the other Linux executable
|
||||||
|
formats, and it does not share any of their drawbacks.
|
||||||
|
.PP
|
||||||
|
Notes:
|
||||||
|
.PP
|
||||||
|
.Vb 3
|
||||||
|
\& \- Be sure that "vmlinuz/386" or "bvmlinuz/386" is displayed
|
||||||
|
\& during compression \- otherwise a wrong executable format
|
||||||
|
\& may have been used, and the kernel won\*(Aqt boot.
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Benefits:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \- Better compression (but note that the kernel was already compressed,
|
||||||
|
\& so the improvement is not as large as with other formats).
|
||||||
|
\& Still, the bytes saved may be essential for special needs like
|
||||||
|
\& boot disks.
|
||||||
|
\&
|
||||||
|
\& For example, this is what I get for my 2.2.16 kernel:
|
||||||
|
\& 1589708 vmlinux
|
||||||
|
\& 641073 bzImage [original]
|
||||||
|
\& 560755 bzImage.upx [compressed by "upx \-9"]
|
||||||
|
\&
|
||||||
|
\& \- Much faster decompression at kernel boot time (but kernel
|
||||||
|
\& decompression speed is not really an issue these days).
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Drawbacks:
|
||||||
|
.PP
|
||||||
|
.Vb 1
|
||||||
|
\& (none)
|
||||||
|
.Ve
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 4
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-filters Compress the program several times, using all
|
||||||
|
\& available preprocessing filters. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default filter gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR WATCOM/LE"
|
||||||
|
.IX Subsection "NOTES FOR WATCOM/LE"
|
||||||
|
\&\fBUPX\fR has been successfully tested with the following extenders:
|
||||||
|
DOS4G, DOS4GW, PMODE/W, DOS32a, CauseWay.
|
||||||
|
The WDOS/X extender is partly supported (for details
|
||||||
|
see the file bugs BUGS).
|
||||||
|
.PP
|
||||||
|
DLLs and the LX format are not supported.
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 2
|
||||||
|
\& \-\-le Produce an unbound LE output instead of
|
||||||
|
\& keeping the current stub.
|
||||||
|
.Ve
|
||||||
|
.SS "NOTES FOR WIN32/PE"
|
||||||
|
.IX Subsection "NOTES FOR WIN32/PE"
|
||||||
|
The PE support in \fBUPX\fR is quite stable now, but probably there are
|
||||||
|
still some incompatibilities with some files.
|
||||||
|
.PP
|
||||||
|
Because of the way \fBUPX\fR (and other packers for this format) works, you
|
||||||
|
can see increased memory usage of your compressed files because the whole
|
||||||
|
program is loaded into memory at startup.
|
||||||
|
If you start several instances of huge compressed programs you're
|
||||||
|
wasting memory because the common segments of the program won't
|
||||||
|
get shared across the instances.
|
||||||
|
On the other hand if you're compressing only smaller programs, or
|
||||||
|
running only one instance of larger programs, then this penalty is
|
||||||
|
smaller, but it's still there.
|
||||||
|
.PP
|
||||||
|
If you're running executables from network, then compressed programs
|
||||||
|
will load faster, and require less bandwidth during execution.
|
||||||
|
.PP
|
||||||
|
DLLs are supported. But UPX compressed DLLs can not share common data and
|
||||||
|
code when they got used by multiple applications. So compressing msvcrt.dll
|
||||||
|
is a waste of memory, but compressing the dll plugins of a particular
|
||||||
|
application may be a better idea.
|
||||||
|
.PP
|
||||||
|
Screensavers are supported, with the restriction that the filename
|
||||||
|
must end with ".scr" (as screensavers are handled slightly different
|
||||||
|
than normal exe files).
|
||||||
|
.PP
|
||||||
|
UPX compressed PE files have some minor memory overhead (usually in the
|
||||||
|
10 \- 30 KiB range) which can be seen by specifying the "\-i" command
|
||||||
|
line switch during compression.
|
||||||
|
.PP
|
||||||
|
Extra options available for this executable format:
|
||||||
|
.PP
|
||||||
|
.Vb 9
|
||||||
|
\& \-\-compress\-exports=0 Don\*(Aqt compress the export section.
|
||||||
|
\& Use this if you plan to run the compressed
|
||||||
|
\& program under Wine.
|
||||||
|
\& \-\-compress\-exports=1 Compress the export section. [DEFAULT]
|
||||||
|
\& Compression of the export section can improve the
|
||||||
|
\& compression ratio quite a bit but may not work
|
||||||
|
\& with all programs (like winword.exe).
|
||||||
|
\& UPX never compresses the export section of a DLL
|
||||||
|
\& regardless of this option.
|
||||||
|
\&
|
||||||
|
\& \-\-compress\-icons=0 Don\*(Aqt compress any icons.
|
||||||
|
\& \-\-compress\-icons=1 Compress all but the first icon.
|
||||||
|
\& \-\-compress\-icons=2 Compress all icons which are not in the
|
||||||
|
\& first icon directory. [DEFAULT]
|
||||||
|
\& \-\-compress\-icons=3 Compress all icons.
|
||||||
|
\&
|
||||||
|
\& \-\-compress\-resources=0 Don\*(Aqt compress any resources at all.
|
||||||
|
\&
|
||||||
|
\& \-\-keep\-resource=list Don\*(Aqt compress resources specified by the list.
|
||||||
|
\& The members of the list are separated by commas.
|
||||||
|
\& A list member has the following format: I<type[/name]>.
|
||||||
|
\& I<Type> is the type of the resource. Standard types
|
||||||
|
\& must be specified as decimal numbers, user types can be
|
||||||
|
\& specified by decimal IDs or strings. I<Name> is the
|
||||||
|
\& identifier of the resource. It can be a decimal number
|
||||||
|
\& or a string. For example:
|
||||||
|
\&
|
||||||
|
\& \-\-keep\-resource=2/MYBITMAP,5,6/12345
|
||||||
|
\&
|
||||||
|
\& UPX won\*(Aqt compress the named bitmap resource "MYBITMAP",
|
||||||
|
\& it leaves every dialog (5) resource uncompressed, and
|
||||||
|
\& it won\*(Aqt touch the string table resource with identifier
|
||||||
|
\& 12345.
|
||||||
|
\&
|
||||||
|
\& \-\-force Force compression even when there is an
|
||||||
|
\& unexpected value in a header field.
|
||||||
|
\& Use with care.
|
||||||
|
\&
|
||||||
|
\& \-\-strip\-relocs=0 Don\*(Aqt strip relocation records.
|
||||||
|
\& \-\-strip\-relocs=1 Strip relocation records. [DEFAULT]
|
||||||
|
\& This option only works on executables with base
|
||||||
|
\& address greater or equal to 0x400000. Usually the
|
||||||
|
\& compressed files becomes smaller, but some files
|
||||||
|
\& may become larger. Note that the resulting file will
|
||||||
|
\& not work under Windows 3.x (Win32s).
|
||||||
|
\& UPX never strips relocations from a DLL
|
||||||
|
\& regardless of this option.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-methods Compress the program several times, using all
|
||||||
|
\& available compression methods. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default method gives the best results anyway.
|
||||||
|
\&
|
||||||
|
\& \-\-all\-filters Compress the program several times, using all
|
||||||
|
\& available preprocessing filters. This may improve
|
||||||
|
\& the compression ratio in some cases, but usually
|
||||||
|
\& the default filter gives the best results anyway.
|
||||||
|
.Ve
|
||||||
|
.SH DIAGNOSTICS
|
||||||
|
.IX Header "DIAGNOSTICS"
|
||||||
|
Exit status is normally 0; if an error occurs, exit status
|
||||||
|
is 1. If a warning occurs, exit status is 2.
|
||||||
|
.PP
|
||||||
|
\&\fBUPX\fR's diagnostics are intended to be self-explanatory.
|
||||||
|
.SH BUGS
|
||||||
|
.IX Header "BUGS"
|
||||||
|
Please report all bugs immediately to the authors.
|
||||||
|
.SH AUTHORS
|
||||||
|
.IX Header "AUTHORS"
|
||||||
|
.Vb 2
|
||||||
|
\& Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||||
|
\& http://www.oberhumer.com
|
||||||
|
\&
|
||||||
|
\& Laszlo Molnar <ezerotven+github@gmail.com>
|
||||||
|
\&
|
||||||
|
\& John F. Reiser <jreiser@BitWagon.com>
|
||||||
|
.Ve
|
||||||
|
.SH COPYRIGHT
|
||||||
|
.IX Header "COPYRIGHT"
|
||||||
|
Copyright (C) 1996\-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
.PP
|
||||||
|
Copyright (C) 1996\-2024 Laszlo Molnar
|
||||||
|
.PP
|
||||||
|
Copyright (C) 2000\-2024 John F. Reiser
|
||||||
|
.PP
|
||||||
|
\&\fBUPX\fR is distributed with full source code under the terms of the
|
||||||
|
GNU General Public License v2+; either under the pure GPLv2+ (see
|
||||||
|
the file COPYING), or (at your option) under the GPLv+2 with special
|
||||||
|
exceptions and restrictions granting the free usage for all binaries
|
||||||
|
including commercial programs (see the file LICENSE).
|
||||||
|
.PP
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
.PP
|
||||||
|
You should have received a copy of the UPX License Agreements along
|
||||||
|
with this program; see the files COPYING and LICENSE. If not,
|
||||||
|
visit the UPX home page.
|
||||||
+140
-131
@@ -12,9 +12,9 @@ B<upx> S<[ I<command> ]> S<[ I<options> ]> I<filename>...
|
|||||||
|
|
||||||
=head1 ABSTRACT
|
=head1 ABSTRACT
|
||||||
|
|
||||||
The Ultimate Packer for eXecutables
|
The Ultimate Packer for eXecutables
|
||||||
Copyright (c) 1996-2004 Markus Oberhumer & Laszlo Molnar
|
Copyright (c) 1996-2024 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||||
http://upx.sourceforge.net
|
https://upx.github.io
|
||||||
|
|
||||||
|
|
||||||
B<UPX> is a portable, extendable, high-performance executable packer for
|
B<UPX> is a portable, extendable, high-performance executable packer for
|
||||||
@@ -23,69 +23,59 @@ ratio and offers I<*very*> fast decompression. Your executables suffer
|
|||||||
no memory overhead or other drawbacks for most of the formats supported,
|
no memory overhead or other drawbacks for most of the formats supported,
|
||||||
because of in-place decompression.
|
because of in-place decompression.
|
||||||
|
|
||||||
While you may use B<UPX> freely for both non-commercial and commercial
|
|
||||||
executables (for details see the file LICENSE), we would highly
|
|
||||||
appreciate if you credit B<UPX> and ourselves in the documentation,
|
|
||||||
possibly including a reference to the B<UPX> home page. Thanks.
|
|
||||||
|
|
||||||
[ Using B<UPX> in non-OpenSource applications without proper credits
|
|
||||||
is considered not politically correct ;-) ]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head1 DISCLAIMER
|
=head1 DISCLAIMER
|
||||||
|
|
||||||
B<UPX> comes with ABSOLUTELY NO WARRANTY; for details see the file LICENSE.
|
B<UPX> comes with ABSOLUTELY NO WARRANTY; for details see the file COPYING.
|
||||||
|
|
||||||
This is the first production quality release, and we plan that future 1.xx
|
|
||||||
releases will be backward compatible with this version.
|
|
||||||
|
|
||||||
Please report all problems or suggestions to the authors. Thanks.
|
Please report all problems or suggestions to the authors. Thanks.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=head1 SECURITY CONTEXT
|
||||||
|
|
||||||
|
IMPORTANT NOTE: B<UPX> inherits the security context of any files it handles.
|
||||||
|
|
||||||
|
This means that packing, unpacking, or even testing or listing a file requires
|
||||||
|
the same security considerations as actually executing the file.
|
||||||
|
|
||||||
|
Use B<UPX> on trusted files only!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
B<UPX> is a versatile executable packer with the following features:
|
B<UPX> is a versatile executable packer with the following features:
|
||||||
|
|
||||||
- excellent compression ratio: compresses better than zip/gzip,
|
- secure: as UPX is documented Open Source since many years any relevant
|
||||||
|
Security/Antivirus software is able to peek inside UPX compressed
|
||||||
|
apps to verify them
|
||||||
|
|
||||||
|
- excellent compression ratio: typically compresses better than Zip,
|
||||||
use UPX to decrease the size of your distribution !
|
use UPX to decrease the size of your distribution !
|
||||||
|
|
||||||
- very fast decompression: about 10 MB/sec on an ancient Pentium 133,
|
- very fast decompression: more than 500 MB/sec on any reasonably modern
|
||||||
about 200 MB/sec on an Athlon XP 2000+.
|
machine
|
||||||
|
|
||||||
- no memory overhead for your compressed executables for most of the
|
- no memory overhead for your compressed executables for most of the
|
||||||
supported formats
|
supported formats because of in-place decompression
|
||||||
|
|
||||||
- safe: you can list, test and unpack your executables
|
- safe: you can list, test and unpack your executables.
|
||||||
Also, a checksum of both the compressed and uncompressed file is
|
Also, a checksum of both the compressed and uncompressed file is
|
||||||
maintained internally.
|
maintained internally.
|
||||||
|
|
||||||
- universal: UPX can pack a number of executable formats:
|
- universal: UPX can pack a number of executable formats, including
|
||||||
* atari/tos
|
Windows programs and DLLs, macOS apps and Linux executables
|
||||||
* bvmlinuz/386 [bootable Linux kernel]
|
|
||||||
* djgpp2/coff
|
|
||||||
* dos/com
|
|
||||||
* dos/exe
|
|
||||||
* dos/sys
|
|
||||||
* linux/386
|
|
||||||
* linux/elf386
|
|
||||||
* linux/sh386
|
|
||||||
* ps1/exe
|
|
||||||
* rtm32/pe
|
|
||||||
* tmt/adam
|
|
||||||
* vmlinuz/386 [bootable Linux kernel]
|
|
||||||
* watcom/le (supporting DOS4G, PMODE/W, DOS32a and CauseWay)
|
|
||||||
* win32/pe
|
|
||||||
|
|
||||||
- portable: UPX is written in portable endian-neutral C++
|
- portable: UPX is written in portable endian-neutral C++
|
||||||
|
|
||||||
- extendable: because of the class layout it's very easy to support
|
- extendable: because of the class layout it's very easy to support
|
||||||
new executable formats or add new compression algorithms
|
new executable formats or add new compression algorithms
|
||||||
|
|
||||||
- free: UPX can be distributed and used freely. And from version 0.99
|
- free: UPX is distributed with full source code under the GNU General
|
||||||
the full source code of UPX is released under the GNU General Public
|
Public License v2+, with special exceptions granting the free usage
|
||||||
License (GPL) !
|
for commercial programs
|
||||||
|
|
||||||
You probably understand now why we call B<UPX> the "I<ultimate>"
|
You probably understand now why we call B<UPX> the "I<ultimate>"
|
||||||
executable packer.
|
executable packer.
|
||||||
@@ -133,7 +123,18 @@ B<--help>: prints the help
|
|||||||
|
|
||||||
B<--version>: print the version of B<UPX>
|
B<--version>: print the version of B<UPX>
|
||||||
|
|
||||||
[ ...to be written... - type `B<upx --help>' for now ]
|
B<--exact>: when compressing, require to be able to get a byte-identical file
|
||||||
|
after decompression with option B<-d>. [NOTE: this is work in progress and is
|
||||||
|
not supported for all formats yet. If you do care, as a workaround you can
|
||||||
|
compress and then decompress your program a first time - any further
|
||||||
|
compress-decompress steps should then yield byte-identical results
|
||||||
|
as compared to the first decompressed version.]
|
||||||
|
|
||||||
|
B<-k>: keep backup files
|
||||||
|
|
||||||
|
B<-o file>: write output to file
|
||||||
|
|
||||||
|
[ ...more docs need to be written... - type `B<upx --help>' for now ]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -141,7 +142,7 @@ B<--version>: print the version of B<UPX>
|
|||||||
|
|
||||||
B<UPX> offers ten different compression levels from B<-1> to B<-9>,
|
B<UPX> offers ten different compression levels from B<-1> to B<-9>,
|
||||||
and B<--best>. The default compression level is B<-8> for files
|
and B<--best>. The default compression level is B<-8> for files
|
||||||
smaller than 512 kB, and B<-7> otherwise.
|
smaller than 512 KiB, and B<-7> otherwise.
|
||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
@@ -167,38 +168,23 @@ Note that compression level B<--best> can be somewhat slow for large
|
|||||||
files, but you definitely should use it when releasing a final version
|
files, but you definitely should use it when releasing a final version
|
||||||
of your program.
|
of your program.
|
||||||
|
|
||||||
Quick start for achieving the best compression ratio:
|
Quick info for achieving the best compression ratio:
|
||||||
|
|
||||||
=over 4
|
|
||||||
|
|
||||||
Try B<upx --brute myfile.exe>.
|
|
||||||
|
|
||||||
=back
|
|
||||||
|
|
||||||
Details for achieving the best compression ratio:
|
|
||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
=item *
|
=item *
|
||||||
|
|
||||||
Use the compression level B<--best>.
|
Try B<upx --brute --no-lzma myfile.exe> or even
|
||||||
|
B<upx --ultra-brute --no-lzma myfile.exe>.
|
||||||
|
|
||||||
=item *
|
=item *
|
||||||
|
|
||||||
Try one or both of the options B<--all-methods> and B<--all-filters>.
|
The option B<--lzma> enables LZMA compression, which compresses better but
|
||||||
|
is *significantly slower* at decompression. You probably do not want
|
||||||
|
to use it for large files.
|
||||||
|
|
||||||
=item *
|
(Note that B<--lzma> is automatically enabled by B<--all-methods> and
|
||||||
|
B<--brute>, use B<--no-lzma> to override.)
|
||||||
Try the option B<--crp-ms=NUMBER>. This uses more memory during compression
|
|
||||||
to achieve a (slightly) better compression ratio.
|
|
||||||
|
|
||||||
NUMBER must be a decimal value from 10000 to 999999, inclusive.
|
|
||||||
The default value is 10000 (ten thousand).
|
|
||||||
|
|
||||||
=item *
|
|
||||||
|
|
||||||
Info: the option B<--brute> is an abbrevation for the options
|
|
||||||
B<S<--best> S<--all-methods> S<--all-filters> S<--crp-ms=999999>>.
|
|
||||||
|
|
||||||
=item *
|
=item *
|
||||||
|
|
||||||
@@ -214,7 +200,7 @@ For win32/pe programs there's B<--strip-relocs=0>. See notes below.
|
|||||||
|
|
||||||
=head1 OVERLAY HANDLING OPTIONS
|
=head1 OVERLAY HANDLING OPTIONS
|
||||||
|
|
||||||
Info: An "overlay" means auxillary data atached after the logical end of
|
Info: An "overlay" means auxiliary data attached after the logical end of
|
||||||
an executable, and it often contains application specific data
|
an executable, and it often contains application specific data
|
||||||
(this is a common practice to avoid an extra data file, though
|
(this is a common practice to avoid an extra data file, though
|
||||||
it would be better to use resource sections).
|
it would be better to use resource sections).
|
||||||
@@ -222,10 +208,7 @@ it would be better to use resource sections).
|
|||||||
B<UPX> handles overlays like many other executable packers do: it simply
|
B<UPX> handles overlays like many other executable packers do: it simply
|
||||||
copies the overlay after the compressed image. This works with some
|
copies the overlay after the compressed image. This works with some
|
||||||
files, but doesn't work with others, depending on how an application
|
files, but doesn't work with others, depending on how an application
|
||||||
actually accesses this overlayed data.
|
actually accesses this overlaid data.
|
||||||
|
|
||||||
Since version 0.90 UPX defaults to B<--overlay=copy> for
|
|
||||||
all executable formats.
|
|
||||||
|
|
||||||
--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||||
|
|
||||||
@@ -237,7 +220,7 @@ all executable formats.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head1 ENVIRONMENT
|
=head1 ENVIRONMENT VARIABLE
|
||||||
|
|
||||||
The environment variable B<UPX> can hold a set of default
|
The environment variable B<UPX> can hold a set of default
|
||||||
options for B<UPX>. These options are interpreted first and
|
options for B<UPX>. These options are interpreted first and
|
||||||
@@ -267,7 +250,7 @@ This is the executable format used by the Atari ST/TT, a Motorola 68000
|
|||||||
based personal computer which was popular in the late '80s. Support
|
based personal computer which was popular in the late '80s. Support
|
||||||
of this format is only because of nostalgic feelings of one of
|
of this format is only because of nostalgic feelings of one of
|
||||||
the authors and serves no practical purpose :-).
|
the authors and serves no practical purpose :-).
|
||||||
See http://www.freemint.de for more info.
|
See https://freemint.github.io for more info.
|
||||||
|
|
||||||
Packed programs will be byte-identical to the original after uncompression.
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
All debug information will be stripped, though.
|
All debug information will be stripped, though.
|
||||||
@@ -338,9 +321,6 @@ Extra options available for this executable format:
|
|||||||
|
|
||||||
=head2 NOTES FOR DOS/SYS
|
=head2 NOTES FOR DOS/SYS
|
||||||
|
|
||||||
You can only compress plain sys files, sys/exe (two in one)
|
|
||||||
combos are not supported.
|
|
||||||
|
|
||||||
Compressed programs only work on a 286+.
|
Compressed programs only work on a 286+.
|
||||||
|
|
||||||
Packed programs will be byte-identical to the original after uncompression.
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
@@ -368,7 +348,7 @@ Extra options available for this executable format:
|
|||||||
First of all, it is recommended to use B<UPX> *instead* of B<strip>. strip has
|
First of all, it is recommended to use B<UPX> *instead* of B<strip>. strip has
|
||||||
the very bad habit of replacing your stub with its own (outdated) version.
|
the very bad habit of replacing your stub with its own (outdated) version.
|
||||||
Additionally B<UPX> corrects a bug/feature in strip v2.8.x: it
|
Additionally B<UPX> corrects a bug/feature in strip v2.8.x: it
|
||||||
will fix the 4 KByte aligment of the stub.
|
will fix the 4 KiB alignment of the stub.
|
||||||
|
|
||||||
B<UPX> includes the full functionality of stubify. This means it will
|
B<UPX> includes the full functionality of stubify. This means it will
|
||||||
automatically stubify your COFF files. Use the option B<--coff> to
|
automatically stubify your COFF files. Use the option B<--coff> to
|
||||||
@@ -403,7 +383,7 @@ Extra options available for this executable format:
|
|||||||
Introduction
|
Introduction
|
||||||
|
|
||||||
Linux/386 support in UPX consists of 3 different executable formats,
|
Linux/386 support in UPX consists of 3 different executable formats,
|
||||||
one optimized for ELF excutables ("linux/elf386"), one optimized
|
one optimized for ELF executables ("linux/elf386"), one optimized
|
||||||
for shell scripts ("linux/sh386"), and one generic format
|
for shell scripts ("linux/sh386"), and one generic format
|
||||||
("linux/386").
|
("linux/386").
|
||||||
|
|
||||||
@@ -431,14 +411,14 @@ General user's overview
|
|||||||
or network I/O.
|
or network I/O.
|
||||||
|
|
||||||
Depending on the statistics of usage and access, and the relative
|
Depending on the statistics of usage and access, and the relative
|
||||||
speeds of CPU, RAM, swap space, /tmp, and filesystem storage, then
|
speeds of CPU, RAM, swap space, /tmp, and file system storage, then
|
||||||
invoking and running a compressed executable can be faster than
|
invoking and running a compressed executable can be faster than
|
||||||
directly running the corresponding uncompressed program.
|
directly running the corresponding uncompressed program.
|
||||||
The operating system might perfrom fewer expensive I/O operations
|
The operating system might perform fewer expensive I/O operations
|
||||||
to invoke the compressed program. Paging to or from swap space
|
to invoke the compressed program. Paging to or from swap space
|
||||||
or /tmp might be faster than paging from the general filesystem.
|
or /tmp might be faster than paging from the general file system.
|
||||||
``Medium-sized'' programs which access about 1/3 to 1/2 of their
|
``Medium-sized'' programs which access about 1/3 to 1/2 of their
|
||||||
stored program bytes can do particulary well with compression.
|
stored program bytes can do particularly well with compression.
|
||||||
Small programs tend not to benefit as much because the absolute
|
Small programs tend not to benefit as much because the absolute
|
||||||
savings is less. Big programs tend not to benefit proportionally
|
savings is less. Big programs tend not to benefit proportionally
|
||||||
because each invocation may use only a small fraction of the program,
|
because each invocation may use only a small fraction of the program,
|
||||||
@@ -447,7 +427,7 @@ General user's overview
|
|||||||
then compression may win anyway.
|
then compression may win anyway.
|
||||||
|
|
||||||
Currently, executables compressed by UPX do not share RAM at runtime
|
Currently, executables compressed by UPX do not share RAM at runtime
|
||||||
in the way that executables mapped from a filesystem do. As a
|
in the way that executables mapped from a file system do. As a
|
||||||
result, if the same program is run simultaneously by more than one
|
result, if the same program is run simultaneously by more than one
|
||||||
process, then using the compressed version will require more RAM and/or
|
process, then using the compressed version will require more RAM and/or
|
||||||
swap space. So, shell programs (bash, csh, etc.) and ``make''
|
swap space. So, shell programs (bash, csh, etc.) and ``make''
|
||||||
@@ -536,7 +516,7 @@ The linux/elf386 format decompresses directly into RAM,
|
|||||||
uses only one exec, does not use space in /tmp,
|
uses only one exec, does not use space in /tmp,
|
||||||
and does not use /proc.
|
and does not use /proc.
|
||||||
|
|
||||||
Linux/elf386 is automatically selected for Linux ELF exectuables.
|
Linux/elf386 is automatically selected for Linux ELF executables.
|
||||||
|
|
||||||
Packed programs will be byte-identical to the original after uncompression.
|
Packed programs will be byte-identical to the original after uncompression.
|
||||||
|
|
||||||
@@ -625,7 +605,7 @@ Extra options available for this executable format:
|
|||||||
Please read the general Linux description first.
|
Please read the general Linux description first.
|
||||||
|
|
||||||
The generic linux/386 format decompresses to /tmp and needs
|
The generic linux/386 format decompresses to /tmp and needs
|
||||||
/proc filesystem support. It starts the decompressed program
|
/proc file system support. It starts the decompressed program
|
||||||
via the execve() syscall.
|
via the execve() syscall.
|
||||||
|
|
||||||
Linux/386 is only selected if the specialized linux/elf386
|
Linux/386 is only selected if the specialized linux/elf386
|
||||||
@@ -637,11 +617,11 @@ How it works:
|
|||||||
|
|
||||||
For files which are not ELF and not a script for a known "-c" shell,
|
For files which are not ELF and not a script for a known "-c" shell,
|
||||||
UPX uses kernel execve(), which first requires decompressing to a
|
UPX uses kernel execve(), which first requires decompressing to a
|
||||||
temporary file in the filesystem. Interestingly -
|
temporary file in the file system. Interestingly -
|
||||||
because of the good memory management of the Linux kernel - this
|
because of the good memory management of the Linux kernel - this
|
||||||
often does not introduce a noticable delay, and in fact there
|
often does not introduce a noticeable delay, and in fact there
|
||||||
will be no disk access at all if you have enough free memory as
|
will be no disk access at all if you have enough free memory as
|
||||||
the entire process takes places within the filesystem buffers.
|
the entire process takes places within the file system buffers.
|
||||||
|
|
||||||
A compressed executable consists of the UPX stub and an overlay
|
A compressed executable consists of the UPX stub and an overlay
|
||||||
which contains the original program in a compressed form.
|
which contains the original program in a compressed form.
|
||||||
@@ -667,7 +647,7 @@ Specific drawbacks:
|
|||||||
decompression, but you still need it for the full execution time
|
decompression, but you still need it for the full execution time
|
||||||
of the program.
|
of the program.
|
||||||
|
|
||||||
- You must have /proc filesystem support as the stub wants to open
|
- You must have /proc file system support as the stub wants to open
|
||||||
/proc/<pid>/exe and needs /proc/<pid>/fd/X. This also means that you
|
/proc/<pid>/exe and needs /proc/<pid>/fd/X. This also means that you
|
||||||
cannot compress programs that are used during the boot sequence
|
cannot compress programs that are used during the boot sequence
|
||||||
before /proc is mounted.
|
before /proc is mounted.
|
||||||
@@ -679,8 +659,8 @@ Specific drawbacks:
|
|||||||
|
|
||||||
- Because of temporary decompression to disk the decompression speed
|
- Because of temporary decompression to disk the decompression speed
|
||||||
is not as fast as with the other executable formats. Still, I can see
|
is not as fast as with the other executable formats. Still, I can see
|
||||||
no noticable delay when starting programs like my ~3 MB emacs (which
|
no noticeable delay when starting programs like my ~3 MiB emacs (which
|
||||||
is less than 1 MB when compressed :-).
|
is less than 1 MiB when compressed :-).
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
|
|
||||||
@@ -693,26 +673,30 @@ Extra options available for this executable format:
|
|||||||
=head2 NOTES FOR PS1/EXE
|
=head2 NOTES FOR PS1/EXE
|
||||||
|
|
||||||
This is the executable format used by the Sony PlayStation (PSone),
|
This is the executable format used by the Sony PlayStation (PSone),
|
||||||
a Mips R3000 based gaming console which is popular since the late '90s.
|
a MIPS R3000 based gaming console which is popular since the late '90s.
|
||||||
Support of this format is very similar to the Atari one, because of
|
Support of this format is very similar to the Atari one, because of
|
||||||
nostalgic feelings of one of the authors, but this format maybe serves
|
nostalgic feelings of one of the authors.
|
||||||
a practical purpose ;-).
|
|
||||||
|
|
||||||
Packed programs will be byte-identical to the original after uncompression.
|
Packed programs will be byte-identical to the original after uncompression,
|
||||||
|
until further notice.
|
||||||
|
|
||||||
Maximum uncompressed size: ~1998848 bytes.
|
Maximum uncompressed size: ~1.89 / ~7.60 MiB.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
- UPX creates as default a 'CD-Rom only' PS1/PS2 compatible executable.
|
- UPX creates as default a suitable executable for CD-Mastering
|
||||||
For transfer between client/target use options below.
|
and console transfer. For a CD-Master main executable you could also try
|
||||||
|
the special option "--boot-only" as described below.
|
||||||
|
It has been reported that upx packed executables are fully compatible with
|
||||||
|
the Sony PlayStation 2 (PS2, PStwo) and Sony PlayStation Portable (PSP) in
|
||||||
|
Sony PlayStation (PSone) emulation mode.
|
||||||
|
|
||||||
- Normally the packed files use the same memory areas like the uncompressed
|
- Normally the packed files use the same memory areas like the uncompressed
|
||||||
versions, so they will not override other memory areas while unpacking.
|
versions, so they will not override other memory areas while unpacking.
|
||||||
If this isn't possible UPX will abort showing a 'packed data overlap'
|
If this isn't possible UPX will abort showing a 'packed data overlap'
|
||||||
error. With the "--force" option UPX will set a few 'bytes higher' loading
|
error. With the "--force" option UPX will relocate the loading address
|
||||||
offset for the packed file, but this isn't a real problem if it is a
|
for the packed file, but this isn't a real problem if it is a single or
|
||||||
single or boot-only executable.
|
the main executable.
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
|
|
||||||
@@ -721,21 +705,23 @@ Extra options available for this executable format:
|
|||||||
the compression ratio in some cases, but usually
|
the compression ratio in some cases, but usually
|
||||||
the default method gives the best results anyway.
|
the default method gives the best results anyway.
|
||||||
|
|
||||||
--console-run This enables client/target transfer compatibility.
|
--8-bit Uses 8 bit size compression [default: 32 bit]
|
||||||
This format also run from a CD, except the "--no-align"
|
|
||||||
option is used. Upto 2024 bytes larger files
|
--8mib-ram PSone has 8 MiB ram available [default: 2 MiB]
|
||||||
than [default] will be the result, also a
|
|
||||||
slower decompression speed can be expected.
|
--boot-only This format is for main exes and CD-Mastering only !
|
||||||
|
It may slightly improve the compression ratio,
|
||||||
|
decompression routines are faster than default ones.
|
||||||
|
But it cannot be used for console transfer !
|
||||||
|
|
||||||
--no-align This option disables CD mode 2 data sector format
|
--no-align This option disables CD mode 2 data sector format
|
||||||
alignment, and enables "--console-run".
|
alignment. May slightly improves the compression ratio,
|
||||||
This will slightly improve the compression ratio,
|
|
||||||
but the compressed executable will not boot from a CD.
|
but the compressed executable will not boot from a CD.
|
||||||
So use it for client/target transfer only!.
|
Use it for console transfer only !
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head2 NOTES FOR RTM32/PE
|
=head2 NOTES FOR RTM32/PE and ARM/PE
|
||||||
|
|
||||||
Same as win32/pe.
|
Same as win32/pe.
|
||||||
|
|
||||||
@@ -779,7 +765,7 @@ Benefits:
|
|||||||
- Better compression (but note that the kernel was already compressed,
|
- Better compression (but note that the kernel was already compressed,
|
||||||
so the improvement is not as large as with other formats).
|
so the improvement is not as large as with other formats).
|
||||||
Still, the bytes saved may be essential for special needs like
|
Still, the bytes saved may be essential for special needs like
|
||||||
bootdisks.
|
boot disks.
|
||||||
|
|
||||||
For example, this is what I get for my 2.2.16 kernel:
|
For example, this is what I get for my 2.2.16 kernel:
|
||||||
1589708 vmlinux
|
1589708 vmlinux
|
||||||
@@ -826,13 +812,14 @@ Extra options available for this executable format:
|
|||||||
=head2 NOTES FOR WIN32/PE
|
=head2 NOTES FOR WIN32/PE
|
||||||
|
|
||||||
The PE support in B<UPX> is quite stable now, but probably there are
|
The PE support in B<UPX> is quite stable now, but probably there are
|
||||||
still some incompabilities with some files.
|
still some incompatibilities with some files.
|
||||||
|
|
||||||
Because of the way B<UPX> (and other packers for this format) works, you
|
Because of the way B<UPX> (and other packers for this format) works, you
|
||||||
can see increased memory usage of your compressed files. If you start
|
can see increased memory usage of your compressed files because the whole
|
||||||
several instances of huge compressed programs you're wasting memory
|
program is loaded into memory at startup.
|
||||||
because the common segements of the program won't get shared
|
If you start several instances of huge compressed programs you're
|
||||||
across the instances.
|
wasting memory because the common segments of the program won't
|
||||||
|
get shared across the instances.
|
||||||
On the other hand if you're compressing only smaller programs, or
|
On the other hand if you're compressing only smaller programs, or
|
||||||
running only one instance of larger programs, then this penalty is
|
running only one instance of larger programs, then this penalty is
|
||||||
smaller, but it's still there.
|
smaller, but it's still there.
|
||||||
@@ -840,12 +827,19 @@ smaller, but it's still there.
|
|||||||
If you're running executables from network, then compressed programs
|
If you're running executables from network, then compressed programs
|
||||||
will load faster, and require less bandwidth during execution.
|
will load faster, and require less bandwidth during execution.
|
||||||
|
|
||||||
DLLs are supported.
|
DLLs are supported. But UPX compressed DLLs can not share common data and
|
||||||
|
code when they got used by multiple applications. So compressing msvcrt.dll
|
||||||
|
is a waste of memory, but compressing the dll plugins of a particular
|
||||||
|
application may be a better idea.
|
||||||
|
|
||||||
Screensavers are supported, with the restriction that the filename
|
Screensavers are supported, with the restriction that the filename
|
||||||
must end in ".scr" (as screensavers are handled slightly different
|
must end with ".scr" (as screensavers are handled slightly different
|
||||||
than normal exe files).
|
than normal exe files).
|
||||||
|
|
||||||
|
UPX compressed PE files have some minor memory overhead (usually in the
|
||||||
|
10 - 30 KiB range) which can be seen by specifying the "-i" command
|
||||||
|
line switch during compression.
|
||||||
|
|
||||||
Extra options available for this executable format:
|
Extra options available for this executable format:
|
||||||
|
|
||||||
--compress-exports=0 Don't compress the export section.
|
--compress-exports=0 Don't compress the export section.
|
||||||
@@ -862,9 +856,26 @@ Extra options available for this executable format:
|
|||||||
--compress-icons=1 Compress all but the first icon.
|
--compress-icons=1 Compress all but the first icon.
|
||||||
--compress-icons=2 Compress all icons which are not in the
|
--compress-icons=2 Compress all icons which are not in the
|
||||||
first icon directory. [DEFAULT]
|
first icon directory. [DEFAULT]
|
||||||
|
--compress-icons=3 Compress all icons.
|
||||||
|
|
||||||
--compress-resources=0 Don't compress any resources at all.
|
--compress-resources=0 Don't compress any resources at all.
|
||||||
|
|
||||||
|
--keep-resource=list Don't compress resources specified by the list.
|
||||||
|
The members of the list are separated by commas.
|
||||||
|
A list member has the following format: I<type[/name]>.
|
||||||
|
I<Type> is the type of the resource. Standard types
|
||||||
|
must be specified as decimal numbers, user types can be
|
||||||
|
specified by decimal IDs or strings. I<Name> is the
|
||||||
|
identifier of the resource. It can be a decimal number
|
||||||
|
or a string. For example:
|
||||||
|
|
||||||
|
--keep-resource=2/MYBITMAP,5,6/12345
|
||||||
|
|
||||||
|
UPX won't compress the named bitmap resource "MYBITMAP",
|
||||||
|
it leaves every dialog (5) resource uncompressed, and
|
||||||
|
it won't touch the string table resource with identifier
|
||||||
|
12345.
|
||||||
|
|
||||||
--force Force compression even when there is an
|
--force Force compression even when there is an
|
||||||
unexpected value in a header field.
|
unexpected value in a header field.
|
||||||
Use with care.
|
Use with care.
|
||||||
@@ -911,32 +922,30 @@ Please report all bugs immediately to the authors.
|
|||||||
Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||||
http://www.oberhumer.com
|
http://www.oberhumer.com
|
||||||
|
|
||||||
Laszlo Molnar <ml1050@users.sourceforge.net>
|
Laszlo Molnar <ezerotven+github@gmail.com>
|
||||||
|
|
||||||
John F. Reiser <jreiser@BitWagon.com>
|
John F. Reiser <jreiser@BitWagon.com>
|
||||||
|
|
||||||
Jens Medoch <jssg@users.sourceforge.net>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
=head1 COPYRIGHT
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Laszlo Molnar
|
Copyright (C) 1996-2024 Laszlo Molnar
|
||||||
|
|
||||||
Copyright (C) 2000-2004 John F. Reiser
|
Copyright (C) 2000-2024 John F. Reiser
|
||||||
|
|
||||||
Copyright (C) 2002-2004 Jens Medoch
|
B<UPX> is distributed with full source code under the terms of the
|
||||||
|
GNU General Public License v2+; either under the pure GPLv2+ (see
|
||||||
This program may be used freely, and you are welcome to
|
the file COPYING), or (at your option) under the GPLv+2 with special
|
||||||
redistribute it under certain conditions.
|
exceptions and restrictions granting the free usage for all binaries
|
||||||
|
including commercial programs (see the file LICENSE).
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
B<UPX License Agreement> for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the UPX License Agreement along
|
|
||||||
with this program; see the file LICENSE. If not, visit the UPX home page.
|
|
||||||
|
|
||||||
|
You should have received a copy of the UPX License Agreements along
|
||||||
|
with this program; see the files COPYING and LICENSE. If not,
|
||||||
|
visit the UPX home page.
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
|
---
|
||||||
|
Checks: >
|
||||||
|
-*,
|
||||||
|
bugprone-*,
|
||||||
|
-bugprone-branch-clone,
|
||||||
|
-bugprone-easily-swappable-parameters,
|
||||||
|
-bugprone-implicit-widening-of-multiplication-result,
|
||||||
|
-bugprone-macro-parentheses,
|
||||||
|
-bugprone-narrowing-conversions,
|
||||||
|
-bugprone-reserved-identifier,
|
||||||
|
-bugprone-switch-missing-default-case,
|
||||||
|
clang-analyzer-*,
|
||||||
|
-clang-analyzer-core.UndefinedBinaryOperatorResult,
|
||||||
|
-clang-analyzer-core.uninitialized.Assign,
|
||||||
|
-clang-analyzer-security.insecureAPI.strcpy,
|
||||||
|
clang-diagnostic-*,
|
||||||
|
performance-*,
|
||||||
|
FormatStyle: file
|
||||||
|
HeaderFilterRegex: '.*'
|
||||||
|
InheritParentConfig: false
|
||||||
|
...
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
|
---
|
||||||
|
Checks: >
|
||||||
|
-*,
|
||||||
|
bugprone-*,
|
||||||
|
-bugprone-assignment-in-if-condition,
|
||||||
|
-bugprone-casting-through-void,
|
||||||
|
-bugprone-easily-swappable-parameters,
|
||||||
|
-bugprone-implicit-widening-of-multiplication-result,
|
||||||
|
-bugprone-inc-dec-in-conditions,
|
||||||
|
-bugprone-macro-parentheses,
|
||||||
|
-bugprone-reserved-identifier,
|
||||||
|
-bugprone-sizeof-expression,
|
||||||
|
-bugprone-suspicious-include,
|
||||||
|
clang-analyzer-*,
|
||||||
|
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||||
|
clang-diagnostic-*,
|
||||||
|
performance-*,
|
||||||
|
FormatStyle: file
|
||||||
|
HeaderFilterRegex: '.*'
|
||||||
|
InheritParentConfig: false
|
||||||
|
...
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
|
---
|
||||||
|
Checks: >
|
||||||
|
-*,
|
||||||
|
bugprone-*,
|
||||||
|
-bugprone-assignment-in-if-condition,
|
||||||
|
-bugprone-easily-swappable-parameters,
|
||||||
|
-bugprone-implicit-widening-of-multiplication-result,
|
||||||
|
-bugprone-inc-dec-in-conditions,
|
||||||
|
-bugprone-macro-parentheses,
|
||||||
|
-bugprone-narrowing-conversions,
|
||||||
|
-bugprone-reserved-identifier,
|
||||||
|
-bugprone-switch-missing-default-case,
|
||||||
|
clang-analyzer-*,
|
||||||
|
-clang-analyzer-optin.performance.Padding,
|
||||||
|
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||||
|
clang-diagnostic-*,
|
||||||
|
performance-*,
|
||||||
|
FormatStyle: file
|
||||||
|
HeaderFilterRegex: '.*'
|
||||||
|
InheritParentConfig: false
|
||||||
|
...
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# vim:set ft=yaml ts=2 sw=2 et:
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# for clang-tidy from https://clang.llvm.org/extra/clang-tidy/
|
||||||
|
---
|
||||||
|
Checks: >
|
||||||
|
-*,
|
||||||
|
bugprone-*,
|
||||||
|
-bugprone-assignment-in-if-condition,
|
||||||
|
-bugprone-branch-clone,
|
||||||
|
-bugprone-casting-through-void,
|
||||||
|
-bugprone-easily-swappable-parameters,
|
||||||
|
-bugprone-implicit-widening-of-multiplication-result,
|
||||||
|
-bugprone-macro-parentheses,
|
||||||
|
-bugprone-misplaced-widening-cast,
|
||||||
|
-bugprone-narrowing-conversions,
|
||||||
|
-bugprone-reserved-identifier,
|
||||||
|
-bugprone-switch-missing-default-case,
|
||||||
|
clang-analyzer-*,
|
||||||
|
-clang-analyzer-core.UndefinedBinaryOperatorResult,
|
||||||
|
-clang-analyzer-deadcode.DeadStores,
|
||||||
|
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||||
|
clang-diagnostic-*,
|
||||||
|
performance-*,
|
||||||
|
-performance-no-int-to-ptr,
|
||||||
|
FormatStyle: file
|
||||||
|
HeaderFilterRegex: '.*'
|
||||||
|
InheritParentConfig: false
|
||||||
|
...
|
||||||
Executable
+549
@@ -0,0 +1,549 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# ===- run-clang-tidy.py - Parallel clang-tidy runner --------*- python -*--===#
|
||||||
|
#
|
||||||
|
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
|
# See https://llvm.org/LICENSE.txt for license information.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
#
|
||||||
|
# ===-----------------------------------------------------------------------===#
|
||||||
|
# FIXME: Integrate with clang-tidy-diff.py
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Parallel clang-tidy runner
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Runs clang-tidy over all files in a compilation database. Requires clang-tidy
|
||||||
|
and clang-apply-replacements in $PATH.
|
||||||
|
|
||||||
|
Example invocations.
|
||||||
|
- Run clang-tidy on all files in the current working directory with a default
|
||||||
|
set of checks and show warnings in the cpp files and all project headers.
|
||||||
|
run-clang-tidy.py $PWD
|
||||||
|
|
||||||
|
- Fix all header guards.
|
||||||
|
run-clang-tidy.py -fix -checks=-*,llvm-header-guard
|
||||||
|
|
||||||
|
- Fix all header guards included from clang-tidy and header guards
|
||||||
|
for clang-tidy headers.
|
||||||
|
run-clang-tidy.py -fix -checks=-*,llvm-header-guard extra/clang-tidy \
|
||||||
|
-header-filter=extra/clang-tidy
|
||||||
|
|
||||||
|
Compilation database setup:
|
||||||
|
http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import glob
|
||||||
|
import json
|
||||||
|
import multiprocessing
|
||||||
|
import os
|
||||||
|
import queue
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import threading
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
try:
|
||||||
|
import yaml
|
||||||
|
except ImportError:
|
||||||
|
yaml = None
|
||||||
|
|
||||||
|
|
||||||
|
def strtobool(val):
|
||||||
|
"""Convert a string representation of truth to a bool following LLVM's CLI argument parsing."""
|
||||||
|
|
||||||
|
val = val.lower()
|
||||||
|
if val in ["", "true", "1"]:
|
||||||
|
return True
|
||||||
|
elif val in ["false", "0"]:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Return ArgumentTypeError so that argparse does not substitute its own error message
|
||||||
|
raise argparse.ArgumentTypeError(
|
||||||
|
"'{}' is invalid value for boolean argument! Try 0 or 1.".format(val)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def find_compilation_database(path):
|
||||||
|
"""Adjusts the directory until a compilation database is found."""
|
||||||
|
result = os.path.realpath("./")
|
||||||
|
while not os.path.isfile(os.path.join(result, path)):
|
||||||
|
parent = os.path.dirname(result)
|
||||||
|
if result == parent:
|
||||||
|
print("Error: could not find compilation database.")
|
||||||
|
sys.exit(1)
|
||||||
|
result = parent
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def make_absolute(f, directory):
|
||||||
|
if os.path.isabs(f):
|
||||||
|
return f
|
||||||
|
return os.path.normpath(os.path.join(directory, f))
|
||||||
|
|
||||||
|
|
||||||
|
def get_tidy_invocation(
|
||||||
|
f,
|
||||||
|
clang_tidy_binary,
|
||||||
|
checks,
|
||||||
|
tmpdir,
|
||||||
|
build_path,
|
||||||
|
header_filter,
|
||||||
|
allow_enabling_alpha_checkers,
|
||||||
|
extra_arg,
|
||||||
|
extra_arg_before,
|
||||||
|
quiet,
|
||||||
|
config_file_path,
|
||||||
|
config,
|
||||||
|
line_filter,
|
||||||
|
use_color,
|
||||||
|
plugins,
|
||||||
|
warnings_as_errors,
|
||||||
|
):
|
||||||
|
"""Gets a command line for clang-tidy."""
|
||||||
|
start = [clang_tidy_binary]
|
||||||
|
if allow_enabling_alpha_checkers:
|
||||||
|
start.append("-allow-enabling-analyzer-alpha-checkers")
|
||||||
|
if header_filter is not None:
|
||||||
|
start.append("-header-filter=" + header_filter)
|
||||||
|
if line_filter is not None:
|
||||||
|
start.append("-line-filter=" + line_filter)
|
||||||
|
if use_color is not None:
|
||||||
|
if use_color:
|
||||||
|
start.append("--use-color")
|
||||||
|
else:
|
||||||
|
start.append("--use-color=false")
|
||||||
|
if checks:
|
||||||
|
start.append("-checks=" + checks)
|
||||||
|
if tmpdir is not None:
|
||||||
|
start.append("-export-fixes")
|
||||||
|
# Get a temporary file. We immediately close the handle so clang-tidy can
|
||||||
|
# overwrite it.
|
||||||
|
(handle, name) = tempfile.mkstemp(suffix=".yaml", dir=tmpdir)
|
||||||
|
os.close(handle)
|
||||||
|
start.append(name)
|
||||||
|
for arg in extra_arg:
|
||||||
|
start.append("-extra-arg=%s" % arg)
|
||||||
|
for arg in extra_arg_before:
|
||||||
|
start.append("-extra-arg-before=%s" % arg)
|
||||||
|
start.append("-p=" + build_path)
|
||||||
|
if quiet:
|
||||||
|
start.append("-quiet")
|
||||||
|
if config_file_path:
|
||||||
|
start.append("--config-file=" + config_file_path)
|
||||||
|
elif config:
|
||||||
|
start.append("-config=" + config)
|
||||||
|
for plugin in plugins:
|
||||||
|
start.append("-load=" + plugin)
|
||||||
|
if warnings_as_errors:
|
||||||
|
start.append("--warnings-as-errors=" + warnings_as_errors)
|
||||||
|
start.append(f)
|
||||||
|
return start
|
||||||
|
|
||||||
|
|
||||||
|
def merge_replacement_files(tmpdir, mergefile):
|
||||||
|
"""Merge all replacement files in a directory into a single file"""
|
||||||
|
# The fixes suggested by clang-tidy >= 4.0.0 are given under
|
||||||
|
# the top level key 'Diagnostics' in the output yaml files
|
||||||
|
mergekey = "Diagnostics"
|
||||||
|
merged = []
|
||||||
|
for replacefile in glob.iglob(os.path.join(tmpdir, "*.yaml")):
|
||||||
|
content = yaml.safe_load(open(replacefile, "r"))
|
||||||
|
if not content:
|
||||||
|
continue # Skip empty files.
|
||||||
|
merged.extend(content.get(mergekey, []))
|
||||||
|
|
||||||
|
if merged:
|
||||||
|
# MainSourceFile: The key is required by the definition inside
|
||||||
|
# include/clang/Tooling/ReplacementsYaml.h, but the value
|
||||||
|
# is actually never used inside clang-apply-replacements,
|
||||||
|
# so we set it to '' here.
|
||||||
|
output = {"MainSourceFile": "", mergekey: merged}
|
||||||
|
with open(mergefile, "w") as out:
|
||||||
|
yaml.safe_dump(output, out)
|
||||||
|
else:
|
||||||
|
# Empty the file:
|
||||||
|
open(mergefile, "w").close()
|
||||||
|
|
||||||
|
|
||||||
|
def find_binary(arg, name, build_path):
|
||||||
|
"""Get the path for a binary or exit"""
|
||||||
|
if arg:
|
||||||
|
if shutil.which(arg):
|
||||||
|
return arg
|
||||||
|
else:
|
||||||
|
raise SystemExit(
|
||||||
|
"error: passed binary '{}' was not found or is not executable".format(
|
||||||
|
arg
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
built_path = os.path.join(build_path, "bin", name)
|
||||||
|
binary = shutil.which(name) or shutil.which(built_path)
|
||||||
|
if binary:
|
||||||
|
return binary
|
||||||
|
else:
|
||||||
|
raise SystemExit(
|
||||||
|
"error: failed to find {} in $PATH or at {}".format(name, built_path)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def apply_fixes(args, clang_apply_replacements_binary, tmpdir):
|
||||||
|
"""Calls clang-apply-fixes on a given directory."""
|
||||||
|
invocation = [clang_apply_replacements_binary]
|
||||||
|
invocation.append("-ignore-insert-conflict")
|
||||||
|
if args.format:
|
||||||
|
invocation.append("-format")
|
||||||
|
if args.style:
|
||||||
|
invocation.append("-style=" + args.style)
|
||||||
|
invocation.append(tmpdir)
|
||||||
|
subprocess.call(invocation)
|
||||||
|
|
||||||
|
|
||||||
|
def run_tidy(args, clang_tidy_binary, tmpdir, build_path, queue, lock, failed_files):
|
||||||
|
"""Takes filenames out of queue and runs clang-tidy on them."""
|
||||||
|
while True:
|
||||||
|
name = queue.get()
|
||||||
|
invocation = get_tidy_invocation(
|
||||||
|
name,
|
||||||
|
clang_tidy_binary,
|
||||||
|
args.checks,
|
||||||
|
tmpdir,
|
||||||
|
build_path,
|
||||||
|
args.header_filter,
|
||||||
|
args.allow_enabling_alpha_checkers,
|
||||||
|
args.extra_arg,
|
||||||
|
args.extra_arg_before,
|
||||||
|
args.quiet,
|
||||||
|
args.config_file,
|
||||||
|
args.config,
|
||||||
|
args.line_filter,
|
||||||
|
args.use_color,
|
||||||
|
args.plugins,
|
||||||
|
args.warnings_as_errors,
|
||||||
|
)
|
||||||
|
|
||||||
|
proc = subprocess.Popen(
|
||||||
|
invocation, stdout=subprocess.PIPE, stderr=subprocess.PIPE
|
||||||
|
)
|
||||||
|
output, err = proc.communicate()
|
||||||
|
if proc.returncode != 0:
|
||||||
|
if proc.returncode < 0:
|
||||||
|
msg = "%s: terminated by signal %d\n" % (name, -proc.returncode)
|
||||||
|
err += msg.encode("utf-8")
|
||||||
|
failed_files.append(name)
|
||||||
|
with lock:
|
||||||
|
sys.stdout.write(" ".join(invocation) + "\n" + output.decode("utf-8"))
|
||||||
|
if len(err) > 0:
|
||||||
|
sys.stdout.flush()
|
||||||
|
sys.stderr.write(err.decode("utf-8"))
|
||||||
|
queue.task_done()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Runs clang-tidy over all files "
|
||||||
|
"in a compilation database. Requires "
|
||||||
|
"clang-tidy and clang-apply-replacements in "
|
||||||
|
"$PATH or in your build directory."
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-allow-enabling-alpha-checkers",
|
||||||
|
action="store_true",
|
||||||
|
help="allow alpha checkers from clang-analyzer.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-clang-tidy-binary", metavar="PATH", help="path to clang-tidy binary"
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-clang-apply-replacements-binary",
|
||||||
|
metavar="PATH",
|
||||||
|
help="path to clang-apply-replacements binary",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-checks",
|
||||||
|
default=None,
|
||||||
|
help="checks filter, when not specified, use clang-tidy default",
|
||||||
|
)
|
||||||
|
config_group = parser.add_mutually_exclusive_group()
|
||||||
|
config_group.add_argument(
|
||||||
|
"-config",
|
||||||
|
default=None,
|
||||||
|
help="Specifies a configuration in YAML/JSON format: "
|
||||||
|
" -config=\"{Checks: '*', "
|
||||||
|
' CheckOptions: {x: y}}" '
|
||||||
|
"When the value is empty, clang-tidy will "
|
||||||
|
"attempt to find a file named .clang-tidy for "
|
||||||
|
"each source file in its parent directories.",
|
||||||
|
)
|
||||||
|
config_group.add_argument(
|
||||||
|
"-config-file",
|
||||||
|
default=None,
|
||||||
|
help="Specify the path of .clang-tidy or custom config "
|
||||||
|
"file: e.g. -config-file=/some/path/myTidyConfigFile. "
|
||||||
|
"This option internally works exactly the same way as "
|
||||||
|
"-config option after reading specified config file. "
|
||||||
|
"Use either -config-file or -config, not both.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-header-filter",
|
||||||
|
default=None,
|
||||||
|
help="regular expression matching the names of the "
|
||||||
|
"headers to output diagnostics from. Diagnostics from "
|
||||||
|
"the main file of each translation unit are always "
|
||||||
|
"displayed.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-line-filter",
|
||||||
|
default=None,
|
||||||
|
help="List of files with line ranges to filter the warnings.",
|
||||||
|
)
|
||||||
|
if yaml:
|
||||||
|
parser.add_argument(
|
||||||
|
"-export-fixes",
|
||||||
|
metavar="file_or_directory",
|
||||||
|
dest="export_fixes",
|
||||||
|
help="A directory or a yaml file to store suggested fixes in, "
|
||||||
|
"which can be applied with clang-apply-replacements. If the "
|
||||||
|
"parameter is a directory, the fixes of each compilation unit are "
|
||||||
|
"stored in individual yaml files in the directory.",
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
parser.add_argument(
|
||||||
|
"-export-fixes",
|
||||||
|
metavar="directory",
|
||||||
|
dest="export_fixes",
|
||||||
|
help="A directory to store suggested fixes in, which can be applied "
|
||||||
|
"with clang-apply-replacements. The fixes of each compilation unit are "
|
||||||
|
"stored in individual yaml files in the directory.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-j",
|
||||||
|
type=int,
|
||||||
|
default=0,
|
||||||
|
help="number of tidy instances to be run in parallel.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"files", nargs="*", default=[".*"], help="files to be processed (regex on path)"
|
||||||
|
)
|
||||||
|
parser.add_argument("-fix", action="store_true", help="apply fix-its")
|
||||||
|
parser.add_argument(
|
||||||
|
"-format", action="store_true", help="Reformat code after applying fixes"
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-style",
|
||||||
|
default="file",
|
||||||
|
help="The style of reformat code after applying fixes",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-use-color",
|
||||||
|
type=strtobool,
|
||||||
|
nargs="?",
|
||||||
|
const=True,
|
||||||
|
help="Use colors in diagnostics, overriding clang-tidy's"
|
||||||
|
" default behavior. This option overrides the 'UseColor"
|
||||||
|
"' option in .clang-tidy file, if any.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-p", dest="build_path", help="Path used to read a compile command database."
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-extra-arg",
|
||||||
|
dest="extra_arg",
|
||||||
|
action="append",
|
||||||
|
default=[],
|
||||||
|
help="Additional argument to append to the compiler command line.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-extra-arg-before",
|
||||||
|
dest="extra_arg_before",
|
||||||
|
action="append",
|
||||||
|
default=[],
|
||||||
|
help="Additional argument to prepend to the compiler command line.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-quiet", action="store_true", help="Run clang-tidy in quiet mode"
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-load",
|
||||||
|
dest="plugins",
|
||||||
|
action="append",
|
||||||
|
default=[],
|
||||||
|
help="Load the specified plugin in clang-tidy.",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-warnings-as-errors",
|
||||||
|
default=None,
|
||||||
|
help="Upgrades warnings to errors. Same format as '-checks'",
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
db_path = "compile_commands.json"
|
||||||
|
|
||||||
|
if args.build_path is not None:
|
||||||
|
build_path = args.build_path
|
||||||
|
else:
|
||||||
|
# Find our database
|
||||||
|
build_path = find_compilation_database(db_path)
|
||||||
|
|
||||||
|
clang_tidy_binary = find_binary(args.clang_tidy_binary, "clang-tidy", build_path)
|
||||||
|
|
||||||
|
if args.fix:
|
||||||
|
clang_apply_replacements_binary = find_binary(
|
||||||
|
args.clang_apply_replacements_binary, "clang-apply-replacements", build_path
|
||||||
|
)
|
||||||
|
|
||||||
|
combine_fixes = False
|
||||||
|
export_fixes_dir = None
|
||||||
|
delete_fixes_dir = False
|
||||||
|
if args.export_fixes is not None:
|
||||||
|
# if a directory is given, create it if it does not exist
|
||||||
|
if args.export_fixes.endswith(os.path.sep) and not os.path.isdir(
|
||||||
|
args.export_fixes
|
||||||
|
):
|
||||||
|
os.makedirs(args.export_fixes)
|
||||||
|
|
||||||
|
if not os.path.isdir(args.export_fixes):
|
||||||
|
if not yaml:
|
||||||
|
raise RuntimeError(
|
||||||
|
"Cannot combine fixes in one yaml file. Either install PyYAML or specify an output directory."
|
||||||
|
)
|
||||||
|
|
||||||
|
combine_fixes = True
|
||||||
|
|
||||||
|
if os.path.isdir(args.export_fixes):
|
||||||
|
export_fixes_dir = args.export_fixes
|
||||||
|
|
||||||
|
if export_fixes_dir is None and (args.fix or combine_fixes):
|
||||||
|
export_fixes_dir = tempfile.mkdtemp()
|
||||||
|
delete_fixes_dir = True
|
||||||
|
|
||||||
|
# Load the database and extract all files.
|
||||||
|
database = json.load(open(os.path.join(build_path, db_path)))
|
||||||
|
files = set(
|
||||||
|
[make_absolute(entry["file"], entry["directory"]) for entry in database]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Build up a big regexy filter from all command line arguments.
|
||||||
|
file_name_re = re.compile("|".join(args.files))
|
||||||
|
|
||||||
|
# filter files with mo.group(0), and sort files
|
||||||
|
matched_files = []
|
||||||
|
for name in files:
|
||||||
|
mo = file_name_re.search(name)
|
||||||
|
if mo and mo.group(0):
|
||||||
|
matched_files.append(name)
|
||||||
|
files = sorted(matched_files)
|
||||||
|
if not files:
|
||||||
|
if delete_fixes_dir:
|
||||||
|
shutil.rmtree(export_fixes_dir)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
try:
|
||||||
|
invocation = get_tidy_invocation(
|
||||||
|
"",
|
||||||
|
clang_tidy_binary,
|
||||||
|
args.checks,
|
||||||
|
None,
|
||||||
|
build_path,
|
||||||
|
args.header_filter,
|
||||||
|
args.allow_enabling_alpha_checkers,
|
||||||
|
args.extra_arg,
|
||||||
|
args.extra_arg_before,
|
||||||
|
args.quiet,
|
||||||
|
args.config_file,
|
||||||
|
args.config,
|
||||||
|
args.line_filter,
|
||||||
|
args.use_color,
|
||||||
|
args.plugins,
|
||||||
|
args.warnings_as_errors,
|
||||||
|
)
|
||||||
|
invocation.append("-list-checks")
|
||||||
|
invocation.append("-")
|
||||||
|
if args.quiet:
|
||||||
|
# Even with -quiet we still want to check if we can call clang-tidy.
|
||||||
|
with open(os.devnull, "w") as dev_null:
|
||||||
|
subprocess.check_call(invocation, stdout=dev_null)
|
||||||
|
else:
|
||||||
|
subprocess.check_call(invocation)
|
||||||
|
except:
|
||||||
|
print("Unable to run clang-tidy.", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
max_task = args.j
|
||||||
|
if max_task == 0:
|
||||||
|
max_task = multiprocessing.cpu_count()
|
||||||
|
|
||||||
|
return_code = 0
|
||||||
|
try:
|
||||||
|
# Spin up a bunch of tidy-launching threads.
|
||||||
|
task_queue = queue.Queue(max_task)
|
||||||
|
# List of files with a non-zero return code.
|
||||||
|
failed_files = []
|
||||||
|
lock = threading.Lock()
|
||||||
|
for _ in range(max_task):
|
||||||
|
t = threading.Thread(
|
||||||
|
target=run_tidy,
|
||||||
|
args=(
|
||||||
|
args,
|
||||||
|
clang_tidy_binary,
|
||||||
|
export_fixes_dir,
|
||||||
|
build_path,
|
||||||
|
task_queue,
|
||||||
|
lock,
|
||||||
|
failed_files,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
t.daemon = True
|
||||||
|
t.start()
|
||||||
|
|
||||||
|
# Fill the queue with files.
|
||||||
|
for name in files:
|
||||||
|
if file_name_re.search(name):
|
||||||
|
task_queue.put(name)
|
||||||
|
|
||||||
|
# Wait for all threads to be done.
|
||||||
|
task_queue.join()
|
||||||
|
if len(failed_files):
|
||||||
|
return_code = 1
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
# This is a sad hack. Unfortunately subprocess goes
|
||||||
|
# bonkers with ctrl-c and we start forking merrily.
|
||||||
|
print("\nCtrl-C detected, goodbye.")
|
||||||
|
if delete_fixes_dir:
|
||||||
|
shutil.rmtree(export_fixes_dir)
|
||||||
|
os.kill(0, 9)
|
||||||
|
|
||||||
|
if combine_fixes:
|
||||||
|
print("Writing fixes to " + args.export_fixes + " ...")
|
||||||
|
try:
|
||||||
|
merge_replacement_files(export_fixes_dir, args.export_fixes)
|
||||||
|
except:
|
||||||
|
print("Error exporting fixes.\n", file=sys.stderr)
|
||||||
|
traceback.print_exc()
|
||||||
|
return_code = 1
|
||||||
|
|
||||||
|
if args.fix:
|
||||||
|
print("Applying fixes ...")
|
||||||
|
try:
|
||||||
|
apply_fixes(args, clang_apply_replacements_binary, export_fixes_dir)
|
||||||
|
except:
|
||||||
|
print("Error applying fixes.\n", file=sys.stderr)
|
||||||
|
traceback.print_exc()
|
||||||
|
return_code = 1
|
||||||
|
|
||||||
|
if delete_fixes_dir:
|
||||||
|
shutil.rmtree(export_fixes_dir)
|
||||||
|
sys.exit(return_code)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,382 @@
|
|||||||
|
#
|
||||||
|
# UPX "CMake" build file; see https://cmake.org/
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
# set USE_STRICT_DEFAULTS
|
||||||
|
if(NOT DEFINED USE_STRICT_DEFAULTS AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/use_strict_defaults.cmake" OPTIONAL)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED USE_STRICT_DEFAULTS)
|
||||||
|
# use permissive config defaults when building from source code tarball
|
||||||
|
set(USE_STRICT_DEFAULTS FALSE CACHE INTERNAL "" FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# macros
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# support config hooks; developer convenience
|
||||||
|
macro(upx_cmake_include_hook section)
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/hooks/CMakeLists.${section}.txt" OPTIONAL)
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/maint/make/CMakeLists.${section}.txt" OPTIONAL)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Disallow in-source build. Note that you will still have to manually
|
||||||
|
# clean up a few files if you accidentally try an in-source build.
|
||||||
|
macro(upx_disallow_in_source_build)
|
||||||
|
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
||||||
|
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
||||||
|
if(",${CMAKE_CURRENT_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR},")
|
||||||
|
# try to clean up (does not work)
|
||||||
|
#file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/CMakeCache.txt")
|
||||||
|
#file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/cmake.check_cache")
|
||||||
|
message(FATAL_ERROR "ERROR: In-source builds are not allowed, please use an extra build dir.")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# set the default build type; must be called before project() cmake init
|
||||||
|
macro(upx_set_default_build_type type)
|
||||||
|
set(upx_global_default_build_type "${type}")
|
||||||
|
get_property(upx_global_is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
if(NOT upx_global_is_multi_config AND NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE "${upx_global_default_build_type}" CACHE STRING "Choose the type of build." FORCE)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# set the default multi-config build type; must be called after project() cmake init
|
||||||
|
macro(upx_apply_build_type)
|
||||||
|
if(upx_global_is_multi_config)
|
||||||
|
set(c "${CMAKE_CONFIGURATION_TYPES}")
|
||||||
|
list(INSERT c 0 "${upx_global_default_build_type}")
|
||||||
|
if(CMAKE_BUILD_TYPE)
|
||||||
|
list(INSERT c 0 "${CMAKE_BUILD_TYPE}")
|
||||||
|
endif()
|
||||||
|
list(REMOVE_DUPLICATES c)
|
||||||
|
set(CMAKE_CONFIGURATION_TYPES "${c}" CACHE STRING "List of supported configuration types." FORCE)
|
||||||
|
endif()
|
||||||
|
# now also set the build type for use in try_compile()
|
||||||
|
if(NOT CMAKE_TRY_COMPILE_CONFIGURATION)
|
||||||
|
if(CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_TRY_COMPILE_CONFIGURATION "${CMAKE_BUILD_TYPE}")
|
||||||
|
else()
|
||||||
|
set(CMAKE_TRY_COMPILE_CONFIGURATION "${upx_global_default_build_type}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# ternary conditional operator
|
||||||
|
macro(upx_ternary result_var_name condition true_value false_value)
|
||||||
|
if(${condition})
|
||||||
|
set(${result_var_name} "${true_value}")
|
||||||
|
else()
|
||||||
|
set(${result_var_name} "${false_value}")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# util
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# convert to CMake bool
|
||||||
|
function(upx_make_bool_var result_var_name var_name default_value)
|
||||||
|
set(result "${default_value}")
|
||||||
|
# only query $var_name if it is defined and not empty
|
||||||
|
if(NOT ",${var_name}," STREQUAL ",,")
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
if(NOT ",${${var_name}}," STREQUAL ",,")
|
||||||
|
set(result "${${var_name}}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(${result})
|
||||||
|
set(result ON)
|
||||||
|
else()
|
||||||
|
set(result OFF)
|
||||||
|
endif()
|
||||||
|
set(${result_var_name} "${result}" PARENT_SCOPE) # return value
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_print_var) # ARGV
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
if(NOT ",${${var_name}}," STREQUAL ",,")
|
||||||
|
if(${var_name})
|
||||||
|
message(STATUS "${var_name} = ${${var_name}}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_print_env_var) # ARGV
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
if(DEFINED ENV{${var_name}})
|
||||||
|
if(NOT ",$ENV{${var_name}}," STREQUAL ",,")
|
||||||
|
message(STATUS "ENV{${var_name}} = '$ENV{${var_name}}'")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_print_have_symbol) # ARGV; needs include(CheckSymbolExists)
|
||||||
|
set(rq "${CMAKE_REQUIRED_QUIET}")
|
||||||
|
set(CMAKE_REQUIRED_QUIET ON)
|
||||||
|
foreach(symbol ${ARGV})
|
||||||
|
set(cache_var_name "HAVE_symbol_${symbol}")
|
||||||
|
check_symbol_exists("${symbol}" "limits.h;stddef.h;stdint.h" "${cache_var_name}")
|
||||||
|
if(${cache_var_name})
|
||||||
|
message(STATUS "HAVE_symbol ${symbol}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(CMAKE_REQUIRED_QUIET "${rq}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# examine compiler configuration
|
||||||
|
function(upx_print_common_symbols)
|
||||||
|
upx_print_have_symbol(__FAST_MATH__)
|
||||||
|
upx_print_have_symbol(__PIC__ __pic__ __PIE__ __pie__)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# examine MinGW/Cygwin compiler configuration
|
||||||
|
function(upx_print_mingw_symbols)
|
||||||
|
if(WIN32 OR MINGW OR CYGWIN)
|
||||||
|
if(CMAKE_C_COMPILER_ID MATCHES "(Clang|GNU)")
|
||||||
|
# runtime library: msvcrt vs ucrt vs cygwin
|
||||||
|
upx_print_have_symbol(__CRTDLL__ __CYGWIN__ __CYGWIN32__ __CYGWIN64__ __MINGW32__ __MINGW64__ __MINGW64_VERSION_MAJOR __MSVCRT__ __MSVCRT_VERSION__ _UCRT _WIN32 _WIN32_WINNT _WIN64)
|
||||||
|
# exception handing: SJLJ (setjmp/longjmp) vs DWARF vs SEH
|
||||||
|
upx_print_have_symbol(__GCC_HAVE_DWARF2_CFI_ASM __SEH__ __USING_SJLJ_EXCEPTIONS__)
|
||||||
|
# threads: win32 vs posix/pthread/winpthreads vs mcfgthread
|
||||||
|
upx_print_have_symbol(_REENTRANT __USING_MCFGTHREAD__)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# add wildcard expansions to a variable
|
||||||
|
function(upx_add_glob_files) # ARGV
|
||||||
|
set(var_name ${ARGV0})
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
if(${CMAKE_VERSION} VERSION_LESS "3.3")
|
||||||
|
file(GLOB files ${ARGV})
|
||||||
|
else()
|
||||||
|
file(GLOB files LIST_DIRECTORIES false ${ARGV})
|
||||||
|
endif()
|
||||||
|
set(result "")
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
set(result "${${var_name}}")
|
||||||
|
endif()
|
||||||
|
list(APPEND result "${files}")
|
||||||
|
list(SORT result)
|
||||||
|
list(REMOVE_DUPLICATES result)
|
||||||
|
#message(STATUS "upx_add_glob_files: ${var_name} = ${result}")
|
||||||
|
set(${var_name} "${result}" PARENT_SCOPE) # return value
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# remove wildcard expansions from a variable
|
||||||
|
function(upx_remove_glob_files) # ARGV
|
||||||
|
set(var_name ${ARGV0})
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
file(GLOB files ${ARGV})
|
||||||
|
set(result "")
|
||||||
|
if(DEFINED ${var_name})
|
||||||
|
set(result "${${var_name}}")
|
||||||
|
foreach(file ${files})
|
||||||
|
list(REMOVE_ITEM result "${file}")
|
||||||
|
endforeach()
|
||||||
|
list(SORT result)
|
||||||
|
list(REMOVE_DUPLICATES result)
|
||||||
|
endif()
|
||||||
|
#message(STATUS "upx_remove_glob_files: ${var_name} = ${result}")
|
||||||
|
set(${var_name} "${result}" PARENT_SCOPE) # return value
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# useful for CI jobs: allow settings via environment and cache result
|
||||||
|
function(upx_cache_bool_vars) # ARGV
|
||||||
|
set(default_value "${ARGV0}")
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
set(value ${default_value})
|
||||||
|
if(DEFINED UPX_CACHE_VALUE_${var_name}) # check cache
|
||||||
|
set(value "${UPX_CACHE_VALUE_${var_name}}")
|
||||||
|
elseif(DEFINED ${var_name}) # defined via "cmake -DXXX=YYY"
|
||||||
|
set(value "${${var_name}}")
|
||||||
|
elseif(DEFINED ENV{${var_name}}) # check environment
|
||||||
|
if("$ENV{${var_name}}" MATCHES "^(0|1|OFF|ON|FALSE|TRUE|off|on|false|true)$")
|
||||||
|
set(value "$ENV{${var_name}}")
|
||||||
|
set(UPX_CACHE_ORIGIN_FROM_ENV_${var_name} TRUE CACHE INTERNAL "" FORCE) # for status message below
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
# convert to bool
|
||||||
|
if(value)
|
||||||
|
set(value ON)
|
||||||
|
else()
|
||||||
|
set(value OFF)
|
||||||
|
endif()
|
||||||
|
# store result
|
||||||
|
if(UPX_CACHE_ORIGIN_FROM_ENV_${var_name})
|
||||||
|
message(STATUS "setting from environment: ${var_name} = ${value}")
|
||||||
|
endif()
|
||||||
|
set(${var_name} "${value}" PARENT_SCOPE) # store result
|
||||||
|
set(UPX_CACHE_VALUE_${var_name} "${value}" CACHE INTERNAL "" FORCE) # and store in cache
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_platform_check_mismatch var_name_1 var_name_2)
|
||||||
|
if(DEFINED ${var_name_1} OR DEFINED ${var_name_2})
|
||||||
|
if(NOT ",${${var_name_1}}," STREQUAL ",${${var_name_2}},")
|
||||||
|
if(UPX_CONFIG_DISABLE_WERROR)
|
||||||
|
message(WARNING "WARNING: '${var_name_1}' '${var_name_2}' mismatch")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "FATAL ERROR: '${var_name_1}' '${var_name_2}' mismatch")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# compilation flags
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
function(upx_internal_add_definitions_with_prefix) # ARGV; needs include(CheckCCompilerFlag)
|
||||||
|
set(flag_prefix "${ARGV0}")
|
||||||
|
if("${flag_prefix}" MATCHES "^empty$") # need "empty" to work around bug in old CMake versions
|
||||||
|
set(flag_prefix "")
|
||||||
|
endif()
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
set(failed "")
|
||||||
|
foreach(f ${ARGV})
|
||||||
|
set(flag "${flag_prefix}${f}")
|
||||||
|
string(REGEX REPLACE "[^0-9a-zA-Z_]" "_" cache_var_name "HAVE_CFLAG_${flag}")
|
||||||
|
check_c_compiler_flag("${flag}" ${cache_var_name})
|
||||||
|
if(${cache_var_name})
|
||||||
|
#message(STATUS "add_definitions: ${flag}")
|
||||||
|
add_definitions("${flag}")
|
||||||
|
else()
|
||||||
|
list(APPEND failed "${f}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(failed_flags "${failed}" PARENT_SCOPE) # return value
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_add_definitions) # ARGV; needs include(CheckCCompilerFlag)
|
||||||
|
set(failed_flags "")
|
||||||
|
if(MSVC_FRONTEND AND CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
|
# for clang-cl try "-clang:" flag prefix first
|
||||||
|
upx_internal_add_definitions_with_prefix("-clang:" ${ARGV})
|
||||||
|
upx_internal_add_definitions_with_prefix("empty" ${failed_flags})
|
||||||
|
else()
|
||||||
|
upx_internal_add_definitions_with_prefix("empty" ${ARGV})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# useful for CI jobs: allow target extra compile options
|
||||||
|
function(upx_add_target_extra_compile_options) # ARGV
|
||||||
|
set(t "${ARGV0}")
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
foreach(var_name ${ARGV})
|
||||||
|
if(NOT DEFINED ${var_name})
|
||||||
|
elseif(",${${var_name}}," STREQUAL ",,")
|
||||||
|
else()
|
||||||
|
set(flags "${${var_name}}")
|
||||||
|
if(NOT flags MATCHES ";") # NOTE: split into list from string only if not already a list
|
||||||
|
if(${CMAKE_VERSION} VERSION_GREATER "3.8.99")
|
||||||
|
separate_arguments(flags NATIVE_COMMAND "${flags}")
|
||||||
|
else()
|
||||||
|
separate_arguments(flags)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
target_compile_options(${t} PRIVATE "${flags}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# compile a target with -O2 optimization even in Debug build
|
||||||
|
function(upx_compile_target_debug_with_O2) # ARGV
|
||||||
|
foreach(t ${ARGV})
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
# MSVC uses some Debug compilation options like -RTC1 that are incompatible with -O2
|
||||||
|
else()
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-O2>)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# compile a source file with -O2 optimization even in Debug build; messy because of CMake limitations
|
||||||
|
function(upx_compile_source_debug_with_O2) # ARGV
|
||||||
|
set(flags "$<$<CONFIG:Debug>:-O2>")
|
||||||
|
if(${CMAKE_VERSION} VERSION_LESS "3.8")
|
||||||
|
# 3.8: The COMPILE_FLAGS source file property learned to support generator expressions
|
||||||
|
if(upx_global_is_multi_config OR NOT CMAKE_BUILD_TYPE MATCHES "^Debug$")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(flags "-O2")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_GENERATOR MATCHES "Xcode") # multi-config
|
||||||
|
# NOTE: Xcode does not support per-config per-source COMPILE_FLAGS (as of CMake 3.27.7)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
foreach(source ${ARGV})
|
||||||
|
if(MSVC_FRONTEND)
|
||||||
|
# MSVC uses some Debug compilation options like -RTC1 that are incompatible with -O2
|
||||||
|
else()
|
||||||
|
get_source_file_property(prop "${source}" COMPILE_FLAGS)
|
||||||
|
if("${prop}" MATCHES "^(NOTFOUND)?$")
|
||||||
|
set_source_files_properties("${source}" PROPERTIES COMPILE_FLAGS "${flags}")
|
||||||
|
else()
|
||||||
|
set_source_files_properties("${source}" PROPERTIES COMPILE_FLAGS "${prop} ${flags}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# sanitize a target; note that this may require special run-time support libs from your toolchain
|
||||||
|
function(upx_sanitize_target) # ARGV
|
||||||
|
foreach(t ${ARGV})
|
||||||
|
if(UPX_CONFIG_DISABLE_SANITIZE)
|
||||||
|
# no-op
|
||||||
|
elseif(MSVC_FRONTEND)
|
||||||
|
# MSVC uses -GS (similar to -fstack-protector) by default
|
||||||
|
elseif(NOT GNU_FRONTEND)
|
||||||
|
# unknown compiler
|
||||||
|
elseif(MINGW OR CYGWIN)
|
||||||
|
# avoid link errors with current MinGW-w64 versions
|
||||||
|
# see https://www.mingw-w64.org/contribute/#sanitizers-asan-tsan-usan
|
||||||
|
elseif(CMAKE_C_COMPILER_ID MATCHES "^Clang$" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "9.0")
|
||||||
|
# unreliable/broken sanitize implementation before clang-9 (Sep 2019)
|
||||||
|
message(WARNING "WARNING: ignoring SANITIZE for target '${t}'")
|
||||||
|
elseif(CMAKE_C_COMPILER_ID MATCHES "^GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "8.0")
|
||||||
|
# unsupported compiler; unreliable/broken sanitize implementation before gcc-8 (May 2018)
|
||||||
|
message(WARNING "WARNING: ignoring SANITIZE for target '${t}'")
|
||||||
|
else()
|
||||||
|
# default sanitizer for Debug builds
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-fsanitize=undefined -fsanitize-undefined-trap-on-error -fstack-protector-all>)
|
||||||
|
# default sanitizer for Release builds
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:-fstack-protector>)
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:Release>:-fstack-protector>)
|
||||||
|
target_compile_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:-fstack-protector>)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# test
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
function(upx_add_test) # ARGV
|
||||||
|
set(name "${ARGV0}")
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
add_test(NAME "${name}" COMMAND ${ARGV})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(upx_test_depends) # ARGV
|
||||||
|
set(name "${ARGV0}")
|
||||||
|
list(REMOVE_AT ARGV 0)
|
||||||
|
get_property(prop TEST "${name}" PROPERTY DEPENDS)
|
||||||
|
if("${prop}" MATCHES "^(NOTFOUND)?$")
|
||||||
|
set_tests_properties("${name}" PROPERTIES DEPENDS "${ARGV}")
|
||||||
|
else()
|
||||||
|
set_tests_properties("${name}" PROPERTIES DEPENDS "${prop};${ARGV}")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
#
|
||||||
|
# UPX "CMake" build file; see https://cmake.org/
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# summary section
|
||||||
|
# print some info about the build configuration
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# generator
|
||||||
|
upx_print_var(CMAKE_GENERATOR_TOOLSET CMAKE_GENERATOR_PLATFORM)
|
||||||
|
|
||||||
|
# directories
|
||||||
|
if(NOT ",${CMAKE_BINARY_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR}," OR NOT ",${CMAKE_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_SOURCE_DIR},")
|
||||||
|
upx_print_var(CMAKE_BINARY_DIR CMAKE_SOURCE_DIR CMAKE_CURRENT_BINARY_DIR CMAKE_CURRENT_SOURCE_DIR)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# system
|
||||||
|
upx_print_var(CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_VERSION CMAKE_HOST_SYSTEM_PROCESSOR)
|
||||||
|
upx_print_var(CMAKE_SYSTEM_NAME CMAKE_SYSTEM_VERSION CMAKE_SYSTEM_PROCESSOR)
|
||||||
|
upx_print_var(CMAKE_ANDROID_NDK CMAKE_ANDROID_NDK_VERSION CMAKE_ANDROID_STANDALONE_TOOLCHAIN)
|
||||||
|
upx_print_var(CMAKE_APPLE_SILICON_PROCESSOR CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT)
|
||||||
|
upx_print_Var(CMAKE_CROSSCOMPILING CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
|
|
||||||
|
# binutils
|
||||||
|
upx_print_var(CMAKE_AR CMAKE_RANLIB)
|
||||||
|
|
||||||
|
# compilers
|
||||||
|
foreach(lang IN ITEMS ASM C CXX)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_LAUNCHER)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_ID)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_VERSION)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_FRONTEND_VARIANT )
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID)
|
||||||
|
upx_print_var(CMAKE_${lang}_PLATFORM_ID)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_ABI)
|
||||||
|
upx_print_var(CMAKE_${lang}_COMPILER_TARGET)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# misc
|
||||||
|
upx_print_var(CMAKE_INTERPROCEDURAL_OPTIMIZATION CMAKE_POSITION_INDEPENDENT_CODE)
|
||||||
|
|
||||||
|
# shortcuts
|
||||||
|
upx_print_var(APPLE CLANG CYGWIN GNU_FRONTEND GNUC MINGW MSVC MSVC_FRONTEND MSVC_IDE MSVC_TOOLSET_VERSION MSVC_VERSION MSYS UNIX WIN32 WIN64)
|
||||||
|
|
||||||
|
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
#
|
||||||
|
# UPX "CMake" build file; see https://cmake.org/
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# test section: self-pack tests
|
||||||
|
#
|
||||||
|
# IMPORTANT NOTE: these tests can only work if the host executable format
|
||||||
|
# is supported by UPX!
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
set(emu "")
|
||||||
|
if(DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
|
set(emu "${CMAKE_CROSSCOMPILING_EMULATOR}")
|
||||||
|
endif()
|
||||||
|
set(exe "${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
|
set(upx_self_exe "$<TARGET_FILE:upx>")
|
||||||
|
set(fo "--force-overwrite")
|
||||||
|
|
||||||
|
#
|
||||||
|
# basic tests
|
||||||
|
#
|
||||||
|
|
||||||
|
upx_add_test(upx-self-pack upx -3 "${upx_self_exe}" ${fo} -o upx-packed${exe})
|
||||||
|
upx_add_test(upx-self-pack-fa upx -3 --all-filters "${upx_self_exe}" ${fo} -o upx-packed-fa${exe})
|
||||||
|
upx_add_test(upx-self-pack-fn upx -3 --no-filter "${upx_self_exe}" ${fo} -o upx-packed-fn${exe})
|
||||||
|
upx_add_test(upx-self-pack-fr upx -3 --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-fr${exe})
|
||||||
|
upx_add_test(upx-self-pack-nrv2b upx -3 --nrv2b "${upx_self_exe}" ${fo} -o upx-packed-nrv2b${exe})
|
||||||
|
upx_add_test(upx-self-pack-nrv2d upx -3 --nrv2d "${upx_self_exe}" ${fo} -o upx-packed-nrv2d${exe})
|
||||||
|
upx_add_test(upx-self-pack-nrv2e upx -3 --nrv2e "${upx_self_exe}" ${fo} -o upx-packed-nrv2e${exe})
|
||||||
|
upx_add_test(upx-self-pack-lzma upx -1 --lzma "${upx_self_exe}" ${fo} -o upx-packed-lzma${exe})
|
||||||
|
|
||||||
|
upx_add_test(upx-list upx -l upx-packed${exe} upx-packed-fa${exe} upx-packed-fn${exe} upx-packed-fr${exe} upx-packed-nrv2b${exe} upx-packed-nrv2d${exe} upx-packed-nrv2e${exe} upx-packed-lzma${exe})
|
||||||
|
upx_add_test(upx-fileinfo upx --fileinfo upx-packed${exe} upx-packed-fa${exe} upx-packed-fn${exe} upx-packed-fr${exe} upx-packed-nrv2b${exe} upx-packed-nrv2d${exe} upx-packed-nrv2e${exe} upx-packed-lzma${exe})
|
||||||
|
upx_add_test(upx-test upx -t upx-packed${exe} upx-packed-fa${exe} upx-packed-fn${exe} upx-packed-fr${exe} upx-packed-nrv2b${exe} upx-packed-nrv2d${exe} upx-packed-nrv2e${exe} upx-packed-lzma${exe})
|
||||||
|
|
||||||
|
upx_add_test(upx-unpack upx -d upx-packed${exe} ${fo} -o upx-unpacked${exe})
|
||||||
|
upx_add_test(upx-unpack-fa upx -d upx-packed-fa${exe} ${fo} -o upx-unpacked-fa${exe})
|
||||||
|
upx_add_test(upx-unpack-fn upx -d upx-packed-fn${exe} ${fo} -o upx-unpacked-fn${exe})
|
||||||
|
upx_add_test(upx-unpack-fr upx -d upx-packed-fr${exe} ${fo} -o upx-unpacked-fr${exe})
|
||||||
|
upx_add_test(upx-unpack-nrv2b upx -d upx-packed-nrv2b${exe} ${fo} -o upx-unpacked-nrv2b${exe})
|
||||||
|
upx_add_test(upx-unpack-nrv2d upx -d upx-packed-nrv2d${exe} ${fo} -o upx-unpacked-nrv2d${exe})
|
||||||
|
upx_add_test(upx-unpack-nrv2e upx -d upx-packed-nrv2e${exe} ${fo} -o upx-unpacked-nrv2e${exe})
|
||||||
|
upx_add_test(upx-unpack-lzma upx -d upx-packed-lzma${exe} ${fo} -o upx-unpacked-lzma${exe})
|
||||||
|
|
||||||
|
# all unpacked files must be identical
|
||||||
|
upx_add_test(upx-compare-fa "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-fa${exe})
|
||||||
|
upx_add_test(upx-compare-fn "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-fn${exe})
|
||||||
|
upx_add_test(upx-compare-fr "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-fr${exe})
|
||||||
|
upx_add_test(upx-compare-nrv2b "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-nrv2b${exe})
|
||||||
|
upx_add_test(upx-compare-nrv2d "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-nrv2d${exe})
|
||||||
|
upx_add_test(upx-compare-nrv2e "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-nrv2e${exe})
|
||||||
|
upx_add_test(upx-compare-lzma "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-lzma${exe})
|
||||||
|
|
||||||
|
# test dependencies
|
||||||
|
upx_test_depends(upx-list "upx-self-pack;upx-self-pack-fa;upx-self-pack-fn;upx-self-pack-fr;upx-self-pack-nrv2b;upx-self-pack-nrv2d;upx-self-pack-nrv2e;upx-self-pack-lzma")
|
||||||
|
upx_test_depends(upx-fileinfo "upx-self-pack;upx-self-pack-fa;upx-self-pack-fn;upx-self-pack-fr;upx-self-pack-nrv2b;upx-self-pack-nrv2d;upx-self-pack-nrv2e;upx-self-pack-lzma")
|
||||||
|
upx_test_depends(upx-test "upx-self-pack;upx-self-pack-fa;upx-self-pack-fn;upx-self-pack-fr;upx-self-pack-nrv2b;upx-self-pack-nrv2d;upx-self-pack-nrv2e;upx-self-pack-lzma")
|
||||||
|
upx_test_depends(upx-unpack upx-self-pack)
|
||||||
|
upx_test_depends(upx-unpack-fa upx-self-pack-fa)
|
||||||
|
upx_test_depends(upx-unpack-fn upx-self-pack-fn)
|
||||||
|
upx_test_depends(upx-unpack-fr upx-self-pack-fr)
|
||||||
|
upx_test_depends(upx-unpack-nrv2b upx-self-pack-nrv2b)
|
||||||
|
upx_test_depends(upx-unpack-nrv2d upx-self-pack-nrv2d)
|
||||||
|
upx_test_depends(upx-unpack-nrv2e upx-self-pack-nrv2e)
|
||||||
|
upx_test_depends(upx-unpack-lzma upx-self-pack-lzma)
|
||||||
|
upx_test_depends(upx-compare-fa "upx-unpack;upx-unpack-fa")
|
||||||
|
upx_test_depends(upx-compare-fn "upx-unpack;upx-unpack-fn")
|
||||||
|
upx_test_depends(upx-compare-fr "upx-unpack;upx-unpack-fr")
|
||||||
|
upx_test_depends(upx-compare-nrv2b "upx-unpack;upx-unpack-nrv2b")
|
||||||
|
upx_test_depends(upx-compare-nrv2d "upx-unpack;upx-unpack-nrv2d")
|
||||||
|
upx_test_depends(upx-compare-nrv2e "upx-unpack;upx-unpack-nrv2e")
|
||||||
|
upx_test_depends(upx-compare-lzma "upx-unpack;upx-unpack-lzma")
|
||||||
|
# tests with higher COST values will run first
|
||||||
|
set_tests_properties(upx-self-pack PROPERTIES COST 90)
|
||||||
|
set_tests_properties(upx-self-pack-fa PROPERTIES COST 20)
|
||||||
|
set_tests_properties(upx-self-pack-fn PROPERTIES COST 20)
|
||||||
|
set_tests_properties(upx-self-pack-fr PROPERTIES COST 20)
|
||||||
|
set_tests_properties(upx-self-pack-nrv2b PROPERTIES COST 20)
|
||||||
|
set_tests_properties(upx-self-pack-nrv2d PROPERTIES COST 20)
|
||||||
|
set_tests_properties(upx-self-pack-nrv2e PROPERTIES COST 20)
|
||||||
|
set_tests_properties(upx-self-pack-lzma PROPERTIES COST 30)
|
||||||
|
set_tests_properties(upx-unpack PROPERTIES COST 10)
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_RUN_UNPACKED_TEST)
|
||||||
|
upx_add_test(upx-run-unpacked ${emu} ./upx-unpacked${exe} --version-short)
|
||||||
|
upx_test_depends(upx-run-unpacked upx-unpack)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_RUN_PACKED_TEST)
|
||||||
|
upx_add_test(upx-run-packed ${emu} ./upx-packed${exe} --version-short)
|
||||||
|
upx_add_test(upx-run-packed-fa ${emu} ./upx-packed-fa${exe} --version-short)
|
||||||
|
upx_add_test(upx-run-packed-fn ${emu} ./upx-packed-fn${exe} --version-short)
|
||||||
|
upx_add_test(upx-run-packed-fr ${emu} ./upx-packed-fr${exe} --version-short)
|
||||||
|
upx_add_test(upx-run-packed-nrv2b ${emu} ./upx-packed-nrv2b${exe} --version-short)
|
||||||
|
upx_add_test(upx-run-packed-nrv2d ${emu} ./upx-packed-nrv2d${exe} --version-short)
|
||||||
|
upx_add_test(upx-run-packed-nrv2e ${emu} ./upx-packed-nrv2e${exe} --version-short)
|
||||||
|
upx_add_test(upx-run-packed-lzma ${emu} ./upx-packed-lzma${exe} --version-short)
|
||||||
|
upx_test_depends(upx-run-packed upx-self-pack)
|
||||||
|
upx_test_depends(upx-run-packed-fa upx-self-pack-fa)
|
||||||
|
upx_test_depends(upx-run-packed-fn upx-self-pack-fn)
|
||||||
|
upx_test_depends(upx-run-packed-fr upx-self-pack-fr)
|
||||||
|
upx_test_depends(upx-run-packed-nrv2b upx-self-pack-nrv2b)
|
||||||
|
upx_test_depends(upx-run-packed-nrv2d upx-self-pack-nrv2d)
|
||||||
|
upx_test_depends(upx-run-packed-nrv2e upx-self-pack-nrv2e)
|
||||||
|
upx_test_depends(upx-run-packed-lzma upx-self-pack-lzma)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#
|
||||||
|
# exhaustive tests
|
||||||
|
#
|
||||||
|
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS)
|
||||||
|
foreach(method IN ITEMS nrv2b nrv2d nrv2e lzma)
|
||||||
|
foreach(level IN ITEMS 1 2 3 4 5 6 7)
|
||||||
|
set(s "${method}-${level}")
|
||||||
|
upx_add_test(upx-self-pack-${s} upx --${method} -${level} --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-${s}${exe})
|
||||||
|
upx_add_test(upx-list-${s} upx -l upx-packed-${s}${exe})
|
||||||
|
upx_add_test(upx-fileinfo-${s} upx --fileinfo upx-packed-${s}${exe})
|
||||||
|
upx_add_test(upx-test-${s} upx -t upx-packed-${s}${exe})
|
||||||
|
upx_add_test(upx-unpack-${s} upx -d upx-packed-${s}${exe} ${fo} -o upx-unpacked-${s}${exe})
|
||||||
|
upx_add_test(upx-compare-${s} "${CMAKE_COMMAND}" -E compare_files upx-unpacked${exe} upx-unpacked-${s}${exe})
|
||||||
|
upx_test_depends(upx-list-${s} upx-self-pack-${s})
|
||||||
|
upx_test_depends(upx-fileinfo-${s} upx-self-pack-${s})
|
||||||
|
upx_test_depends(upx-test-${s} upx-self-pack-${s})
|
||||||
|
upx_test_depends(upx-unpack-${s} upx-self-pack-${s})
|
||||||
|
upx_test_depends(upx-compare-${s} "upx-unpack;upx-unpack-${s}")
|
||||||
|
if(method MATCHES "lzma")
|
||||||
|
set_tests_properties(upx-self-pack-${s} PROPERTIES COST "3${level}")
|
||||||
|
else()
|
||||||
|
set_tests_properties(upx-self-pack-${s} PROPERTIES COST "2${level}")
|
||||||
|
endif()
|
||||||
|
if(NOT UPX_CONFIG_DISABLE_RUN_PACKED_TEST)
|
||||||
|
upx_add_test(upx-run-packed-${s} ${emu} ./upx-packed-${s}${exe} --version-short)
|
||||||
|
upx_test_depends(upx-run-packed-${s} upx-self-pack-${s})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endforeach()
|
||||||
|
endif () # UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS
|
||||||
|
|
||||||
|
# clean up
|
||||||
|
set(emu "")
|
||||||
|
set(exe "")
|
||||||
|
set(upx_self_exe "")
|
||||||
|
set(fo "")
|
||||||
|
|
||||||
|
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
static std::mutex lock_mutex;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::lock_guard<std::mutex> lock(lock_mutex);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
// Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// check ABI - require proper alignment of fundamental types for use in atomics
|
||||||
|
static_assert(alignof(char) == sizeof(char), "");
|
||||||
|
static_assert(alignof(signed char) == sizeof(signed char), "");
|
||||||
|
static_assert(alignof(unsigned char) == sizeof(unsigned char), "");
|
||||||
|
static_assert(alignof(short) == sizeof(short), "");
|
||||||
|
static_assert(alignof(unsigned short) == sizeof(unsigned short), "");
|
||||||
|
static_assert(alignof(int) == sizeof(int), "");
|
||||||
|
static_assert(alignof(unsigned int) == sizeof(unsigned int), "");
|
||||||
|
static_assert(alignof(long) == sizeof(long), "");
|
||||||
|
static_assert(alignof(unsigned long) == sizeof(unsigned long), "");
|
||||||
|
static_assert(alignof(ptrdiff_t) == sizeof(ptrdiff_t), "");
|
||||||
|
static_assert(alignof(size_t) == sizeof(size_t), "");
|
||||||
|
static_assert(alignof(intptr_t) == sizeof(intptr_t), "");
|
||||||
|
static_assert(alignof(uintptr_t) == sizeof(uintptr_t), "");
|
||||||
|
static_assert(alignof(void *) == sizeof(void *), "");
|
||||||
|
|
||||||
|
int main() { return 0; }
|
||||||
@@ -0,0 +1,329 @@
|
|||||||
|
#
|
||||||
|
# UPX top-level Makefile - needs GNU make and CMake >= 3.13
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
ifeq ($(UPX_MAKEFILE_EXTRA_MK_INCLUDED),)
|
||||||
|
override UPX_MAKEFILE_EXTRA_MK_INCLUDED := 1
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# support functions
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
override check_defined = $(foreach 1,$1,$(if $(filter undefined,$(origin $1)),$(error ERROR: variable '$1' is not defined),))
|
||||||
|
override check_undefined = $(foreach 1,$1,$(if $(filter undefined,$(origin $1)),,$(error ERROR: variable '$1' is already defined)))
|
||||||
|
|
||||||
|
# return "1" or empty-string
|
||||||
|
override eq = $(if $(subst x$1,,x$2)$(subst x$2,,x$1),,1)
|
||||||
|
override ne = $(if $(subst x$1,,x$2)$(subst x$2,,x$1),1,)
|
||||||
|
|
||||||
|
override tolower = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
|
||||||
|
override toupper = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
|
||||||
|
|
||||||
|
# canonicalize case of CMAKE_BUILD_TYPE to "Debug" and "Release"
|
||||||
|
override cm_build_type = $(if $(call eq,$1,),$(error EMPTY-build-type),$(if $(call eq,$(call tolower,$1),debug),Debug,$(if $(call eq,$(call tolower,$1),release),Release,$(if $(call eq,$(call tolower,$1),none),None,$1))))
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# extra builds: some pre-defined build configurations
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
$(call check_defined,run_config run_build)
|
||||||
|
$(call check_undefined,run_config_and_build)
|
||||||
|
|
||||||
|
define run_config_and_build
|
||||||
|
$(call run_config,$1,$2)
|
||||||
|
$(call run_build,$1,$2)
|
||||||
|
endef
|
||||||
|
|
||||||
|
# force building with clang/clang++
|
||||||
|
build/extra/clang/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang/%: export CC = clang
|
||||||
|
build/extra/clang/%: export CXX = clang++
|
||||||
|
|
||||||
|
# force building with clang/clang++ -m32
|
||||||
|
build/extra/clang-m32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-m32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-m32/%: export CC = clang -m32
|
||||||
|
build/extra/clang-m32/%: export CXX = clang++ -m32
|
||||||
|
|
||||||
|
# force building with clang/clang++ -mx32
|
||||||
|
build/extra/clang-mx32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-mx32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-mx32/%: export CC = clang -mx32
|
||||||
|
build/extra/clang-mx32/%: export CXX = clang++ -mx32
|
||||||
|
|
||||||
|
# force building with clang/clang++ -m64
|
||||||
|
build/extra/clang-m64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-m64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-m64/%: export CC = clang -m64
|
||||||
|
build/extra/clang-m64/%: export CXX = clang++ -m64
|
||||||
|
|
||||||
|
# force building with clang/clang++ -static
|
||||||
|
build/extra/clang-static/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-static/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-static/%: export CC = clang -static
|
||||||
|
build/extra/clang-static/%: export CXX = clang++ -static
|
||||||
|
|
||||||
|
# force building with clang/clang++ -static-pie
|
||||||
|
build/extra/clang-static-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-static-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-static-pie/%: export CC = clang -static-pie -fPIE -Wno-unused-command-line-argument
|
||||||
|
build/extra/clang-static-pie/%: export CXX = clang++ -static-pie -fPIE -Wno-unused-command-line-argument
|
||||||
|
|
||||||
|
# force building with clang/clang++ -static -flto
|
||||||
|
build/extra/clang-static-lto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-static-lto/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-static-lto/%: export CC = clang -static -flto
|
||||||
|
build/extra/clang-static-lto/%: export CXX = clang++ -static -flto
|
||||||
|
|
||||||
|
# force building with clang/clang++ C17/C++20
|
||||||
|
build/extra/clang-std-cxx20/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-std-cxx20/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-std-cxx20/%: export CC = clang -std=gnu17
|
||||||
|
build/extra/clang-std-cxx20/%: export CXX = clang++ -std=gnu++20
|
||||||
|
build/extra/clang-std-cxx20/%: export UPX_CONFIG_DISABLE_C_STANDARD=ON
|
||||||
|
build/extra/clang-std-cxx20/%: export UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
||||||
|
|
||||||
|
# force building with clang/clang++ C23/C++23
|
||||||
|
build/extra/clang-std-cxx23/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/clang-std-cxx23/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/clang-std-cxx23/%: export CC = clang -std=gnu2x
|
||||||
|
build/extra/clang-std-cxx23/%: export CXX = clang++ -std=gnu++2b
|
||||||
|
build/extra/clang-std-cxx23/%: export UPX_CONFIG_DISABLE_C_STANDARD=ON
|
||||||
|
build/extra/clang-std-cxx23/%: export UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
||||||
|
|
||||||
|
# force building with gcc/g++
|
||||||
|
build/extra/gcc/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc/%: export CC = gcc
|
||||||
|
build/extra/gcc/%: export CXX = g++
|
||||||
|
|
||||||
|
# force building with gcc/g++ -m32
|
||||||
|
build/extra/gcc-m32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-m32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-m32/%: export CC = gcc -m32
|
||||||
|
build/extra/gcc-m32/%: export CXX = g++ -m32
|
||||||
|
|
||||||
|
# force building with gcc/g++ -mx32
|
||||||
|
build/extra/gcc-mx32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-mx32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-mx32/%: export CC = gcc -mx32
|
||||||
|
build/extra/gcc-mx32/%: export CXX = g++ -mx32
|
||||||
|
|
||||||
|
# force building with gcc/g++ -m64
|
||||||
|
build/extra/gcc-m64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-m64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-m64/%: export CC = gcc -m64
|
||||||
|
build/extra/gcc-m64/%: export CXX = g++ -m64
|
||||||
|
|
||||||
|
# force building with gcc/g++ -static
|
||||||
|
build/extra/gcc-static/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-static/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-static/%: export CC = gcc -static
|
||||||
|
build/extra/gcc-static/%: export CXX = g++ -static
|
||||||
|
|
||||||
|
# force building with gcc/g++ -static-pie
|
||||||
|
build/extra/gcc-static-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-static-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-static-pie/%: export CC = gcc -static-pie -fPIE
|
||||||
|
build/extra/gcc-static-pie/%: export CXX = g++ -static-pie -fPIE
|
||||||
|
|
||||||
|
# force building with gcc/g++ -static -flto
|
||||||
|
build/extra/gcc-static-lto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-static-lto/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-static-lto/%: export CC = gcc -static -flto
|
||||||
|
build/extra/gcc-static-lto/%: export CXX = g++ -static -flto
|
||||||
|
|
||||||
|
# force building with gcc/g++ C17/C++20
|
||||||
|
build/extra/gcc-std-cxx20/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-std-cxx20/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-std-cxx20/%: export CC = gcc -std=gnu17
|
||||||
|
build/extra/gcc-std-cxx20/%: export CXX = g++ -std=gnu++20
|
||||||
|
build/extra/gcc-std-cxx20/%: export UPX_CONFIG_DISABLE_C_STANDARD=ON
|
||||||
|
build/extra/gcc-std-cxx20/%: export UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
||||||
|
|
||||||
|
# force building with gcc/g++ C23/C++23
|
||||||
|
build/extra/gcc-std-cxx23/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/gcc-std-cxx23/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/gcc-std-cxx23/%: export CC = gcc -std=gnu2x
|
||||||
|
build/extra/gcc-std-cxx23/%: export CXX = g++ -std=gnu++2b
|
||||||
|
build/extra/gcc-std-cxx23/%: export UPX_CONFIG_DISABLE_C_STANDARD=ON
|
||||||
|
build/extra/gcc-std-cxx23/%: export UPX_CONFIG_DISABLE_CXX_STANDARD=ON
|
||||||
|
|
||||||
|
# cross compiler: Linux glibc aarch64-linux-gnu (arm64)
|
||||||
|
build/extra/cross-linux-gnu-aarch64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/cross-linux-gnu-aarch64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/cross-linux-gnu-aarch64/%: export CC = aarch64-linux-gnu-gcc
|
||||||
|
build/extra/cross-linux-gnu-aarch64/%: export CXX = aarch64-linux-gnu-g++
|
||||||
|
build/extra/cross-linux-gnu-aarch64/%: CMAKE_SYSTEM_NAME ?= Linux
|
||||||
|
build/extra/cross-linux-gnu-aarch64/%: CMAKE_CROSSCOMPILING_EMULATOR ?= qemu-aarch64
|
||||||
|
|
||||||
|
# cross compiler: Linux glibc arm-linux-gnueabihf
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/%: export CC = arm-linux-gnueabihf-gcc
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/%: export CXX = arm-linux-gnueabihf-g++ -Wno-psabi
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/%: CMAKE_SYSTEM_NAME ?= Linux
|
||||||
|
build/extra/cross-linux-gnu-arm-eabihf/%: CMAKE_CROSSCOMPILING_EMULATOR ?= qemu-arm
|
||||||
|
|
||||||
|
# cross compiler: Windows x86 win32 MinGW (i386)
|
||||||
|
build/extra/cross-windows-mingw32/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/cross-windows-mingw32/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/cross-windows-mingw32/%: export CC = i686-w64-mingw32-gcc -static -D_WIN32_WINNT=0x0501
|
||||||
|
build/extra/cross-windows-mingw32/%: export CXX = i686-w64-mingw32-g++ -static -D_WIN32_WINNT=0x0501
|
||||||
|
build/extra/cross-windows-mingw32/%: CMAKE_SYSTEM_NAME ?= Windows
|
||||||
|
build/extra/cross-windows-mingw32/%: CMAKE_SYSTEM_PROCESSOR ?= X86
|
||||||
|
build/extra/cross-windows-mingw32/%: CMAKE_CROSSCOMPILING_EMULATOR ?= wine
|
||||||
|
|
||||||
|
# cross compiler: Windows x64 win64 MinGW (amd64)
|
||||||
|
build/extra/cross-windows-mingw64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/cross-windows-mingw64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/cross-windows-mingw64/%: export CC = x86_64-w64-mingw32-gcc -static -D_WIN32_WINNT=0x0501
|
||||||
|
build/extra/cross-windows-mingw64/%: export CXX = x86_64-w64-mingw32-g++ -static -D_WIN32_WINNT=0x0501
|
||||||
|
build/extra/cross-windows-mingw64/%: CMAKE_SYSTEM_NAME ?= Windows
|
||||||
|
build/extra/cross-windows-mingw64/%: CMAKE_SYSTEM_PROCESSOR ?= AMD64
|
||||||
|
build/extra/cross-windows-mingw64/%: CMAKE_CROSSCOMPILING_EMULATOR ?= wine
|
||||||
|
|
||||||
|
# cross compiler: macOS arm64 (aarch64)
|
||||||
|
build/extra/cross-darwin-arm64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/cross-darwin-arm64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/cross-darwin-arm64/%: export CC = clang -target arm64-apple-darwin
|
||||||
|
build/extra/cross-darwin-arm64/%: export CXX = clang++ -target arm64-apple-darwin
|
||||||
|
build/extra/cross-darwin-arm64/%: CMAKE_SYSTEM_NAME ?= Darwin
|
||||||
|
build/extra/cross-darwin-arm64/%: CMAKE_SYSTEM_PROCESSOR ?= arm64
|
||||||
|
|
||||||
|
# cross compiler: macOS x86_64 (amd64)
|
||||||
|
build/extra/cross-darwin-x86_64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/extra/cross-darwin-x86_64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/extra/cross-darwin-x86_64/%: export CC = clang -target x86_64-apple-darwin
|
||||||
|
build/extra/cross-darwin-x86_64/%: export CXX = clang++ -target x86_64-apple-darwin
|
||||||
|
build/extra/cross-darwin-x86_64/%: CMAKE_SYSTEM_NAME ?= Darwin
|
||||||
|
build/extra/cross-darwin-x86_64/%: CMAKE_SYSTEM_PROCESSOR ?= x86_64
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# C/C++ static analyzers
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# force building with clang Static Analyzer (scan-build)
|
||||||
|
SCAN_BUILD = scan-build
|
||||||
|
build/analyze/clang-analyzer/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/analyze/clang-analyzer/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/analyze/clang-analyzer/%: override CMAKE := $(SCAN_BUILD) $(CMAKE)
|
||||||
|
build/analyze/clang-analyzer/%: export CCC_CC ?= clang
|
||||||
|
build/analyze/clang-analyzer/%: export CCC_CXX ?= clang++
|
||||||
|
|
||||||
|
# run clang-tidy: uses file compile_commands.json from an existing clang build;
|
||||||
|
# does not create any actual files, so purely PHONY
|
||||||
|
CLANG_TIDY_BUILD_BASE = build/extra/clang
|
||||||
|
RUN_CLANG_TIDY = time python3 ./misc/analyze/clang-tidy/run-clang-tidy.py -p $<
|
||||||
|
RUN_CLANG_TIDY_WERROR = $(RUN_CLANG_TIDY) '-warnings-as-errors=*'
|
||||||
|
build/analyze/clang-tidy-upx/debug build/analyze/clang-tidy-upx/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||||
|
$(RUN_CLANG_TIDY_WERROR) -config-file ./.clang-tidy '/src/.*\.cpp'
|
||||||
|
build/analyze/clang-tidy-bzip2/debug build/analyze/clang-tidy-bzip2/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||||
|
$(RUN_CLANG_TIDY) -config-file ./misc/analyze/clang-tidy/clang-tidy-bzip2.yml /vendor/bzip2/
|
||||||
|
build/analyze/clang-tidy-ucl/debug build/analyze/clang-tidy-ucl/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||||
|
$(RUN_CLANG_TIDY_WERROR) -config-file ./misc/analyze/clang-tidy/clang-tidy-ucl.yml /vendor/ucl/
|
||||||
|
build/analyze/clang-tidy-zlib/debug build/analyze/clang-tidy-zlib/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||||
|
$(RUN_CLANG_TIDY) -config-file ./misc/analyze/clang-tidy/clang-tidy-zlib.yml /vendor/zlib/
|
||||||
|
build/analyze/clang-tidy-zstd/debug build/analyze/clang-tidy-zstd/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||||
|
$(RUN_CLANG_TIDY) -config-file ./misc/analyze/clang-tidy/clang-tidy-zstd.yml /vendor/zstd/
|
||||||
|
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-upx/$$(notdir $$@)
|
||||||
|
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-bzip2/$$(notdir $$@)
|
||||||
|
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-ucl/$$(notdir $$@)
|
||||||
|
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-zlib/$$(notdir $$@)
|
||||||
|
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-zstd/$$(notdir $$@)
|
||||||
|
|
||||||
|
# OLD names [deprecated]
|
||||||
|
build/extra/scan-build/debug: build/analyze/clang-analyzer/debug PHONY
|
||||||
|
build/extra/scan-build/release: build/analyze/clang-analyzer/release PHONY
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# advanced: generic eXtra target
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# usage:
|
||||||
|
# make UPX_XTARGET=my-target CC="my-cc -flags" CXX="my-cxx -flags"
|
||||||
|
# make UPX_XTARGET=my-target CC="my-cc -flags" CXX="my-cxx -flags" xtarget/debug
|
||||||
|
|
||||||
|
ifneq ($(UPX_XTARGET),)
|
||||||
|
ifneq ($(CC),)
|
||||||
|
ifneq ($(CXX),)
|
||||||
|
|
||||||
|
UPX_XTARGET := $(UPX_XTARGET)
|
||||||
|
build/$(UPX_XTARGET)/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||||
|
build/$(UPX_XTARGET)/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||||
|
build/$(UPX_XTARGET)/%: export CC := $(CC)
|
||||||
|
build/$(UPX_XTARGET)/%: export CXX := $(CXX)
|
||||||
|
# shortcuts
|
||||||
|
xtarget/all: xtarget/debug xtarget/release PHONY
|
||||||
|
xtarget/debug: build/$(UPX_XTARGET)/debug PHONY
|
||||||
|
xtarget/release: build/$(UPX_XTARGET)/release PHONY
|
||||||
|
xtarget/all+test: xtarget/debug+test xtarget/release+test PHONY
|
||||||
|
xtarget/debug+test: build/$(UPX_XTARGET)/debug+test PHONY
|
||||||
|
xtarget/release+test: build/$(UPX_XTARGET)/release+test PHONY
|
||||||
|
# set new default
|
||||||
|
.DEFAULT_GOAL := build/$(UPX_XTARGET)/release
|
||||||
|
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# assemble cmake config flags; useful for CI jobs
|
||||||
|
#
|
||||||
|
# info: by default CMake only honors the CC and CXX environment variables; make
|
||||||
|
# it easy to set other variables like CMAKE_AR or CMAKE_RANLIB
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
$(call check_undefined,__add_cmake_config)
|
||||||
|
# promote an environment or Make variable to a CMake cache entry:
|
||||||
|
__add_cmake_config = $(and $($1),-D$1="$($1)")
|
||||||
|
|
||||||
|
# pass common CMake settings
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_VERBOSE_MAKEFILE)
|
||||||
|
# pass common CMake toolchain settings
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_ADDR2LINE)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_AR)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_DLLTOOL)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_LINKER)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_NM)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_OBJCOPY)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_OBJDUMP)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_RANLIB)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_READELF)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_STRIP)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_TAPI)
|
||||||
|
# pass common CMake LTO toolchain settings
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_C_COMPILER_AR)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_C_COMPILER_RANLIB)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_CXX_COMPILER_AR)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_CXX_COMPILER_RANLIB)
|
||||||
|
# pass common CMake cross compilation settings
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_SYSTEM_NAME)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_SYSTEM_PROCESSOR)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
|
# pass UPX config options; see CMakeLists.txt
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_GITREV)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_SANITIZE)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_WERROR)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_WSTRICT)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_SELF_PACK_TEST)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS)
|
||||||
|
# pass UPX extra compile options; see CMakeLists.txt
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB)
|
||||||
|
UPX_CMAKE_CONFIG_FLAGS += $(call __add_cmake_config,UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD)
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# check git submodules
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
SUBMODULES = doctest lzma-sdk ucl valgrind zlib
|
||||||
|
|
||||||
|
$(foreach 1,$(SUBMODULES),$(if $(wildcard vendor/$1/[CL]*),,\
|
||||||
|
$(error ERROR: missing git submodule '$1'; run 'git submodule update --init')))
|
||||||
|
|
||||||
|
endif # UPX_MAKEFILE_EXTRA_MK_INCLUDED
|
||||||
Executable
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
||||||
|
|
||||||
|
# create the image from Dockerfile
|
||||||
|
# using a rootless Podman container
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
image=upx-stubtools-20240405-v1
|
||||||
|
[[ $1 == --print-image ]] && echo "$image" && exit 0
|
||||||
|
|
||||||
|
podman build -t "$image" -f "$argv0dir/Dockerfile" "$argv0dir"
|
||||||
|
|
||||||
|
podman image list "$image"
|
||||||
|
echo
|
||||||
|
podman image tree "$image"
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
||||||
|
|
||||||
|
# list all system packages that are installed in the image
|
||||||
|
# using a rootless Podman container
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
image="$("$argv0dir/10-create-image.sh" --print-image)"
|
||||||
|
|
||||||
|
podman image list "$image"
|
||||||
|
echo
|
||||||
|
podman image tree "$image"
|
||||||
|
|
||||||
|
echo 'Packages:'
|
||||||
|
flags=( --read-only --rm --pull=never )
|
||||||
|
flags+=( --cap-drop=all ) # drop all capabilities
|
||||||
|
flags+=( --network=none ) # no network needed
|
||||||
|
podman run "${flags[@]}" "$image" bash -c $'dpkg -l | sed \'s/ *$//\' | LC_ALL=C sort'
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Packages sorted by Installed-Size:'
|
||||||
|
podman run "${flags[@]}" "$image" bash -c $'awk \'
|
||||||
|
BEGIN {
|
||||||
|
arch = "UNKNOWN"; size = 0; package = "UNKNOWN";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if ($1 == "Architecture:") arch = $2;
|
||||||
|
if ($1 == "Installed-Size:") size = $2;
|
||||||
|
if ($1 == "Package:") package = $2;
|
||||||
|
if ($1 == "") {
|
||||||
|
printf("%9d %-40s %s\\n", size, package, arch);
|
||||||
|
count += 1; total += size;
|
||||||
|
arch = "UNKNOWN"; size = 0; package = "UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END {
|
||||||
|
printf("%9d ===== TOTAL (%d packages)\\n", total, count);
|
||||||
|
}
|
||||||
|
\' /var/lib/dpkg/status | LC_ALL=C sort -rn'
|
||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
||||||
|
|
||||||
|
# run an interactive shell in the image
|
||||||
|
# using a rootless Podman container
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
image="$("$argv0dir/10-create-image.sh" --print-image)"
|
||||||
|
|
||||||
|
flags=( --read-only --rm --pull=never )
|
||||||
|
flags+=( --cap-drop=all ) # drop all capabilities
|
||||||
|
flags+=( --network=none ) # no network needed
|
||||||
|
flags+=( -ti -e TERM="$TERM" ) # allocate an interactive pseudo-tty and pass $TERM
|
||||||
|
if [[ 1 == 1 ]]; then
|
||||||
|
# run as user upx 2000:2000
|
||||||
|
flags+=( --user 2000 )
|
||||||
|
# map container users 0..999 to subuid-users 1..1000, and map container user 2000 to current host user
|
||||||
|
flags+=( --uidmap=0:1:1000 --uidmap=2000:0:1 )
|
||||||
|
# map container groups 0..999 to subgid-groups 1..1000, and map container group 2000 to current host group
|
||||||
|
flags+=( --gidmap=0:1:1000 --gidmap=2000:0:1 )
|
||||||
|
# NOTE: we mount the upx top-level directory read-write under /home/upx/src/upx
|
||||||
|
# INFO: SELinux users *may* have to add ":z" to the volume mount flags; check the docs!
|
||||||
|
flags+=( -v "${argv0dir}/../../..:/home/upx/src/upx" )
|
||||||
|
flags+=( -w /home/upx/src/upx ) # set working directory
|
||||||
|
flags+=( --tmpfs /home/upx/.cache:rw,exec ) # mount a writeable tmpfs
|
||||||
|
flags+=( --tmpfs /home/upx/.config:rw,exec ) # mount a writeable tmpfs
|
||||||
|
flags+=( --tmpfs /home/upx/.local:rw,exec ) # mount a writeable tmpfs
|
||||||
|
else
|
||||||
|
# run as user root 0:0
|
||||||
|
# ONLY FOR DEBUGGING THE IMAGE
|
||||||
|
# map container user/group 0 to current host user/group
|
||||||
|
flags+=( --user 0 )
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $# == 0 ]]; then
|
||||||
|
podman run "${flags[@]}" "$image" bash -l
|
||||||
|
else
|
||||||
|
podman run "${flags[@]}" "$image" "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# now we can rebuild the UPX stubs:
|
||||||
|
# cd /home/upx/src/upx/src/stub
|
||||||
|
# # make sure that git is clean:
|
||||||
|
# git status .
|
||||||
|
# # remove stub files and make sure that they got deleted:
|
||||||
|
# make maintainer-clean extra-clean
|
||||||
|
# git status .
|
||||||
|
# # rebuild
|
||||||
|
# make extra-all all
|
||||||
|
# # make sure that the stub files did rebuild correctly:
|
||||||
|
# git status .
|
||||||
|
# git diff .
|
||||||
|
|
||||||
|
# we can also build UPX in the container:
|
||||||
|
# cd /home/upx/src/upx
|
||||||
|
# rm -rf ./build/extra/gcc/release
|
||||||
|
# make build/extra/gcc/release
|
||||||
|
# # run tests
|
||||||
|
# ./build/extra/gcc/release/upx --version
|
||||||
|
# make -C build/extra/gcc/release test
|
||||||
|
|
||||||
|
# and we can also build UPX with -m32:
|
||||||
|
# cd /home/upx/src/upx
|
||||||
|
# rm -rf ./build/extra/gcc-m32/release
|
||||||
|
# make build/extra/gcc-m32/release
|
||||||
|
# # run tests
|
||||||
|
# ./build/extra/gcc-m32/release/upx --version
|
||||||
|
# make -C build/extra/gcc-m32/release test
|
||||||
|
|
||||||
|
# and we can also build UPX with -mx32: (NOTE: needs CONFIG_X86_X32_ABI on host kernel!)
|
||||||
|
# cd /home/upx/src/upx
|
||||||
|
# rm -rf ./build/extra/gcc-mx32/release
|
||||||
|
# make build/extra/gcc-mx32/release
|
||||||
|
# # run tests (needs CONFIG_X86_X32_ABI on host kernel)
|
||||||
|
# ./build/extra/gcc-mx32/release/upx --version
|
||||||
|
# make -C build/extra/gcc-mx32/release test
|
||||||
|
|
||||||
|
# and we can also rebuild the UPX docs the container:
|
||||||
|
# cd /home/upx/src/upx/doc
|
||||||
|
# make clean all
|
||||||
|
# git status .
|
||||||
|
# git diff .
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
||||||
|
|
||||||
|
# rebuild stubs from source code
|
||||||
|
# (also see 20-image-run-shell.sh for more container usage examples)
|
||||||
|
# using a rootless Podman container
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
image="$("$argv0dir/10-create-image.sh" --print-image)"
|
||||||
|
|
||||||
|
flags=( --read-only --rm --pull=never )
|
||||||
|
flags+=( --cap-drop=all ) # drop all capabilities
|
||||||
|
flags+=( --network=none ) # no network needed
|
||||||
|
if [[ 1 == 1 ]]; then
|
||||||
|
# run as user upx 2000:2000
|
||||||
|
flags+=( --user 2000 )
|
||||||
|
# map container users 0..999 to subuid-users 1..1000, and map container user 2000 to current host user
|
||||||
|
flags+=( --uidmap=0:1:1000 --uidmap=2000:0:1 )
|
||||||
|
# map container groups 0..999 to subgid-groups 1..1000, and map container group 2000 to current host group
|
||||||
|
flags+=( --gidmap=0:1:1000 --gidmap=2000:0:1 )
|
||||||
|
# NOTE: we mount the upx top-level directory read-write under /home/upx/src/upx
|
||||||
|
# INFO: SELinux users *may* have to add ":z" to the volume mount flags; check the docs!
|
||||||
|
flags+=( -v "${argv0dir}/../../..:/home/upx/src/upx" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
podman run "${flags[@]}" "$image" bash -c $'
|
||||||
|
set -ex; set -o pipefail
|
||||||
|
cd /home/upx/src/upx
|
||||||
|
# check whitespace
|
||||||
|
[[ -d .git ]] && bash ./misc/scripts/check_whitespace_git.sh
|
||||||
|
# rebuild docs
|
||||||
|
make -C doc clean all
|
||||||
|
# rebuild stubs
|
||||||
|
cd /home/upx/src/upx/src/stub
|
||||||
|
make maintainer-clean extra-clean
|
||||||
|
git status . || true # make sure the stub files got deleted
|
||||||
|
make extra-all all
|
||||||
|
echo "===== Rebuilt stubs. All done. ====="
|
||||||
|
exit 0
|
||||||
|
'
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
FROM docker.io/library/ubuntu:24.04
|
||||||
|
ENV UPX_CONTAINER_IMAGE_NAME=upx-stubtools-20240405-v1
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV LANG=C.UTF-8
|
||||||
|
|
||||||
|
# install system packages
|
||||||
|
RUN dpkg --add-architecture i386 \
|
||||||
|
&& apt-get update && apt-get upgrade -y \
|
||||||
|
&& apt-get install -y --no-install-recommends \
|
||||||
|
aria2 bash bash-completion ca-certificates curl git less libmpc3 \
|
||||||
|
make ncurses-term perl-base tar time wget xz-utils \
|
||||||
|
libc6:i386 zlib1g:i386 \
|
||||||
|
# the following packages are not required for rebuilding the stubs, but
|
||||||
|
# they do make the image *much* more convenient and also allow building
|
||||||
|
# the full UPX binary inside the container via CMake:
|
||||||
|
7zip bfs bubblewrap busybox bzip2 bzip3 cabextract ccache chrpath cmake cpio dash diffstat \
|
||||||
|
elfutils execstack fd-find file fish fzf g++ gawk gdb gojq ht htop hyperfine jq ksh \
|
||||||
|
libzstd-dev lsb-release lz4 lzip lzop minify mksh moreutils musl neovim ninja-build \
|
||||||
|
p7zip parallel patch patchelf patchutils pax-utils proot \
|
||||||
|
python3 python3-pyasn1 python3-pycryptodome python3-pycurl python3-toml python3-yaml python3-zstd \
|
||||||
|
re2c ripgrep rsync screen strace universal-ctags unzip valgrind yash yq \
|
||||||
|
zip zlib1g-dev zoxide zsh zstd \
|
||||||
|
# extra packages for compiling with "gcc -m32" and "gcc -mx32":
|
||||||
|
g++-multilib gcc-multilib \
|
||||||
|
&& true
|
||||||
|
|
||||||
|
# install python2-minimal packages from Debian-11; REQUIRED
|
||||||
|
RUN cd /root \
|
||||||
|
&& aria2c --checksum=sha-256=85833c92314011b89bbead6f9a5a7a360b5ee4f9b95e001225afead4ebf9f7d3 \
|
||||||
|
'https://ftp.debian.org/debian/pool/main/p/python2.7/libpython2.7-minimal_2.7.18-8+deb11u1_amd64.deb' \
|
||||||
|
&& aria2c --checksum=sha-256=44f0cdc1a343303d31c55fcb3a6402cfe326adf749ec30e375e6e0c0c5f7c1f7 \
|
||||||
|
'https://ftp.debian.org/debian/pool/main/p/python2.7/python2.7-minimal_2.7.18-8+deb11u1_amd64.deb' \
|
||||||
|
&& dpkg -i ./*.deb \
|
||||||
|
&& rm ./*.deb \
|
||||||
|
&& if ! test -f /usr/bin/python2; then ln -s -v python2.7 /usr/bin/python2; fi \
|
||||||
|
&& ldconfig \
|
||||||
|
&& true
|
||||||
|
|
||||||
|
# manually unpack and install compat libs from Ubuntu-16.04; REQUIRED
|
||||||
|
RUN cd /root \
|
||||||
|
&& aria2c --checksum=sha-256=de22baf3dd851a10e16fbf66a243e70149ca46e06b2939fdc79429196cefc090 \
|
||||||
|
'https://archive.kernel.org/ubuntu-archive/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.6-1_amd64.deb' \
|
||||||
|
&& mkdir packages \
|
||||||
|
&& for f in ./*.deb; do dpkg -x $f ./packages; done \
|
||||||
|
&& mv -v -n ./packages/usr/lib/x86_64-linux-gnu/lib* /usr/lib/x86_64-linux-gnu/ \
|
||||||
|
&& rm -rf ./*.deb ./packages \
|
||||||
|
&& ldconfig \
|
||||||
|
&& true
|
||||||
|
|
||||||
|
# install upx-stubtools into /usr/local/bin/bin-upx-20221212; REQUIRED
|
||||||
|
RUN cd /root \
|
||||||
|
&& aria2c --checksum=sha-256=509e06639118a79d8e79489a400e134c6d3ca36bad2c6ec29648d7c1e5b81afa \
|
||||||
|
'https://github.com/upx/upx-stubtools/releases/download/v20221212/bin-upx-20221212.tar.xz' \
|
||||||
|
&& cd /usr/local/bin \
|
||||||
|
&& tar -xoaf /root/bin-upx-20221212.tar.xz \
|
||||||
|
&& rm /root/bin-upx-20221212.tar.xz \
|
||||||
|
&& true
|
||||||
|
|
||||||
|
# install official UPX release binaries into /usr/local/bin; not required but convenient for testing
|
||||||
|
RUN cd /root \
|
||||||
|
&& wget -q https://github.com/upx/upx/releases/download/v3.91/upx-3.91-amd64_linux.tar.bz2 \
|
||||||
|
&& xzversions="3.92 3.93 3.94 3.95 3.96 4.0.0 4.0.1 4.0.2 4.1.0 4.2.0 4.2.1 4.2.2 4.2.3" \
|
||||||
|
&& for v in $xzversions; do wget -q https://github.com/upx/upx/releases/download/v${v}/upx-${v}-amd64_linux.tar.xz; done \
|
||||||
|
&& for f in ./upx-*.tar.*; do tar -xoaf $f; done \
|
||||||
|
&& for v in 3.91 $xzversions; do d=upx-${v}-amd64_linux; ./$d/upx -qq -d $d/upx -o /usr/local/bin/upx-${v}; done \
|
||||||
|
&& rm -r ./upx-*.tar.* ./upx-*linux \
|
||||||
|
&& true
|
||||||
|
|
||||||
|
# create default container user upx:upx 2000:2000
|
||||||
|
RUN useradd upx -U --uid 2000 --shell /bin/bash -m \
|
||||||
|
&& cd /home/upx && chmod 00700 . \
|
||||||
|
# prepare ~/.cache, ~/.config and ~/.local for possible tmpfs mounts
|
||||||
|
&& mkdir -p .cache/tmp .local/bin src/upx \
|
||||||
|
&& for d in ccache fontconfig go-build mesa_shader_cache parallel tmp wine zig; do mkdir -p .cache/$d; done \
|
||||||
|
&& for d in fish git helix kak nvim; do mkdir -p .config/$d; done \
|
||||||
|
&& for d in bin include lib share state; do mkdir -p .local/$d; done \
|
||||||
|
&& ln -s .cache/wine .wine && ln -s .cache/tmp tmp \
|
||||||
|
# symlink upx-stubtools
|
||||||
|
&& ln -s /usr/local/bin/bin-upx-20221212 .local/bin/bin-upx \
|
||||||
|
# some convenience settings according to upx developer preferences
|
||||||
|
&& echo "alias md=mkdir" >> .bashrc \
|
||||||
|
&& echo "alias rd=rmdir" >> .bashrc \
|
||||||
|
&& echo 'mdd() { mkdir "$1" && cd "$1"; }' >> .bashrc \
|
||||||
|
&& echo 'm() { make "$@"; }' >> .bashrc \
|
||||||
|
&& echo 'tn() { time nice "$@"; }' >> .bashrc \
|
||||||
|
&& echo 'tnm() { time nice make "$@"; }' >> .bashrc \
|
||||||
|
&& echo 'tnmm() { time nice make -j "$@"; }' >> .bashrc \
|
||||||
|
&& echo 'source /usr/share/bash-completion/completions/make' >> .bashrc \
|
||||||
|
&& echo 'complete -F _make m tnm tnmm' >> .bashrc \
|
||||||
|
&& echo 'eval "$(zoxide init bash)"' >> .bashrc \
|
||||||
|
&& echo "alias zz=zi\nalias y=z\nalias yy=zi" >> .bashrc \
|
||||||
|
&& echo "alias cd..='cd ..'" >> .bashrc \
|
||||||
|
&& echo "alias ..='cd ..'" >> .bashrc \
|
||||||
|
&& echo "alias .='cd ..'" >> .bashrc \
|
||||||
|
&& chown -R upx:upx . \
|
||||||
|
&& true
|
||||||
|
USER upx
|
||||||
Generated
+719
@@ -0,0 +1,719 @@
|
|||||||
|
Packages:
|
||||||
|
+++-=============================-=================================-============-================================================================================
|
||||||
|
Desired=Unknown/Install/Remove/Purge/Hold
|
||||||
|
ii 7zip 23.01+dfsg-11 amd64 7-Zip file archiver with a high compression ratio
|
||||||
|
ii apt 2.7.14build2 amd64 commandline package manager
|
||||||
|
ii aria2 1.37.0+debian-1build3 amd64 High speed download utility
|
||||||
|
ii base-files 13ubuntu10 amd64 Debian base system miscellaneous files
|
||||||
|
ii base-passwd 3.6.3build1 amd64 Debian base system master password and group files
|
||||||
|
ii bash 5.2.21-2ubuntu4 amd64 GNU Bourne Again SHell
|
||||||
|
ii bash-completion 1:2.11-8 all programmable completion for the bash shell
|
||||||
|
ii bfs 3.1.2-1build1 amd64 Breadth-first version of find(1)
|
||||||
|
ii binutils 2.42-4ubuntu2 amd64 GNU assembler, linker and binary utilities
|
||||||
|
ii binutils-common:amd64 2.42-4ubuntu2 amd64 Common files for the GNU assembler, linker and binary utilities
|
||||||
|
ii binutils-x86-64-linux-gnu 2.42-4ubuntu2 amd64 GNU binary utilities, for x86-64-linux-gnu target
|
||||||
|
ii bsdextrautils 2.39.3-9ubuntu6 amd64 extra utilities from 4.4BSD-Lite
|
||||||
|
ii bsdutils 1:2.39.3-9ubuntu6 amd64 basic utilities from 4.4BSD-Lite
|
||||||
|
ii bubblewrap 0.9.0-1build1 amd64 utility for unprivileged chroot and namespace manipulation
|
||||||
|
ii busybox 1:1.36.1-6ubuntu3 amd64 Tiny utilities for small and embedded systems
|
||||||
|
ii bzip2 1.0.8-5.1 amd64 high-quality block-sorting file compressor - utilities
|
||||||
|
ii bzip3 1.4.0-1 amd64 better, faster and stronger spiritual successor to bzip2 - utilities
|
||||||
|
ii ca-certificates 20240203 all Common CA certificates
|
||||||
|
ii cabextract 1.11-2 amd64 Microsoft Cabinet file unpacker
|
||||||
|
ii ccache 4.9.1-1 amd64 Compiler cache for fast recompilation of C/C++ code
|
||||||
|
ii chrpath 0.16-2build1 amd64 Tool to edit the rpath in ELF binaries
|
||||||
|
ii cmake 3.28.3-1build7 amd64 cross-platform, open-source make system
|
||||||
|
ii cmake-data 3.28.3-1build7 all CMake data files (modules, templates and documentation)
|
||||||
|
ii coreutils 9.4-3ubuntu6 amd64 GNU core utilities
|
||||||
|
ii cpio 2.15+dfsg-1ubuntu2 amd64 GNU cpio -- a program to manage archives of files
|
||||||
|
ii cpp 4:13.2.0-7ubuntu1 amd64 GNU C preprocessor (cpp)
|
||||||
|
ii cpp-13 13.2.0-23ubuntu4 amd64 GNU C preprocessor
|
||||||
|
ii cpp-13-x86-64-linux-gnu 13.2.0-23ubuntu4 amd64 GNU C preprocessor for x86_64-linux-gnu
|
||||||
|
ii cpp-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C preprocessor (cpp) for the amd64 architecture
|
||||||
|
ii curl 8.5.0-2ubuntu10.1 amd64 command line tool for transferring data with URL syntax
|
||||||
|
ii dash 0.5.12-6ubuntu5 amd64 POSIX-compliant shell
|
||||||
|
ii debconf 1.5.86ubuntu1 all Debian configuration management system
|
||||||
|
ii debianutils 5.17build1 amd64 Miscellaneous utilities specific to Debian
|
||||||
|
ii diffstat 1.66-1build1 amd64 produces graph of changes introduced by a diff file
|
||||||
|
ii diffutils 1:3.10-1build1 amd64 File comparison utilities
|
||||||
|
ii dpkg 1.22.6ubuntu6 amd64 Debian package management system
|
||||||
|
ii e2fsprogs 1.47.0-2.4~exp1ubuntu4 amd64 ext2/ext3/ext4 file system utilities
|
||||||
|
ii elfutils 0.190-1.1build4 amd64 collection of utilities to handle ELF objects
|
||||||
|
ii execstack 0.0.20131005-1.1ubuntu1 amd64 ELF GNU_STACK program header editing utility
|
||||||
|
ii fd-find 9.0.0-1 amd64 Simple, fast and user-friendly alternative to find
|
||||||
|
ii file 1:5.45-3build1 amd64 Recognize the type of data in a file using "magic" numbers
|
||||||
|
ii findutils 4.9.0-5build1 amd64 utilities for finding files--find, xargs
|
||||||
|
ii fish 3.7.0-1 amd64 friendly interactive shell
|
||||||
|
ii fish-common 3.7.0-1 all friendly interactive shell (architecture-independent files)
|
||||||
|
ii fzf 0.44.1-1 amd64 general-purpose command-line fuzzy finder
|
||||||
|
ii g++ 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler
|
||||||
|
ii g++-13 13.2.0-23ubuntu4 amd64 GNU C++ compiler
|
||||||
|
ii g++-13-multilib 13.2.0-23ubuntu4 amd64 GNU C++ compiler (multilib support)
|
||||||
|
ii g++-13-x86-64-linux-gnu 13.2.0-23ubuntu4 amd64 GNU C++ compiler for x86_64-linux-gnu architecture
|
||||||
|
ii g++-multilib 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler (multilib files)
|
||||||
|
ii g++-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler for the amd64 architecture
|
||||||
|
ii gawk 1:5.2.1-2build3 amd64 GNU awk, a pattern scanning and processing language
|
||||||
|
ii gcc 4:13.2.0-7ubuntu1 amd64 GNU C compiler
|
||||||
|
ii gcc-13 13.2.0-23ubuntu4 amd64 GNU C compiler
|
||||||
|
ii gcc-13-base:amd64 13.2.0-23ubuntu4 amd64 GCC, the GNU Compiler Collection (base package)
|
||||||
|
ii gcc-13-multilib 13.2.0-23ubuntu4 amd64 GNU C compiler (multilib support)
|
||||||
|
ii gcc-13-x86-64-linux-gnu 13.2.0-23ubuntu4 amd64 GNU C compiler for the x86_64-linux-gnu architecture
|
||||||
|
ii gcc-14-base:amd64 14-20240412-0ubuntu1 amd64 GCC, the GNU Compiler Collection (base package)
|
||||||
|
ii gcc-14-base:i386 14-20240412-0ubuntu1 i386 GCC, the GNU Compiler Collection (base package)
|
||||||
|
ii gcc-multilib 4:13.2.0-7ubuntu1 amd64 GNU C compiler (multilib files)
|
||||||
|
ii gcc-x86-64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C compiler for the amd64 architecture
|
||||||
|
ii gdb 15.0.50.20240403-0ubuntu1 amd64 GNU Debugger
|
||||||
|
ii git 1:2.43.0-1ubuntu7 amd64 fast, scalable, distributed revision control system
|
||||||
|
ii git-man 1:2.43.0-1ubuntu7 all fast, scalable, distributed revision control system (manual pages)
|
||||||
|
ii gojq 0.12.13-1 amd64 pure Go implementation of jq (program)
|
||||||
|
ii gpgv 2.4.4-2ubuntu17 amd64 GNU privacy guard - signature verification tool
|
||||||
|
ii grep 3.11-4build1 amd64 GNU grep, egrep and fgrep
|
||||||
|
ii groff-base 1.23.0-3build2 amd64 GNU troff text-formatting system (base system components)
|
||||||
|
ii gzip 1.12-1ubuntu3 amd64 GNU compression utilities
|
||||||
|
ii hostname 3.23+nmu2ubuntu2 amd64 utility to set/show the host name or domain name
|
||||||
|
ii ht 2.1.0+repack1-5 amd64 Viewer/editor/analyser (mostly) for executables
|
||||||
|
ii htop 3.3.0-4build1 amd64 interactive processes viewer
|
||||||
|
ii hyperfine 1.18.0-2build1 amd64 Command-line benchmarking tool
|
||||||
|
ii init-system-helpers 1.66ubuntu1 all helper tools for all init systems
|
||||||
|
ii jq 1.7.1-3build1 amd64 lightweight and flexible command-line JSON processor
|
||||||
|
ii ksh 20240113 all transitional package
|
||||||
|
ii ksh93u+m 1.0.8-1 amd64 AT&T KornShell
|
||||||
|
ii less 590-2ubuntu2.1 amd64 pager program similar to more
|
||||||
|
ii lib32asan8 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector (32bit)
|
||||||
|
ii lib32atomic1 14-20240412-0ubuntu1 amd64 support library providing __atomic built-in functions (32bit)
|
||||||
|
ii lib32gcc-13-dev 13.2.0-23ubuntu4 amd64 GCC support library (32 bit development files)
|
||||||
|
ii lib32gcc-s1 14-20240412-0ubuntu1 amd64 GCC support library (32 bit Version)
|
||||||
|
ii lib32gomp1 14-20240412-0ubuntu1 amd64 GCC OpenMP (GOMP) support library (32bit)
|
||||||
|
ii lib32itm1 14-20240412-0ubuntu1 amd64 GNU Transactional Memory Library (32bit)
|
||||||
|
ii lib32quadmath0 14-20240412-0ubuntu1 amd64 GCC Quad-Precision Math Library (32bit)
|
||||||
|
ii lib32stdc++-13-dev 13.2.0-23ubuntu4 amd64 GNU Standard C++ Library v3 (development files)
|
||||||
|
ii lib32stdc++6 14-20240412-0ubuntu1 amd64 GNU Standard C++ Library v3 (32 bit Version)
|
||||||
|
ii lib32ubsan1 14-20240412-0ubuntu1 amd64 UBSan -- undefined behaviour sanitizer (32bit)
|
||||||
|
ii libacl1:amd64 2.3.2-1build1 amd64 access control list - shared library
|
||||||
|
ii libapt-pkg6.0t64:amd64 2.7.14build2 amd64 package management runtime library
|
||||||
|
ii libarchive13t64:amd64 3.7.2-2 amd64 Multi-format archive and compression library (shared library)
|
||||||
|
ii libaria2-0:amd64 1.37.0+debian-1build3 amd64 C++ library interface to aria2
|
||||||
|
ii libasan8:amd64 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector
|
||||||
|
ii libasm1t64:amd64 0.190-1.1build4 amd64 library with a programmable assembler interface
|
||||||
|
ii libassuan0:amd64 2.5.6-1build1 amd64 IPC library for the GnuPG components
|
||||||
|
ii libatomic1:amd64 14-20240412-0ubuntu1 amd64 support library providing __atomic built-in functions
|
||||||
|
ii libattr1:amd64 1:2.5.2-1build1 amd64 extended attribute handling - shared library
|
||||||
|
ii libaudit-common 1:3.1.2-2.1build1 all Dynamic library for security auditing - common files
|
||||||
|
ii libaudit1:amd64 1:3.1.2-2.1build1 amd64 Dynamic library for security auditing
|
||||||
|
ii libbabeltrace1:amd64 1.5.11-3build3 amd64 Babeltrace conversion libraries
|
||||||
|
ii libbinutils:amd64 2.42-4ubuntu2 amd64 GNU binary utilities (private shared library)
|
||||||
|
ii libblkid1:amd64 2.39.3-9ubuntu6 amd64 block device ID library
|
||||||
|
ii libbrotli1:amd64 1.1.0-2build2 amd64 library implementing brotli encoder and decoder (shared libraries)
|
||||||
|
ii libbsd0:amd64 0.12.1-1build1 amd64 utility functions from BSD systems - shared library
|
||||||
|
ii libbz2-1.0:amd64 1.0.8-5.1 amd64 high-quality block-sorting file compressor library - runtime
|
||||||
|
ii libbzip3-0:amd64 1.4.0-1 amd64 better, faster and stronger spiritual successor to bzip2 - runtime
|
||||||
|
ii libc-bin 2.39-0ubuntu8.1 amd64 GNU C Library: Binaries
|
||||||
|
ii libc-dev-bin 2.39-0ubuntu8.1 amd64 GNU C Library: Development binaries
|
||||||
|
ii libc6-dbg:amd64 2.39-0ubuntu8.1 amd64 GNU C Library: detached debugging symbols
|
||||||
|
ii libc6-dev-i386 2.39-0ubuntu8.1 amd64 GNU C Library: 32-bit development libraries for AMD64
|
||||||
|
ii libc6-dev-x32 2.39-0ubuntu8.1 amd64 GNU C Library: X32 ABI Development Libraries for AMD64
|
||||||
|
ii libc6-dev:amd64 2.39-0ubuntu8.1 amd64 GNU C Library: Development Libraries and Header Files
|
||||||
|
ii libc6-i386 2.39-0ubuntu8.1 amd64 GNU C Library: 32-bit shared libraries for AMD64
|
||||||
|
ii libc6-x32 2.39-0ubuntu8.1 amd64 GNU C Library: X32 ABI Shared libraries for AMD64
|
||||||
|
ii libc6:amd64 2.39-0ubuntu8.1 amd64 GNU C Library: Shared libraries
|
||||||
|
ii libc6:i386 2.39-0ubuntu8.1 i386 GNU C Library: Shared libraries
|
||||||
|
ii libcap-ng0:amd64 0.8.4-2build2 amd64 alternate POSIX capabilities library
|
||||||
|
ii libcap2:amd64 1:2.66-5ubuntu2 amd64 POSIX 1003.1e capabilities (library)
|
||||||
|
ii libcares2:amd64 1.27.0-1.0ubuntu1 amd64 asynchronous name resolver
|
||||||
|
ii libcc1-0:amd64 14-20240412-0ubuntu1 amd64 GCC cc1 plugin for GDB
|
||||||
|
ii libcom-err2:amd64 1.47.0-2.4~exp1ubuntu4 amd64 common error description library
|
||||||
|
ii libcrypt-dev:amd64 1:4.4.36-4build1 amd64 libcrypt development files
|
||||||
|
ii libcrypt1:amd64 1:4.4.36-4build1 amd64 libcrypt shared library
|
||||||
|
ii libctf-nobfd0:amd64 2.42-4ubuntu2 amd64 Compact C Type Format library (runtime, no BFD dependency)
|
||||||
|
ii libctf0:amd64 2.42-4ubuntu2 amd64 Compact C Type Format library (runtime, BFD dependency)
|
||||||
|
ii libcurl3t64-gnutls:amd64 8.5.0-2ubuntu10.1 amd64 easy-to-use client-side URL transfer library (GnuTLS flavour)
|
||||||
|
ii libcurl4t64:amd64 8.5.0-2ubuntu10.1 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour)
|
||||||
|
ii libdb5.3t64:amd64 5.3.28+dfsg2-7 amd64 Berkeley v5.3 Database Libraries [runtime]
|
||||||
|
ii libdebconfclient0:amd64 0.271ubuntu3 amd64 Debian Configuration Management System (C-implementation library)
|
||||||
|
ii libdebuginfod-common 0.190-1.1build4 all configuration to enable the Debian debug info server
|
||||||
|
ii libdebuginfod1t64:amd64 0.190-1.1build4 amd64 library to interact with debuginfod (development files)
|
||||||
|
ii libdw1t64:amd64 0.190-1.1build4 amd64 library that provides access to the DWARF debug information
|
||||||
|
ii libelf1t64:amd64 0.190-1.1build4 amd64 library to read and write ELF files
|
||||||
|
ii liberror-perl 0.17029-2 all Perl module for error/exception handling in an OO-ish way
|
||||||
|
ii libexpat1:amd64 2.6.1-2build1 amd64 XML parsing C library - runtime library
|
||||||
|
ii libext2fs2t64:amd64 1.47.0-2.4~exp1ubuntu4 amd64 ext2/ext3/ext4 file system libraries
|
||||||
|
ii libffi8:amd64 3.4.6-1build1 amd64 Foreign Function Interface library runtime
|
||||||
|
ii libgcc-13-dev:amd64 13.2.0-23ubuntu4 amd64 GCC support library (development files)
|
||||||
|
ii libgcc-s1:amd64 14-20240412-0ubuntu1 amd64 GCC support library
|
||||||
|
ii libgcc-s1:i386 14-20240412-0ubuntu1 i386 GCC support library
|
||||||
|
ii libgcrypt20:amd64 1.10.3-2build1 amd64 LGPL Crypto library - runtime library
|
||||||
|
ii libgdbm-compat4t64:amd64 1.23-5.1build1 amd64 GNU dbm database routines (legacy support runtime version)
|
||||||
|
ii libgdbm6t64:amd64 1.23-5.1build1 amd64 GNU dbm database routines (runtime version)
|
||||||
|
ii libglib2.0-0t64:amd64 2.80.0-6ubuntu1 amd64 GLib library of C routines
|
||||||
|
ii libgmp10:amd64 2:6.3.0+dfsg-2ubuntu6 amd64 Multiprecision arithmetic library
|
||||||
|
ii libgnutls30t64:amd64 3.8.3-1.1ubuntu3.1 amd64 GNU TLS library - main runtime library
|
||||||
|
ii libgomp1:amd64 14-20240412-0ubuntu1 amd64 GCC OpenMP (GOMP) support library
|
||||||
|
ii libgpg-error0:amd64 1.47-3build2 amd64 GnuPG development runtime library
|
||||||
|
ii libgprofng0:amd64 2.42-4ubuntu2 amd64 GNU Next Generation profiler (runtime library)
|
||||||
|
ii libgssapi-krb5-2:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
|
||||||
|
ii libhiredis1.1.0:amd64 1.2.0-6ubuntu3 amd64 minimalistic C client library for Redis
|
||||||
|
ii libhogweed6t64:amd64 3.9.1-2.2build1 amd64 low level cryptographic library (public-key cryptos)
|
||||||
|
ii libhwasan0:amd64 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector
|
||||||
|
ii libicu74:amd64 74.2-1ubuntu3 amd64 International Components for Unicode
|
||||||
|
ii libidn2-0:amd64 2.3.7-2build1 amd64 Internationalized domain names (IDNA2008/TR46) library
|
||||||
|
ii libio-pty-perl 1:1.20-1build2 amd64 Perl module for pseudo tty IO
|
||||||
|
ii libipc-run-perl 20231003.0-1 all Perl module for running processes
|
||||||
|
ii libipt2 2.0.6-1build1 amd64 Intel Processor Trace Decoder Library
|
||||||
|
ii libisl23:amd64 0.26-3build1 amd64 manipulating sets and relations of integer points bounded by linear constraints
|
||||||
|
ii libitm1:amd64 14-20240412-0ubuntu1 amd64 GNU Transactional Memory Library
|
||||||
|
ii libjansson4:amd64 2.14-2build2 amd64 C library for encoding, decoding and manipulating JSON data
|
||||||
|
ii libjq1:amd64 1.7.1-3build1 amd64 lightweight and flexible command-line JSON processor - shared library
|
||||||
|
ii libjsoncpp25:amd64 1.9.5-6build1 amd64 library for reading and writing JSON for C++
|
||||||
|
ii libk5crypto3:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries - Crypto Library
|
||||||
|
ii libkeyutils1:amd64 1.6.3-3build1 amd64 Linux Key Management Utilities (library)
|
||||||
|
ii libkrb5-3:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries
|
||||||
|
ii libkrb5support0:amd64 1.20.1-6ubuntu2 amd64 MIT Kerberos runtime libraries - Support library
|
||||||
|
ii libldap2:amd64 2.6.7+dfsg-1~exp1ubuntu8 amd64 OpenLDAP libraries
|
||||||
|
ii liblsan0:amd64 14-20240412-0ubuntu1 amd64 LeakSanitizer -- a memory leak detector (runtime)
|
||||||
|
ii libluajit-5.1-2:amd64 2.1.0+git20231223.c525bcb+dfsg-1 amd64 Just in time compiler for Lua - library version
|
||||||
|
ii libluajit-5.1-common 2.1.0+git20231223.c525bcb+dfsg-1 all Just in time compiler for Lua - common files
|
||||||
|
ii liblz4-1:amd64 1.9.4-1build1 amd64 Fast LZ compression algorithm library - runtime
|
||||||
|
ii liblzma5:amd64 5.6.1+really5.4.5-1 amd64 XZ-format compression library
|
||||||
|
ii liblzo2-2:amd64 2.10-2build4 amd64 data compression library
|
||||||
|
ii libmagic-mgc 1:5.45-3build1 amd64 File type determination library using "magic" numbers (compiled magic file)
|
||||||
|
ii libmagic1t64:amd64 1:5.45-3build1 amd64 Recognize the type of data in a file using "magic" numbers - library
|
||||||
|
ii libmd0:amd64 1.1.0-2build1 amd64 message digest functions from BSD systems - shared library
|
||||||
|
ii libmount1:amd64 2.39.3-9ubuntu6 amd64 device mounting library
|
||||||
|
ii libmpc3:amd64 1.3.1-1build1 amd64 multiple precision complex floating-point library
|
||||||
|
ii libmpfr6:amd64 4.2.1-1build1 amd64 multiple precision floating-point computation
|
||||||
|
ii libmsgpackc2:amd64 4.0.0-3build1 amd64 binary-based efficient object serialization library
|
||||||
|
ii libmspack0t64:amd64 0.11-1.1build1 amd64 library for Microsoft compression formats (shared library)
|
||||||
|
ii libncurses6:amd64 6.4+20240113-1ubuntu2 amd64 shared libraries for terminal handling
|
||||||
|
ii libncursesw6:amd64 6.4+20240113-1ubuntu2 amd64 shared libraries for terminal handling (wide character support)
|
||||||
|
ii libnettle8t64:amd64 3.9.1-2.2build1 amd64 low level cryptographic library (symmetric and one-way cryptos)
|
||||||
|
ii libnghttp2-14:amd64 1.59.0-1build4 amd64 library implementing HTTP/2 protocol (shared library)
|
||||||
|
ii libnl-3-200:amd64 3.7.0-0.3build1 amd64 library for dealing with netlink sockets
|
||||||
|
ii libnl-genl-3-200:amd64 3.7.0-0.3build1 amd64 library for dealing with netlink sockets - generic netlink
|
||||||
|
ii libnpth0t64:amd64 1.6-3.1build1 amd64 replacement for GNU Pth using system threads
|
||||||
|
ii libonig5:amd64 6.9.9-1build1 amd64 regular expressions library
|
||||||
|
ii libp11-kit0:amd64 0.25.3-4ubuntu2 amd64 library for loading and coordinating access to PKCS#11 modules - runtime
|
||||||
|
ii libpam-modules-bin 1.5.3-5ubuntu5 amd64 Pluggable Authentication Modules for PAM - helper binaries
|
||||||
|
ii libpam-modules:amd64 1.5.3-5ubuntu5 amd64 Pluggable Authentication Modules for PAM
|
||||||
|
ii libpam-runtime 1.5.3-5ubuntu5 all Runtime support for the PAM library
|
||||||
|
ii libpam0g:amd64 1.5.3-5ubuntu5 amd64 Pluggable Authentication Modules library
|
||||||
|
ii libpcre2-32-0:amd64 10.42-4ubuntu2 amd64 New Perl Compatible Regular Expression Library - 32 bit runtime files
|
||||||
|
ii libpcre2-8-0:amd64 10.42-4ubuntu2 amd64 New Perl Compatible Regular Expression Library- 8 bit runtime files
|
||||||
|
ii libperl5.38t64:amd64 5.38.2-3.2build2 amd64 shared Perl library
|
||||||
|
ii libpipeline1:amd64 1.5.7-2 amd64 Unix process pipeline manipulation library
|
||||||
|
ii libpopt0:amd64 1.19+dfsg-1build1 amd64 lib for parsing cmdline parameters
|
||||||
|
ii libproc2-0:amd64 2:4.0.4-4ubuntu3 amd64 library for accessing process information from /proc
|
||||||
|
ii libpsl5t64:amd64 0.21.2-1.1build1 amd64 Library for Public Suffix List (shared libraries)
|
||||||
|
ii libpython2.7-minimal:amd64 2.7.18-8+deb11u1 amd64 Minimal subset of the Python language (version 2.7)
|
||||||
|
ii libpython3-stdlib:amd64 3.12.3-0ubuntu1 amd64 interactive high-level object-oriented language (default python3 version)
|
||||||
|
ii libpython3.12-minimal:amd64 3.12.3-1 amd64 Minimal subset of the Python language (version 3.12)
|
||||||
|
ii libpython3.12-stdlib:amd64 3.12.3-1 amd64 Interactive high-level object-oriented language (standard library, version 3.12)
|
||||||
|
ii libpython3.12t64:amd64 3.12.3-1 amd64 Shared Python runtime library (version 3.12)
|
||||||
|
ii libquadmath0:amd64 14-20240412-0ubuntu1 amd64 GCC Quad-Precision Math Library
|
||||||
|
ii libreadline8t64:amd64 8.2-4build1 amd64 GNU readline and history libraries, run-time libraries
|
||||||
|
ii librhash0:amd64 1.4.3-3build1 amd64 shared library for hash functions computing
|
||||||
|
ii librtmp1:amd64 2.4+20151223.gitfa8646d.1-2build7 amd64 toolkit for RTMP streams (shared library)
|
||||||
|
ii libsasl2-2:amd64 2.1.28+dfsg1-5ubuntu3 amd64 Cyrus SASL - authentication abstraction library
|
||||||
|
ii libsasl2-modules-db:amd64 2.1.28+dfsg1-5ubuntu3 amd64 Cyrus SASL - pluggable authentication modules (DB)
|
||||||
|
ii libseccomp2:amd64 2.5.5-1ubuntu3 amd64 high level interface to Linux seccomp filter
|
||||||
|
ii libselinux1:amd64 3.5-2ubuntu2 amd64 SELinux runtime shared libraries
|
||||||
|
ii libsemanage-common 3.5-1build5 all Common files for SELinux policy management libraries
|
||||||
|
ii libsemanage2:amd64 3.5-1build5 amd64 SELinux policy management library
|
||||||
|
ii libsensors-config 1:3.6.0-9build1 all lm-sensors configuration files
|
||||||
|
ii libsensors5:amd64 1:3.6.0-9build1 amd64 library to read temperature/voltage/fan sensors
|
||||||
|
ii libsepol2:amd64 3.5-2build1 amd64 SELinux library for manipulating binary security policies
|
||||||
|
ii libsframe1:amd64 2.42-4ubuntu2 amd64 Library to handle the SFrame format (runtime library)
|
||||||
|
ii libsigsegv2:amd64 2.14-1ubuntu2 amd64 Library for handling page faults in a portable way
|
||||||
|
ii libsmartcols1:amd64 2.39.3-9ubuntu6 amd64 smart column output alignment library
|
||||||
|
ii libsource-highlight-common 3.1.9-4.3build1 all architecture-independent files for source highlighting library
|
||||||
|
ii libsource-highlight4t64:amd64 3.1.9-4.3build1 amd64 source highlighting library
|
||||||
|
ii libsqlite3-0:amd64 3.45.1-1ubuntu2 amd64 SQLite 3 shared library
|
||||||
|
ii libss2:amd64 1.47.0-2.4~exp1ubuntu4 amd64 command-line interface parsing library
|
||||||
|
ii libssh-4:amd64 0.10.6-2build2 amd64 tiny C SSH library (OpenSSL flavor)
|
||||||
|
ii libssh2-1t64:amd64 1.11.0-4.1build2 amd64 SSH2 client-side library
|
||||||
|
ii libssl3t64:amd64 3.0.13-0ubuntu3 amd64 Secure Sockets Layer toolkit - shared libraries
|
||||||
|
ii libstdc++-13-dev:amd64 13.2.0-23ubuntu4 amd64 GNU Standard C++ Library v3 (development files)
|
||||||
|
ii libstdc++6:amd64 14-20240412-0ubuntu1 amd64 GNU Standard C++ Library v3
|
||||||
|
ii libsystemd0:amd64 255.4-1ubuntu8 amd64 systemd utility library
|
||||||
|
ii libtalloc2:amd64 2.4.2-1build2 amd64 hierarchical pool based memory allocator
|
||||||
|
ii libtasn1-6:amd64 4.19.0-3build1 amd64 Manage ASN.1 structures (runtime)
|
||||||
|
ii libtermkey1:amd64 0.22-1 amd64 library for processing keyboard input
|
||||||
|
ii libtime-duration-perl 1.21-2 all module for rounded or exact English expression of durations
|
||||||
|
ii libtimedate-perl 2.3300-2 all collection of modules to manipulate date/time information
|
||||||
|
ii libtinfo6:amd64 6.4+20240113-1ubuntu2 amd64 shared low-level terminfo library for terminal handling
|
||||||
|
ii libtree-sitter0:amd64 0.20.8-2 amd64 incremental parsing system for programming tools
|
||||||
|
ii libtsan2:amd64 14-20240412-0ubuntu1 amd64 ThreadSanitizer -- a Valgrind-based detector of data races (runtime)
|
||||||
|
ii libubsan1:amd64 14-20240412-0ubuntu1 amd64 UBSan -- undefined behaviour sanitizer (runtime)
|
||||||
|
ii libuchardet0:amd64 0.0.8-1build1 amd64 universal charset detection library - shared library
|
||||||
|
ii libudev1:amd64 255.4-1ubuntu8 amd64 libudev shared library
|
||||||
|
ii libunibilium4:amd64 2.1.0-3 amd64 simple, self-contained terminfo library
|
||||||
|
ii libunistring5:amd64 1.1-2build1 amd64 Unicode string library for C
|
||||||
|
ii libunwind8:amd64 1.6.2-3build1 amd64 library to determine the call-chain of a program - runtime
|
||||||
|
ii liburing2:amd64 2.5-1build1 amd64 Linux kernel io_uring access library - shared library
|
||||||
|
ii libutempter0:amd64 1.2.1-3build1 amd64 privileged helper for utmp/wtmp updates (runtime)
|
||||||
|
ii libuuid1:amd64 2.39.3-9ubuntu6 amd64 Universally Unique ID library
|
||||||
|
ii libuv1t64:amd64 1.48.0-1.1build1 amd64 asynchronous event notification library - runtime library
|
||||||
|
ii libvterm0:amd64 0.3.3-2build1 amd64 abstract terminal library
|
||||||
|
ii libx11-6:amd64 2:1.8.7-1build1 amd64 X11 client-side library
|
||||||
|
ii libx11-data 2:1.8.7-1build1 all X11 client-side library
|
||||||
|
ii libx32asan8 14-20240412-0ubuntu1 amd64 AddressSanitizer -- a fast memory error detector (x32)
|
||||||
|
ii libx32atomic1 14-20240412-0ubuntu1 amd64 support library providing __atomic built-in functions (x32)
|
||||||
|
ii libx32gcc-13-dev 13.2.0-23ubuntu4 amd64 GCC support library (x32 development files)
|
||||||
|
ii libx32gcc-s1 14-20240412-0ubuntu1 amd64 GCC support library (x32)
|
||||||
|
ii libx32gomp1 14-20240412-0ubuntu1 amd64 GCC OpenMP (GOMP) support library (x32)
|
||||||
|
ii libx32itm1 14-20240412-0ubuntu1 amd64 GNU Transactional Memory Library (x32)
|
||||||
|
ii libx32quadmath0 14-20240412-0ubuntu1 amd64 GCC Quad-Precision Math Library (x32)
|
||||||
|
ii libx32stdc++-13-dev 13.2.0-23ubuntu4 amd64 GNU Standard C++ Library v3 (development files)
|
||||||
|
ii libx32stdc++6 14-20240412-0ubuntu1 amd64 GNU Standard C++ Library v3 (x32)
|
||||||
|
ii libx32ubsan1 14-20240412-0ubuntu1 amd64 UBSan -- undefined behaviour sanitizer (x32)
|
||||||
|
ii libxau6:amd64 1:1.0.9-1build6 amd64 X11 authorisation library
|
||||||
|
ii libxcb1:amd64 1.15-1ubuntu2 amd64 X C Binding
|
||||||
|
ii libxdmcp6:amd64 1:1.1.3-0ubuntu6 amd64 X11 Display Manager Control Protocol library
|
||||||
|
ii libxml2:amd64 2.9.14+dfsg-1.3ubuntu3 amd64 GNOME XML library
|
||||||
|
ii libxxhash0:amd64 0.8.2-2build1 amd64 shared library for xxhash
|
||||||
|
ii libyaml-0-2:amd64 0.2.5-1build1 amd64 Fast YAML 1.1 parser and emitter library
|
||||||
|
ii libzstd-dev:amd64 1.5.5+dfsg2-2build1 amd64 fast lossless compression algorithm -- development files
|
||||||
|
ii libzstd1:amd64 1.5.5+dfsg2-2build1 amd64 fast lossless compression algorithm
|
||||||
|
ii linux-libc-dev:amd64 6.8.0-31.31 amd64 Linux Kernel Headers for development
|
||||||
|
ii login 1:4.13+dfsg1-4ubuntu3 amd64 system login tools
|
||||||
|
ii logsave 1.47.0-2.4~exp1ubuntu4 amd64 save the output of a command in a log file
|
||||||
|
ii lsb-release 12.0-2 all Linux Standard Base version reporting utility (minimal implementation)
|
||||||
|
ii lua-luv:amd64 1.48.0-2-2build1 amd64 libuv bindings for Lua
|
||||||
|
ii lz4 1.9.4-1build1 amd64 Fast LZ compression algorithm library - tool
|
||||||
|
ii lzip 1.24.1-1build1 amd64 lossless data compressor based on the LZMA algorithm
|
||||||
|
ii lzop 1.04-2build3 amd64 fast compression program
|
||||||
|
ii make 4.3-4.1build2 amd64 utility for directing compilation
|
||||||
|
ii man-db 2.12.0-4build2 amd64 tools for reading manual pages
|
||||||
|
ii mawk 1.3.4.20240123-1build1 amd64 Pattern scanning and text processing language
|
||||||
|
ii media-types 10.1.0 all List of standard media types and their usual file extension
|
||||||
|
ii minify 2.20.17-1 amd64 CLI implementation of the Go minify library package
|
||||||
|
ii mksh 59c-37 amd64 MirBSD Korn Shell
|
||||||
|
ii moreutils 0.69-1 amd64 additional Unix utilities
|
||||||
|
ii mount 2.39.3-9ubuntu6 amd64 tools for mounting and manipulating filesystems
|
||||||
|
ii musl:amd64 1.2.4-2 amd64 standard C library
|
||||||
|
ii ncurses-base 6.4+20240113-1ubuntu2 all basic terminal type definitions
|
||||||
|
ii ncurses-bin 6.4+20240113-1ubuntu2 amd64 terminal-related programs and man pages
|
||||||
|
ii ncurses-term 6.4+20240113-1ubuntu2 all additional terminal type definitions
|
||||||
|
ii neovim 0.9.5-6ubuntu2 amd64 heavily refactored vim fork
|
||||||
|
ii neovim-runtime 0.9.5-6ubuntu2 all heavily refactored vim fork (runtime files)
|
||||||
|
ii netbase 6.4 all Basic TCP/IP networking system
|
||||||
|
ii ninja-build 1.11.1-2 amd64 small build system closest in spirit to Make
|
||||||
|
ii openssl 3.0.13-0ubuntu3 amd64 Secure Sockets Layer toolkit - cryptographic utility
|
||||||
|
ii p7zip 16.02+transitional.1 all transitional package
|
||||||
|
ii parallel 20231122+ds-1 all build and execute command lines from standard input in parallel
|
||||||
|
ii passwd 1:4.13+dfsg1-4ubuntu3 amd64 change and administer password and group data
|
||||||
|
ii patch 2.7.6-7build3 amd64 Apply a diff file to an original
|
||||||
|
ii patchelf 0.18.0-1.1build1 amd64 modify properties of ELF executables
|
||||||
|
ii patchutils 0.4.2-1build3 amd64 Utilities to work with patches
|
||||||
|
ii pax-utils 1.3.7-1 amd64 Security-focused ELF files checking tool
|
||||||
|
ii perl 5.38.2-3.2build2 amd64 Larry Wall's Practical Extraction and Report Language
|
||||||
|
ii perl-base 5.38.2-3.2build2 amd64 minimal Perl system
|
||||||
|
ii perl-modules-5.38 5.38.2-3.2build2 all Core Perl modules
|
||||||
|
ii procps 2:4.0.4-4ubuntu3 amd64 /proc file system utilities
|
||||||
|
ii proot 5.1.0-1.3 amd64 emulate chroot, bind mount and binfmt_misc for non-root users
|
||||||
|
ii python2.7-minimal 2.7.18-8+deb11u1 amd64 Minimal subset of the Python language (version 2.7)
|
||||||
|
ii python3 3.12.3-0ubuntu1 amd64 interactive high-level object-oriented language (default python3 version)
|
||||||
|
ii python3-argcomplete 3.1.4-1 all bash tab completion for argparse (for Python 3)
|
||||||
|
ii python3-minimal 3.12.3-0ubuntu1 amd64 minimal subset of the Python language (default python3 version)
|
||||||
|
ii python3-pyasn1 0.4.8-4 all ASN.1 library for Python (Python 3 module)
|
||||||
|
ii python3-pycryptodome 3.20.0+dfsg-1 amd64 cryptographic Python library (Python 3)
|
||||||
|
ii python3-pycurl 7.45.3-1build2 amd64 Python bindings to libcurl (Python 3)
|
||||||
|
ii python3-pyelftools 0.30-1 all pure-python3 library for parsing ELF and DWARF
|
||||||
|
ii python3-toml 0.10.2-1 all library for Tom's Obvious, Minimal Language - Python 3.x
|
||||||
|
ii python3-xmltodict 0.13.0-1 all Makes working with XML feel like you are working with JSON (Python 3)
|
||||||
|
ii python3-yaml 6.0.1-2build2 amd64 YAML parser and emitter for Python3
|
||||||
|
ii python3-zstd 1.5.5.1-1build1 amd64 python bindings to Yann Collet ZSTD compression library
|
||||||
|
ii python3.12 3.12.3-1 amd64 Interactive high-level object-oriented language (version 3.12)
|
||||||
|
ii python3.12-minimal 3.12.3-1 amd64 Minimal subset of the Python language (version 3.12)
|
||||||
|
ii re2c 3.1-1build1 amd64 lexer generator for C, C++, Go and Rust
|
||||||
|
ii readline-common 8.2-4build1 all GNU readline and history libraries, common files
|
||||||
|
ii ripgrep 14.1.0-1 amd64 Recursively searches directories for a regex pattern
|
||||||
|
ii rpcsvc-proto 1.4.2-0ubuntu7 amd64 RPC protocol compiler and definitions
|
||||||
|
ii rsync 3.2.7-1ubuntu1 amd64 fast, versatile, remote (and local) file-copying tool
|
||||||
|
ii screen 4.9.1-1build1 amd64 terminal multiplexer with VT100/ANSI terminal emulation
|
||||||
|
ii sed 4.9-2build1 amd64 GNU stream editor for filtering/transforming text
|
||||||
|
ii sensible-utils 0.0.22 all Utilities for sensible alternative selection
|
||||||
|
ii strace 6.8-0ubuntu2 amd64 System call tracer
|
||||||
|
ii sysstat 12.6.1-2 amd64 system performance tools for Linux
|
||||||
|
ii sysvinit-utils 3.08-6ubuntu3 amd64 System-V-like utilities
|
||||||
|
ii tar 1.35+dfsg-3build1 amd64 GNU version of the tar archiving utility
|
||||||
|
ii time 1.9-0.2build1 amd64 GNU time program for measuring CPU resource usage
|
||||||
|
ii tzdata 2024a-2ubuntu1 all time zone and daylight-saving time data
|
||||||
|
ii ubuntu-keyring 2023.11.28.1 all GnuPG keys of the Ubuntu archive
|
||||||
|
ii ucf 3.0043+nmu1 all Update Configuration File(s): preserve user changes to config files
|
||||||
|
ii universal-ctags 5.9.20210829.0-1 amd64 build tag file indexes of source code definitions
|
||||||
|
ii unzip 6.0-28ubuntu4 amd64 De-archiver for .zip files
|
||||||
|
ii util-linux 2.39.3-9ubuntu6 amd64 miscellaneous system utilities
|
||||||
|
ii valgrind 1:3.22.0-0ubuntu3 amd64 instrumentation framework for building dynamic analysis tools
|
||||||
|
ii wget 1.21.4-1ubuntu4 amd64 retrieves files from the web
|
||||||
|
ii xz-utils 5.6.1+really5.4.5-1 amd64 XZ-format compression utilities
|
||||||
|
ii yash 2.55-2 amd64 yet another shell
|
||||||
|
ii yq 3.1.0-3 all Command-line YAML processor - jq wrapper for YAML documents
|
||||||
|
ii zip 3.0-13build1 amd64 Archiver for .zip files
|
||||||
|
ii zlib1g-dev:amd64 1:1.3.dfsg-3.1ubuntu2 amd64 compression library - development
|
||||||
|
ii zlib1g:amd64 1:1.3.dfsg-3.1ubuntu2 amd64 compression library - runtime
|
||||||
|
ii zlib1g:i386 1:1.3.dfsg-3.1ubuntu2 i386 compression library - runtime
|
||||||
|
ii zoxide 0.9.3-1 amd64 Smarter cd command for your terminal
|
||||||
|
ii zsh 5.9-6ubuntu2 amd64 shell with lots of features
|
||||||
|
ii zsh-common 5.9-6ubuntu2 all architecture independent files for Zsh
|
||||||
|
ii zstd 1.5.5+dfsg2-2build1 amd64 fast lossless compression algorithm -- CLI tool
|
||||||
|
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|
||||||
|
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
|
||||||
|
||/ Name Version Architecture Description
|
||||||
|
|
||||||
|
Packages sorted by Installed-Size:
|
||||||
|
964659 ===== TOTAL (355 packages)
|
||||||
|
76943 valgrind amd64
|
||||||
|
72249 gcc-13-x86-64-linux-gnu amd64
|
||||||
|
37841 g++-13-x86-64-linux-gnu amd64
|
||||||
|
36493 cmake amd64
|
||||||
|
35919 libicu74 amd64
|
||||||
|
35027 cpp-13-x86-64-linux-gnu amd64
|
||||||
|
29327 libperl5.38t64 amd64
|
||||||
|
21815 neovim-runtime all
|
||||||
|
21684 git amd64
|
||||||
|
20518 libstdc++-13-dev amd64
|
||||||
|
19159 perl-modules-5.38 all
|
||||||
|
16248 zsh-common all
|
||||||
|
16092 libgcc-13-dev amd64
|
||||||
|
13430 libc6 amd64
|
||||||
|
13111 libc6-dev amd64
|
||||||
|
12519 gdb amd64
|
||||||
|
12321 fish-common all
|
||||||
|
12296 libc6 i386
|
||||||
|
12003 libc6-x32 amd64
|
||||||
|
11992 libc6-i386 amd64
|
||||||
|
11569 binutils-x86-64-linux-gnu amd64
|
||||||
|
11174 libc6-dbg amd64
|
||||||
|
10984 cmake-data all
|
||||||
|
10764 libasan8 amd64
|
||||||
|
9665 libx32asan8 amd64
|
||||||
|
9556 lib32asan8 amd64
|
||||||
|
9012 libpython3.12-stdlib amd64
|
||||||
|
8905 libpython3.12t64 amd64
|
||||||
|
8893 libtsan2 amd64
|
||||||
|
8636 lib32gcc-13-dev amd64
|
||||||
|
8335 libmagic-mgc amd64
|
||||||
|
8118 libc6-dev-x32 amd64
|
||||||
|
7923 python3.12-minimal amd64
|
||||||
|
7913 perl-base amd64
|
||||||
|
7492 libx32gcc-13-dev amd64
|
||||||
|
7166 linux-libc-dev amd64
|
||||||
|
6946 libc6-dev-i386 amd64
|
||||||
|
6944 coreutils amd64
|
||||||
|
6775 neovim amd64
|
||||||
|
6743 lib32stdc++-13-dev amd64
|
||||||
|
6607 libssl3t64 amd64
|
||||||
|
6433 libx32stdc++-13-dev amd64
|
||||||
|
6237 dpkg amd64
|
||||||
|
6158 7zip amd64
|
||||||
|
5210 ripgrep amd64
|
||||||
|
5169 libpython3.12-minimal amd64
|
||||||
|
4879 libhwasan0 amd64
|
||||||
|
4341 ncurses-term all
|
||||||
|
4244 minify amd64
|
||||||
|
4103 apt amd64
|
||||||
|
3983 gojq amd64
|
||||||
|
3956 python3-pycryptodome amd64
|
||||||
|
3949 libglib2.0-0t64 amd64
|
||||||
|
3849 libgprofng0 amd64
|
||||||
|
3806 liblsan0 amd64
|
||||||
|
3721 groff-base amd64
|
||||||
|
3627 fzf amd64
|
||||||
|
3605 python2.7-minimal amd64
|
||||||
|
3443 fish amd64
|
||||||
|
3441 re2c amd64
|
||||||
|
3438 util-linux amd64
|
||||||
|
3403 libaria2-0 amd64
|
||||||
|
3382 fd-find amd64
|
||||||
|
3349 libubsan1 amd64
|
||||||
|
3244 libapt-pkg6.0t64 amd64
|
||||||
|
3157 libx32ubsan1 amd64
|
||||||
|
3111 ksh93u+m amd64
|
||||||
|
3110 libstdc++6 amd64
|
||||||
|
3109 lib32ubsan1 amd64
|
||||||
|
2995 parallel all
|
||||||
|
2966 lib32stdc++6 amd64
|
||||||
|
2957 elfutils amd64
|
||||||
|
2928 man-db amd64
|
||||||
|
2785 libpython2.7-minimal amd64
|
||||||
|
2770 libx32stdc++6 amd64
|
||||||
|
2431 zsh amd64
|
||||||
|
2419 passwd amd64
|
||||||
|
2352 libgnutls30t64 amd64
|
||||||
|
2346 libbinutils amd64
|
||||||
|
2191 ht amd64
|
||||||
|
2182 libc-bin amd64
|
||||||
|
2161 git-man all
|
||||||
|
2103 strace amd64
|
||||||
|
2078 libxml2 amd64
|
||||||
|
2032 libisl23 amd64
|
||||||
|
2009 universal-ctags amd64
|
||||||
|
1980 aria2 amd64
|
||||||
|
1900 bash amd64
|
||||||
|
1884 openssl amd64
|
||||||
|
1798 zstd amd64
|
||||||
|
1796 procps amd64
|
||||||
|
1761 libdb5.3t64 amd64
|
||||||
|
1757 libunistring5 amd64
|
||||||
|
1736 gawk amd64
|
||||||
|
1730 libsqlite3-0 amd64
|
||||||
|
1712 libp11-kit0 amd64
|
||||||
|
1634 mksh amd64
|
||||||
|
1579 ccache amd64
|
||||||
|
1504 e2fsprogs amd64
|
||||||
|
1454 bash-completion all
|
||||||
|
1452 sysstat amd64
|
||||||
|
1448 yash amd64
|
||||||
|
1396 libgcrypt20 amd64
|
||||||
|
1381 tzdata all
|
||||||
|
1362 libx11-6 amd64
|
||||||
|
1342 libx11-data all
|
||||||
|
1321 zlib1g-dev amd64
|
||||||
|
1314 hyperfine amd64
|
||||||
|
1237 libzstd-dev amd64
|
||||||
|
1186 libmpfr6 amd64
|
||||||
|
1136 zoxide amd64
|
||||||
|
1123 libpam-modules amd64
|
||||||
|
1025 libsystemd0 amd64
|
||||||
|
1014 libkrb5-3 amd64
|
||||||
|
996 screen amd64
|
||||||
|
924 libcurl4t64 amd64
|
||||||
|
916 wget amd64
|
||||||
|
905 libcurl3t64-gnutls amd64
|
||||||
|
904 libarchive13t64 amd64
|
||||||
|
884 login amd64
|
||||||
|
852 busybox amd64
|
||||||
|
843 libbrotli1 amd64
|
||||||
|
812 lua-luv amd64
|
||||||
|
785 musl amd64
|
||||||
|
780 rsync amd64
|
||||||
|
765 libdw1t64 amd64
|
||||||
|
761 libzstd1 amd64
|
||||||
|
751 libsepol2 amd64
|
||||||
|
745 libsource-highlight4t64 amd64
|
||||||
|
735 python3.12 amd64
|
||||||
|
732 xz-utils amd64
|
||||||
|
708 tar amd64
|
||||||
|
698 lib32quadmath0 amd64
|
||||||
|
672 perl amd64
|
||||||
|
647 ncurses-bin amd64
|
||||||
|
635 libpcre2-8-0 amd64
|
||||||
|
629 libonig5 amd64
|
||||||
|
624 python3-pyelftools all
|
||||||
|
602 libluajit-5.1-2 amd64
|
||||||
|
560 binutils-common amd64
|
||||||
|
556 libtinfo6 amd64
|
||||||
|
554 libpcre2-32-0 amd64
|
||||||
|
552 findutils amd64
|
||||||
|
543 libgmp10 amd64
|
||||||
|
542 gcc-13 amd64
|
||||||
|
538 libext2fs2t64 amd64
|
||||||
|
536 zip amd64
|
||||||
|
536 libldap2 amd64
|
||||||
|
520 curl amd64
|
||||||
|
512 python3-yaml amd64
|
||||||
|
508 libbabeltrace1 amd64
|
||||||
|
496 libssh-4 amd64
|
||||||
|
493 debconf all
|
||||||
|
467 libreadline8t64 amd64
|
||||||
|
452 diffutils amd64
|
||||||
|
426 base-files amd64
|
||||||
|
425 libgssapi-krb5-2 amd64
|
||||||
|
424 libnettle8t64 amd64
|
||||||
|
424 htop amd64
|
||||||
|
422 libncursesw6 amd64
|
||||||
|
415 libssh2-1t64 amd64
|
||||||
|
404 make amd64
|
||||||
|
389 python3-pyasn1 all
|
||||||
|
386 ca-certificates all
|
||||||
|
384 ncurses-base all
|
||||||
|
384 libexpat1 amd64
|
||||||
|
378 liblzma5 amd64
|
||||||
|
375 unzip amd64
|
||||||
|
374 lib32gomp1 amd64
|
||||||
|
372 libgomp1 amd64
|
||||||
|
367 libmount1 amd64
|
||||||
|
358 libjq1 amd64
|
||||||
|
357 bfs amd64
|
||||||
|
355 ninja-build amd64
|
||||||
|
351 libx32gomp1 amd64
|
||||||
|
348 mount amd64
|
||||||
|
344 libcrypt-dev amd64
|
||||||
|
344 grep amd64
|
||||||
|
340 sed amd64
|
||||||
|
337 libhogweed6t64 amd64
|
||||||
|
337 gpgv amd64
|
||||||
|
336 libncurses6 amd64
|
||||||
|
328 cpio amd64
|
||||||
|
314 libudev1 amd64
|
||||||
|
310 libctf-nobfd0 amd64
|
||||||
|
309 less amd64
|
||||||
|
305 libsource-highlight-common all
|
||||||
|
300 libquadmath0 amd64
|
||||||
|
299 libx32quadmath0 amd64
|
||||||
|
289 libblkid1 amd64
|
||||||
|
288 libsemanage2 amd64
|
||||||
|
288 bsdutils amd64
|
||||||
|
287 bsdextrautils amd64
|
||||||
|
276 libpam-runtime all
|
||||||
|
273 patchelf amd64
|
||||||
|
273 mawk amd64
|
||||||
|
270 pax-utils amd64
|
||||||
|
269 libpam-modules-bin amd64
|
||||||
|
264 libuv1t64 amd64
|
||||||
|
257 libk5crypto3 amd64
|
||||||
|
255 libipc-run-perl all
|
||||||
|
254 base-passwd amd64
|
||||||
|
245 rpcsvc-proto amd64
|
||||||
|
244 gzip amd64
|
||||||
|
237 libjsoncpp25 amd64
|
||||||
|
235 libproc2-0 amd64
|
||||||
|
235 libgcc-s1 i386
|
||||||
|
232 lz4 amd64
|
||||||
|
232 libctf0 amd64
|
||||||
|
231 moreutils amd64
|
||||||
|
231 lib32gcc-s1 amd64
|
||||||
|
230 librhash0 amd64
|
||||||
|
226 libcrypt1 amd64
|
||||||
|
224 libidn2-0 amd64
|
||||||
|
224 debianutils amd64
|
||||||
|
218 patch amd64
|
||||||
|
218 libluajit-5.1-common all
|
||||||
|
215 patchutils amd64
|
||||||
|
214 ucf all
|
||||||
|
211 libmagic1t64 amd64
|
||||||
|
208 libpam0g amd64
|
||||||
|
207 libuchardet0 amd64
|
||||||
|
206 proot amd64
|
||||||
|
202 python3-pycurl amd64
|
||||||
|
200 libselinux1 amd64
|
||||||
|
200 libnghttp2-14 amd64
|
||||||
|
199 execstack amd64
|
||||||
|
198 libtree-sitter0 amd64
|
||||||
|
197 libgcc-s1 amd64
|
||||||
|
196 libxcb1 amd64
|
||||||
|
196 libelf1t64 amd64
|
||||||
|
187 libunwind8 amd64
|
||||||
|
187 dash amd64
|
||||||
|
185 libgpg-error0 amd64
|
||||||
|
184 libx32gcc-s1 amd64
|
||||||
|
176 libcares2 amd64
|
||||||
|
172 libnl-3-200 amd64
|
||||||
|
171 libsmartcols1 amd64
|
||||||
|
163 lzip amd64
|
||||||
|
162 zlib1g amd64
|
||||||
|
159 binutils amd64
|
||||||
|
157 zlib1g i386
|
||||||
|
157 lzop amd64
|
||||||
|
157 liblzo2-2 amd64
|
||||||
|
155 liblz4-1 amd64
|
||||||
|
154 python3-argcomplete all
|
||||||
|
151 libaudit1 amd64
|
||||||
|
149 libmpc3 amd64
|
||||||
|
148 libsasl2-2 amd64
|
||||||
|
148 libcc1-0 amd64
|
||||||
|
143 libyaml-0-2 amd64
|
||||||
|
143 libseccomp2 amd64
|
||||||
|
137 librtmp1 amd64
|
||||||
|
136 libhiredis1.1.0 amd64
|
||||||
|
132 libkrb5support0 amd64
|
||||||
|
131 libipt2 amd64
|
||||||
|
130 init-system-helpers all
|
||||||
|
129 bubblewrap amd64
|
||||||
|
127 libbsd0 amd64
|
||||||
|
126 time amd64
|
||||||
|
126 libsframe1 amd64
|
||||||
|
123 libtimedate-perl all
|
||||||
|
121 libtasn1-6 amd64
|
||||||
|
120 libpopt0 amd64
|
||||||
|
115 libitm1 amd64
|
||||||
|
113 lib32itm1 amd64
|
||||||
|
112 jq amd64
|
||||||
|
111 python3-minimal amd64
|
||||||
|
110 gcc-14-base i386
|
||||||
|
110 gcc-14-base amd64
|
||||||
|
110 gcc-13-base amd64
|
||||||
|
109 bzip2 amd64
|
||||||
|
107 sysvinit-utils amd64
|
||||||
|
105 libx32itm1 amd64
|
||||||
|
105 libc-dev-bin amd64
|
||||||
|
103 libio-pty-perl amd64
|
||||||
|
100 libassuan0 amd64
|
||||||
|
99 libpsl5t64 amd64
|
||||||
|
98 libmspack0t64 amd64
|
||||||
|
97 libcap2 amd64
|
||||||
|
96 liburing2 amd64
|
||||||
|
95 libunibilium4 amd64
|
||||||
|
95 libjansson4 amd64
|
||||||
|
95 libbz2-1.0 amd64
|
||||||
|
93 media-types all
|
||||||
|
93 libvterm0 amd64
|
||||||
|
93 libgdbm6t64 amd64
|
||||||
|
90 libxxhash0 amd64
|
||||||
|
84 libuuid1 amd64
|
||||||
|
83 libtalloc2 amd64
|
||||||
|
82 python3 amd64
|
||||||
|
82 cabextract amd64
|
||||||
|
81 libbzip3-0 amd64
|
||||||
|
79 libsensors5 amd64
|
||||||
|
79 libmd0 amd64
|
||||||
|
77 readline-common all
|
||||||
|
77 python3-toml all
|
||||||
|
75 libsasl2-modules-db amd64
|
||||||
|
74 libasm1t64 amd64
|
||||||
|
74 libacl1 amd64
|
||||||
|
72 libffi8 amd64
|
||||||
|
72 diffstat amd64
|
||||||
|
69 yq all
|
||||||
|
69 libss2 amd64
|
||||||
|
69 liberror-perl all
|
||||||
|
69 libdebuginfod1t64 amd64
|
||||||
|
67 libpipeline1 amd64
|
||||||
|
66 bzip3 amd64
|
||||||
|
63 sensible-utils all
|
||||||
|
63 libtermkey1 amd64
|
||||||
|
63 file amd64
|
||||||
|
61 ksh all
|
||||||
|
60 libcap-ng0 amd64
|
||||||
|
60 libattr1 amd64
|
||||||
|
57 libcom-err2 amd64
|
||||||
|
53 libnl-genl-3-200 amd64
|
||||||
|
51 logsave amd64
|
||||||
|
51 libutempter0 amd64
|
||||||
|
50 libdebuginfod-common all
|
||||||
|
48 libmsgpackc2 amd64
|
||||||
|
47 python3-xmltodict all
|
||||||
|
47 libsigsegv2 amd64
|
||||||
|
46 hostname amd64
|
||||||
|
45 libatomic1 amd64
|
||||||
|
44 python3-zstd amd64
|
||||||
|
43 libx32atomic1 amd64
|
||||||
|
42 libnpth0t64 amd64
|
||||||
|
41 libxdmcp6 amd64
|
||||||
|
41 libkeyutils1 amd64
|
||||||
|
39 lib32atomic1 amd64
|
||||||
|
38 libdebconfclient0 amd64
|
||||||
|
37 gcc amd64
|
||||||
|
37 cpp amd64
|
||||||
|
36 netbase all
|
||||||
|
36 chrpath amd64
|
||||||
|
34 libtime-duration-perl all
|
||||||
|
34 libgdbm-compat4t64 amd64
|
||||||
|
33 libxau6 amd64
|
||||||
|
29 ubuntu-keyring all
|
||||||
|
28 g++-13 amd64
|
||||||
|
27 libpython3-stdlib amd64
|
||||||
|
26 libsemanage-common all
|
||||||
|
25 libsensors-config all
|
||||||
|
25 gcc-x86-64-linux-gnu amd64
|
||||||
|
20 cpp-x86-64-linux-gnu amd64
|
||||||
|
17 lsb-release all
|
||||||
|
17 libaudit-common all
|
||||||
|
13 g++ amd64
|
||||||
|
11 g++-x86-64-linux-gnu amd64
|
||||||
|
11 cpp-13 amd64
|
||||||
|
8 p7zip all
|
||||||
|
8 gcc-multilib amd64
|
||||||
|
6 gcc-13-multilib amd64
|
||||||
|
6 g++-multilib amd64
|
||||||
|
6 g++-13-multilib amd64
|
||||||
Executable
+40
@@ -0,0 +1,40 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
[[ -z $1 ]] || cd "$1" || exit 1
|
||||||
|
|
||||||
|
find . \
|
||||||
|
-type d -name '.git' -prune -o \
|
||||||
|
-type d -name '.hg' -prune -o \
|
||||||
|
-type d -name 'build*' -prune -o \
|
||||||
|
-type d -name 'tmp*' -prune -o \
|
||||||
|
-type d -name 'vendor' -prune -o \
|
||||||
|
-type f -iname '*.bat' -prune -o \
|
||||||
|
-type f -iname '*.exe' -prune -o \
|
||||||
|
-type f -iname '*.o' -prune -o \
|
||||||
|
-type f -iname '*.obj' -prune -o \
|
||||||
|
-type f -iname '*.out' -prune -o \
|
||||||
|
-type f -iname '*.pdf' -prune -o \
|
||||||
|
-type f -iname '*.swp' -prune -o \
|
||||||
|
-type f -print0 | \
|
||||||
|
LC_ALL=C sort -z | xargs -0r perl -n -e '
|
||||||
|
#print("$ARGV\n");
|
||||||
|
if (m,[\x00\x01\x02\x7f\xfe\xff],) { print "ERROR: binary file detected $ARGV: $_"; exit(1); }
|
||||||
|
if (m,[\r\x1a],) { print "ERROR: DOS EOL detected $ARGV: $_"; exit(1); }
|
||||||
|
if (m,([ \t]+)$,) {
|
||||||
|
# allow exactly two trailing spaces for GitHub flavoured Markdown in .md files
|
||||||
|
if ($1 ne " " || $ARGV !~ m,\.md$,) {
|
||||||
|
print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m,\t,) {
|
||||||
|
if ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { }
|
||||||
|
elsif ($ARGV =~ m,\.mk$,) { }
|
||||||
|
elsif ($ARGV =~ m,/tmp/.*\.(disasm|dump)$,) { }
|
||||||
|
elsif ($ARGV =~ m,/src/stub/src/arch/.*/lzma\w+\.S$,) { }
|
||||||
|
else { print "ERROR: hard TAB detected $ARGV: $_"; exit(1); }
|
||||||
|
}
|
||||||
|
' || exit 1
|
||||||
Executable
+34
@@ -0,0 +1,34 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
[[ -z $1 ]] || cd "$1" || exit 1
|
||||||
|
[[ -d .git ]] || exit 1
|
||||||
|
|
||||||
|
git ls-files --full-name -z | perl -0 -n -e '
|
||||||
|
s,^,./,;
|
||||||
|
if (m,^\./src/lzma-sdk(\0|$),) { }
|
||||||
|
elsif (m,^\./vendor/,) { }
|
||||||
|
elsif (m,\.bat(\0|$),) { }
|
||||||
|
elsif (m,\.exe(\0|$),) { }
|
||||||
|
else { print; }
|
||||||
|
' | LC_ALL=C sort -z | xargs -0r perl -n -e '
|
||||||
|
#print("$ARGV\n");
|
||||||
|
if (m,[\x00\x01\x02\x7f\xfe\xff],) { print "ERROR: binary file detected $ARGV: $_"; exit(1); }
|
||||||
|
if (m,[\r\x1a],) { print "ERROR: DOS EOL detected $ARGV: $_"; exit(1); }
|
||||||
|
if (m,([ \t]+)$,) {
|
||||||
|
# allow exactly two trailing spaces for GitHub flavoured Markdown in .md files
|
||||||
|
if ($1 ne " " || $ARGV !~ m,\.md$,) {
|
||||||
|
print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m,\t,) {
|
||||||
|
if ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { }
|
||||||
|
elsif ($ARGV =~ m,\.mk$,) { }
|
||||||
|
elsif ($ARGV =~ m,/tmp/.*\.(disasm|dump)$,) { }
|
||||||
|
elsif ($ARGV =~ m,/src/stub/src/arch/.*/lzma\w+\.S$,) { }
|
||||||
|
else { print "ERROR: hard TAB detected $ARGV: $_"; exit(1); }
|
||||||
|
}
|
||||||
|
' || exit 1
|
||||||
Executable
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#! /usr/bin/env python3
|
||||||
|
## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# simulate "readlink -en FILE"
|
||||||
|
# - result may differ from actual readlink(1) for edge cases
|
||||||
|
# - works with Python2 and Python3
|
||||||
|
#
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
import os, sys
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
sys.exit(1)
|
||||||
|
real_path = os.path.realpath(sys.argv[1])
|
||||||
|
if not os.path.exists(real_path):
|
||||||
|
sys.exit(1)
|
||||||
|
sys.stdout.write(real_path)
|
||||||
|
sys.stdout.flush()
|
||||||
Executable
+15
@@ -0,0 +1,15 @@
|
|||||||
|
#! /usr/bin/env python3
|
||||||
|
## vim:set ts=4 sw=4 et: -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# simulate "readlink -fn FILE" for systems that lack it (e.g. macOS-11)
|
||||||
|
# - result may differ from actual readlink(1) for edge cases
|
||||||
|
# - works with Python2 and Python3
|
||||||
|
#
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
|
||||||
|
import os, sys
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
sys.exit(1)
|
||||||
|
real_path = os.path.realpath(sys.argv[1])
|
||||||
|
sys.stdout.write(real_path)
|
||||||
|
sys.stdout.flush()
|
||||||
Executable
+42
@@ -0,0 +1,42 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
# assemble cmake config flags; useful for CI jobs
|
||||||
|
# also see misc/make/Makefile-extra.mk
|
||||||
|
|
||||||
|
cmake_config_flags=()
|
||||||
|
|
||||||
|
# promote an environment variable to a CMake cache entry:
|
||||||
|
__add_cmake_config() {
|
||||||
|
[[ -z "${!1}" ]] || cmake_config_flags+=( -D$1="${!1}" )
|
||||||
|
}
|
||||||
|
|
||||||
|
# pass common CMake settings
|
||||||
|
for v in CMAKE_VERBOSE_MAKEFILE; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass common CMake toolchain settings
|
||||||
|
for v in CMAKE_ADDR2LINE CMAKE_AR CMAKE_DLLTOOL CMAKE_LINKER CMAKE_NM CMAKE_OBJCOPY CMAKE_OBJDUMP CMAKE_RANLIB CMAKE_READELF CMAKE_STRIP CMAKE_TAPI; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass common CMake LTO toolchain settings
|
||||||
|
for v in CMAKE_C_COMPILER_AR CMAKE_C_COMPILER_RANLIB CMAKE_CXX_COMPILER_AR CMAKE_CXX_COMPILER_RANLIB; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass common CMake cross compilation settings
|
||||||
|
for v in CMAKE_SYSTEM_NAME CMAKE_SYSTEM_PROCESSOR CMAKE_CROSSCOMPILING_EMULATOR; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass UPX config options; see CMakeLists.txt
|
||||||
|
for v in UPX_CONFIG_DISABLE_GITREV UPX_CONFIG_DISABLE_SANITIZE UPX_CONFIG_DISABLE_WERROR UPX_CONFIG_DISABLE_WSTRICT UPX_CONFIG_DISABLE_SELF_PACK_TEST UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
# pass UPX extra compile options; see CMakeLists.txt
|
||||||
|
for v in UPX_CONFIG_EXTRA_COMPILE_OPTIONS_BZIP2 UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UCL UPX_CONFIG_EXTRA_COMPILE_OPTIONS_UPX UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZLIB UPX_CONFIG_EXTRA_COMPILE_OPTIONS_ZSTD; do
|
||||||
|
__add_cmake_config $v
|
||||||
|
done
|
||||||
|
|
||||||
|
exec "${CMAKE:-cmake}" $UPX_CMAKE_CONFIG_FLAGS "${cmake_config_flags[@]}" "$@"
|
||||||
|
exit 99
|
||||||
Executable
+34
@@ -0,0 +1,34 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
# "Gofmt's style is nobody's favourite, but gofmt is everybody's favourite." --Rob Pike
|
||||||
|
#
|
||||||
|
# NOTE: we are using clang-format-15.0.6 from upx-stubtools
|
||||||
|
# see https://github.com/upx/upx-stubtools/releases
|
||||||
|
#
|
||||||
|
# NOTE: we use .clang-format config from upx.git/.clang-format
|
||||||
|
|
||||||
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
|
UPX_CLANG_FORMAT="$HOME/local/bin/bin-upx/clang-format-15.0.6"
|
||||||
|
fi
|
||||||
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
|
UPX_CLANG_FORMAT="$HOME/.local/bin/bin-upx/clang-format-15.0.6"
|
||||||
|
fi
|
||||||
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
|
UPX_CLANG_FORMAT="$HOME/bin/bin-upx/clang-format-15.0.6"
|
||||||
|
fi
|
||||||
|
if [[ ! -f $UPX_CLANG_FORMAT ]]; then
|
||||||
|
echo "ERROR: $0: cannot find clang-format-15.0.6"
|
||||||
|
echo "ERROR: $0: please visit https://github.com/upx/upx-stubtools"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# limit memory usage to 1 GiB (in case of clang-format problems with invalid files)
|
||||||
|
ulimit -v 1048576 || true
|
||||||
|
|
||||||
|
#echo $UPX_CLANG_FORMAT
|
||||||
|
exec "$UPX_CLANG_FORMAT" -style=file "$@"
|
||||||
|
exit 99
|
||||||
Executable
+166
@@ -0,0 +1,166 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
# mimic running "ctest", i.e. the "test" section of CMakeLists.txt; does not redirect stdout
|
||||||
|
# (allows freely setting $upx_exe_runner, while CMake is restricted to configure-time settings)
|
||||||
|
#
|
||||||
|
# requires:
|
||||||
|
# $upx_exe (required, but with convenience fallback "./upx")
|
||||||
|
# optional settings:
|
||||||
|
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
|
||||||
|
#
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# init & checks
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# upx_exe
|
||||||
|
[[ -z $upx_exe && -f ./upx && -x ./upx ]] && upx_exe=./upx # convenience fallback
|
||||||
|
if [[ -z $upx_exe ]]; then echo "UPX-ERROR: please set \$upx_exe"; exit 1; fi
|
||||||
|
if [[ ! -f $upx_exe ]]; then echo "UPX-ERROR: file '$upx_exe' does not exist"; exit 1; fi
|
||||||
|
upx_exe=$(readlink -fn "$upx_exe") # make absolute
|
||||||
|
[[ -f $upx_exe ]] || exit 1
|
||||||
|
|
||||||
|
# set emu and run_upx
|
||||||
|
emu=()
|
||||||
|
if [[ -n $upx_exe_runner ]]; then
|
||||||
|
# usage examples:
|
||||||
|
# export upx_exe_runner="qemu-x86_64 -cpu Nehalem"
|
||||||
|
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
||||||
|
# export upx_exe_runner="wine"
|
||||||
|
IFS=' ' read -r -a emu <<< "$upx_exe_runner" # split at spaces into array
|
||||||
|
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
|
||||||
|
IFS=';' read -r -a emu <<< "$CMAKE_CROSSCOMPILING_EMULATOR" # split at semicolons into array
|
||||||
|
fi
|
||||||
|
run_upx=( "${emu[@]}" "$upx_exe" )
|
||||||
|
echo "run_upx='${run_upx[*]}'"
|
||||||
|
|
||||||
|
# run_upx sanity check
|
||||||
|
if ! "${run_upx[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
||||||
|
if ! "${run_upx[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
||||||
|
if ! "${run_upx[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# see CMakeLists.txt
|
||||||
|
#
|
||||||
|
# IDEA: create a Makefile and use "make -j" so that these tests can
|
||||||
|
# run in parallel much like "ctest --parallel 8"
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# similar to cmake function upx_cache_bool_vars()
|
||||||
|
set_cmake_bool_vars() {
|
||||||
|
local default_value="$1"; shift
|
||||||
|
local var_name
|
||||||
|
for var_name do
|
||||||
|
case "${!var_name}" in
|
||||||
|
0 | FALSE | OFF | false | off) eval "export $var_name=OFF" ;;
|
||||||
|
1 | TRUE | ON | true | on) eval "export $var_name=ON" ;;
|
||||||
|
*) eval "export $var_name=$default_value" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
set -x
|
||||||
|
set_cmake_bool_vars OFF UPX_CONFIG_DISABLE_SELF_PACK_TEST
|
||||||
|
set_cmake_bool_vars OFF UPX_CONFIG_DISABLE_RUN_UNPACKED_TEST
|
||||||
|
set_cmake_bool_vars OFF UPX_CONFIG_DISABLE_RUN_PACKED_TEST
|
||||||
|
if [[ "${emu[0]}" == *valgrind* ]]; then # valgrind is SLOW
|
||||||
|
set_cmake_bool_vars ON UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS
|
||||||
|
else
|
||||||
|
set_cmake_bool_vars OFF UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS
|
||||||
|
fi
|
||||||
|
|
||||||
|
export UPX="--prefer-ucl --no-color --no-progress"
|
||||||
|
export UPX_DEBUG_DISABLE_GITREV_WARNING=1
|
||||||
|
export UPX_DEBUG_DOCTEST_DISABLE=1 # already checked above
|
||||||
|
|
||||||
|
"${run_upx[@]}" --version
|
||||||
|
"${run_upx[@]}" --version-short
|
||||||
|
"${run_upx[@]}" --license
|
||||||
|
"${run_upx[@]}" --help
|
||||||
|
"${run_upx[@]}" --help-short
|
||||||
|
"${run_upx[@]}" --help-verbose
|
||||||
|
"${run_upx[@]}" --sysinfo
|
||||||
|
"${run_upx[@]}" --sysinfo -v
|
||||||
|
"${run_upx[@]}" --sysinfo -vv
|
||||||
|
|
||||||
|
if [[ $UPX_CONFIG_DISABLE_SELF_PACK_TEST == ON ]]; then
|
||||||
|
echo "Self-pack test disabled. All done."; exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
exe=".out"
|
||||||
|
upx_self_exe=$upx_exe
|
||||||
|
fo="--force-overwrite"
|
||||||
|
|
||||||
|
"${run_upx[@]}" -3 "${upx_self_exe}" ${fo} -o upx-packed${exe}
|
||||||
|
"${run_upx[@]}" -3 --all-filters "${upx_self_exe}" ${fo} -o upx-packed-fa${exe}
|
||||||
|
"${run_upx[@]}" -3 --no-filter "${upx_self_exe}" ${fo} -o upx-packed-fn${exe}
|
||||||
|
"${run_upx[@]}" -3 --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-fr${exe}
|
||||||
|
"${run_upx[@]}" -3 --nrv2b "${upx_self_exe}" ${fo} -o upx-packed-nrv2b${exe}
|
||||||
|
"${run_upx[@]}" -3 --nrv2d "${upx_self_exe}" ${fo} -o upx-packed-nrv2d${exe}
|
||||||
|
"${run_upx[@]}" -3 --nrv2e "${upx_self_exe}" ${fo} -o upx-packed-nrv2e${exe}
|
||||||
|
"${run_upx[@]}" -1 --lzma "${upx_self_exe}" ${fo} -o upx-packed-lzma${exe}
|
||||||
|
|
||||||
|
"${run_upx[@]}" -l upx-packed${exe} upx-packed-fa${exe} upx-packed-fn${exe} upx-packed-fr${exe} upx-packed-nrv2b${exe} upx-packed-nrv2d${exe} upx-packed-nrv2e${exe} upx-packed-lzma${exe}
|
||||||
|
"${run_upx[@]}" --fileinfo upx-packed${exe} upx-packed-fa${exe} upx-packed-fn${exe} upx-packed-fr${exe} upx-packed-nrv2b${exe} upx-packed-nrv2d${exe} upx-packed-nrv2e${exe} upx-packed-lzma${exe}
|
||||||
|
"${run_upx[@]}" -t upx-packed${exe} upx-packed-fa${exe} upx-packed-fn${exe} upx-packed-fr${exe} upx-packed-nrv2b${exe} upx-packed-nrv2d${exe} upx-packed-nrv2e${exe} upx-packed-lzma${exe}
|
||||||
|
|
||||||
|
"${run_upx[@]}" -d upx-packed${exe} ${fo} -o upx-unpacked${exe}
|
||||||
|
"${run_upx[@]}" -d upx-packed-fa${exe} ${fo} -o upx-unpacked-fa${exe}
|
||||||
|
"${run_upx[@]}" -d upx-packed-fn${exe} ${fo} -o upx-unpacked-fn${exe}
|
||||||
|
"${run_upx[@]}" -d upx-packed-fr${exe} ${fo} -o upx-unpacked-fr${exe}
|
||||||
|
"${run_upx[@]}" -d upx-packed-nrv2b${exe} ${fo} -o upx-unpacked-nrv2b${exe}
|
||||||
|
"${run_upx[@]}" -d upx-packed-nrv2d${exe} ${fo} -o upx-unpacked-nrv2d${exe}
|
||||||
|
"${run_upx[@]}" -d upx-packed-nrv2e${exe} ${fo} -o upx-unpacked-nrv2e${exe}
|
||||||
|
"${run_upx[@]}" -d upx-packed-lzma${exe} ${fo} -o upx-unpacked-lzma${exe}
|
||||||
|
|
||||||
|
# all unpacked files must be identical
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-fa${exe}
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-fn${exe}
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-fr${exe}
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-nrv2b${exe}
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-nrv2d${exe}
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-nrv2e${exe}
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-lzma${exe}
|
||||||
|
|
||||||
|
if [[ $UPX_CONFIG_DISABLE_RUN_UNPACKED_TEST != ON ]]; then
|
||||||
|
"${emu[@]}" ./upx-unpacked${exe} --version-short
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_CONFIG_DISABLE_RUN_PACKED_TEST != ON ]]; then
|
||||||
|
"${emu[@]}" ./upx-packed${exe} --version-short
|
||||||
|
"${emu[@]}" ./upx-packed-fa${exe} --version-short
|
||||||
|
"${emu[@]}" ./upx-packed-fn${exe} --version-short
|
||||||
|
"${emu[@]}" ./upx-packed-fr${exe} --version-short
|
||||||
|
"${emu[@]}" ./upx-packed-nrv2b${exe} --version-short
|
||||||
|
"${emu[@]}" ./upx-packed-nrv2d${exe} --version-short
|
||||||
|
"${emu[@]}" ./upx-packed-nrv2e${exe} --version-short
|
||||||
|
"${emu[@]}" ./upx-packed-lzma${exe} --version-short
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS != ON ]]; then
|
||||||
|
set +x
|
||||||
|
for method in nrv2b nrv2d nrv2e lzma; do
|
||||||
|
for level in 1 2 3 4 5 6 7; do
|
||||||
|
s="${method}-${level}"
|
||||||
|
echo "========== $s =========="
|
||||||
|
"${run_upx[@]}" -qq --${method} -${level} --all-filters --debug-use-random-filter "${upx_self_exe}" ${fo} -o upx-packed-${s}${exe}
|
||||||
|
"${run_upx[@]}" -qq -l upx-packed-${s}${exe}
|
||||||
|
"${run_upx[@]}" -qq --fileinfo upx-packed-${s}${exe}
|
||||||
|
"${run_upx[@]}" -qq -t upx-packed-${s}${exe}
|
||||||
|
"${run_upx[@]}" -qq -d upx-packed-${s}${exe} ${fo} -o upx-unpacked-${s}${exe}
|
||||||
|
cmp -s upx-unpacked${exe} upx-unpacked-${s}${exe}
|
||||||
|
if [[ $UPX_CONFIG_DISABLE_RUN_PACKED_TEST != ON ]]; then
|
||||||
|
"${emu[@]}" ./upx-packed-${s}${exe} --version-short
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "run_upx='${run_upx[*]}'"
|
||||||
|
echo "All done."
|
||||||
Executable
+425
@@ -0,0 +1,425 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
# test file system behaviour with symlinks; requires:
|
||||||
|
# $upx_exe (required, but with convenience fallback "./upx")
|
||||||
|
# optional settings:
|
||||||
|
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
|
||||||
|
# $upx_test_file
|
||||||
|
#
|
||||||
|
|
||||||
|
# IMPORTANT NOTE: this script only works on Unix
|
||||||
|
# IMPORTANT NOTE: do NOT run as user root!
|
||||||
|
umask 0022
|
||||||
|
|
||||||
|
# disable on macOS for now, see https://github.com/upx/upx/issues/612
|
||||||
|
if [[ "$(uname)" == Darwin ]]; then
|
||||||
|
case "$UPX_DEBUG_FORCE_PACK_MACOS" in
|
||||||
|
"" | "0") echo "$0: SKIPPED"; exit 0 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
id || true
|
||||||
|
echo "PWD='$PWD'"
|
||||||
|
if [[ $UID == 0 || $EUID == 0 ]]; then
|
||||||
|
echo "ERROR: do not run as root: UID=$UID EUID=$EUID"
|
||||||
|
exit 91
|
||||||
|
fi
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# init & checks
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# upx_exe
|
||||||
|
[[ -z $upx_exe && -f ./upx && -x ./upx ]] && upx_exe=./upx # convenience fallback
|
||||||
|
if [[ -z $upx_exe ]]; then echo "UPX-ERROR: please set \$upx_exe"; exit 1; fi
|
||||||
|
if [[ ! -f $upx_exe ]]; then echo "UPX-ERROR: file '$upx_exe' does not exist"; exit 1; fi
|
||||||
|
upx_exe=$(readlink -fn "$upx_exe") # make absolute
|
||||||
|
[[ -f $upx_exe ]] || exit 1
|
||||||
|
|
||||||
|
# set emu and run_upx
|
||||||
|
emu=()
|
||||||
|
if [[ -n $upx_exe_runner ]]; then
|
||||||
|
# usage examples:
|
||||||
|
# export upx_exe_runner="qemu-x86_64 -cpu Nehalem"
|
||||||
|
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
||||||
|
# export upx_exe_runner="wine"
|
||||||
|
IFS=' ' read -r -a emu <<< "$upx_exe_runner" # split at spaces into array
|
||||||
|
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
|
||||||
|
IFS=';' read -r -a emu <<< "$CMAKE_CROSSCOMPILING_EMULATOR" # split at semicolons into array
|
||||||
|
fi
|
||||||
|
run_upx=( "${emu[@]}" "$upx_exe" )
|
||||||
|
echo "run_upx='${run_upx[*]}'"
|
||||||
|
|
||||||
|
# run_upx sanity check
|
||||||
|
if ! "${run_upx[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
||||||
|
if ! "${run_upx[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
||||||
|
if ! "${run_upx[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# util functions
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
exit_code=0
|
||||||
|
num_errors=0
|
||||||
|
all_errors=
|
||||||
|
|
||||||
|
failed() {
|
||||||
|
####exit $1
|
||||||
|
# log error and keep going
|
||||||
|
exit_code=1
|
||||||
|
local a="$(basename "$(dirname "$PWD")")"
|
||||||
|
local b="$(basename "$PWD")"
|
||||||
|
let num_errors+=1 || true
|
||||||
|
all_errors="${all_errors} $a/$b/$1"
|
||||||
|
echo " FAILED $b/$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_file() {
|
||||||
|
local f
|
||||||
|
for f in "$@"; do
|
||||||
|
[[ ! -L "$f" && -f "$f" ]] && continue
|
||||||
|
echo "failed '$f': not a regular file"
|
||||||
|
failed 21
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_symlink_to_file() {
|
||||||
|
local f
|
||||||
|
for f in "$@"; do
|
||||||
|
[[ -L "$f" && -f "$f" ]] && continue
|
||||||
|
echo "failed '$f': not a symlink to file"
|
||||||
|
failed 22
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_symlink_to_dir() {
|
||||||
|
local f
|
||||||
|
for f in "$@"; do
|
||||||
|
[[ -L "$f" && -d "$f" ]] && continue
|
||||||
|
echo "failed '$f': not a symlink to dir"
|
||||||
|
failed 23
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_symlink_dangling() {
|
||||||
|
local f
|
||||||
|
for f in "$@"; do
|
||||||
|
[[ -L "$f" && ! -e "$f" ]] && continue
|
||||||
|
echo "failed '$f': not a dangling symlink"
|
||||||
|
failed 24
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_directory() {
|
||||||
|
if command -v rsync >/dev/null; then
|
||||||
|
rsync -aH "$1/" "$2"
|
||||||
|
else
|
||||||
|
cp -ai "$1" "$2"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_files() {
|
||||||
|
# clean
|
||||||
|
local d
|
||||||
|
for d in z_dir_1 z_dir_2 z_dir_3 z_dir_4; do
|
||||||
|
if [[ -d $d ]]; then
|
||||||
|
chmod -R +rwx "./$d"
|
||||||
|
rm -rf "./$d"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
mkdir z_dir_1
|
||||||
|
cd z_dir_1
|
||||||
|
: > z_file
|
||||||
|
ln -s z_file z_symlink_file
|
||||||
|
: > z_file_link_1
|
||||||
|
ln z_file_link_1 z_file_link_2
|
||||||
|
ln -s z_file_link_1 z_symlink_file_link
|
||||||
|
mkdir z_dir
|
||||||
|
ln -s z_dir z_symlink_dir
|
||||||
|
ln -s z_file_missing z_symlink_dangling
|
||||||
|
assert_file z_file*
|
||||||
|
assert_symlink_to_file z_symlink_file
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# write-protect z_dir_2/z_file*
|
||||||
|
copy_directory z_dir_1 z_dir_2
|
||||||
|
chmod a-w z_dir_2/z_file*
|
||||||
|
|
||||||
|
# write-protect z_dir_3 itself
|
||||||
|
copy_directory z_dir_1 z_dir_3
|
||||||
|
chmod a-w z_dir_3
|
||||||
|
|
||||||
|
# write-protect everything in z_dir_4
|
||||||
|
copy_directory z_dir_1 z_dir_4
|
||||||
|
chmod -R a-w z_dir_4
|
||||||
|
}
|
||||||
|
|
||||||
|
print_header() {
|
||||||
|
local x='==========='; x="$x$x$x$x$x$x$x"
|
||||||
|
echo -e "\n${x}\n${1}\n${x}\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
enter_dir() {
|
||||||
|
cd "$1" || exit 1
|
||||||
|
echo "===== $(basename "$PWD")"
|
||||||
|
}
|
||||||
|
leave_dir() {
|
||||||
|
echo "===== $(basename "$PWD") files"
|
||||||
|
ls -lA
|
||||||
|
cd ..
|
||||||
|
}
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# setup
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
#set -x # debug
|
||||||
|
|
||||||
|
export UPX="--prefer-ucl --no-color --no-progress"
|
||||||
|
export UPX_DEBUG_DISABLE_GITREV_WARNING=1
|
||||||
|
export UPX_DEBUG_DOCTEST_DISABLE=1 # already checked above
|
||||||
|
|
||||||
|
# get $test_file
|
||||||
|
if [[ -f $upx_test_file ]]; then
|
||||||
|
test_file="$(readlink -fn "$upx_test_file")"
|
||||||
|
else
|
||||||
|
for test_file in /usr/bin/gmake /usr/bin/make /usr/bin/env /bin/ls; do
|
||||||
|
if [[ -f $test_file ]]; then
|
||||||
|
test_file="$(readlink -fn "$test_file")"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
ls -l "$test_file"
|
||||||
|
file "$test_file" || true
|
||||||
|
|
||||||
|
# create and enter a tmpdir in the current directory
|
||||||
|
tmpdir="$(mktemp -d tmp-upx-test-XXXXXX)"
|
||||||
|
cd "./$tmpdir" || exit 1
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# default
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
print_header "default"
|
||||||
|
flags="-qq -2 --no-filter"
|
||||||
|
mkdir default
|
||||||
|
cd default
|
||||||
|
create_files
|
||||||
|
enter_dir z_dir_1
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new || failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file && failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 && failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file && failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link && failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_2
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new || failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file && failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 && failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file && failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link && failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_3
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new && failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file && failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 && failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file && failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link && failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_4
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new && failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file && failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 && failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file && failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link && failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# force-overwrite
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
print_header "force-overwrite"
|
||||||
|
flags="-qq -2 --no-filter --force-overwrite"
|
||||||
|
mkdir force-overwrite
|
||||||
|
cd force-overwrite
|
||||||
|
create_files
|
||||||
|
enter_dir z_dir_1
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new || failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file || failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 || failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir || failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling || failed 18
|
||||||
|
assert_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_file z_symlink_dir
|
||||||
|
assert_file z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_2
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new || failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file || failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 || failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir || failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling || failed 18
|
||||||
|
assert_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_file z_symlink_dir
|
||||||
|
assert_file z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_3
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new && failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file || failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 || failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_4
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new && failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file || failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 || failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# link
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
print_header "link"
|
||||||
|
flags="-qq -2 --no-filter --link"
|
||||||
|
mkdir link
|
||||||
|
cd link
|
||||||
|
create_files
|
||||||
|
enter_dir z_dir_1
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new || failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file || failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 || failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir || failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling || failed 18
|
||||||
|
assert_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_file z_symlink_dir
|
||||||
|
assert_file z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_2
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new || failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file && failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 && failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir || failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling || failed 18
|
||||||
|
assert_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_file z_symlink_dir
|
||||||
|
assert_file z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_3
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new && failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file || failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 || failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
enter_dir z_dir_4
|
||||||
|
"${run_upx[@]}" $flags z_symlink_file && failed 10
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_new && failed 11
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_dir && failed 12
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file && failed 13
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_file_link_1 && failed 14
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file || failed 15
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_file_link || failed 16
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dir && failed 17
|
||||||
|
"${run_upx[@]}" $flags "$test_file" -o z_symlink_dangling && failed 18
|
||||||
|
assert_symlink_to_file z_symlink_file z_symlink_file_link
|
||||||
|
assert_symlink_to_dir z_symlink_dir
|
||||||
|
assert_symlink_dangling z_symlink_dangling
|
||||||
|
leave_dir
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# done
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# clean up
|
||||||
|
cd ..
|
||||||
|
chmod -R +rwx "./$tmpdir"
|
||||||
|
rm -rf "./$tmpdir"
|
||||||
|
|
||||||
|
if [[ $exit_code == 0 ]]; then
|
||||||
|
echo "UPX testsuite passed. All done."
|
||||||
|
else
|
||||||
|
echo "UPX-ERROR: UPX testsuite FAILED:${all_errors}"
|
||||||
|
echo "UPX-ERROR: UPX testsuite FAILED with $num_errors error(s). See log file."
|
||||||
|
fi
|
||||||
|
exit $exit_code
|
||||||
+209
@@ -0,0 +1,209 @@
|
|||||||
|
########## begin .sha256sums.recreate
|
||||||
|
expected_sha256sums__t010_decompressed="\
|
||||||
|
24158f78c34c4ef94bb7773a6dda7231d289be76c2f5f60e8b9ddb3f800c100e *amd64-linux.elf/upx-3.91
|
||||||
|
24808d572483f4cd713d66894b3da406755038737007a78b076528e6407e3132 *amd64-linux.elf/upx-3.95
|
||||||
|
d88eaad0528bcecec9f51cbe015a117c8cf350a3f6d8308f2b0517d4fd19d189 *amd64-win64.pe/upx-3.95.exe
|
||||||
|
f7279729eb975e4238f8b8ee56fefa41ccbeb35ef0ffe4c34f8047baab78fff5 *arm-linux.elf/upx-3.95
|
||||||
|
e09df2a69f88c692138447f274ba7f99cdd11f8696c71ac8d3761606c95ab5c5 *arm-wince.pe/upx-3.91.exe
|
||||||
|
ce81113f8a4ff1cd806811cb80ab8bea5c9c6fbced47451c7f07e50700f9817b *arm64-linux.elf/upx-3.95
|
||||||
|
b1c1c38d50007616aaf8e942839648c80a6111023e0b411e5fa7a06c543aeb4a *armeb-linux.elf/upx-3.91
|
||||||
|
84b90eb0d617571fe4885639925b35ca6a61060cb2616bb5bf729b4d701653e4 *armeb-linux.elf/upx-3.95
|
||||||
|
bcac77a287289301a45fde9a75e4e6c9ad7f8d57856bae6eafaae12ae4445a34 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
7d331e508449497f64cd47abdd3f00f70307f508ad3fd692d333feb97beccead *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
730a513b72a094697f827e4ac1a4f8ef58a614fc7a7ad448fa58d60cd89af7ed *i386-linux.elf/upx-3.91
|
||||||
|
a1f3e5ffa7b2cfebe1e475ac1f4c7683b1b8b4e292aa0d04386cc0314dd162c9 *i386-linux.elf/upx-3.95
|
||||||
|
e90fb09a808334c2674996760d42c82f8352e3f671f6b66c11481e772785c4d2 *i386-win32.pe/upx-3.91.exe
|
||||||
|
07bd50c1d80f6ff651228e6fc0ba3a583a472915772244f232696b34156a9d27 *i386-win32.pe/upx-3.95.exe
|
||||||
|
8e5333ea040f5594d3e67d5b09e005d52b3a52ef55099a7c11d7e39ead38e66d *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
8902f38ec3d95d8e077e3ab5fdbb5bad408859913a35deb87041f4f053cd6605 *mips-linux.elf/upx-3.95
|
||||||
|
c3f44b4d00a87384c03a6f9e7aec809c1addfe3e271244d38a474f296603088c *mipsel-linux.elf/upx-3.91
|
||||||
|
dd1496bc4e9c32a5d5dd47e3eaabf7b134ca001d48807eebfd3d5e28c8a2ab58 *mipsel-linux.elf/upx-3.95
|
||||||
|
b8c35fa2956da17ca505956e9f5017bb5f3a746322647e24ccb8ff28059cafa4 *powerpc-linux.elf/upx-3.91
|
||||||
|
2bc00a51daa0bada19a8fa1bd2c227a8596844fa1b0aa3611087f195072700e2 *powerpc-linux.elf/upx-3.95
|
||||||
|
a0950546dc17fca9437219431d8ddb0249ce5b08e899e0c799a87ac982adee70 *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t020_canonicalized="\
|
||||||
|
24158f78c34c4ef94bb7773a6dda7231d289be76c2f5f60e8b9ddb3f800c100e *amd64-linux.elf/upx-3.91
|
||||||
|
24808d572483f4cd713d66894b3da406755038737007a78b076528e6407e3132 *amd64-linux.elf/upx-3.95
|
||||||
|
d88eaad0528bcecec9f51cbe015a117c8cf350a3f6d8308f2b0517d4fd19d189 *amd64-win64.pe/upx-3.95.exe
|
||||||
|
f7279729eb975e4238f8b8ee56fefa41ccbeb35ef0ffe4c34f8047baab78fff5 *arm-linux.elf/upx-3.95
|
||||||
|
e09df2a69f88c692138447f274ba7f99cdd11f8696c71ac8d3761606c95ab5c5 *arm-wince.pe/upx-3.91.exe
|
||||||
|
ce81113f8a4ff1cd806811cb80ab8bea5c9c6fbced47451c7f07e50700f9817b *arm64-linux.elf/upx-3.95
|
||||||
|
b1c1c38d50007616aaf8e942839648c80a6111023e0b411e5fa7a06c543aeb4a *armeb-linux.elf/upx-3.91
|
||||||
|
84b90eb0d617571fe4885639925b35ca6a61060cb2616bb5bf729b4d701653e4 *armeb-linux.elf/upx-3.95
|
||||||
|
bcac77a287289301a45fde9a75e4e6c9ad7f8d57856bae6eafaae12ae4445a34 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
7d331e508449497f64cd47abdd3f00f70307f508ad3fd692d333feb97beccead *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
730a513b72a094697f827e4ac1a4f8ef58a614fc7a7ad448fa58d60cd89af7ed *i386-linux.elf/upx-3.91
|
||||||
|
a1f3e5ffa7b2cfebe1e475ac1f4c7683b1b8b4e292aa0d04386cc0314dd162c9 *i386-linux.elf/upx-3.95
|
||||||
|
e90fb09a808334c2674996760d42c82f8352e3f671f6b66c11481e772785c4d2 *i386-win32.pe/upx-3.91.exe
|
||||||
|
07bd50c1d80f6ff651228e6fc0ba3a583a472915772244f232696b34156a9d27 *i386-win32.pe/upx-3.95.exe
|
||||||
|
8e5333ea040f5594d3e67d5b09e005d52b3a52ef55099a7c11d7e39ead38e66d *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
8902f38ec3d95d8e077e3ab5fdbb5bad408859913a35deb87041f4f053cd6605 *mips-linux.elf/upx-3.95
|
||||||
|
c3f44b4d00a87384c03a6f9e7aec809c1addfe3e271244d38a474f296603088c *mipsel-linux.elf/upx-3.91
|
||||||
|
dd1496bc4e9c32a5d5dd47e3eaabf7b134ca001d48807eebfd3d5e28c8a2ab58 *mipsel-linux.elf/upx-3.95
|
||||||
|
b8c35fa2956da17ca505956e9f5017bb5f3a746322647e24ccb8ff28059cafa4 *powerpc-linux.elf/upx-3.91
|
||||||
|
2bc00a51daa0bada19a8fa1bd2c227a8596844fa1b0aa3611087f195072700e2 *powerpc-linux.elf/upx-3.95
|
||||||
|
a0950546dc17fca9437219431d8ddb0249ce5b08e899e0c799a87ac982adee70 *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t110_compress_ucl_nrv2b_3_no_filter="\
|
||||||
|
ef49d1c9617dbb3dc1bb36ab70df8a263cd816cc5e91ad28cc62f91ccc77afa7 *amd64-linux.elf/upx-3.91
|
||||||
|
253b1542cdcd5d554eb442e263eb44e400f00e63cfd4d0d727eacec5fcdbbd00 *amd64-linux.elf/upx-3.95
|
||||||
|
d96c42d14684e7248de5712310364eafa28b337695bc0d8c37f91d593b869250 *amd64-win64.pe/upx-3.95.exe
|
||||||
|
c1d3b9ec3157f068097f5deffddce4fc4d3d95602daa539992e0accff6af0de8 *arm-linux.elf/upx-3.95
|
||||||
|
9ca862c0c92d7e4068145024486bb85a6031bf06f9a37c6af543234e08e8ab36 *arm-wince.pe/upx-3.91.exe
|
||||||
|
9173b4e4b1ac0b92e63dc51168dbd41d38208520b0f4c17b91d22e584ad55ae4 *arm64-linux.elf/upx-3.95
|
||||||
|
8c6c5f1678fb74d2f65a1e6c28e3089a4b99b49939fabac3ca1f71183bc73ffa *armeb-linux.elf/upx-3.91
|
||||||
|
13caa682f323a0438a651f53768af9b7fb1208980d46d94c6fb984ecf4422599 *armeb-linux.elf/upx-3.95
|
||||||
|
55f30818e45da393628aa80c3518f3cf099666ae3af5014bded2196ea28ddaea *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
6b80b2be79ec38af3071fcaf8f0d0ec524e4523e7e52e2f10111862ab93ec793 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
9bb71da401ae398ca42cde73afffe0c0db29fff24f22196c4116636ab6385170 *i386-linux.elf/upx-3.91
|
||||||
|
c2375a808f989c0f8290fcd9760db0033413323d8597deb796f182f8ac38afa2 *i386-linux.elf/upx-3.95
|
||||||
|
892695e1abdc0fbbd110ee30c317fde56947f4a8b3dfe413507ee7665f109986 *i386-win32.pe/upx-3.91.exe
|
||||||
|
f76ec227836388da3174007e2c5e27fb6cb397a83297872e78befb298a65796d *i386-win32.pe/upx-3.95.exe
|
||||||
|
8f7c5b3d67c78c117c02bec8b30ec5fca7baa79a35d250a4d981cb7137f8635d *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
745ac3afd263f3a653165bd229e35c817a58c9b894a8d6fbd4e5aaf6c38c1264 *mips-linux.elf/upx-3.95
|
||||||
|
a11da76425bc3bb308de3c19e6df22f56bf12c95afcf96ee8c2d4aaeda07ac8a *mipsel-linux.elf/upx-3.91
|
||||||
|
76c458e8e9b94eceb60d8c51f602a5dec44b2617886ea0b5b7b8802c61d962e9 *mipsel-linux.elf/upx-3.95
|
||||||
|
cec277d9e6e0cbf551f697c1d52e5d29b48533efbe4269df0aafbc12731a93ed *powerpc-linux.elf/upx-3.91
|
||||||
|
92c6cec7bf40d1aa5a62a55fce95bb99d94c5b477edbea127ee0468471ddbdb3 *powerpc-linux.elf/upx-3.95
|
||||||
|
df2f12597c901196e8f10782e72fb4c294955f03a66cc4e8bf3c24414929f717 *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
|
||||||
|
f7e51450a373cb49f88e3e17c268f4198429f7ad06bed57dda28161b5383196a *amd64-linux.elf/upx-3.91
|
||||||
|
15c57828824d18604519fd43349f0340ccebfddf246ab355f8f30253123132ea *amd64-linux.elf/upx-3.95
|
||||||
|
728b2feceda3cfdd849aef4402d5d4e61aa6fa6d56266e7730b148dc66f4a7b0 *amd64-win64.pe/upx-3.95.exe
|
||||||
|
188a3581ed2bac5fdfd50e08267e2e9cf4cf3ddbfc9f5ae15643298bda4bf11c *arm-linux.elf/upx-3.95
|
||||||
|
0711f0b8531de9659f099f43f2a883d628bee8de67f927e7137c19c6d23a30bd *arm-wince.pe/upx-3.91.exe
|
||||||
|
ae6fa69b1242bdfe808d64b7bbefddfe9c1c96302627ee8c65fa2851102fc502 *arm64-linux.elf/upx-3.95
|
||||||
|
7586b4029355eff2edf25141835ee2405ab9f936956e56420315c3d3fecc8bda *armeb-linux.elf/upx-3.91
|
||||||
|
e37875b1a91ef3c88bdba113649a061b72239dbfe77b77077c51254037a982b6 *armeb-linux.elf/upx-3.95
|
||||||
|
536e5a6bb18378f3eea81be12f218f4da60ea81eddf480434aaf418610e4e52d *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
386f3037b26b8b2ce49a527028d738956e7ef649b29a0ef15e32acef4a3b291a *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
5761d8e12b01163c2bf378bef813df9a621da08c4508773db992a1cce067c70c *i386-linux.elf/upx-3.91
|
||||||
|
8afc2b549e2f78987641045697afaac0378b48e84c3e946334c9e4f1a7e693fa *i386-linux.elf/upx-3.95
|
||||||
|
1cc6663f3d9e847f9fec39a52c8efe38b39a66074c0ad77a880a84dde7c68d3f *i386-win32.pe/upx-3.91.exe
|
||||||
|
edf158ec6064e9b11b677a73239a70e414fa8c4f3b8950f74e81514ccb28ef4f *i386-win32.pe/upx-3.95.exe
|
||||||
|
faa36b6601743dcc5eaedb57187a893006652b6c68acecff179ce2cd123e6209 *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
6c76928b5914b5c2e072bf2f90a2c95049cc41aec6b98b1f0b3c4f84df069f02 *mips-linux.elf/upx-3.95
|
||||||
|
029c2a47f1f613c538d2f39674167489a9d1bbbb6649a06d51d2b5ea983b4924 *mipsel-linux.elf/upx-3.91
|
||||||
|
4d837edcaf344505ad1a3721ec8e5db35ddaa273a747201e460b946c0a89d6ea *mipsel-linux.elf/upx-3.95
|
||||||
|
0e24a9e58939f7aacd3482db24e04bdac406a658dbb8d5e65d71d76d455e5aa5 *powerpc-linux.elf/upx-3.91
|
||||||
|
04bd4885f37c77a34b39e76cca2fd363f794ed1611093d7fffe1ee19920ce1dd *powerpc-linux.elf/upx-3.95
|
||||||
|
3b6be5bff0e435a8dbd8529562912c58dafdcb9694d75564238f3d086048abd2 *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
|
||||||
|
715de64e0911c959d0ea208db13bf23a5e635e97e73feb9e04ac9d32117e6a3f *amd64-linux.elf/upx-3.91
|
||||||
|
da805c93ffea03da2f0c0dbb1b313cf0d88ef2c0cb0ad77b0be792210106cd6c *amd64-linux.elf/upx-3.95
|
||||||
|
213e6d3c80b4d741e8c78da915d32c1a2b74072d31e86ec46a10ac2535cf8f6f *amd64-win64.pe/upx-3.95.exe
|
||||||
|
3a66e868147347208935c042517b9f0e2e30d2dbb5c004ec8df6a9ab1e42ecd5 *arm-linux.elf/upx-3.95
|
||||||
|
8d295980b1e6a8240bf75b86a9b8e4561424cbabeab01246f51e553d84b40839 *arm-wince.pe/upx-3.91.exe
|
||||||
|
194947a439c1348570e45343e404c409be3f10feb70fdd87d9bca0addc772c44 *arm64-linux.elf/upx-3.95
|
||||||
|
a01384f43803428e0bfc5f8152304eb8618ef862e4e996a4a4fa4dd9c4576833 *armeb-linux.elf/upx-3.91
|
||||||
|
f2fdba359d52bb82fbab093176a3fbf37b9cb13e8d297523ed57051c3bd401e3 *armeb-linux.elf/upx-3.95
|
||||||
|
582030394a570f92be2d31b3862ab7fb0a6f08982c793a4d41c1471d2cabb939 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
f60dc2f332f58b7fa08f551f8c33d645d71d9ee79e2a719130d10ea4091373ef *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
13887e5466a7d0fc2652aedcef44e33e6ee9b8d6f0ac21dbc4ec90fcc0613bfa *i386-linux.elf/upx-3.91
|
||||||
|
636759f884399ff05e8493a759f60ea52cd4640eb5e9760f12fc25fbf730b1ed *i386-linux.elf/upx-3.95
|
||||||
|
c4a5d27ce7d8f0f326e49489223eda188a9be61971a88758a559efb9f854611a *i386-win32.pe/upx-3.91.exe
|
||||||
|
4ca9a3dd0e0ec38cc1aa3720d9c666f86df4fbe9dcb87ef0dad56d0a47dc327a *i386-win32.pe/upx-3.95.exe
|
||||||
|
f34a020e6325d213052d9f09c775c4d292c34c51380b1ab1b22c6663645167f0 *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
3006af1262a29173c46340f1ee4526fba41145f7476841d5bf6b499aa6dea0fd *mips-linux.elf/upx-3.95
|
||||||
|
6af81d3c7cb6f1388925fe2d78ea96313d91d5e17249268739de4d56857f27bd *mipsel-linux.elf/upx-3.91
|
||||||
|
9d3849cd0037ef550703c574e0ccb3032b0d27217ec02c90a0ad8592d2a229f1 *mipsel-linux.elf/upx-3.95
|
||||||
|
704b6eb2033cf3eab30cbc53c35fc85bf0cb17f904528792de33967a1406091d *powerpc-linux.elf/upx-3.91
|
||||||
|
b89b2f3b250ddd156cb857717c86a0c0325a26dd084717c64f3022277ad02be4 *powerpc-linux.elf/upx-3.95
|
||||||
|
d52f201ab041fa64a4ee4234bd0e443e883e402bb93ced9e22554bd3ef3cc9ab *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t140_compress_lzma_2_no_filter="\
|
||||||
|
af8536d70ecb8c0680c1c9dc45ef60dcb13fab99f0e4644d9f86216a9cf003e2 *amd64-linux.elf/upx-3.91
|
||||||
|
004a705f4981a19f35767b33bdb70b942717a701ad8635bd56ba33e347c6ed69 *amd64-linux.elf/upx-3.95
|
||||||
|
cf07c202497ab38417ec3ccb65cbb0eb9b87f6c6df40d7dc4b44616282c8e0f8 *amd64-win64.pe/upx-3.95.exe
|
||||||
|
da153c1747e0e242cc8b90c04362f67caa0aa638562bc12fcc7fe08ebb1b4fcb *arm-linux.elf/upx-3.95
|
||||||
|
9755110ebc951c9767e376155d9c6fee9789b009ce82ae47276664f5c832557e *arm-wince.pe/upx-3.91.exe
|
||||||
|
bb9e92b577ace19da295032c294063d724655cf5b97d014053c3fb05ce478884 *arm64-linux.elf/upx-3.95
|
||||||
|
a3c639403fd7b2f035315773c1aa3f68cc0532cf5cd075defd34fa44c4bbbb7a *armeb-linux.elf/upx-3.91
|
||||||
|
3f9604a69a945d86b93f2182ee82f754881331c7ef566d0cd4dc36d7acfa1aa0 *armeb-linux.elf/upx-3.95
|
||||||
|
e6518528d60861e37cb8429376628a7f3d1d5fc90f0933facd70b4e9e0b50709 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
53280a22c34ee1733007ccf858e1f5416c0f7043a4361799087e19a4b2a7eaf4 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
a51ce8993b3577fc2ee45b52174aaadc66c2f90ff53a0148ed096a65d99d24a2 *i386-linux.elf/upx-3.91
|
||||||
|
d018260f04d1efc2b46c8b7ff5b132358e58cb062c158b08a7179fbb561b0e48 *i386-linux.elf/upx-3.95
|
||||||
|
121e4acc3fbad4954cb2d2b957d229b042beaf4b68749c4f85ebfc60fcc80d43 *i386-win32.pe/upx-3.91.exe
|
||||||
|
d604523130da29af35705d9008098ae8b4bb9e7d4743357674470252dd68b8d3 *i386-win32.pe/upx-3.95.exe
|
||||||
|
4d26f0be2b6b6c4802515a7f0dfd97998c6d23e696ae6c0393c9ac0893885a9b *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
4d3b0c7b4dabb5a7a193a0a2899f086f5dfc555106188131389678ecc137378a *mips-linux.elf/upx-3.95
|
||||||
|
be2e9fb66c087f37b58f203b406b618526296dd8c9c53e73bb622740f1e377ba *mipsel-linux.elf/upx-3.91
|
||||||
|
9da821fac44f787875727cf001ca33ed87e02c5fe477f0ebb965c5e0eb62c26c *mipsel-linux.elf/upx-3.95
|
||||||
|
98d7c0214663ae47f59244a90aabbb72a798a4ad0c74ce79d448013f5cad6893 *powerpc-linux.elf/upx-3.91
|
||||||
|
c58266817c4e38982c66e4b75e0002c6e7a51710864f930987b8670ee121ee0b *powerpc-linux.elf/upx-3.95
|
||||||
|
7fecab59271c9d4596bd79978e112a5fea72e33bd7c53c1985d187009d807724 *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t150_compress_ucl_2_all_filters="\
|
||||||
|
977380191b474f5a7fa78e8015a279bfaa77626bc56d83185fec8761531b3029 *amd64-linux.elf/upx-3.91
|
||||||
|
4f94c9bee7a2f7deed245dc767c215654a41373be978123c3f1ef9074454c59d *amd64-linux.elf/upx-3.95
|
||||||
|
00aa338efc865f720a901afb1c19064cf137abb71d361be9b19192b0ff8a9479 *amd64-win64.pe/upx-3.95.exe
|
||||||
|
c1908a58fcc23a9a964f2cd5f76f805a7cc9ca39480d129c6bdb8db30033840b *arm-linux.elf/upx-3.95
|
||||||
|
78ffa99aa69e2f66f864dce88e787e3b1c0c056009e0f863986d65aabd186107 *arm-wince.pe/upx-3.91.exe
|
||||||
|
245c6bb22ae2b39671503244329f1e4498277b06d600447ad81c7d41ebc872d6 *arm64-linux.elf/upx-3.95
|
||||||
|
9e359728cdb9bf6ea21a864b2c9da56809eda27d6b88828b85ab815311bf77b6 *armeb-linux.elf/upx-3.91
|
||||||
|
86edb5959b5cabad270d7c77e750bc710424b92cfb2ebaeedf3ba403382f4e93 *armeb-linux.elf/upx-3.95
|
||||||
|
b65db2766ffdd45657a07edd57426c55acce2a73a1e3559ab43903ae77574131 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
e827d64700b14e8c19de2882e66d0df0fca4cda0255ae41a66810e4c86583a93 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
c95a7ad9a5015abb1b8a163afe46b4f1529c70ca4ef9353cfb6e5c7eef60245c *i386-linux.elf/upx-3.91
|
||||||
|
21ef65f5c756f216c0f9db9475a7514e10b8e003c30bc22416ec8156cba65252 *i386-linux.elf/upx-3.95
|
||||||
|
6db34f6cdc626c4857fc7b188910562909e571eed3be2116448e244ca82eaa64 *i386-win32.pe/upx-3.91.exe
|
||||||
|
68a08dd3995681af594c66df4b94559e5900f0a09fcf822e3fc2522c3133ad69 *i386-win32.pe/upx-3.95.exe
|
||||||
|
1546ce426b3cfe38bdea18fafadee409253d5d2b452aae5476e073b29e17bb58 *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
6ecc64d1fb9fb2a675980ce939b0b8142e802e7218b8ea45f2bb82205ed9242e *mips-linux.elf/upx-3.95
|
||||||
|
eb3c90f8f775e70cb2cc187b7e55d66a3bb28fa760e14a17353acd1130fd122a *mipsel-linux.elf/upx-3.91
|
||||||
|
b47964dbe65e9975d6bddfbfdd321a5e6c96b6eba79b30d0f94ec4323b796991 *mipsel-linux.elf/upx-3.95
|
||||||
|
c32a2deaa707eafaed36a4ab8fb26bb8d8c63a9743b19ad207e305553d14c7fe *powerpc-linux.elf/upx-3.91
|
||||||
|
c4dbfbd0f5021d50f1addc68273f20b49204bf26ae8c8896a0aacc7d2c5a2d47 *powerpc-linux.elf/upx-3.95
|
||||||
|
bb96ea8a29500893b729dad4afe90b09186641c32c42a70a3d2380a771f896d9 *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
|
||||||
|
de00c3bcb56d78c3fd1d1e633b3f64b884b3611abc305b9e79f4f14385178418 *amd64-linux.elf/upx-3.91
|
||||||
|
eb5aea4d780711dd59e3f86d34a49f16d3669acc6569292bf9ea445d406c5c80 *amd64-linux.elf/upx-3.95
|
||||||
|
2fae12ccc55eeac6c05ff2c6b27539c66816080647283ac2e1b22576242b6bb5 *amd64-win64.pe/upx-3.95.exe
|
||||||
|
14120b8348172a08cd7651184941820ed1c69b7a8d859e375390eee529f5c94e *arm-linux.elf/upx-3.95
|
||||||
|
a6690508c1acdaa07ce97feec0f330182c24206d8e9133949d2a42fccc1cbf27 *arm-wince.pe/upx-3.91.exe
|
||||||
|
4f30adcd3d047fad15344bf6cf3cf4f91cfbacbb121af889df8634fa4c888247 *arm64-linux.elf/upx-3.95
|
||||||
|
f85f0a70b024a050999d476420b9db88206e340b2ffff3781c491b538ae03e37 *armeb-linux.elf/upx-3.91
|
||||||
|
e1b2dc75427212dc268c6921aa2059adf5709b21f230432a4725b16e1c64b238 *armeb-linux.elf/upx-3.95
|
||||||
|
fcf64cfce9e9762e03740d2bf9e2e86d873ade1b6f4a68eb07625f516426810d *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
9188a6f911b79fb8629880836b2f5787eb4d938872ba4f1a64c93e70cde9f428 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
8369ff8112aeb55a1684ce0ec16e13e6bc524b734557b49b292f9aae60edccb6 *i386-linux.elf/upx-3.91
|
||||||
|
c4e16cc1a64db618d9038ea9ba6032b7fe5aac05c0d7731b91373094a6a0f6e4 *i386-linux.elf/upx-3.95
|
||||||
|
b21cf7756542b3bab5f4a59d4036cd3176e297dceb744dec96ac365be6568dcd *i386-win32.pe/upx-3.91.exe
|
||||||
|
b1bc0d360918d51ca7b7f32f5083845e4566c7fa7a425d0451f4b10f227d1eac *i386-win32.pe/upx-3.95.exe
|
||||||
|
c40af5d1ba0531abb92587cbcbe604d4f562b685d6e7bbb40ec4d879fddf1267 *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
0865d2f1d65e2693d801b3c28d64910a009707be65598772df655c640469a4e5 *mips-linux.elf/upx-3.95
|
||||||
|
4cf108686c2419c6d82eecb2473a6d0ca0a0b47096cc01ea2b55113f84762cc7 *mipsel-linux.elf/upx-3.91
|
||||||
|
0a90a99e0ebb1e9c86e0bdf6a3eec6ca116e65b235ba1ee9029694b84cadc438 *mipsel-linux.elf/upx-3.95
|
||||||
|
4d8f85d254b1fd87bebe2fd732afd6214c98b869cda17ff0c4c566358446038a *powerpc-linux.elf/upx-3.91
|
||||||
|
bbc6179756637db10b636d7383226cb1d685866e8e9191069107725365b42f38 *powerpc-linux.elf/upx-3.95
|
||||||
|
52d7db1d6d6611d4a064c036b57044fd93d4c5762452be07188ee2ff6b1e42bc *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
expected_sha256sums__t170_compress_all_methods_no_lzma_5_no_filter="\
|
||||||
|
ee887f19ee6a5d5f0a0ce7116a41570e106c10bc0bb25acf7eb3ee254c1ed560 *amd64-linux.elf/upx-3.91
|
||||||
|
9bd019e6442b219825f19082a20e4e73c49b24a4dee39e9e2cf0fc907ecdb46f *amd64-linux.elf/upx-3.95
|
||||||
|
382fe4b3e4f575322b746d7d45e4553ba3cf47cb4351b9900508fb52a00118ad *amd64-win64.pe/upx-3.95.exe
|
||||||
|
ae71103c2e105099ab345a648abf109b9aec3039137c90af30710dd4a4b51736 *arm-linux.elf/upx-3.95
|
||||||
|
9150f49be3fcb03a5f23b209e5db443c9b96fa4d8e20d3730195f9eafff5d8e8 *arm-wince.pe/upx-3.91.exe
|
||||||
|
100d9cee849b7996cbde2dc82df766e5104ae030055ae9b286c53b60e9e51405 *arm64-linux.elf/upx-3.95
|
||||||
|
43ded21db5b7b8355bc371e39cd3b1be05e91635e3cb6d64f9a8aea16127e157 *armeb-linux.elf/upx-3.91
|
||||||
|
b0ac3a36871630af80bb9b6ba94604b3ebc1fe05fdb6d095a7c461916fb3d231 *armeb-linux.elf/upx-3.95
|
||||||
|
36b6a947567386e325f1d3ff84a55ecbd37687e3264cfb0a57aa5e3be5ff85f9 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||||
|
ad02fcac751563d49cb0711d818231c1030bad9ef2b12fd54e60e2bc6510e9d6 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||||
|
d1b4e2c81a0baf4ad273dd96722783e9219e69049a78d536757f39761a7cfe8b *i386-linux.elf/upx-3.91
|
||||||
|
6e509d556ccd2af102d43924bd4eb1e9bed9d557e44387769032df4ede525f0d *i386-linux.elf/upx-3.95
|
||||||
|
2138186fb26cc7983ec4a4ead290573f2e8226fea4a0b9b6d668d86fb21d1573 *i386-win32.pe/upx-3.91.exe
|
||||||
|
5f286eaf28bab252a0f4f069b7b88910b9ce62327c4d15837b91ce65e4f9030e *i386-win32.pe/upx-3.95.exe
|
||||||
|
0ab25c2cd8cf53a31323464080991344479998f45fd9b215caba003f96e9e11c *m68k-atari.tos/upx-3.91.ttp
|
||||||
|
ba14b6b4e846d29bd4211fbcdb2a641f55f8a5700806af64c52182736b757f46 *mips-linux.elf/upx-3.95
|
||||||
|
40c23e16bfe68ec0a59f9651ac747db1e81f07deabc4c22a732e40e03e2b1100 *mipsel-linux.elf/upx-3.91
|
||||||
|
7d353d8381c3401c3c9765fa6091c634791ae9b7338ca5b769f63c38f8f418e7 *mipsel-linux.elf/upx-3.95
|
||||||
|
b43bd16efb19081fe0945948231486cdd1b1157d193ab7cbbd470594f46c57ca *powerpc-linux.elf/upx-3.91
|
||||||
|
7a8a24fa57d17f99b11133a0822a5e499681d09695525b80f8c61d90d06c4ac8 *powerpc-linux.elf/upx-3.95
|
||||||
|
0339ffc1d99f5b5ad12e8492b6a9dc707f705a120494a6bc453fb8617808d10a *powerpc64le-linux.elf/upx-3.95
|
||||||
|
"
|
||||||
|
########## end .sha256sums.recreate
|
||||||
Executable
+335
@@ -0,0 +1,335 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
## vim:set ts=4 sw=4 et:
|
||||||
|
set -e; set -o pipefail
|
||||||
|
argv0=$0; argv0abs=$(readlink -fn "$argv0"); argv0dir=$(dirname "$argv0abs")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
# very first version of the upx-testsuite; requires:
|
||||||
|
# $upx_exe (required, but with convenience fallback "./upx")
|
||||||
|
# $upx_testsuite_SRCDIR (required, but with convenience fallback)
|
||||||
|
# $upx_testsuite_BUILDDIR (optional)
|
||||||
|
#
|
||||||
|
# optional settings:
|
||||||
|
# $upx_exe_runner (e.g. "qemu-x86_64 -cpu Nehalem" or "valgrind")
|
||||||
|
# $UPX_TESTSUITE_VERBOSE
|
||||||
|
# $UPX_TESTSUITE_LEVEL
|
||||||
|
#
|
||||||
|
# see https://github.com/upx/upx-testsuite.git
|
||||||
|
#
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# init & checks
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# upx_exe
|
||||||
|
[[ -z $upx_exe && -f ./upx && -x ./upx ]] && upx_exe=./upx # convenience fallback
|
||||||
|
if [[ -z $upx_exe ]]; then echo "UPX-ERROR: please set \$upx_exe"; exit 1; fi
|
||||||
|
if [[ ! -f $upx_exe ]]; then echo "UPX-ERROR: file '$upx_exe' does not exist"; exit 1; fi
|
||||||
|
upx_exe=$(readlink -fn "$upx_exe") # make absolute
|
||||||
|
[[ -f $upx_exe ]] || exit 1
|
||||||
|
|
||||||
|
# set emu and run_upx
|
||||||
|
emu=()
|
||||||
|
if [[ -n $upx_exe_runner ]]; then
|
||||||
|
# usage examples:
|
||||||
|
# export upx_exe_runner="qemu-x86_64 -cpu Nehalem"
|
||||||
|
# export upx_exe_runner="valgrind --leak-check=no --error-exitcode=1 --quiet"
|
||||||
|
# export upx_exe_runner="wine"
|
||||||
|
IFS=' ' read -r -a emu <<< "$upx_exe_runner" # split at spaces into array
|
||||||
|
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
|
||||||
|
IFS=';' read -r -a emu <<< "$CMAKE_CROSSCOMPILING_EMULATOR" # split at semicolons into array
|
||||||
|
fi
|
||||||
|
run_upx=( "${emu[@]}" "$upx_exe" )
|
||||||
|
echo "run_upx='${run_upx[*]}'"
|
||||||
|
|
||||||
|
# run_upx sanity check
|
||||||
|
if ! "${run_upx[@]}" --version-short >/dev/null; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
||||||
|
if ! "${run_upx[@]}" -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
||||||
|
if ! "${run_upx[@]}" --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
||||||
|
|
||||||
|
# upx_testsuite_SRCDIR
|
||||||
|
if [[ -z $upx_testsuite_SRCDIR ]]; then
|
||||||
|
# convenience fallback: search standard locations below upx top-level directory
|
||||||
|
if [[ -d "$argv0dir/../../../upx--upx-testsuite.git/files/packed" ]]; then
|
||||||
|
upx_testsuite_SRCDIR="$argv0dir/../../../upx--upx-testsuite.git"
|
||||||
|
elif [[ -d "$argv0dir/../../../upx-testsuite.git/files/packed" ]]; then
|
||||||
|
upx_testsuite_SRCDIR="$argv0dir/../../../upx-testsuite.git"
|
||||||
|
elif [[ -d "$argv0dir/../../../upx-testsuite/files/packed" ]]; then
|
||||||
|
upx_testsuite_SRCDIR="$argv0dir/../../../upx-testsuite"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ ! -d "$upx_testsuite_SRCDIR/files/packed" ]]; then
|
||||||
|
echo "invalid or missing \$upx_testsuite_SRCDIR:"
|
||||||
|
echo " please git clone https://github.com/upx/upx-testsuite.git"
|
||||||
|
echo " and set (export) the envvar upx_testsuite_SRCDIR to the local file path"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
upx_testsuite_SRCDIR=$(readlink -fn "$upx_testsuite_SRCDIR") # make absolute
|
||||||
|
[[ -d $upx_testsuite_SRCDIR ]] || exit 1
|
||||||
|
|
||||||
|
# upx_testsuite_BUILDDIR
|
||||||
|
if [[ -z $upx_testsuite_BUILDDIR ]]; then
|
||||||
|
upx_testsuite_BUILDDIR="./tmp-upx-testsuite"
|
||||||
|
fi
|
||||||
|
mkdir -p "$upx_testsuite_BUILDDIR" || exit 1
|
||||||
|
upx_testsuite_BUILDDIR=$(readlink -fn "$upx_testsuite_BUILDDIR") # make absolute
|
||||||
|
[[ -d $upx_testsuite_BUILDDIR ]] || exit 1
|
||||||
|
cd / && cd "$upx_testsuite_BUILDDIR" || exit 1
|
||||||
|
: > ./.mfxnobackup
|
||||||
|
|
||||||
|
# run_upx sanity check after "cd"
|
||||||
|
if ! "${run_upx[@]}" --version-short >/dev/null; then
|
||||||
|
echo "UPX-ERROR: FATAL: upx --version-short FAILED"
|
||||||
|
echo "please make sure that \$upx_exe contains ABSOLUTE file paths and can be run from any directory"
|
||||||
|
echo "INFO: run_upx='${run_upx[*]}'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# setup
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
#set -x # debug
|
||||||
|
|
||||||
|
exit_code=0
|
||||||
|
num_errors=0
|
||||||
|
all_errors=
|
||||||
|
|
||||||
|
export UPX="--prefer-ucl --no-color --no-progress"
|
||||||
|
export UPX_DEBUG_DISABLE_GITREV_WARNING=1
|
||||||
|
export UPX_DEBUG_DOCTEST_DISABLE=1 # already checked above
|
||||||
|
|
||||||
|
case $UPX_TESTSUITE_LEVEL in
|
||||||
|
[0-8]) ;;
|
||||||
|
*) UPX_TESTSUITE_LEVEL=999 ;;
|
||||||
|
esac
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL == 0 ]]; then
|
||||||
|
echo "UPX testsuite SKIPPED."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf ./testsuite_1
|
||||||
|
mkdir testsuite_1 || exit 1
|
||||||
|
cd testsuite_1 || exit 1
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# support functions
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
run_upx() {
|
||||||
|
local ec=0
|
||||||
|
if [[ $UPX_TESTSUITE_VERBOSE == 1 ]]; then
|
||||||
|
echo "LOG: '${run_upx[*]}' $*"
|
||||||
|
fi
|
||||||
|
"${run_upx[@]}" "$@" || ec=$?
|
||||||
|
if [[ $ec != 0 ]]; then
|
||||||
|
echo "FATAL: '${run_upx[*]}' $*"
|
||||||
|
echo " (exit code was $ec)"
|
||||||
|
exit 42
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
testsuite_header() {
|
||||||
|
local x='==========='; x="$x$x$x$x$x$x$x"
|
||||||
|
echo -e "\n${x}\n${1}\n${x}\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
testsuite_split_f() {
|
||||||
|
fd=$(dirname "$1")
|
||||||
|
fb=$(basename "$1")
|
||||||
|
fsubdir=$(basename "$fd")
|
||||||
|
# sanity checks
|
||||||
|
if [[ ! -f $1 || -z $fsubdir || -z $fb ]]; then
|
||||||
|
fd=''; fb=''; fsubdir=''
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
testsuite_check_sha() {
|
||||||
|
(cd "$1" && sha256sum -b [0-9a-zA-Z]*/* | LC_ALL=C sort -k2) > $1/.sha256sums.current
|
||||||
|
echo
|
||||||
|
cat $1/.sha256sums.current
|
||||||
|
if ! cmp -s $1/.sha256sums.expected $1/.sha256sums.current; then
|
||||||
|
echo "UPX-ERROR: $1 FAILED: checksum mismatch"
|
||||||
|
diff -u $1/.sha256sums.expected $1/.sha256sums.current || true
|
||||||
|
exit_code=99
|
||||||
|
let num_errors+=1 || true
|
||||||
|
all_errors="${all_errors} $1"
|
||||||
|
#exit 99
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
testsuite_check_sha_decompressed() {
|
||||||
|
(cd "$1" && sha256sum -b [0-9a-zA-Z]*/* | LC_ALL=C sort -k2) > $1/.sha256sums.current
|
||||||
|
if ! cmp -s $1/.sha256sums.expected $1/.sha256sums.current; then
|
||||||
|
cat $1/.sha256sums.current
|
||||||
|
echo "UPX-ERROR: FATAL: $1 FAILED: decompressed checksum mismatch"
|
||||||
|
diff -u $1/.sha256sums.expected $1/.sha256sums.current || true
|
||||||
|
exit 98
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
testsuite_use_canonicalized=1
|
||||||
|
testsuite_run_compress() {
|
||||||
|
testsuite_header $testdir
|
||||||
|
local files f
|
||||||
|
if [[ $testsuite_use_canonicalized == 1 ]]; then
|
||||||
|
files='t020_canonicalized/*/*'
|
||||||
|
else
|
||||||
|
files='t010_decompressed/*/*'
|
||||||
|
fi
|
||||||
|
for f in $files; do
|
||||||
|
testsuite_split_f "$f"
|
||||||
|
[[ -z $fb ]] && continue
|
||||||
|
echo "# $f"
|
||||||
|
mkdir -p "$testdir/$fsubdir" "$testdir/.decompressed/$fsubdir"
|
||||||
|
run_upx -qq --prefer-ucl "$@" "$f" -o "$testdir/$fsubdir/$fb"
|
||||||
|
run_upx -qq -d "$testdir/$fsubdir/$fb" -o "$testdir/.decompressed/$fsubdir/$fb"
|
||||||
|
done
|
||||||
|
testsuite_check_sha $testdir
|
||||||
|
run_upx -qq -l "$testdir"/*/*
|
||||||
|
run_upx -qq --file-info "$testdir"/*/*
|
||||||
|
run_upx -q -t "$testdir"/*/*
|
||||||
|
if [[ $testsuite_use_canonicalized == 1 ]]; then
|
||||||
|
# check that after decompression the file matches the canonicalized version
|
||||||
|
cp t020_canonicalized/.sha256sums.expected $testdir/.decompressed/
|
||||||
|
testsuite_check_sha_decompressed $testdir/.decompressed
|
||||||
|
rm -rf "./$testdir/.decompressed"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# expected checksums
|
||||||
|
#
|
||||||
|
# To ease maintenance of this script in case of updates this section
|
||||||
|
# can be automatically re-created from the current checksums -
|
||||||
|
# see call of function recreate_expected_sha256sums below.
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
recreate_expected_sha256sums() {
|
||||||
|
local o="$1"
|
||||||
|
local files f d
|
||||||
|
echo "########## begin .sha256sums.recreate" > "$o"
|
||||||
|
files='*/.sha256sums.current'
|
||||||
|
for f in $files; do
|
||||||
|
d=$(dirname "$f")
|
||||||
|
echo "expected_sha256sums__${d}="'"\' >> "$o"
|
||||||
|
cat "$f" >> "$o"
|
||||||
|
echo '"' >> "$o"
|
||||||
|
done
|
||||||
|
echo "########## end .sha256sums.recreate" >> "$o"
|
||||||
|
}
|
||||||
|
|
||||||
|
source "$argv0dir/upx_testsuite_1-expected_sha256sums.sh" || exit 1
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# decompression tests
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
testdir=t010_decompressed
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
|
||||||
|
testsuite_header $testdir
|
||||||
|
for f in "$upx_testsuite_SRCDIR"/files/packed/*/upx-3.9[15]*; do
|
||||||
|
testsuite_split_f "$f"
|
||||||
|
[[ -z $fb ]] && continue
|
||||||
|
echo "# $f"
|
||||||
|
mkdir -p "$testdir/$fsubdir"
|
||||||
|
run_upx -qq -d "$f" -o "$testdir/$fsubdir/$fb"
|
||||||
|
done
|
||||||
|
testsuite_check_sha $testdir
|
||||||
|
|
||||||
|
# run one pack+unpack step to canonicalize the files
|
||||||
|
testdir=t020_canonicalized
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
|
||||||
|
testsuite_header $testdir
|
||||||
|
for f in t010_decompressed/*/*; do
|
||||||
|
testsuite_split_f "$f"
|
||||||
|
[[ -z $fb ]] && continue
|
||||||
|
echo "# $f"
|
||||||
|
mkdir -p "$testdir/$fsubdir/.packed"
|
||||||
|
run_upx -qq --prefer-ucl -1 "$f" -o "$testdir/$fsubdir/.packed/$fb"
|
||||||
|
run_upx -qq -d "$testdir/$fsubdir/.packed/$fb" -o "$testdir/$fsubdir/$fb"
|
||||||
|
done
|
||||||
|
testsuite_check_sha $testdir
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# compression tests
|
||||||
|
# info: we use fast compression levels because we want to
|
||||||
|
# test UPX and not the compression libraries
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL -ge 2 ]]; then
|
||||||
|
testdir=t110_compress_ucl_nrv2b_3_no_filter
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
time testsuite_run_compress --nrv2b -3 --no-filter
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL -ge 3 ]]; then
|
||||||
|
testdir=t120_compress_ucl_nrv2d_3_no_filter
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
time testsuite_run_compress --nrv2d -3 --no-filter
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL -ge 4 ]]; then
|
||||||
|
testdir=t130_compress_ucl_nrv2e_3_no_filter
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
time testsuite_run_compress --nrv2e -3 --no-filter
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL -ge 5 ]]; then
|
||||||
|
testdir=t140_compress_lzma_2_no_filter
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
time testsuite_run_compress --lzma -2 --no-filter
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL -ge 6 ]]; then
|
||||||
|
testdir=t150_compress_ucl_2_all_filters
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
time testsuite_run_compress -2 --all-filters
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL -ge 7 ]]; then
|
||||||
|
testdir=t160_compress_all_methods_1_no_filter
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
time testsuite_run_compress --all-methods -1 --no-filter
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $UPX_TESTSUITE_LEVEL -ge 8 ]]; then
|
||||||
|
testdir=t170_compress_all_methods_no_lzma_5_no_filter
|
||||||
|
mkdir $testdir; v=expected_sha256sums__$testdir; echo -n "${!v}" >$testdir/.sha256sums.expected
|
||||||
|
time testsuite_run_compress --all-methods --no-lzma -5 --no-filter
|
||||||
|
fi
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# summary
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
|
# recreate checksums from current version for an easy update in case of changes
|
||||||
|
recreate_expected_sha256sums .sha256sums.recreate
|
||||||
|
|
||||||
|
testsuite_header "UPX testsuite summary: level $UPX_TESTSUITE_LEVEL"
|
||||||
|
run_upx --version-short
|
||||||
|
echo
|
||||||
|
echo "upx_exe='$upx_exe'"
|
||||||
|
ls -l "$upx_exe"
|
||||||
|
if command -v file >/dev/null; then
|
||||||
|
file "$upx_exe" || true
|
||||||
|
fi
|
||||||
|
echo "run_upx='${run_upx[*]}'"
|
||||||
|
echo "upx_testsuite_SRCDIR='$upx_testsuite_SRCDIR'"
|
||||||
|
echo "upx_testsuite_BUILDDIR='$upx_testsuite_BUILDDIR'"
|
||||||
|
echo ".sha256sums.{expected,current} counts:"
|
||||||
|
cat ./*/.sha256sums.expected | LC_ALL=C sort | wc
|
||||||
|
cat ./*/.sha256sums.current | LC_ALL=C sort | wc
|
||||||
|
echo
|
||||||
|
if [[ $exit_code == 0 ]]; then
|
||||||
|
echo "UPX testsuite passed. All done."
|
||||||
|
else
|
||||||
|
echo "UPX-ERROR: UPX testsuite FAILED:${all_errors}"
|
||||||
|
echo "UPX-ERROR: UPX testsuite FAILED with $num_errors error(s). See log file."
|
||||||
|
fi
|
||||||
|
exit $exit_code
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#
|
||||||
|
# valgrind suppressions for musl libc
|
||||||
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
|
#
|
||||||
|
|
||||||
|
# musl malloc
|
||||||
|
{
|
||||||
|
musl-malloc-enframe
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:enframe
|
||||||
|
}
|
||||||
|
|
||||||
|
# these are only needed for older musl versions
|
||||||
|
|
||||||
|
{
|
||||||
|
musl-malloc-mal0_clear
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:mal0_clear
|
||||||
|
fun:calloc
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
musl-string-memchr
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:memchr
|
||||||
|
}
|
||||||
|
{
|
||||||
|
musl-string-stpcpy
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:stpcpy
|
||||||
|
}
|
||||||
|
{
|
||||||
|
musl-string-strchrnul
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:strchrnul
|
||||||
|
}
|
||||||
|
{
|
||||||
|
musl-string-strlen
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:strlen
|
||||||
|
}
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
The GNU bfd binary file descriptor package, part of the GNU binutils package,
|
|
||||||
contains code to recognize an Elf file by looking at fields in the file header.
|
|
||||||
Many programs (such as gdb, size, objdump, objcopy, strip and others) use bfd.
|
|
||||||
Unfortunately, bfd has been overly strict. In releases
|
|
||||||
binutils-2.9.1.0.4, binutils-2.9.1.0.23, binutils-2.9.5.0.0,
|
|
||||||
binutils-2.10.1,
|
|
||||||
gdb-4.17, gdb-5.0,
|
|
||||||
and probably others,
|
|
||||||
bfd does not recognize a file with zero in Elf32_Ehdr.e_shoff, .e_shentsize,
|
|
||||||
or .e_shnum, even though the operating system kernel does not care, and many
|
|
||||||
bfd clients would work just fine in these cases.
|
|
||||||
|
|
||||||
Because of its desire to create small size compressed executables, UPX
|
|
||||||
generates and uses Elf files with zero in .e_shoff, .e_shentsizes, and .e_shnum.
|
|
||||||
As a result, many widely-distributed instances of gdb, size, objdump, etc.,
|
|
||||||
refuse to work on UPX-packed executables.
|
|
||||||
|
|
||||||
Here is a patch to bfd/elfcode.h which enables many bfd clients to work
|
|
||||||
with UPX-packed executables. The last two lines of the patch are
|
|
||||||
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
|
|
||||||
--- elfcode.h.orig Mon Jun 16 11:45:32 1997
|
|
||||||
+++ elfcode.h Sat Apr 22 10:18:56 2000
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/* ELF executable support for BFD.
|
|
||||||
- Copyright 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
|
|
||||||
+ Copyright 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
Written by Fred Fish @ Cygnus Support, from information published
|
|
||||||
in "UNIX System V Release 4, Programmers Guide: ANSI C and
|
|
||||||
@@ -517,14 +517,14 @@
|
|
||||||
elf_debug_file (i_ehdrp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- /* If there is no section header table, we're hosed. */
|
|
||||||
- if (i_ehdrp->e_shoff == 0)
|
|
||||||
+ /* If there is no section header table, and relocatable, then we're hosed. */
|
|
||||||
+ if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
|
|
||||||
goto got_wrong_format_error;
|
|
||||||
|
|
||||||
/* As a simple sanity check, verify that the what BFD thinks is the
|
|
||||||
size of each section header table entry actually matches the size
|
|
||||||
- recorded in the file. */
|
|
||||||
- if (i_ehdrp->e_shentsize != sizeof (x_shdr))
|
|
||||||
+ recorded in the file, but only if there are any sections. */
|
|
||||||
+ if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
|
|
||||||
goto got_wrong_format_error;
|
|
||||||
|
|
||||||
ebd = get_elf_backend_data (abfd);
|
|
||||||
@@ -579,6 +579,7 @@
|
|
||||||
/* Allocate space for a copy of the section header table in
|
|
||||||
internal form, seek to the section header table in the file,
|
|
||||||
read it in, and convert it to internal form. */
|
|
||||||
+ if (i_ehdrp->e_shnum!=0) {
|
|
||||||
i_shdrp = ((Elf_Internal_Shdr *)
|
|
||||||
bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum));
|
|
||||||
elf_elfsections (abfd) = ((Elf_Internal_Shdr **)
|
|
||||||
@@ -609,6 +610,7 @@
|
|
||||||
if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx))
|
|
||||||
goto got_no_match;
|
|
||||||
}
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* Read in the program headers. */
|
|
||||||
if (i_ehdrp->e_phnum == 0)
|
|
||||||
@@ -644,6 +646,7 @@
|
|
||||||
bfd_section_from_shdr with it (since this particular strtab is
|
|
||||||
used to find all of the ELF section names.) */
|
|
||||||
|
|
||||||
+ if (i_ehdrp->e_shstrndx != 0) {
|
|
||||||
shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
|
|
||||||
if (!shstrtab)
|
|
||||||
goto got_no_match;
|
|
||||||
@@ -657,6 +660,7 @@
|
|
||||||
if (! bfd_section_from_shdr (abfd, shindex))
|
|
||||||
goto got_no_match;
|
|
||||||
}
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* Let the backend double check the format and override global
|
|
||||||
information. */
|
|
||||||
@@ -930,7 +934,7 @@
|
|
||||||
{
|
|
||||||
Elf_Internal_Shdr *hdr;
|
|
||||||
Elf_Internal_Shdr *verhdr;
|
|
||||||
- long symcount; /* Number of external ELF symbols */
|
|
||||||
+ unsigned long symcount; /* Number of external ELF symbols */
|
|
||||||
elf_symbol_type *sym; /* Pointer to current bfd symbol */
|
|
||||||
elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
|
|
||||||
Elf_Internal_Sym i_sym;
|
|
||||||
@@ -978,7 +982,7 @@
|
|
||||||
sym = symbase = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- long i;
|
|
||||||
+ unsigned long i;
|
|
||||||
|
|
||||||
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
|
|
||||||
return -1;
|
|
||||||
-3164
File diff suppressed because it is too large
Load Diff
@@ -1,24 +0,0 @@
|
|||||||
GNUmakefile
|
|
||||||
*.0??
|
|
||||||
*.d
|
|
||||||
*.dat
|
|
||||||
*.idb
|
|
||||||
*.img
|
|
||||||
*.map
|
|
||||||
*.raw
|
|
||||||
*.rc
|
|
||||||
*.rel
|
|
||||||
*.res
|
|
||||||
*.pdb
|
|
||||||
*.upx
|
|
||||||
.gdbinit
|
|
||||||
.Attic
|
|
||||||
.deps
|
|
||||||
B
|
|
||||||
compress_nrv.*
|
|
||||||
upx
|
|
||||||
upx_nrv
|
|
||||||
upx_nrv.*
|
|
||||||
upx_ucl
|
|
||||||
upx_ucl.*
|
|
||||||
version1*.h
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
ifeq ($(DEPS_DONE),)
|
|
||||||
DEPS_DONE := 1
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // automated dependencies
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
ifeq ($(DEPMODE),gcc)
|
|
||||||
EXTRA_CFLAGS += -Wp,-MMD,.deps/$(*F).d
|
|
||||||
EXTRA_CXXFLAGS += -Wp,-MMD,.deps/$(*F).d
|
|
||||||
HAVE_DEPS := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(DEPMODE),linux-intelc)
|
|
||||||
EXTRA_CFLAGS += -MMD -MF.deps/$(*F).d
|
|
||||||
EXTRA_CXXFLAGS += -MMD -MF.deps/$(*F).d
|
|
||||||
HAVE_DEPS := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(DEPMODE),linux-pgi)
|
|
||||||
## NOTE: -MMD does not work...
|
|
||||||
EXTRA_CFLAGS += -MD.deps/$(*F).d
|
|
||||||
EXTRA_CXXFLAGS += -MD.deps/$(*F).d
|
|
||||||
HAVE_DEPS := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(HAVE_DEPS),1)
|
|
||||||
ifeq ($(strip $(wildcard .deps)),)
|
|
||||||
DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
|
|
||||||
else
|
|
||||||
DEPS_FILES := $(wildcard .deps/*.d)
|
|
||||||
ifneq ($(strip $(DEPS_FILES)),)
|
|
||||||
include $(DEPS_FILES)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
endif # DEPS_DONE
|
|
||||||
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
DEPMODE := gcc
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // defaults for gcc
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
CC = gcc
|
|
||||||
CXX = g++
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS_W =
|
|
||||||
CFLAGS_M =
|
|
||||||
CFLAGS_O =
|
|
||||||
CXXFLAGS_W =
|
|
||||||
CXXFLAGS_M =
|
|
||||||
CXXFLAGS_O =
|
|
||||||
|
|
||||||
CFLAGS = $(CFLAGS_W) $(EXTRA_CFLAGS_W) $(CFLAGS_M) $(CFLAGS_O) $(EXTRA_CFLAGS_O)
|
|
||||||
CXXFLAGS = $(CXXFLAGS_W) $(EXTRA_CXXFLAGS_W) $(CXXFLAGS_M) $(CXXFLAGS_O) $(EXTRA_CXXFLAGS_O)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# cflags
|
|
||||||
#
|
|
||||||
|
|
||||||
##CFLAGS_WERROR = -Werror
|
|
||||||
CFLAGS_WERROR =
|
|
||||||
CFLAGS_W = $(CFLAGS_WERROR) -Wall -W -Wbad-function-cast -Wcast-align -Wcast-qual -Winline -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wshadow -Wwrite-strings
|
|
||||||
CXXFLAGS_W = $(CFLAGS_WERROR) -Wall -W -Wcast-align -Wcast-qual -Winline -Woverloaded-virtual -Wpointer-arith -Wshadow -Wsign-promo -Wsynth -Wwrite-strings
|
|
||||||
|
|
||||||
##CFLAGS_M += -fno-builtin
|
|
||||||
##CFLAGS_M += -malign-functions=0 -malign-jumps=0 -malign-loops=0
|
|
||||||
CXXFLAGS_M = $(CFLAGS_M)
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS_O = -g -O0
|
|
||||||
else
|
|
||||||
##CFLAGS_O = -Os -fstrict-aliasing
|
|
||||||
CFLAGS_O = -O2 -fstrict-aliasing
|
|
||||||
##CFLAGS_O = -O2 -fno-strict-aliasing
|
|
||||||
endif
|
|
||||||
CXXFLAGS_O = $(CFLAGS_O) -fconserve-space
|
|
||||||
##CXXFLAGS += -fasynchronous-exceptions
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# cxxflags for g++ 3.2 or better
|
|
||||||
|
|
||||||
##CXXFLAGS_W += -Wdisabled-optimization -Wpacked
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# ldflags
|
|
||||||
#
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
LDFLAGS += -g
|
|
||||||
else
|
|
||||||
LDFLAGS += -s
|
|
||||||
endif
|
|
||||||
LDFLAGS += -Wl,-Map,$T.map
|
|
||||||
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# vi:nowrap
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
UDIR := $($(U)DIR)
|
|
||||||
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/include)),) # { include
|
|
||||||
DEFS += -DWITH_$(U)
|
|
||||||
INCLUDES += -I$(UDIR)/include
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/debug/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/debug/src/.libs
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/$(release)/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/$(release)/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/$(target)/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/$(target)/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/release/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/release/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR)/build/src/.libs)),)
|
|
||||||
LIBDIRS += $(UDIR)/build/src/.libs
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(UDIR))),)
|
|
||||||
LIBDIRS += $(UDIR)
|
|
||||||
DOS_LIBDIRS := $(DOS_LIBDIRS);$(UDIR)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
LDLIBS += -l$(u)
|
|
||||||
DOS_LDLIBS += $(u).lib
|
|
||||||
|
|
||||||
|
|
||||||
DEFS := $(DEFS)
|
|
||||||
INCLUDES := $(INCLUDES)
|
|
||||||
LIBDIRS := $(LIBDIRS)
|
|
||||||
LDLIBS := $(LDLIBS)
|
|
||||||
DOS_LDLIBS := $(DOS_LDLIBS)
|
|
||||||
|
|
||||||
endif # } include
|
|
||||||
+86
-64
@@ -1,86 +1,108 @@
|
|||||||
#
|
#
|
||||||
# UPX Makefile (GNU make) - works with unix/win32/djgpp2
|
# UPX src Makefile - needs GNU make and CMake >= 3.13
|
||||||
#
|
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||||
# usage:
|
|
||||||
# `make target=linux' # linux
|
|
||||||
# `make target=dos32-djggp2' # dos32 - djggp2
|
|
||||||
# `make target=win32-cygwin' # win32 - cygwin
|
|
||||||
# `make target=win32-mingw32' # win32 - mingw32
|
|
||||||
# `make target=win32-rsxnt' # win32 - rsxnt
|
|
||||||
# `make target=win32-bc' # win32 - Borland C++
|
|
||||||
# `make target=win32-dm' # win32 - Digital Mars C++
|
|
||||||
# `make target=win32-ic' # win32 - Intel C++
|
|
||||||
# `make target=win32-vc' # win32 - Visual C++
|
|
||||||
# `make target=win32-wc' # win32 - Watcom C++
|
|
||||||
# `make target=cross-amd64-linux' # x86_64-linux cross compiler
|
|
||||||
# `make target=cross-mingw32' # i586-mingw32msvc cross compiler
|
|
||||||
# `make target=cross-mint' # m68k-atari-mint cross compiler
|
|
||||||
# `make target=gcc' # generic gcc
|
|
||||||
#
|
|
||||||
# you can also set the `UPX_MAKE_TARGET' environment variable.
|
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# NOTE: this Makefile is intended for developers - please use
|
||||||
|
# the top-level Makefile instead
|
||||||
|
|
||||||
# configuration section
|
ifndef srcdir
|
||||||
|
srcdir := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||||
ifeq ($(strip $(UCLDIR)),)
|
endif
|
||||||
# change this to reflect where the UCL library is
|
ifndef top_srcdir
|
||||||
UCLDIR = $(HOME)/local/src/ucl-1.02
|
top_srcdir := $(srcdir)/..
|
||||||
endif
|
endif
|
||||||
|
|
||||||
## you can set the default target here
|
#***********************************************************************
|
||||||
##target =
|
# redirect to top-level Makefile
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
DEBUG = 0
|
# NOTE that the top-level Makefile .DEFAULT_GOAL is build/release
|
||||||
|
.DEFAULT_GOAL = build/all
|
||||||
|
|
||||||
srcdir = .
|
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
|
||||||
top_srcdir = ..
|
.PHONY: PHONY
|
||||||
|
.SECONDEXPANSION:
|
||||||
|
.SUFFIXES:
|
||||||
|
|
||||||
|
build/debug build/release build/all: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
|
build/debug+test build/release+test build/all+test: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
|
# shortcuts
|
||||||
|
debug release all: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
|
debug+test release+test all+test: PHONY; $(MAKE) -C $(top_srcdir) $@
|
||||||
|
|
||||||
##### You should not have to change anything below this line. #####
|
test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY
|
||||||
|
|
||||||
|
#***********************************************************************
|
||||||
|
# make run-testsuite
|
||||||
|
# git clone https://github.com/upx/upx-testsuite.git
|
||||||
|
#***********************************************************************
|
||||||
|
|
||||||
# /***********************************************************************
|
# search for the UPX testsuite; you can override by setting "upx_testsuite_SRCDIR"
|
||||||
# // object files
|
ifndef upx_testsuite_SRCDIR
|
||||||
# ************************************************************************/
|
# search standard locations below $(top_srcdir)
|
||||||
|
ifneq ($(wildcard $(top_srcdir)/../upx--upx-testsuite.git/files/packed/.),)
|
||||||
|
upx_testsuite_SRCDIR := $(top_srcdir)/../upx--upx-testsuite.git
|
||||||
|
else ifneq ($(wildcard $(top_srcdir)/../upx-testsuite.git/files/packed/.),)
|
||||||
|
upx_testsuite_SRCDIR := $(top_srcdir)/../upx-testsuite.git
|
||||||
|
else ifneq ($(wildcard $(top_srcdir)/../upx-testsuite/files/packed/.),)
|
||||||
|
upx_testsuite_SRCDIR := $(top_srcdir)/../upx-testsuite
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# these use exceptions & RTTI
|
# run the UPX testsuite
|
||||||
OBJECTS1 = \
|
# The expected (old) checksums are in $(top_srcdir)/misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
|
||||||
compress$o except$o file$o lefile$o \
|
# The actual (new) checksums are in ./tmp-upx-testsuite-*/testsuite_1/.sha256sums.recreate
|
||||||
filter$o linker$o mem$o msg$o stdcxx$o work$o ui$o \
|
ifneq ($(wildcard $(upx_testsuite_SRCDIR)/files/packed/.),)
|
||||||
packer$o packerf$o packhead$o packmast$o \
|
ifneq ($(wildcard $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh),)
|
||||||
p_com$o p_djgpp2$o p_elks$o p_exe$o \
|
run-testsuite: run-testsuite-release PHONY
|
||||||
p_lx_elf$o p_lx_exc$o p_lx_sep$o p_lx_sh$o \
|
run-testsuite-all: run-testsuite-debug run-testsuite-release PHONY
|
||||||
p_ps1$o p_sys$o p_tmt$o p_tos$o \
|
run-testsuite-%: export upx_testsuite_SRCDIR := $(upx_testsuite_SRCDIR)
|
||||||
p_unix$o p_vmlinz$o p_w16ne$o p_w32pe$o p_wcle$o
|
run-testsuite-debug: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-debug
|
||||||
|
run-testsuite-debug: export upx_exe := $(top_srcdir)/build/debug/upx
|
||||||
|
run-testsuite-debug: build/debug PHONY
|
||||||
|
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh
|
||||||
|
run-testsuite-release: export upx_testsuite_BUILDDIR := ./tmp-upx-testsuite-release
|
||||||
|
run-testsuite-release: export upx_exe := $(top_srcdir)/build/release/upx
|
||||||
|
run-testsuite-release: build/release PHONY
|
||||||
|
time -p bash $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# no exceptions or RTTI
|
#***********************************************************************
|
||||||
OBJECTS2 = \
|
# make check-whitespace
|
||||||
filteri$o help$o main$o mygetopt$o snprintf$o util$o \
|
#***********************************************************************
|
||||||
c_init$o c_file$o c_none$o c_screen$o \
|
|
||||||
s_object$o s_djgpp2$o s_vcsa$o s_win32$o
|
|
||||||
|
|
||||||
# pure C sources
|
ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc.
|
||||||
OBJECTS3 =
|
|
||||||
|
|
||||||
OBJECTS = $(OBJECTS1) $(OBJECTS2) $(OBJECTS3)
|
CHECK_WHITESPACE = bash $(top_srcdir)/misc/scripts/check_whitespace.sh $(top_srcdir)
|
||||||
LIBS =
|
ifneq ($(wildcard $(top_srcdir)/.git/.),)
|
||||||
RESOURCES =
|
CHECK_WHITESPACE = bash $(top_srcdir)/misc/scripts/check_whitespace_git.sh $(top_srcdir)
|
||||||
|
endif
|
||||||
|
check-whitespace: PHONY; $(CHECK_WHITESPACE)
|
||||||
|
|
||||||
|
endif # /usr/bin/env
|
||||||
|
|
||||||
# /***********************************************************************
|
#***********************************************************************
|
||||||
# // main
|
# make clang-format
|
||||||
# ************************************************************************/
|
#***********************************************************************
|
||||||
|
|
||||||
override WITH_ZLIB = 1
|
# automatically format some C++ source code files
|
||||||
|
ifneq ($(wildcard /usr/bin/env),)
|
||||||
|
ifeq ($(shell uname),Linux)
|
||||||
|
|
||||||
include $(srcdir)/Makefile.bld
|
# Markus loves clang-format, but John hates it; find a compromise
|
||||||
|
CLANG_FORMAT_EXCLUDE_FILES += stub/%.h util/miniacc.h
|
||||||
|
CLANG_FORMAT_EXCLUDE_FILES += p_lx_% p_mach% p_unix% p_vmlin%
|
||||||
|
CLANG_FORMAT_FILES := $(sort $(wildcard *.[ch]* ../maint/src/*.[ch]* */*.[ch]*))
|
||||||
|
CLANG_FORMAT_FILES += $(sort $(wildcard stub/tools/*/*.[ch]*))
|
||||||
|
CLANG_FORMAT_FILES += $(sort $(wildcard ../misc/cmake/try_compile/*.[ch]*))
|
||||||
|
CLANG_FORMAT_FILES := $(sort $(filter-out $(CLANG_FORMAT_EXCLUDE_FILES),$(CLANG_FORMAT_FILES)))
|
||||||
|
clang-format: $(CLANG_FORMAT_FILES) PHONY
|
||||||
|
@echo "running upx-clang-format"
|
||||||
|
@bash $(top_srcdir)/misc/scripts/upx-clang-format.sh -i $(CLANG_FORMAT_FILES)
|
||||||
|
|
||||||
|
endif # Linux
|
||||||
|
endif # /usr/bin/env
|
||||||
|
|
||||||
# /***********************************************************************
|
# vim:set ts=8 sw=8 noet:
|
||||||
# // dependencies
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
include $(srcdir)/Makedefs.dep
|
|
||||||
|
|
||||||
# vi:nowrap
|
|
||||||
|
|||||||
@@ -1,717 +0,0 @@
|
|||||||
# /***********************************************************************
|
|
||||||
# // perpare setup
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .a .c .cpp .exe .lib .o .obj .rc .res .ttp
|
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(srcdir),)
|
|
||||||
srcdir = .
|
|
||||||
endif
|
|
||||||
|
|
||||||
VPATH = $(srcdir)
|
|
||||||
|
|
||||||
|
|
||||||
# auto-detect the target unless given on the commandline
|
|
||||||
ifeq ($(strip $(target)),)
|
|
||||||
# try environment variable UPX_MAKE_TARGET
|
|
||||||
target := $(UPX_MAKE_TARGET)
|
|
||||||
endif
|
|
||||||
ifeq ($(strip $(target)),)
|
|
||||||
ifneq ($(strip $(wildcard /usr/include/linux)),)
|
|
||||||
target = linux
|
|
||||||
endif
|
|
||||||
##ifneq ($(strip $(wildcard /platform/sun4?/kernel/unix)),)
|
|
||||||
##target = sparc-sun-solaris
|
|
||||||
##endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(target)),)
|
|
||||||
include please_specify_a_target
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# util var for use in the rules - basename of the current target
|
|
||||||
override T = $(basename $@)
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // compiler defaults
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
CC_SRC = $<
|
|
||||||
CXX_SRC = $<
|
|
||||||
CC_COMPILE = $(CC) $(CCARCH) $(DEFS) $(EXTRA_DEFS) $(INCLUDES) $(EXTRA_INCLUDES) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_OUTPUT) -c $(CC_SRC)
|
|
||||||
CXX_COMPILE = $(CXX) $(CXXARCH) $(DEFS) $(EXTRA_DEFS) $(INCLUDES) $(EXTRA_INCLUDES) $(CXXFLAGS) $(EXTRA_CXXFLAGS) $(CXXFLAGS_OUTPUT) -c $(CXX_SRC)
|
|
||||||
CXX_LINK_EXE = $(CXXLD) $(CXXLDARCH) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LINK_EXE_OUTPUT) $^ $(LDLIBS) $(EXTRA_LDLIBS) $(LINK_EXE_LDFLAGS)
|
|
||||||
STUBEDIT_EXE =
|
|
||||||
STUBIFY_EXE =
|
|
||||||
CHMOD_EXE =
|
|
||||||
|
|
||||||
o = .o
|
|
||||||
a = .a
|
|
||||||
e =
|
|
||||||
DEFS =
|
|
||||||
INCLUDES =
|
|
||||||
LIBDIRS =
|
|
||||||
DOS_LDLIBS =
|
|
||||||
DOS_LIBDIRS =
|
|
||||||
|
|
||||||
# CC defaults
|
|
||||||
CC = INVALID_TARGET_CC
|
|
||||||
CCARCH =
|
|
||||||
CFLAGS =
|
|
||||||
CFLAGS_OUTPUT =
|
|
||||||
|
|
||||||
# CXX defaults
|
|
||||||
CXX = $(CC)
|
|
||||||
CXXARCH = $(CCARCH)
|
|
||||||
CXXFLAGS = $(CFLAGS)
|
|
||||||
CXXFLAGS_OUTPUT = $(CFLAGS_OUTPUT)
|
|
||||||
|
|
||||||
# CXXLD defaults
|
|
||||||
CXXLD = $(CXX)
|
|
||||||
CXXLDARCH = $(CXXARCH)
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT =
|
|
||||||
LDLIBS =
|
|
||||||
LINK_EXE_LDFLAGS =
|
|
||||||
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
DEFS += -DDEBUG
|
|
||||||
## DEFS += -DTESTING
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // compression libraries
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
DOS_LDLIBS += zlib.lib
|
|
||||||
ZLIBDIR:=$(strip $(subst \,/,$(ZLIBDIR)))
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR))),)
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR)/include/zlib.h)),)
|
|
||||||
INCLUDES += -I$(ZLIBDIR)/include
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR)/src/zlib.h)),)
|
|
||||||
INCLUDES += -I$(ZLIBDIR)/src
|
|
||||||
else
|
|
||||||
ifneq ($(strip $(wildcard $(ZLIBDIR)/zlib.h)),)
|
|
||||||
INCLUDES += -I$(ZLIBDIR)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
UCLDIR:=$(strip $(subst \,/,$(UCLDIR)))
|
|
||||||
NRVDIR:=$(strip $(subst \,/,$(NRVDIR)))
|
|
||||||
u = ucl
|
|
||||||
U = UCL
|
|
||||||
upx_exe_tail =
|
|
||||||
include $(srcdir)/Makedefs.inc
|
|
||||||
ifneq ($(strip $(wildcard $(NRVDIR)/include/nrv)),)
|
|
||||||
u = nrv
|
|
||||||
U = NRV
|
|
||||||
upx_exe_tail := _$(u)
|
|
||||||
include $(srcdir)/Makedefs.inc
|
|
||||||
endif
|
|
||||||
upx_exe = upx$(upx_exe_tail)$(e)
|
|
||||||
|
|
||||||
override tmp := -Wl,--rpath,
|
|
||||||
LDRPATH := $(addprefix $(tmp),$(LIBDIRS))
|
|
||||||
LIBDIRS += .
|
|
||||||
LDLIBDIRS := $(addprefix -L,$(LIBDIRS))
|
|
||||||
|
|
||||||
##LDFLAGS += $(LDRPATH)
|
|
||||||
LDFLAGS += $(LDLIBDIRS)
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // compiler settings
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
###
|
|
||||||
### generic gcc
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),gcc)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux - gcc
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
override arch := $(shell uname -m | sed -e 's/^i[3456789]86$$/i386/')
|
|
||||||
ifeq ($(arch),i386)
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
endif
|
|
||||||
DEFS += -D_FILE_OFFSET_BITS=64
|
|
||||||
LDLIBS += -lmcheck
|
|
||||||
##CFLAGS_WERROR = -Werror
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
else
|
|
||||||
##LDFLAGS += -static
|
|
||||||
STUBEDIT_EXE = objcopy -S -R .comment -R .note $@
|
|
||||||
ifeq ($(arch),i386)
|
|
||||||
## STUBIFY_EXE = perl $(srcdir)/stub/scripts/brandelf.pl $@
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
CHMOD_EXE = chmod 755 $@
|
|
||||||
endif # linux
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux/i386 - Borland C++ 5.7 (Kylix 3)
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux-bc57)
|
|
||||||
##DEPMODE := linux-XXX ## FIXME
|
|
||||||
CC = bc++ -q -3
|
|
||||||
CFLAGS = -w '-w!'
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS += -ls
|
|
||||||
LINK_EXE_OUTPUT = -e$@
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
# warning: do not use option `-d' --> incorrect string merging will happen
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -dc
|
|
||||||
else
|
|
||||||
CFLAGS += -O2 -dc
|
|
||||||
endif
|
|
||||||
# transform `-lxx -lyy' into `libxx.a libyy.a'
|
|
||||||
LDLIBS := $(shell echo "$(LDLIBS)" | perl -pe 's/-l(.+?)\b/lib\1.a/g')
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux/i386 - Intel C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux-intelc)
|
|
||||||
DEPMODE := linux-intelc
|
|
||||||
CC = icc
|
|
||||||
CXX = icpc
|
|
||||||
CCARCH += -march=i386 -mcpu=i686 -nolib_inline
|
|
||||||
DEFS += -D_FILE_OFFSET_BITS=64
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
CFLAGS = $(CFLAGS_WERROR)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -g -O0
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
LDFLAGS += -Wl,-Map,$T.map
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### linux/i386 - Portland Group PGI C++ 5.x
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),linux-pgi)
|
|
||||||
DEPMODE := linux-pgi
|
|
||||||
CC = pgcc
|
|
||||||
CXX = pgCC
|
|
||||||
CCARCH += -tp=p6
|
|
||||||
DEFS += -D_FILE_OFFSET_BITS=64
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
ifeq ($(WITH_ZLIB),1)
|
|
||||||
LDLIBS += -lz
|
|
||||||
endif
|
|
||||||
##CFLAGS += -Minform=info
|
|
||||||
CXXFLAGS = $(CFLAGS) -tused
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Linux cross compilers
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),cross-amd64-linux)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
CC = x86_64-linux-gcc
|
|
||||||
CXX = x86_64-linux-g++
|
|
||||||
LDLIBS += -lmcheck
|
|
||||||
endif # cross-amd64-linux
|
|
||||||
|
|
||||||
ifeq ($(target),cross-m68k-linux)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
CC = m68k-linux-gcc
|
|
||||||
CXX = m68k-linux-g++
|
|
||||||
##LDLIBS += -lmcheck
|
|
||||||
endif # cross-m68k-linux
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### sparc-sun-solaris2.8
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),sparc-sun-solaris)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### Atari cross compilers
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),cross-mint)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .ttp
|
|
||||||
CC = m68k-atari-mint-gcc
|
|
||||||
CXX = m68k-atari-mint-g++
|
|
||||||
CCARCH += -m68000
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),cross-mint-m68040)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .ttp
|
|
||||||
CC = m68k-atari-mint-gcc
|
|
||||||
CXX = m68k-atari-mint-g++
|
|
||||||
CCARCH += -m68040
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),cross-mint-m68020-60)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .ttp
|
|
||||||
CC = m68k-atari-mint-gcc
|
|
||||||
CXX = m68k-atari-mint-g++
|
|
||||||
CCARCH += -m68020-60 -m68881
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### dos32 - djgpp2 / emx
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),dos32-djgpp2)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CXX = gxx
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
CFLAGS_WERROR = -Werror
|
|
||||||
STUBEDIT_EXE = stubedit $@ bufsize=0xfc00
|
|
||||||
ifneq ($(strip $(wildcard $(DJDIR)/bin/mfxdjstubify.ex[eE])),)
|
|
||||||
ifneq ($(strip $(wildcard $(DJDIR)/bin/cwsdstub.ex[eE])),)
|
|
||||||
STUBIFY_EXE = mfxdjstubify -v -s $(DJDIR)/bin/cwsdstub.exe $@
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),dos32-emx)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CXX = gcc
|
|
||||||
CFLAGS_O = -O2
|
|
||||||
CCARCH += -mno-probe
|
|
||||||
LDFLAGS = -L. -s
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - cygwin / mingw32 / rsxnt
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-cygwin)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
##CXX = g++-2
|
|
||||||
e = .exe
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
LDLIBS += -lwinmm
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(target),win32-mingw32)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
LDLIBS += -lwinmm
|
|
||||||
endif
|
|
||||||
|
|
||||||
# mingw32 cross compiler
|
|
||||||
ifeq ($(target),cross-mingw32)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CC = i586-mingw32msvc-gcc
|
|
||||||
CXX = i586-mingw32msvc-g++
|
|
||||||
CCARCH += -march=i386 -mcpu=i686
|
|
||||||
LDLIBS += -lwinmm
|
|
||||||
endif
|
|
||||||
|
|
||||||
# rsxnt (g++ 2.8.1)
|
|
||||||
ifeq ($(target),win32-rsxnt)
|
|
||||||
include $(srcdir)/Makedefs.gcc
|
|
||||||
e = .exe
|
|
||||||
CXX = gcc
|
|
||||||
CFLAGS_O = -O2
|
|
||||||
CCARCH += -Zwin32 -Zsys -mno-probe
|
|
||||||
LDFLAGS = -L. -s
|
|
||||||
STUBEDIT_EXE = pestack -s1024 -c1024 $@
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Borland C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-bc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = bcc32 -3
|
|
||||||
ifeq ($(UPX_BROKEN_INCLUDES),1)
|
|
||||||
ifneq ($(srcdir),.)
|
|
||||||
INCLUDES += -I$(srcdir)
|
|
||||||
endif
|
|
||||||
INCLUDES += -I$(srcdir)/acc
|
|
||||||
ifneq ($(strip $(wildcard $(srcdir)/filter)),)
|
|
||||||
INCLUDES += -I$(srcdir)/filter
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
CFLAGS = -w -w-inl -g1
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS = -ls
|
|
||||||
LINK_EXE_OUTPUT = -e$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -d
|
|
||||||
else
|
|
||||||
CFLAGS += -O2 -d
|
|
||||||
endif
|
|
||||||
endif # win32-bc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Digital Mars C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-dm)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = dmc -mn
|
|
||||||
CFLAGS = -w- -wx
|
|
||||||
CXXFLAGS = $(CFLAGS) -Aa -Ab -Ae -Ar
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS = -L/map
|
|
||||||
LINK_EXE_OUTPUT = -o$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -o- -g -s
|
|
||||||
else
|
|
||||||
CFLAGS += -o
|
|
||||||
endif
|
|
||||||
endif # win32-dm
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Intel C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-ic)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = icl -nologo
|
|
||||||
CFLAGS = -W3 -WX
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,2)
|
|
||||||
# statically link libc.lib
|
|
||||||
CC += -ML
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS) setargv.obj
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win32-ic
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Metrowerks C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-mwerks)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = mwcc -gccinc
|
|
||||||
CFLAGS = -w on
|
|
||||||
CXXFLAGS = $(CFLAGS)
|
|
||||||
CFLAGS_OUTPUT = -o $@
|
|
||||||
LDFLAGS = -lwinmm.lib -map $T.map
|
|
||||||
LINK_EXE_OUTPUT = -o $@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -opt full
|
|
||||||
else
|
|
||||||
CFLAGS +=
|
|
||||||
endif
|
|
||||||
endif # win32-mwerks
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Symantec C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-sc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = sc -mn
|
|
||||||
CFLAGS = -w- -wx
|
|
||||||
CXXFLAGS = $(CFLAGS) -EH -ER
|
|
||||||
CFLAGS_OUTPUT = -o$@
|
|
||||||
LDFLAGS = -L/map
|
|
||||||
LINK_EXE_OUTPUT = -o$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -o- -g -s
|
|
||||||
else
|
|
||||||
CFLAGS += -o
|
|
||||||
endif
|
|
||||||
endif # win32-sc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Visual C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-vc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = cl -nologo
|
|
||||||
CFLAGS = -W4 -WX
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,1)
|
|
||||||
# statically link libc.lib
|
|
||||||
CC += -ML
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS) setargv.obj
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
##LINK_EXE_LDFLAGS += /opt:nowin98
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win32-vc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win32 - Watcom C++
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win32-wc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = wcl386 -zq -bt=nt -mf -5r
|
|
||||||
##CC = wcl386 -zq -bt=dos -l=CauseWay -mf -5r
|
|
||||||
CFLAGS = -zc -w5 -we
|
|
||||||
CXXFLAGS = $(CFLAGS) -xs -xr
|
|
||||||
CFLAGS_OUTPUT = -fo=$@
|
|
||||||
LDFLAGS = -k0x100000 -fm
|
|
||||||
LINK_EXE_OUTPUT = -fe=$@
|
|
||||||
LDLIBS = $(DOS_LDLIBS)
|
|
||||||
CC_SRC = $(subst /,\\,$<)
|
|
||||||
CXX_SRC = $(subst /,\\,$<)
|
|
||||||
INCLUDES := $(strip $(subst /,\\,$(INCLUDES)))
|
|
||||||
ifeq (1,2)
|
|
||||||
WCL386 := $(INCLUDES)
|
|
||||||
export WCL386
|
|
||||||
INCLUDES :=
|
|
||||||
endif
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS +=
|
|
||||||
else
|
|
||||||
# note: it seems that the optimizer is generating bad code with `-ox'
|
|
||||||
CFLAGS += -olr
|
|
||||||
endif
|
|
||||||
endif # win32-wc
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win64 - Intel C++ [Itanium]
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win64-ic)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = ecl -nologo
|
|
||||||
CFLAGS = -W3
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,2)
|
|
||||||
# statically link libc.lib
|
|
||||||
CC += -ML
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS) setargv.obj
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win64-ic
|
|
||||||
|
|
||||||
|
|
||||||
###
|
|
||||||
### win64 - Visual C++ [AMD64 or Itanium]
|
|
||||||
###
|
|
||||||
|
|
||||||
ifeq ($(target),win64-vc)
|
|
||||||
o = .obj
|
|
||||||
a = .lib
|
|
||||||
e = .exe
|
|
||||||
CC = cl -nologo
|
|
||||||
CFLAGS = -W4
|
|
||||||
CXXFLAGS = $(CFLAGS) -EHac -GR
|
|
||||||
LDFLAGS =
|
|
||||||
LINK_EXE_OUTPUT = -Fe$@
|
|
||||||
LINK_EXE_LDFLAGS = /link /map:$T.map
|
|
||||||
##LINK_EXE_LDFLAGS += /verbose
|
|
||||||
ifeq (1,1)
|
|
||||||
# statically link libc.lib
|
|
||||||
CC += -ML
|
|
||||||
## DOS_LDLIBS := $(DOS_LDLIBS:.lib=_ml.lib)
|
|
||||||
else
|
|
||||||
# link against msvcrt.dll
|
|
||||||
CC += -MD
|
|
||||||
endif
|
|
||||||
LDLIBS = $(DOS_LDLIBS) setargv.obj
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -Od -ZI
|
|
||||||
LINK_EXE_LDFLAGS += /debug
|
|
||||||
else
|
|
||||||
CFLAGS += -O1 -GF
|
|
||||||
LINK_EXE_LDFLAGS += /release
|
|
||||||
endif
|
|
||||||
RESOURCES := $(subst .rc,.res,$(notdir $(wildcard $(srcdir)/*.rc)))
|
|
||||||
endif # win64-vc
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // malloc debuggers and memory checkers - obsolete, use valgrind
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
# compile in extra valgrind support
|
|
||||||
DEFS += -DWITH_VALGRIND
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
LDLIBS += -lefence
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
DEFS += -DWITH_DMALLOC
|
|
||||||
LDLIBS += -ldmalloc
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (1,2)
|
|
||||||
DEFS += -DWITH_GC -DLINUX_THREADS -D_REENTRANT
|
|
||||||
LDLIBS += -lgc -lpthread
|
|
||||||
# only needed when using -static:
|
|
||||||
##LDFLAGS += -Wl,-defsym,_DYNAMIC=0
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // main targets
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
-include ./Makefile.local
|
|
||||||
|
|
||||||
all: $(upx_exe)
|
|
||||||
|
|
||||||
$(upx_exe): $(OBJECTS) $(LIBS) $(RESOURCES)
|
|
||||||
$(strip $(CXX_LINK_EXE))
|
|
||||||
$(strip $(STUBEDIT_EXE))
|
|
||||||
$(strip $(STUBIFY_EXE))
|
|
||||||
$(strip $(CHMOD_EXE))
|
|
||||||
|
|
||||||
mostlyclean:
|
|
||||||
-rm -f *.d *.err *.i *.log *.map gdb-trans*
|
|
||||||
|
|
||||||
clean: mostlyclean
|
|
||||||
-rm -f *.a *.lib *.o *.obj *.res *.tds tags TAGS ID
|
|
||||||
-rm -f *.idb *.pdb
|
|
||||||
-rm -f $(upx_exe) upx upx.exe upx.ttp upx_nrv upx_nrv.exe upx_nrv.ttp upx_ucl upx_ucl.exe upx_ucl.ttp
|
|
||||||
-rm -rf .deps _deps
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
|
|
||||||
maintainer-clean: distclean
|
|
||||||
|
|
||||||
.PHONY: all mostlyclean clean distclean maintainer-clean
|
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
|
||||||
# // rules
|
|
||||||
# ************************************************************************/
|
|
||||||
|
|
||||||
%$o : %.c
|
|
||||||
$(strip $(CC_COMPILE))
|
|
||||||
|
|
||||||
%$o : %.cpp
|
|
||||||
$(strip $(CXX_COMPILE))
|
|
||||||
|
|
||||||
%.res : %.rc
|
|
||||||
rc -l 0x409 -fo$@ $<
|
|
||||||
|
|
||||||
|
|
||||||
# vi:nowrap
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
GNUmakefile
|
|
||||||
@@ -1,340 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) 19yy <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Possible configuration values:
|
|
||||||
*
|
|
||||||
* ACC_CONFIG_NO_HEADER
|
|
||||||
* ACC_CONFIG_HEADER if given, then use this as <config.h>
|
|
||||||
* ACC_CONFIG_INCLUDE include path to acc_ files
|
|
||||||
*
|
|
||||||
* ACC_CONFIG_PREFER___INT64 [acc_type.h]
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_H_INCLUDED
|
|
||||||
#define __ACC_H_INCLUDED 1
|
|
||||||
|
|
||||||
#define ACC_VERSION 20040623L
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_INCLUDE)
|
|
||||||
# define ACC_CONFIG_INCLUDE(file) file
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__CYGWIN32__) && !defined(__CYGWIN__)
|
|
||||||
# define __CYGWIN__ __CYGWIN32__
|
|
||||||
#endif
|
|
||||||
#if defined(__IBMCPP__) && !defined(__IBMC__)
|
|
||||||
# define __IBMC__ __IBMCPP__
|
|
||||||
#endif
|
|
||||||
#if defined(__ICL) && defined(_WIN32) && !defined(__INTEL_COMPILER)
|
|
||||||
# define __INTEL_COMPILER __ICL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* disable pedantic warnings for undefined preprocessing symbols */
|
|
||||||
#if defined(__INTEL_COMPILER) && defined(__linux__)
|
|
||||||
# pragma warning(disable: 193)
|
|
||||||
#endif
|
|
||||||
#if defined(__KEIL__) && defined(__C166__)
|
|
||||||
# pragma warning disable = 322
|
|
||||||
#elif 0 && defined(__C251__)
|
|
||||||
# pragma warning disable = 322
|
|
||||||
#endif
|
|
||||||
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
|
|
||||||
# if (_MSC_VER >= 1300)
|
|
||||||
# pragma warning(disable: 4668)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if 0 && defined(__WATCOMC__)
|
|
||||||
# if (__WATCOMC__ < 1060)
|
|
||||||
# pragma warning 203 9
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_init.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_os.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_cc.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_arch.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_mm.h")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_defs.h")
|
|
||||||
|
|
||||||
#if defined(ACC_CONFIG_NO_HEADER)
|
|
||||||
#elif defined(ACC_CONFIG_HEADER)
|
|
||||||
# include ACC_CONFIG_HEADER
|
|
||||||
#else
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_auto.h")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include ACC_CONFIG_INCLUDE("acc_type.h")
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* CPU architecture - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_ARCH_UNKNOWN [default]
|
|
||||||
* ACC_ARCH_ALPHA
|
|
||||||
* ACC_ARCH_AMD64 aka x86-64 or ia32e
|
|
||||||
* ACC_ARCH_C166
|
|
||||||
* ACC_ARCH_IA16 Intel Architecture (8088, 8086, 80186, 80286)
|
|
||||||
* ACC_ARCH_IA32 Intel Architecture (80386+)
|
|
||||||
* ACC_ARCH_IA64 Intel Architecture (Itanium)
|
|
||||||
* ACC_ARCH_M68K Motorola 680x0
|
|
||||||
* ACC_ARCH_MCS251
|
|
||||||
* ACC_ARCH_MCS51
|
|
||||||
* ACC_ARCH_PPC64 Power PC
|
|
||||||
* ACC_ARCH_SPARC64
|
|
||||||
*
|
|
||||||
* Optionally define one of:
|
|
||||||
* ACC_ENDIAN_LITTLE_ENDIAN
|
|
||||||
* ACC_ENDIAN_BIG_ENDIAN
|
|
||||||
*
|
|
||||||
* Note that this list is not exhaustive - actually we only really care
|
|
||||||
* about architectures which allow unaligned memory access at reasonable
|
|
||||||
* speed (for the moment this means IA16, IA32 and AMD64).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# define ACC_ARCH_IA16 1
|
|
||||||
# define ACC_INFO_ARCH "ia16"
|
|
||||||
#elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64)
|
|
||||||
# define ACC_ARCH_AMD64 1
|
|
||||||
# define ACC_INFO_ARCH "amd64"
|
|
||||||
#elif (UINT_MAX <= ACC_0xffffL) && defined(__AVR__)
|
|
||||||
# define ACC_ARCH_AVR 1
|
|
||||||
# define ACC_INFO_ARCH "avr"
|
|
||||||
#elif (UINT_MAX == ACC_0xffffL) && defined(__C166__)
|
|
||||||
# define ACC_ARCH_C166 1
|
|
||||||
# define ACC_INFO_ARCH "c166"
|
|
||||||
#elif (UINT_MAX == ACC_0xffffL) && defined(__C251__)
|
|
||||||
# define ACC_ARCH_MCS251 1
|
|
||||||
# define ACC_INFO_ARCH "mcs-251"
|
|
||||||
#elif (UINT_MAX == ACC_0xffffL) && defined(__C51__)
|
|
||||||
# define ACC_ARCH_MCS51 1
|
|
||||||
# define ACC_INFO_ARCH "mcs-51"
|
|
||||||
#elif defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386)
|
|
||||||
# define ACC_ARCH_IA32 1
|
|
||||||
# define ACC_INFO_ARCH "ia32"
|
|
||||||
#elif (ACC_CC_ZORTECHC && defined(__I86__))
|
|
||||||
# define ACC_ARCH_IA32 1
|
|
||||||
# define ACC_INFO_ARCH "ia32"
|
|
||||||
#elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64)
|
|
||||||
# define ACC_ARCH_IA64 1
|
|
||||||
# define ACC_INFO_ARCH "ia64"
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_HIGHC) && defined(_I386)
|
|
||||||
# define ACC_ARCH_IA32 1
|
|
||||||
# define ACC_INFO_ARCH "ia32"
|
|
||||||
#elif (ACC_OS_DOS32 || ACC_OS_OS2)
|
|
||||||
# error "missing define for CPU architecture"
|
|
||||||
#elif (ACC_OS_WIN32)
|
|
||||||
# error "missing define for CPU architecture"
|
|
||||||
#elif (ACC_OS_WIN64)
|
|
||||||
/* # error "missing define for CPU architecture" */
|
|
||||||
#elif (ACC_OS_TOS) || defined(__m68000__)
|
|
||||||
# define ACC_ARCH_M68K 1
|
|
||||||
# define ACC_INFO_ARCH "m68k"
|
|
||||||
#elif defined(__alpha__) || defined(__alpha)
|
|
||||||
# define ACC_ARCH_ALPHA 1
|
|
||||||
# define ACC_INFO_ARCH "alpha"
|
|
||||||
#elif defined(__ppc64__) || defined(__ppc64)
|
|
||||||
# define ACC_ARCH_PPC64 1
|
|
||||||
# define ACC_INFO_ARCH "ppc64"
|
|
||||||
#elif defined(__sparc64__) || defined(__sparc64)
|
|
||||||
# define ACC_ARCH_SPARC64 1
|
|
||||||
# define ACC_INFO_ARCH "sparc64"
|
|
||||||
#else
|
|
||||||
# define ACC_ARCH_UNKNOWN 1
|
|
||||||
# define ACC_INFO_ARCH "unknown"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA16 || ACC_ARCH_IA32)
|
|
||||||
# define ACC_ENDIAN_LITTLE_ENDIAN 1
|
|
||||||
# define ACC_INFO_ENDIAN "little-endian"
|
|
||||||
#elif (ACC_ARCH_M68K)
|
|
||||||
# define ACC_ENDIAN_BIG_ENDIAN 1
|
|
||||||
# define ACC_INFO_ENDIAN "big-endian"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_ARCH_IA16)
|
|
||||||
# if (UINT_MAX != ACC_0xffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (ACC_ARCH_IA32)
|
|
||||||
# if (UINT_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,652 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Possible configuration values:
|
|
||||||
*
|
|
||||||
* ACC_CONFIG_AUTO_NO_HEADERS
|
|
||||||
* ACC_CONFIG_AUTO_NO_FUNCTIONS
|
|
||||||
* ACC_CONFIG_AUTO_NO_SIZES
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for <stdint.h>
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_HEADERS)
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
|
|
||||||
# if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1))
|
|
||||||
# define HAVE_STDINT_H 1
|
|
||||||
# endif
|
|
||||||
#elif defined(__dietlibc__)
|
|
||||||
# undef HAVE_STDINT_H /* incomplete */
|
|
||||||
#elif (ACC_CC_BORLANDC) && (__BORLANDC__ >= 0x560)
|
|
||||||
# undef HAVE_STDINT_H /* broken & incomplete */
|
|
||||||
#elif (ACC_CC_DMC) && (__DMC__ >= 0x825)
|
|
||||||
# define HAVE_STDINT_H 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_STDINT_H
|
|
||||||
# include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_HEADERS) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for header files
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_HEADERS)
|
|
||||||
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
|
|
||||||
#define HAVE_ASSERT_H 1
|
|
||||||
#define HAVE_CTYPE_H 1
|
|
||||||
#define HAVE_DIRENT_H 1
|
|
||||||
#define HAVE_ERRNO_H 1
|
|
||||||
#define HAVE_FCNTL_H 1
|
|
||||||
#define HAVE_LIMITS_H 1
|
|
||||||
#define HAVE_MALLOC_H 1
|
|
||||||
#define HAVE_MEMORY_H 1
|
|
||||||
#define HAVE_SETJMP_H 1
|
|
||||||
#define HAVE_SIGNAL_H 1
|
|
||||||
#define HAVE_STDARG_H 1
|
|
||||||
#define HAVE_STDDEF_H 1
|
|
||||||
#define HAVE_STDIO_H 1
|
|
||||||
#define HAVE_STDLIB_H 1
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
#define HAVE_TIME_H 1
|
|
||||||
#define HAVE_UNISTD_H 1
|
|
||||||
#define HAVE_UTIME_H 1
|
|
||||||
#define HAVE_SYS_STAT_H 1
|
|
||||||
#define HAVE_SYS_TIME_H 1
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
|
|
||||||
#undef HAVE_ALLOCA_H
|
|
||||||
#undef HAVE_CONIO_H
|
|
||||||
#undef HAVE_DIRECT_H
|
|
||||||
#undef HAVE_DOS_H
|
|
||||||
#undef HAVE_IO_H
|
|
||||||
#undef HAVE_SHARE_H
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
#undef HAVE_SYS_UTIME_H
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_POSIX)
|
|
||||||
# define HAVE_STRINGS_H 1
|
|
||||||
# if (ACC_OS_POSIX_FREEBSD || ACC_OS_POSIX_MACOSX || ACC_OS_POSIX_OPENBSD)
|
|
||||||
# undef HAVE_MALLOC_H /* deprecated */
|
|
||||||
# elif (ACC_OS_POSIX_HPUX)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# endif
|
|
||||||
# if (ACC_OS_POSIX_MACOSX && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
/* FIXME ??? */
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_CYGWIN)
|
|
||||||
# define HAVE_IO_H 1
|
|
||||||
#elif (ACC_OS_EMX)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# define HAVE_IO_H 1
|
|
||||||
#elif (ACC_OS_TOS && ACC_CC_GNUC)
|
|
||||||
# if !defined(__MINT__)
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_FCNTL_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* DOS, OS/2 & Windows */
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
|
|
||||||
#define HAVE_CONIO_H 1
|
|
||||||
#define HAVE_DIRECT_H 1
|
|
||||||
#define HAVE_DOS_H 1
|
|
||||||
#define HAVE_IO_H 1
|
|
||||||
#define HAVE_SHARE_H 1
|
|
||||||
|
|
||||||
#if (ACC_CC_AZTECC)
|
|
||||||
# undef HAVE_CONIO_H
|
|
||||||
# undef HAVE_DIRECT_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#elif (ACC_CC_BORLANDC)
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# if (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# undef HAVE_DIRENT_H /* pulls in <windows.h>; use <dir.h> instead */
|
|
||||||
# endif
|
|
||||||
# if (__BORLANDC__ < 0x0400)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_DMC)
|
|
||||||
# undef HAVE_DIRENT_H /* not working */
|
|
||||||
# undef HAVE_UNISTD_H /* not working */
|
|
||||||
# define HAVE_SYS_DIRENT_H 1
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_HIGHC)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
#elif (ACC_CC_IBMC && ACC_OS_OS2)
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_CC_INTELC || ACC_CC_MSC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_CC_LCC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__MINGW32__)
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
# define HAVE_ALLOCA_H 1
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#elif (ACC_CC_PACIFICC)
|
|
||||||
# undef HAVE_DIRECT_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_FCNTL_H
|
|
||||||
# undef HAVE_IO_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PELLESC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_DOS_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_SHARE_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# if (__POCC__ < 280)
|
|
||||||
# else
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PGI) && defined(__MINGW32__)
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
#elif (ACC_CC_SYMANTECC)
|
|
||||||
# undef HAVE_DIRENT_H /* opendir() not implemented in libc */
|
|
||||||
# undef HAVE_UNISTD_H /* not working */
|
|
||||||
# if (__SC__ < 0x700)
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_TOPSPEEDC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_STAT_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# undef HAVE_SYS_TYPES_H /* useless */
|
|
||||||
# if (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# undef HAVE_DIRENT_H /* pulls in <windows.h>; use <dir.h> instead */
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0200)
|
|
||||||
# undef HAVE_SIGNAL_H /* not working */
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0400)
|
|
||||||
# undef HAVE_DIRECT_H
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_MALLOC_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_WATCOMC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
# define HAVE_SYS_UTIME_H 1
|
|
||||||
# if (__WATCOMC__ < 950)
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_ZORTECHC)
|
|
||||||
# undef HAVE_DIRENT_H
|
|
||||||
# undef HAVE_MEMORY_H
|
|
||||||
# undef HAVE_UNISTD_H
|
|
||||||
# undef HAVE_UTIME_H
|
|
||||||
# undef HAVE_SYS_TIME_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* DOS, OS/2 & Windows */
|
|
||||||
|
|
||||||
|
|
||||||
#if (HAVE_SYS_TIME_H && HAVE_TIME_H)
|
|
||||||
# define TIME_WITH_SYS_TIME 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_HEADERS) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for library functions
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_FUNCTIONS)
|
|
||||||
|
|
||||||
#define HAVE_ACCESS 1
|
|
||||||
#define HAVE_ALLOCA 1
|
|
||||||
#define HAVE_ATEXIT 1
|
|
||||||
#define HAVE_ATOI 1
|
|
||||||
#define HAVE_ATOL 1
|
|
||||||
#define HAVE_CHMOD 1
|
|
||||||
#define HAVE_CHOWN 1
|
|
||||||
#define HAVE_CTIME 1
|
|
||||||
#define HAVE_DIFFTIME 1
|
|
||||||
#define HAVE_FILENO 1
|
|
||||||
#define HAVE_FSTAT 1
|
|
||||||
#define HAVE_GETTIMEOFDAY 1
|
|
||||||
#define HAVE_GMTIME 1
|
|
||||||
#define HAVE_LOCALTIME 1
|
|
||||||
#define HAVE_LONGJMP 1
|
|
||||||
#define HAVE_LSTAT 1
|
|
||||||
#define HAVE_MEMCMP 1
|
|
||||||
#define HAVE_MEMCPY 1
|
|
||||||
#define HAVE_MEMMOVE 1
|
|
||||||
#define HAVE_MEMSET 1
|
|
||||||
#define HAVE_MKTIME 1
|
|
||||||
#define HAVE_QSORT 1
|
|
||||||
#define HAVE_RAISE 1
|
|
||||||
#define HAVE_SETJMP 1
|
|
||||||
#define HAVE_SIGNAL 1
|
|
||||||
#define HAVE_SNPRINTF 1
|
|
||||||
#define HAVE_STAT 1
|
|
||||||
#define HAVE_STRCHR 1
|
|
||||||
#define HAVE_STRDUP 1
|
|
||||||
#define HAVE_STRERROR 1
|
|
||||||
#define HAVE_STRFTIME 1
|
|
||||||
#define HAVE_STRRCHR 1
|
|
||||||
#define HAVE_STRSTR 1
|
|
||||||
#define HAVE_TIME 1
|
|
||||||
#define HAVE_UMASK 1
|
|
||||||
#define HAVE_UTIME 1
|
|
||||||
#define HAVE_VSNPRINTF 1
|
|
||||||
|
|
||||||
#if (ACC_OS_BEOS || ACC_OS_CYGWIN || ACC_OS_POSIX || ACC_OS_QNX)
|
|
||||||
# define HAVE_STRCASECMP 1
|
|
||||||
# define HAVE_STRNCASECMP 1
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
# define HAVE_STRCASECMP 1
|
|
||||||
# define HAVE_STRNCASECMP 1
|
|
||||||
#else
|
|
||||||
# define HAVE_STRICMP 1
|
|
||||||
# define HAVE_STRNICMP 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_POSIX)
|
|
||||||
# if (ACC_CC_TINYC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# elif defined(__dietlibc__)
|
|
||||||
# endif
|
|
||||||
# if (ACC_OS_POSIX_MACOSX && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
/* FIXME ??? */
|
|
||||||
# undef HAVE_CHOWN
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_CYGWIN)
|
|
||||||
# if (ACC_CC_GNUC < 0x025a00ul)
|
|
||||||
# undef HAVE_GETTIMEOFDAY
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
# endif
|
|
||||||
# if (ACC_CC_GNUC < 0x025f00ul)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_EMX)
|
|
||||||
# undef HAVE_CHOWN
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
#elif (ACC_OS_TOS && ACC_CC_GNUC)
|
|
||||||
# if !defined(__MINT__)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_ACCESS
|
|
||||||
# undef HAVE_CHMOD
|
|
||||||
# undef HAVE_CHOWN
|
|
||||||
# undef HAVE_FSTAT
|
|
||||||
# undef HAVE_GETTIMEOFDAY
|
|
||||||
# undef HAVE_LSTAT
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_UMASK
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* DOS, OS/2 & Windows */
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
|
|
||||||
#undef HAVE_CHOWN
|
|
||||||
#undef HAVE_GETTIMEOFDAY
|
|
||||||
#undef HAVE_LSTAT
|
|
||||||
#undef HAVE_UMASK
|
|
||||||
|
|
||||||
#if (ACC_CC_AZTECC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_DIFFTIME /* difftime() is in the math library */
|
|
||||||
# undef HAVE_FSTAT
|
|
||||||
# undef HAVE_STRDUP /* missing in 5.2a */
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_UTIME /* struct utimbuf is missing */
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_BORLANDC)
|
|
||||||
# if (__BORLANDC__ < 0x0400)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# endif
|
|
||||||
# if ((__BORLANDC__ < 0x0410) && ACC_OS_WIN16)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# if (__BORLANDC__ < 0x0550)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_DMC)
|
|
||||||
# if (ACC_OS_WIN16)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_HIGHC)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_IBMC)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_INTELC)
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#elif (ACC_CC_LCC)
|
|
||||||
# define utime _utime
|
|
||||||
#elif (ACC_CC_MSC)
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# undef HAVE_STRFTIME
|
|
||||||
# endif
|
|
||||||
# if (_MSC_VER < 700)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# else
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
# if ((_MSC_VER < 800) && ACC_OS_WIN16)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# if (_MSC_VER < 1000) && defined(__cplusplus)
|
|
||||||
# undef HAVE_SETJMP
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__MINGW32__)
|
|
||||||
# if (ACC_CC_GNUC < 0x025f00ul)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# else
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_MWERKS) && defined(__MSL__)
|
|
||||||
# if (__MSL__ < 0x8000ul)
|
|
||||||
# undef HAVE_CHMOD /* <unix.h> which in turn pulls in <windows.h> */
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_STRNICMP
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# if defined(__cplusplus)
|
|
||||||
# undef HAVE_STAT
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_PACIFICC)
|
|
||||||
# undef HAVE_ACCESS
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_CHMOD
|
|
||||||
# undef HAVE_DIFFTIME
|
|
||||||
# undef HAVE_FSTAT
|
|
||||||
# undef HAVE_MKTIME
|
|
||||||
# undef HAVE_RAISE
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_STRFTIME
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PELLESC)
|
|
||||||
# if (__POCC__ < 280)
|
|
||||||
# define alloca _alloca
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_PGI) && defined(__MINGW32__)
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_SYMANTECC)
|
|
||||||
# if (ACC_OS_WIN16 && (ACC_MM_MEDIUM || ACC_MM_LARGE || ACC_MM_HUGE))
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# if (__SC__ < 0x600)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# else
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
# if (__SC__ < 0x700)
|
|
||||||
# undef HAVE_DIFFTIME /* difftime() is broken */
|
|
||||||
# undef HAVE_UTIME /* struct utimbuf is missing */
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_TOPSPEEDC)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# if (__TURBOC__ < 0x0200)
|
|
||||||
# undef HAVE_RAISE
|
|
||||||
# undef HAVE_SIGNAL
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0295)
|
|
||||||
# undef HAVE_MKTIME
|
|
||||||
# undef HAVE_STRFTIME
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0400)
|
|
||||||
# undef HAVE_UTIME
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_WATCOMC)
|
|
||||||
# if (__WATCOMC__ < 1100)
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
# else
|
|
||||||
# define snprintf _snprintf
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_ZORTECHC)
|
|
||||||
# if (ACC_OS_WIN16 && (ACC_MM_MEDIUM || ACC_MM_LARGE || ACC_MM_HUGE))
|
|
||||||
# undef HAVE_ALLOCA
|
|
||||||
# endif
|
|
||||||
# undef HAVE_DIFFTIME /* difftime() is broken */
|
|
||||||
# undef HAVE_SNPRINTF
|
|
||||||
# undef HAVE_UTIME /* struct utimbuf is missing */
|
|
||||||
# undef HAVE_VSNPRINTF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* DOS, OS/2 & Windows */
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_FUNCTIONS) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Checks for sizes
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_CONFIG_AUTO_NO_SIZES)
|
|
||||||
|
|
||||||
#define SIZEOF_SHORT (__ACC_SHORT_BIT / 8)
|
|
||||||
#define SIZEOF_INT (__ACC_INT_BIT / 8)
|
|
||||||
#define SIZEOF_LONG (__ACC_LONG_BIT / 8)
|
|
||||||
|
|
||||||
#if (ACC_OS_WIN64) /* LLP64 programming model */
|
|
||||||
# define SIZEOF_PTRDIFF_T 8
|
|
||||||
# define SIZEOF_SIZE_T 8
|
|
||||||
# define SIZEOF_VOID_P 8
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# define SIZEOF_SIZE_T 2
|
|
||||||
# if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
# define SIZEOF_VOID_P 2
|
|
||||||
# elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
# define SIZEOF_VOID_P 4
|
|
||||||
# else
|
|
||||||
# error "ACC_MM"
|
|
||||||
# endif
|
|
||||||
# if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
# define SIZEOF_PTRDIFF_T 2
|
|
||||||
# elif (ACC_MM_COMPACT || ACC_MM_LARGE)
|
|
||||||
# if (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# define SIZEOF_PTRDIFF_T 4
|
|
||||||
# else
|
|
||||||
# define SIZEOF_PTRDIFF_T 2
|
|
||||||
# endif
|
|
||||||
# elif (ACC_MM_HUGE)
|
|
||||||
# define SIZEOF_PTRDIFF_T 4
|
|
||||||
# else
|
|
||||||
# error "ACC_MM"
|
|
||||||
# endif
|
|
||||||
#elif (ACC_ARCH_AVR || ACC_ARCH_C166 || ACC_ARCH_MCS51 || ACC_ARCH_MCS251)
|
|
||||||
# define SIZEOF_PTRDIFF_T 2
|
|
||||||
# define SIZEOF_SIZE_T 2
|
|
||||||
# define SIZEOF_VOID_P 2
|
|
||||||
#else
|
|
||||||
# define SIZEOF_PTRDIFF_T SIZEOF_LONG
|
|
||||||
# define SIZEOF_SIZE_T SIZEOF_LONG
|
|
||||||
# define SIZEOF_VOID_P SIZEOF_LONG
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(SIZEOF_CHAR_P) && (SIZEOF_VOID_P > 0)
|
|
||||||
# define SIZEOF_CHAR_P SIZEOF_VOID_P
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if ((SIZEOF_LONG) > 0 && (SIZEOF_LONG) < 8)
|
|
||||||
#if (ACC_CC_GNUC)
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_OS_WIN64)
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_DMC))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_SYMANTECC && __SC__ >= 0x700))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_INTELC && defined(__linux__)))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_MWERKS || ACC_CC_PELLESC || ACC_CC_PGI))
|
|
||||||
# define SIZEOF_LONG_LONG 8
|
|
||||||
# define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_INTELC || ACC_CC_MSC))
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_BORLANDC && __BORLANDC__ >= 0x0520))
|
|
||||||
/* INFO: unsigned __int64 is somewhat broken in 0x0520; fixed in 0x0530 */
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_ARCH_IA32 && (ACC_CC_WATCOMC && __WATCOMC__ >= 1100))
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#elif (ACC_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64))
|
|
||||||
# define SIZEOF___INT64 8
|
|
||||||
# define SIZEOF_UNSIGNED___INT64 8
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__cplusplus) && defined(ACC_CC_GNUC)
|
|
||||||
# if (ACC_CC_GNUC < 0x020800ul)
|
|
||||||
# undef SIZEOF_LONG_LONG
|
|
||||||
# undef SIZEOF_UNSIGNED_LONG_LONG
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !defined(ACC_CONFIG_AUTO_NO_SIZES) */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// misc
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(HAVE_SIGNAL) && !defined(RETSIGTYPE)
|
|
||||||
# define RETSIGTYPE void
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* C/C++ Compiler - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_CC_UNKNOWN [default]
|
|
||||||
* ACC_CC_GNUC
|
|
||||||
* ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(__INTEL_COMPILER)
|
|
||||||
# define ACC_CC_INTELC 1
|
|
||||||
# define ACC_INFO_CC "Intel C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__INTEL_COMPILER)
|
|
||||||
#elif defined(__POCC__)
|
|
||||||
# define ACC_CC_PELLESC 1
|
|
||||||
# define ACC_INFO_CC "Pelles C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__POCC__)
|
|
||||||
#elif defined(__GNUC__) && defined(__VERSION__)
|
|
||||||
# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
|
||||||
# define ACC_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__)
|
|
||||||
# elif defined(__GNUC_MINOR__)
|
|
||||||
# define ACC_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100)
|
|
||||||
# else
|
|
||||||
# define ACC_CC_GNUC (__GNUC__ * 0x10000L)
|
|
||||||
# endif
|
|
||||||
# define ACC_INFO_CC "gcc"
|
|
||||||
# define ACC_INFO_CCVER __VERSION__
|
|
||||||
#elif defined(__AZTEC_C__)
|
|
||||||
# define ACC_CC_AZTECC 1
|
|
||||||
# define ACC_INFO_CC "Aztec C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__AZTEC_C__)
|
|
||||||
#elif defined(__BORLANDC__)
|
|
||||||
# define ACC_CC_BORLANDC 1
|
|
||||||
# define ACC_INFO_CC "Borland C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__BORLANDC__)
|
|
||||||
#elif defined(__DMC__)
|
|
||||||
# define ACC_CC_DMC 1
|
|
||||||
# define ACC_INFO_CC "Digital Mars C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__DMC__)
|
|
||||||
#elif defined(__DECC)
|
|
||||||
# define ACC_CC_DECC 1
|
|
||||||
# define ACC_INFO_CC "DEC C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__DECC)
|
|
||||||
#elif defined(__HIGHC__)
|
|
||||||
# define ACC_CC_HIGHC 1
|
|
||||||
# define ACC_INFO_CC "MetaWare High C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__IBMC__)
|
|
||||||
# define ACC_CC_IBMC 1
|
|
||||||
# define ACC_INFO_CC "IBM C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__IBMC__)
|
|
||||||
#elif defined(__KEIL__) && defined(__C166__)
|
|
||||||
# define ACC_CC_KEILC 1
|
|
||||||
# define ACC_INFO_CC "Keil C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__C166__)
|
|
||||||
#elif defined(__LCC__)
|
|
||||||
# define ACC_CC_LCC 1
|
|
||||||
# define ACC_INFO_CC "lcc"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
# define ACC_CC_MSC 1
|
|
||||||
# define ACC_INFO_CC "Microsoft C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(_MSC_VER)
|
|
||||||
#elif defined(__MWERKS__)
|
|
||||||
# define ACC_CC_MWERKS 1
|
|
||||||
# define ACC_INFO_CC "Metrowerks C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__MWERKS__)
|
|
||||||
#elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386)
|
|
||||||
# define ACC_CC_NDPC 1
|
|
||||||
# define ACC_INFO_CC "Microway NDP C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__PACIFIC__)
|
|
||||||
# define ACC_CC_PACIFICC 1
|
|
||||||
# define ACC_INFO_CC "Pacific C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__PACIFIC__)
|
|
||||||
#elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__))
|
|
||||||
# define ACC_CC_PGI 1
|
|
||||||
# define ACC_INFO_CC "Portland Group PGI C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__PUREC__)
|
|
||||||
# define ACC_CC_PUREC 1
|
|
||||||
# define ACC_INFO_CC "Pure C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__PUREC__)
|
|
||||||
#elif defined(__SC__)
|
|
||||||
# define ACC_CC_SYMANTECC 1
|
|
||||||
# define ACC_INFO_CC "Symantec C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__SC__)
|
|
||||||
#elif defined(__SUNPRO_C)
|
|
||||||
# define ACC_CC_SUNPROC 1
|
|
||||||
# define ACC_INFO_CC "Sun C"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#elif defined(__TINYC__)
|
|
||||||
# define ACC_CC_TINYC 1
|
|
||||||
# define ACC_INFO_CC "Tiny C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__TINYC__)
|
|
||||||
#elif defined(__TSC__)
|
|
||||||
# define ACC_CC_TOPSPEEDC 1
|
|
||||||
# define ACC_INFO_CC "TopSpeed C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__TSC__)
|
|
||||||
#elif defined(__WATCOMC__)
|
|
||||||
# define ACC_CC_WATCOMC 1
|
|
||||||
# define ACC_INFO_CC "Watcom C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__WATCOMC__)
|
|
||||||
#elif defined(__TURBOC__)
|
|
||||||
# define ACC_CC_TURBOC 1
|
|
||||||
# define ACC_INFO_CC "Turbo C"
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__TURBOC__)
|
|
||||||
#elif defined(__ZTC__)
|
|
||||||
# define ACC_CC_ZORTECHC 1
|
|
||||||
# define ACC_INFO_CC "Zortech C"
|
|
||||||
# if (__ZTC__ == 0x310)
|
|
||||||
# define ACC_INFO_CCVER "0x310"
|
|
||||||
# else
|
|
||||||
# define ACC_INFO_CCVER ACC_CPP_MACRO_EXPAND(__ZTC__)
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define ACC_CC_UNKNOWN 1
|
|
||||||
# define ACC_INFO_CC "unknown"
|
|
||||||
# define ACC_INFO_CCVER "unknown"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,440 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACCCHK_ASSERT)
|
|
||||||
# define ACCCHK_ASSERT(expr) ACC_COMPILE_TIME_ASSERT(expr)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* compile-time sign */
|
|
||||||
#if !defined(ACCCHK_ASSERT_SIGN_T)
|
|
||||||
# define ACCCHK_ASSERT_SIGN_T(type,relop) \
|
|
||||||
ACCCHK_ASSERT( (type) (-1) relop (type) 0 ) \
|
|
||||||
ACCCHK_ASSERT( (type) (~(type)0) relop (type) 0 ) \
|
|
||||||
ACCCHK_ASSERT( (type) (~(type)0) == (type) (-1) )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ACCCHK_IS_SIGNED_T)
|
|
||||||
# define ACCCHK_ASSERT_IS_SIGNED_T(type) ACCCHK_ASSERT_SIGN_T(type,<)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ACCCHK_IS_UNSIGNED_T)
|
|
||||||
# if (ACC_BROKEN_INTEGRAL_PROMOTION)
|
|
||||||
# define ACCCHK_ASSERT_IS_UNSIGNED_T(type) \
|
|
||||||
ACCCHK_ASSERT( (type) (-1) > (type) 0 )
|
|
||||||
# else
|
|
||||||
# define ACCCHK_ASSERT_IS_UNSIGNED_T(type) ACCCHK_ASSERT_SIGN_T(type,>)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check preprocessor
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_0xffffffffL - ACC_UINT32L_C(4294967294) != 1)
|
|
||||||
# error "preprocessor error 1"
|
|
||||||
#endif
|
|
||||||
#if (ACC_0xffffffffL - ACC_UINT32L_C(0xfffffffd) != 2)
|
|
||||||
# error "preprocessor error 2"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define ACCCHK_VAL 1
|
|
||||||
#define ACCCHK_TMP1 ACCCHK_VAL
|
|
||||||
#undef ACCCHK_VAL
|
|
||||||
#define ACCCHK_VAL 2
|
|
||||||
#define ACCCHK_TMP2 ACCCHK_VAL
|
|
||||||
#if (ACCCHK_TMP1 != 2)
|
|
||||||
# error "preprocessor error 3a"
|
|
||||||
#endif
|
|
||||||
#if (ACCCHK_TMP2 != 2)
|
|
||||||
# error "preprocessor error 3b"
|
|
||||||
#endif
|
|
||||||
#undef ACCCHK_VAL
|
|
||||||
#if (ACCCHK_TMP2)
|
|
||||||
# error "preprocessor error 3c"
|
|
||||||
#endif
|
|
||||||
#if (ACCCHK_TMP2 + 0 != 0)
|
|
||||||
# error "preprocessor error 3d"
|
|
||||||
#endif
|
|
||||||
#undef ACCCHK_TMP1
|
|
||||||
#undef ACCCHK_TMP2
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check basic arithmetics
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(__ACC_INT_MAX(2) == 1)
|
|
||||||
ACCCHK_ASSERT(__ACC_INT_MAX(8) == 127)
|
|
||||||
ACCCHK_ASSERT(__ACC_INT_MAX(16) == 32767)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(2) == 3)
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(16) == 0xffffU)
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(32) == 0xffffffffUL)
|
|
||||||
#if !defined(ACC_BROKEN_INTEGRAL_PROMOTION)
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(__ACC_INT_BIT) == ~(0u))
|
|
||||||
ACCCHK_ASSERT(__ACC_UINT_MAX(__ACC_LONG_BIT) == ~(0ul))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check basic types
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(signed char)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned char)
|
|
||||||
ACCCHK_ASSERT(sizeof(signed char) == sizeof(char))
|
|
||||||
ACCCHK_ASSERT(sizeof(unsigned char) == sizeof(char))
|
|
||||||
ACCCHK_ASSERT(sizeof(char) == 1)
|
|
||||||
ACCCHK_ASSERT(sizeof(char) == sizeof((char)0))
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
ACCCHK_ASSERT(sizeof('\0') == sizeof(char))
|
|
||||||
#else
|
|
||||||
# if (ACC_CC_DMC)
|
|
||||||
/* Digital Mars C is broken */
|
|
||||||
# else
|
|
||||||
ACCCHK_ASSERT(sizeof('\0') == sizeof(int))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if defined(acc_alignof)
|
|
||||||
ACCCHK_ASSERT(acc_alignof(char) == 1)
|
|
||||||
ACCCHK_ASSERT(acc_alignof(signed char) == 1)
|
|
||||||
ACCCHK_ASSERT(acc_alignof(unsigned char) == 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(short)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned short)
|
|
||||||
ACCCHK_ASSERT(sizeof(short) == sizeof(unsigned short))
|
|
||||||
ACCCHK_ASSERT(sizeof(short) >= 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(short) >= sizeof(char))
|
|
||||||
ACCCHK_ASSERT(sizeof(short) == sizeof((short)0))
|
|
||||||
#if (SIZEOF_SHORT > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(short) == SIZEOF_SHORT)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(int)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned int)
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == sizeof(unsigned int))
|
|
||||||
ACCCHK_ASSERT(sizeof(int) >= 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(int) >= sizeof(short))
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == sizeof(0))
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == sizeof((int)0))
|
|
||||||
#if (SIZEOF_INT > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(int) == SIZEOF_INT)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(long)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(unsigned long)
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == sizeof(unsigned long))
|
|
||||||
ACCCHK_ASSERT(sizeof(long) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(long) >= sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == sizeof(0L))
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == sizeof((long)0))
|
|
||||||
#if (SIZEOF_LONG > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(long) == SIZEOF_LONG)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(size_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) >= sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == sizeof(sizeof(0))) /* sizeof() returns size_t */
|
|
||||||
#if (SIZEOF_SIZE_T > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == SIZEOF_SIZE_T)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(ptrdiff_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) >= sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) >= sizeof(size_t))
|
|
||||||
#if !defined(ACC_BROKEN_SIZEOF)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == sizeof((char*)0 - (char*)0))
|
|
||||||
# if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
ACCCHK_ASSERT(4 == sizeof((char __huge*)0 - (char __huge*)0))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_PTRDIFF_T > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == SIZEOF_PTRDIFF_T)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) >= sizeof(char*))
|
|
||||||
#if (SIZEOF_VOID_P > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == SIZEOF_VOID_P)
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_CHAR_P > 0)
|
|
||||||
ACCCHK_ASSERT(sizeof(char*) == SIZEOF_CHAR_P)
|
|
||||||
#endif
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
ACCCHK_ASSERT(4 == sizeof(void __huge*))
|
|
||||||
ACCCHK_ASSERT(4 == sizeof(char __huge*))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check arithmetics
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCCHK_ASSERT((((1u << 15) + 1) >> 15) == 1)
|
|
||||||
ACCCHK_ASSERT((((1ul << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
#if (ACC_CC_TURBOC && (__TURBOC__ < 0x0150))
|
|
||||||
/* TC 1.0 bug, probably due to ACC_BROKEN_INTEGRAL_PROMOTION ?? */
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT((1 << (8*SIZEOF_INT-1)) < 0)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((1u << (8*SIZEOF_INT-1)) > 0)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT((1l << (8*SIZEOF_LONG-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((1ul << (8*SIZEOF_LONG-1)) > 0)
|
|
||||||
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32e_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32e_t) == SIZEOF_ACC_INT32E_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32e_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32e_t) == sizeof(acc_uint32e_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int32e_t)1 << 30) + 1) >> 30) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT32E_C(1) << 30) + 1) >> 30) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint32e_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint32e_t)1 << 31) + 1) >> 31) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT32E_C(1) << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT( (acc_int32e_t) (1 + ~(acc_int32e_t)0) == 0)
|
|
||||||
#if defined(ACCCHK_CONFIG_PEDANTIC)
|
|
||||||
/* compiler may warn about overflow */
|
|
||||||
ACCCHK_ASSERT( (acc_uint32e_t)(1 + ~(acc_uint32e_t)0) == 0)
|
|
||||||
#endif /* ACCCHK_CONFIG_PEDANTIC */
|
|
||||||
|
|
||||||
#if (SIZEOF_ACC_INT32E_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32E_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32E_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32E_C(0)) == SIZEOF_ACC_INT32E_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32E_C(0)) == SIZEOF_ACC_INT32E_T)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((ACC_INT32E_C(1) << (8*SIZEOF_ACC_INT32E_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32E_C(1) << (8*SIZEOF_ACC_INT32E_T-1)) > 0)
|
|
||||||
ACCCHK_ASSERT((ACC_INT32E_C(1) << (int)(8*sizeof(ACC_INT32E_C(1))-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32E_C(1) << (int)(8*sizeof(ACC_UINT32E_C(1))-1)) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32E_C(2147483647) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32E_C(-2147483647) -1 < 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32E_C(4294967295) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32E_C(4294967295) == ACC_0xffffffffL)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) >= sizeof(int))
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) >= sizeof(acc_int32e_t))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) == SIZEOF_ACC_INT32L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32l_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32l_t) == sizeof(acc_uint32l_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int32l_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int32l_t)1 << 30) + 1) >> 30) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT32L_C(1) << 30) + 1) >> 30) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint32l_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint32l_t)1 << 31) + 1) >> 31) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT32L_C(1) << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
#if (SIZEOF_ACC_INT32L_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32L_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32L_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32L_C(0)) == SIZEOF_ACC_INT32L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32L_C(0)) == SIZEOF_ACC_INT32L_T)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((ACC_INT32L_C(1) << (8*SIZEOF_ACC_INT32L_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32L_C(1) << (8*SIZEOF_ACC_INT32L_T-1)) > 0)
|
|
||||||
ACCCHK_ASSERT((ACC_INT32L_C(1) << (int)(8*sizeof(ACC_INT32L_C(1))-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32L_C(1) << (int)(8*sizeof(ACC_UINT32L_C(1))-1)) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32L_C(2147483647) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32L_C(-2147483647) -1 < 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32L_C(4294967295) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32L_C(4294967295) == ACC_0xffffffffL)
|
|
||||||
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(int))
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(acc_int32e_t))
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(acc_int32l_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) >= sizeof(acc_int32l_t))
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) == SIZEOF_ACC_INT32F_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32f_t) >= 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint32f_t) >= sizeof(acc_uint32l_t))
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int32f_t) == sizeof(acc_uint32f_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int32f_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int32f_t)1 << 30) + 1) >> 30) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT32F_C(1) << 30) + 1) >> 30) == 1)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint32f_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint32f_t)1 << 31) + 1) >> 31) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT32F_C(1) << 31) + 1) >> 31) == 1)
|
|
||||||
|
|
||||||
#if (SIZEOF_ACC_INT32F_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32F_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32F_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT32F_C(0)) == SIZEOF_ACC_INT32F_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT32F_C(0)) == SIZEOF_ACC_INT32F_T)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT((ACC_INT32F_C(1) << (8*SIZEOF_ACC_INT32F_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32F_C(1) << (8*SIZEOF_ACC_INT32F_T-1)) > 0)
|
|
||||||
ACCCHK_ASSERT((ACC_INT32F_C(1) << (int)(8*sizeof(ACC_INT32F_C(1))-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT32F_C(1) << (int)(8*sizeof(ACC_UINT32F_C(1))-1)) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32F_C(2147483647) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT32F_C(-2147483647) -1 < 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32F_C(4294967295) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT32F_C(4294967295) == ACC_0xffffffffL)
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(acc_int64l_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int64l_t) >= 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int64l_t) == SIZEOF_ACC_INT64L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_uint64l_t) >= 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_int64l_t) == sizeof(acc_uint64l_t))
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_int64l_t)
|
|
||||||
ACCCHK_ASSERT(((( (acc_int64l_t)1 << 62) + 1) >> 62) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_INT64L_C(1) << 62) + 1) >> 62) == 1)
|
|
||||||
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0530))
|
|
||||||
/* Borland C is broken */
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uint64l_t)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT64L_C(18446744073709551615) > 0)
|
|
||||||
#endif
|
|
||||||
ACCCHK_ASSERT(((( (acc_uint64l_t)1 << 63) + 1) >> 63) == 1)
|
|
||||||
ACCCHK_ASSERT(((( ACC_UINT64L_C(1) << 63) + 1) >> 63) == 1)
|
|
||||||
|
|
||||||
#if defined(ACCCHK_CONFIG_PEDANTIC)
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0560))
|
|
||||||
/* Borland C is broken */
|
|
||||||
#elif (SIZEOF_ACC_INT64L_T < SIZEOF_INT)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT64L_C(0)) == sizeof(int))
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT64L_C(0)) == sizeof(int))
|
|
||||||
#else
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_INT64L_C(0)) == SIZEOF_ACC_INT64L_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(ACC_UINT64L_C(0)) == SIZEOF_ACC_INT64L_T)
|
|
||||||
#endif
|
|
||||||
#endif /* ACCCHK_CONFIG_PEDANTIC */
|
|
||||||
ACCCHK_ASSERT((ACC_INT64L_C(1) << (8*SIZEOF_ACC_INT64L_T-1)) < 0)
|
|
||||||
ACCCHK_ASSERT((ACC_UINT64L_C(1) << (8*SIZEOF_ACC_INT64L_T-1)) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT64L_C(9223372036854775807) > 0)
|
|
||||||
ACCCHK_ASSERT(ACC_INT64L_C(-9223372036854775807) - 1 < 0)
|
|
||||||
|
|
||||||
ACCCHK_ASSERT( ACC_INT64L_C(9223372036854775807) % 2147483629l == 721)
|
|
||||||
ACCCHK_ASSERT( ACC_INT64L_C(9223372036854775807) % 2147483647l == 1)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT64L_C(9223372036854775807) % 2147483629ul == 721)
|
|
||||||
ACCCHK_ASSERT(ACC_UINT64L_C(9223372036854775807) % 2147483647ul == 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
ACCCHK_ASSERT_IS_SIGNED_T(acc_intptr_t)
|
|
||||||
ACCCHK_ASSERT_IS_UNSIGNED_T(acc_uintptr_t)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) >= sizeof(void *))
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == SIZEOF_ACC_INTPTR_T)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(acc_uintptr_t))
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check memory model ACC_MM
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_MM_FLAT)
|
|
||||||
#if 0
|
|
||||||
/* this is not a valid assumption -- disabled */
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == sizeof(void (*)(void)))
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 2)
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
ACCCHK_ASSERT(sizeof(void*) == 4)
|
|
||||||
#endif
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_COMPACT)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 2)
|
|
||||||
#elif (ACC_MM_MEDIUM || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 4)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check ACC_ARCH and ACC_OS
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_ARCH_IA16)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 2)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
|
|
||||||
#elif (ACC_ARCH_IA32 || ACC_ARCH_M68K)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
|
|
||||||
#elif (ACC_ARCH_AMD64 || ACC_ARCH_IA64)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(acc_intptr_t) == sizeof(void *))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_WIN32)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 4)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 4)
|
|
||||||
#elif (ACC_OS_WIN64)
|
|
||||||
ACCCHK_ASSERT(sizeof(size_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(ptrdiff_t) == 8)
|
|
||||||
ACCCHK_ASSERT(sizeof(void (*)(void)) == 8)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// check promotion rules
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_NDPC)
|
|
||||||
/* NDP C is broken */
|
|
||||||
#else
|
|
||||||
/* check that the compiler correctly casts signed to unsigned */
|
|
||||||
ACCCHK_ASSERT( (int) ((unsigned char) ((signed char) -1)) == 255)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_CC_KEILC)
|
|
||||||
/* Keil C is broken */
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
/* NDP C is broken */
|
|
||||||
#elif !defined(ACC_BROKEN_INTEGRAL_PROMOTION) && (SIZEOF_INT > 1)
|
|
||||||
/* check that the compiler correctly promotes integrals */
|
|
||||||
ACCCHK_ASSERT( (((unsigned char)128) << (int)(8*sizeof(int)-8)) < 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__ACCCHKR_FUNCNAME)
|
|
||||||
# define __ACCCHKR_FUNCNAME(f) accchkr_ ## f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(ACCCHKR_ASSERT)
|
|
||||||
|
|
||||||
#if 0 || defined(ACCCHKR_CONFIG_DEBUG)
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
static int __ACCCHKR_FUNCNAME(assert_fail)(const char* s, unsigned l)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "ACCCHKR assertion failed in line %u: `%s'\n", l, s);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#define ACCCHKR_ASSERT(expr) ((expr) ? 1 : __ACCCHKR_FUNCNAME(assert_fail)(#expr,__LINE__))
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define ACCCHKR_ASSERT(expr) ((expr) ? 1 : 0)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* avoid inlining */
|
|
||||||
static int __ACCCHKR_FUNCNAME(schedule_insns_bug)(void);
|
|
||||||
static int __ACCCHKR_FUNCNAME(strength_reduce_bug)(int*);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// main entry
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
static int __ACCCHKR_FUNCNAME(check)(int r)
|
|
||||||
{
|
|
||||||
#if defined(ACC_ENDIAN_BIG_ENDIAN)
|
|
||||||
{
|
|
||||||
union { long l; unsigned char c[sizeof(long)]; } u;
|
|
||||||
u.l = 0; u.c[sizeof(long)-1] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l == 128);
|
|
||||||
u.l = 0; u.c[0] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l < 0);
|
|
||||||
ACC_UNUSED(u);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(ACC_ENDIAN_LITTLE_ENDIAN)
|
|
||||||
{
|
|
||||||
union { long l; unsigned char c[sizeof(long)]; } u;
|
|
||||||
u.l = 0; u.c[0] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l == 128);
|
|
||||||
u.l = 0; u.c[sizeof(long)-1] = 0x80;
|
|
||||||
r &= ACCCHKR_ASSERT(u.l < 0);
|
|
||||||
ACC_UNUSED(u);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check for the gcc schedule-insns optimization bug */
|
|
||||||
if (r == 1)
|
|
||||||
{
|
|
||||||
r &= ACCCHKR_ASSERT(!__ACCCHKR_FUNCNAME(schedule_insns_bug()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for the gcc strength-reduce optimization bug */
|
|
||||||
if (r == 1)
|
|
||||||
{
|
|
||||||
static int x[3];
|
|
||||||
static unsigned xn = 3;
|
|
||||||
register unsigned j;
|
|
||||||
|
|
||||||
for (j = 0; j < xn; j++)
|
|
||||||
x[j] = (int)j - 3;
|
|
||||||
r &= ACCCHKR_ASSERT(!__ACCCHKR_FUNCNAME(strength_reduce_bug(x)));
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
static int __ACCCHKR_FUNCNAME(schedule_insns_bug)(void)
|
|
||||||
{
|
|
||||||
const int a[] = {1, 2, 0}; const int* b;
|
|
||||||
b = a; return (*b) ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int __ACCCHKR_FUNCNAME(strength_reduce_bug)(int* x)
|
|
||||||
{
|
|
||||||
#if 0 && (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
ACC_UNUSED(x); return 0;
|
|
||||||
#else
|
|
||||||
return x[0] != -3 || x[1] != -2 || x[2] != -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_CXX_H_INCLUDED
|
|
||||||
#define __ACC_CXX_H_INCLUDED 1
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// exception specification
|
|
||||||
// ACC_CXX_NOTHROW
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_NOTHROW)
|
|
||||||
#elif (ACC_CC_GNUC && (ACC_CC_GNUC < 0x020800ul))
|
|
||||||
#elif (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0450))
|
|
||||||
#elif (ACC_CC_HIGHC)
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER < 1100))
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
#elif (ACC_CC_WATCOMC && !defined(_CPPUNWIND))
|
|
||||||
#elif (ACC_CC_ZORTECHC)
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_NOTHROW throw()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ACC_CXX_NOTHROW)
|
|
||||||
# define ACC_CXX_NOTHROW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// disable dynamic allocation of an object - private helpers
|
|
||||||
// __ACC_CXX_DO_NEW
|
|
||||||
// __ACC_CXX_DO_DELETE
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__ACC_CXX_DO_NEW)
|
|
||||||
#elif (ACC_CC_NDPC || ACC_CC_PGI)
|
|
||||||
# define __ACC_CXX_DO_NEW { return 0; }
|
|
||||||
#else
|
|
||||||
# define __ACC_CXX_DO_NEW ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* need an implementation in case a class has virtual members */
|
|
||||||
#if defined(__ACC_CXX_DO_DELETE)
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# define __ACC_CXX_DO_DELETE { }
|
|
||||||
#else
|
|
||||||
# define __ACC_CXX_DO_DELETE ACC_CXX_NOTHROW { }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// disable dynamic allocation of an object
|
|
||||||
// ACC_CXX_DISABLE_NEW_DELETE
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
#undef __ACC_CXX_HAVE_ARRAY_NEW
|
|
||||||
#undef __ACC_CXX_HAVE_PLACEMENT_NEW
|
|
||||||
#undef __ACC_CXX_HAVE_PLACEMENT_DELETE
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0450))
|
|
||||||
#elif (ACC_CC_MSC && ACC_MM_HUGE)
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER < 1100))
|
|
||||||
#elif (ACC_CC_NDPC)
|
|
||||||
#elif (ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
#elif (ACC_CC_TURBOC)
|
|
||||||
#elif (ACC_CC_WATCOMC && (__WATCOMC__ < 1100))
|
|
||||||
#else
|
|
||||||
# define __ACC_CXX_HAVE_ARRAY_NEW 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__ACC_CXX_HAVE_ARRAY_NEW)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_NEW 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__ACC_CXX_HAVE_PLACEMENT_NEW)
|
|
||||||
# if (ACC_CC_GNUC >= 0x030000ul)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# elif (ACC_CC_INTELC)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER >= 1200))
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# elif (ACC_CC_PGI)
|
|
||||||
# define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_DISABLE_NEW_DELETE)
|
|
||||||
#elif defined(new) || defined(delete)
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif (ACC_CC_GNUC && (ACC_CC_GNUC < 0x025b00ul))
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif (ACC_CC_HIGHC)
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE private:
|
|
||||||
#elif !defined(__ACC_CXX_HAVE_ARRAY_NEW)
|
|
||||||
/* for old compilers use `protected' instead of `private' */
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE \
|
|
||||||
protected: static void operator delete(void*) __ACC_CXX_DO_DELETE \
|
|
||||||
protected: static void* operator new(size_t) __ACC_CXX_DO_NEW \
|
|
||||||
private:
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_DISABLE_NEW_DELETE \
|
|
||||||
protected: static void operator delete(void*) __ACC_CXX_DO_DELETE \
|
|
||||||
static void operator delete[](void*) __ACC_CXX_DO_DELETE \
|
|
||||||
private: static void* operator new(size_t) __ACC_CXX_DO_NEW \
|
|
||||||
static void* operator new[](size_t) __ACC_CXX_DO_NEW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Assist the compiler by defining a unique location for vtables and RTTI.
|
|
||||||
// Every class which has virtual member functions or derives from a class
|
|
||||||
// with virtual members should put this macro at the very top of its
|
|
||||||
// class declaration.
|
|
||||||
// ACC_CXX_TRIGGER_FUNCTION
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_TRIGGER_FUNCTION)
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_TRIGGER_FUNCTION \
|
|
||||||
protected: virtual const void* acc_cxx_trigger_function() const; \
|
|
||||||
private:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(ACC_CXX_TRIGGER_FUNCTION_IMPL)
|
|
||||||
#else
|
|
||||||
# define ACC_CXX_TRIGGER_FUNCTION_IMPL(klass) \
|
|
||||||
const void* klass::acc_cxx_trigger_function() const { return 0; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,191 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// acc_alignof() / acc_inline
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_GNUC)
|
|
||||||
# define acc_alignof(e) __alignof__(e)
|
|
||||||
#elif (ACC_CC_INTELC && (__INTEL_COMPILER >= 700))
|
|
||||||
# define acc_alignof(e) __alignof__(e)
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 1300))
|
|
||||||
# define acc_alignof(e) __alignof(e)
|
|
||||||
#elif (ACC_CC_PGI)
|
|
||||||
# define acc_alignof(e) __alignof__(e)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_CC_TURBOC && (__TURBOC__ <= 0x0295))
|
|
||||||
#elif defined(__cplusplus)
|
|
||||||
# define acc_inline inline
|
|
||||||
#elif (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0550))
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif (ACC_CC_DMC)
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif (ACC_CC_GNUC)
|
|
||||||
# define acc_inline __inline__
|
|
||||||
#elif (ACC_CC_INTELC)
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 1000))
|
|
||||||
# define acc_inline __inline
|
|
||||||
#elif (ACC_CC_PGI)
|
|
||||||
# define acc_inline __inline__
|
|
||||||
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
|
|
||||||
# define acc_inline inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// ACC_UNUSED / ACC_UNUSED_FUNC
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(ACC_UNUSED)
|
|
||||||
# if (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0600))
|
|
||||||
# define ACC_UNUSED(var) ((void) &var)
|
|
||||||
# elif (ACC_CC_BORLANDC || ACC_CC_HIGHC || ACC_CC_NDPC || ACC_CC_TURBOC)
|
|
||||||
# define ACC_UNUSED(var) if (&var) ; else
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER < 900))
|
|
||||||
# define ACC_UNUSED(var) if (&var) ; else
|
|
||||||
# elif (ACC_CC_GNUC)
|
|
||||||
# define ACC_UNUSED(var) ((void) var)
|
|
||||||
# elif (ACC_CC_KEILC)
|
|
||||||
# define ACC_UNUSED(var)
|
|
||||||
# else
|
|
||||||
# define ACC_UNUSED(var) ((void) &var)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if !defined(ACC_UNUSED_FUNC)
|
|
||||||
# if (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0600))
|
|
||||||
# define ACC_UNUSED_FUNC(func) ((void) func)
|
|
||||||
# elif (ACC_CC_BORLANDC || ACC_CC_NDPC || ACC_CC_TURBOC)
|
|
||||||
# define ACC_UNUSED_FUNC(func) if (func) ; else
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER < 900))
|
|
||||||
# define ACC_UNUSED_FUNC(func) if (func) ; else
|
|
||||||
# elif (ACC_CC_KEILC)
|
|
||||||
# define ACC_UNUSED_FUNC(func)
|
|
||||||
# else
|
|
||||||
# define ACC_UNUSED_FUNC(func) ((void) func)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// compile-time-assertions
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* This can be put into a header file but may get ignored by some compilers. */
|
|
||||||
#if !defined(ACC_COMPILE_TIME_ASSERT_HEADER)
|
|
||||||
# if (ACC_CC_AZTECC || ACC_CC_ZORTECHC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1-!(e)];
|
|
||||||
# elif (ACC_CC_DMC || ACC_CC_SYMANTECC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1u-2*!(e)];
|
|
||||||
# elif (ACC_CC_TURBOC && (__TURBOC__ == 0x0295))
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1-!(e)];
|
|
||||||
# else
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) extern int __acc_cta[1-2*!(e)];
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This must appear within a function body. */
|
|
||||||
#if !defined(ACC_COMPILE_TIME_ASSERT)
|
|
||||||
# if (ACC_CC_AZTECC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) {typedef int __acc_cta_t[1-!(e)];}
|
|
||||||
# elif (ACC_CC_DMC || ACC_CC_PACIFICC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break;
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER < 900))
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break;
|
|
||||||
# elif (ACC_CC_TURBOC && (__TURBOC__ == 0x0295))
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break;
|
|
||||||
# else
|
|
||||||
# define ACC_COMPILE_TIME_ASSERT(e) {typedef int __acc_cta_t[1-2*!(e)];}
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// macros
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__ACC_UINT_MAX)
|
|
||||||
# define __ACC_INT_MAX(b) ((((1l << ((b)-2)) - 1l) * 2l) + 1l)
|
|
||||||
# define __ACC_UINT_MAX(b) ((((1ul << ((b)-1)) - 1ul) * 2ul) + 1ul)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// get sizes of builtin integral types from <limits.h>
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if !defined(__ACC_SHORT_BIT)
|
|
||||||
# if (USHRT_MAX == ACC_0xffffL)
|
|
||||||
# define __ACC_SHORT_BIT 16
|
|
||||||
# elif (USHRT_MAX == ACC_0xffffffffL)
|
|
||||||
# define __ACC_SHORT_BIT 32
|
|
||||||
# elif (USHRT_MAX == __ACC_UINT_MAX(64))
|
|
||||||
# define __ACC_SHORT_BIT 64
|
|
||||||
# elif (USHRT_MAX == __ACC_UINT_MAX(128))
|
|
||||||
# define __ACC_SHORT_BIT 128
|
|
||||||
# else
|
|
||||||
# error "check your compiler installation: USHRT_MAX"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__ACC_INT_BIT)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define __ACC_INT_BIT 16
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define __ACC_INT_BIT 32
|
|
||||||
# elif (UINT_MAX == __ACC_UINT_MAX(64))
|
|
||||||
# define __ACC_INT_BIT 64
|
|
||||||
# elif (UINT_MAX == __ACC_UINT_MAX(128))
|
|
||||||
# define __ACC_INT_BIT 128
|
|
||||||
# else
|
|
||||||
# error "check your compiler installation: UINT_MAX"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__ACC_LONG_BIT)
|
|
||||||
# if (ULONG_MAX == ACC_0xffffffffL)
|
|
||||||
# define __ACC_LONG_BIT 32
|
|
||||||
# elif (ULONG_MAX == __ACC_UINT_MAX(64))
|
|
||||||
# define __ACC_LONG_BIT 64
|
|
||||||
# elif (ULONG_MAX == __ACC_UINT_MAX(128))
|
|
||||||
# define __ACC_LONG_BIT 128
|
|
||||||
# else
|
|
||||||
# error "check your compiler installation: ULONG_MAX"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// acc_auto.h supplements
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_CYGWIN || (ACC_OS_EMX && defined(__RSXNT__)) || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# if (ACC_CC_WATCOMC && (__WATCOMC__ < 1000))
|
|
||||||
# elif (ACC_OS_WIN32 && ACC_CC_GNUC) && defined(__PW32__)
|
|
||||||
/* ancient pw32 version */
|
|
||||||
# elif ((ACC_OS_CYGWIN || defined(__MINGW32__)) && (ACC_CC_GNUC && (ACC_CC_GNUC < 0x025f00ul)))
|
|
||||||
/* ancient cygwin/mingw version */
|
|
||||||
# else
|
|
||||||
# define ACC_HAVE_WINDOWS_H 1
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_INCD_H_INCLUDED
|
|
||||||
#define __ACC_INCD_H_INCLUDED 1
|
|
||||||
|
|
||||||
/* default system includes */
|
|
||||||
/* see Autoconf:
|
|
||||||
* headers.m4, _AC_INCLUDES_DEFAULT_REQUIREMENTS ac_includes_default
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#if defined(HAVE_TIME_H) && defined(__MSL__) && defined(__cplusplus)
|
|
||||||
# include <time.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_SYS_TYPES_H
|
|
||||||
# include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_SYS_STAT_H
|
|
||||||
# include <sys/stat.h>
|
|
||||||
#endif
|
|
||||||
#if STDC_HEADERS
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <stddef.h>
|
|
||||||
#else
|
|
||||||
# if HAVE_STDLIB_H
|
|
||||||
# include <stdlib.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if HAVE_STRING_H
|
|
||||||
# if !STDC_HEADERS && HAVE_MEMORY_H
|
|
||||||
# include <memory.h>
|
|
||||||
# endif
|
|
||||||
# include <string.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_STRINGS_H
|
|
||||||
# include <strings.h>
|
|
||||||
#endif
|
|
||||||
#if HAVE_INTTYPES_H
|
|
||||||
# include <inttypes.h>
|
|
||||||
#else
|
|
||||||
# if HAVE_STDINT_H
|
|
||||||
# include <stdint.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_INCE_H_INCLUDED
|
|
||||||
#define __ACC_INCE_H_INCLUDED 1
|
|
||||||
|
|
||||||
/* extra system includes */
|
|
||||||
|
|
||||||
#if defined(HAVE_STDARG_H)
|
|
||||||
# include <stdarg.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_CTYPE_H)
|
|
||||||
# include <ctype.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_ERRNO_H)
|
|
||||||
# include <errno.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_MALLOC_H)
|
|
||||||
# include <malloc.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_ALLOCA_H)
|
|
||||||
# include <alloca.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_FCNTL_H)
|
|
||||||
# include <fcntl.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_DIRENT_H)
|
|
||||||
# include <dirent.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_SETJMP_H)
|
|
||||||
# include <setjmp.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_SIGNAL_H)
|
|
||||||
# include <signal.h>
|
|
||||||
#endif
|
|
||||||
#if defined(TIME_WITH_SYS_TIME)
|
|
||||||
# include <sys/time.h>
|
|
||||||
# include <time.h>
|
|
||||||
#elif defined(HAVE_TIME_H)
|
|
||||||
# include <time.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_UTIME_H)
|
|
||||||
# include <utime.h>
|
|
||||||
#elif defined(HAVE_SYS_UTIME_H)
|
|
||||||
# include <sys/utime.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* DOS, OS/2 & Windows */
|
|
||||||
#if defined(HAVE_IO_H)
|
|
||||||
# include <io.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_DOS_H)
|
|
||||||
# include <dos.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_DIRECT_H)
|
|
||||||
# include <direct.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_SHARE_H)
|
|
||||||
# include <share.h>
|
|
||||||
#endif
|
|
||||||
#if defined(ACC_CC_NDPC)
|
|
||||||
# include <os.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TOS */
|
|
||||||
#if defined(__TOS__) && (defined(__PUREC__) || defined(__TURBOC__))
|
|
||||||
# include <ext.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_INCI_H_INCLUDED
|
|
||||||
#define __ACC_INCI_H_INCLUDED 1
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// internal system includes
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# include <tos.h>
|
|
||||||
#elif (ACC_HAVE_WINDOWS_H)
|
|
||||||
# if 1 && !defined(WIN32_LEAN_AND_MEAN)
|
|
||||||
# define WIN32_LEAN_AND_MEAN 1
|
|
||||||
# endif
|
|
||||||
# if 1 && !defined(_WIN32_WINNT)
|
|
||||||
/* Restrict to a subset of Windows NT 4.0 header files */
|
|
||||||
# define _WIN32_WINNT 0x0400
|
|
||||||
# endif
|
|
||||||
# include <windows.h>
|
|
||||||
# if (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# include <dir.h>
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_WIN16)
|
|
||||||
# if (ACC_CC_AZTECC)
|
|
||||||
# include <model.h>
|
|
||||||
# include <stat.h>
|
|
||||||
# elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
# include <alloc.h>
|
|
||||||
# include <dir.h>
|
|
||||||
# elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# include <sys/exceptn.h>
|
|
||||||
# elif (ACC_CC_PACIFICC)
|
|
||||||
# include <unixio.h>
|
|
||||||
# include <stat.h>
|
|
||||||
# include <sys.h>
|
|
||||||
# elif (ACC_CC_WATCOMC)
|
|
||||||
# include <i86.h>
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_OS216)
|
|
||||||
# if (ACC_CC_WATCOMC)
|
|
||||||
# include <i86.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
//
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# if defined(FP_OFF)
|
|
||||||
# define ACC_FP_OFF(x) FP_OFF(x)
|
|
||||||
# elif defined(_FP_OFF)
|
|
||||||
# define ACC_FP_OFF(x) _FP_OFF(x)
|
|
||||||
# else
|
|
||||||
# define ACC_FP_OFF(x) (((const unsigned __far*)&(x))[0])
|
|
||||||
# endif
|
|
||||||
# if defined(FP_SEG)
|
|
||||||
# define ACC_FP_SEG(x) FP_SEG(x)
|
|
||||||
# elif defined(_FP_SEG)
|
|
||||||
# define ACC_FP_SEG(x) _FP_SEG(x)
|
|
||||||
# else
|
|
||||||
# define ACC_FP_SEG(x) (((const unsigned __far*)&(x))[1])
|
|
||||||
# endif
|
|
||||||
# if defined(MK_FP)
|
|
||||||
# define ACC_MK_FP(s,o) MK_FP(s,o)
|
|
||||||
# elif defined(_MK_FP)
|
|
||||||
# define ACC_MK_FP(s,o) _MK_FP(s,o)
|
|
||||||
# else
|
|
||||||
# define ACC_MK_FP(s,o) ((void __far*)(((unsigned long)(s)<<16)+(unsigned)(o)))
|
|
||||||
# endif
|
|
||||||
# if 0
|
|
||||||
# undef ACC_FP_OFF
|
|
||||||
# undef ACC_FP_SEG
|
|
||||||
# undef ACC_MK_FP
|
|
||||||
# define ACC_FP_OFF(x) (((const unsigned __far*)&(x))[0])
|
|
||||||
# define ACC_FP_SEG(x) (((const unsigned __far*)&(x))[1])
|
|
||||||
# define ACC_MK_FP(s,o) ((void __far*)(((unsigned long)(s)<<16)+(unsigned)(o)))
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// preprocessor
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* workaround for preprocessor bugs in some compilers */
|
|
||||||
#if 0
|
|
||||||
#define ACC_0xffffL 0xfffful
|
|
||||||
#define ACC_0xffffffffL 0xfffffffful
|
|
||||||
#else
|
|
||||||
#define ACC_0xffffL 65535ul
|
|
||||||
#define ACC_0xffffffffL 4294967295ul
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* some things we cannot work around */
|
|
||||||
#if (ACC_0xffffL == ACC_0xffffffffL)
|
|
||||||
# error "your preprocessor is broken 1"
|
|
||||||
#endif
|
|
||||||
#if (16ul * 16384ul != 262144ul)
|
|
||||||
# error "your preprocessor is broken 2"
|
|
||||||
#endif
|
|
||||||
#if 0
|
|
||||||
#if (32767 >= 4294967295ul)
|
|
||||||
# error "your preprocessor is broken 3"
|
|
||||||
#endif
|
|
||||||
#if (65535u >= 4294967295ul)
|
|
||||||
# error "your preprocessor is broken 4"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// try to detect specific compilers
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (UINT_MAX == ACC_0xffffL)
|
|
||||||
#if defined(__ZTC__) && defined(__I86__) && !defined(__OS2__)
|
|
||||||
# if !defined(MSDOS)
|
|
||||||
# define MSDOS 1
|
|
||||||
# endif
|
|
||||||
# if !defined(_MSDOS)
|
|
||||||
# define _MSDOS 1
|
|
||||||
# endif
|
|
||||||
#elif defined(__VERSION) && defined(MB_LEN_MAX)
|
|
||||||
# if (__VERSION == 520) && (MB_LEN_MAX == 1)
|
|
||||||
# if !defined(__AZTEC_C__)
|
|
||||||
# define __AZTEC_C__ __VERSION
|
|
||||||
# endif
|
|
||||||
# if !defined(__DOS__)
|
|
||||||
# define __DOS__ 1
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// fix incorrect and missing stuff
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* Microsoft C does not correctly define ptrdiff_t for
|
|
||||||
* the 16-bit huge memory model.
|
|
||||||
*/
|
|
||||||
#if defined(_MSC_VER) && defined(M_I86HM) && (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ptrdiff_t long
|
|
||||||
# define _PTRDIFF_T_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Fix old compiler versions. */
|
|
||||||
#if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# undef __ACC_RENAME_A
|
|
||||||
# undef __ACC_RENAME_B
|
|
||||||
# if defined(__AZTEC_C__) && defined(__DOS__)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif defined(_MSC_VER) && defined(MSDOS)
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif (_MSC_VER < 700)
|
|
||||||
# define __ACC_RENAME_B 1
|
|
||||||
# endif
|
|
||||||
# elif defined(__TSC__) && defined(__OS2__)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif defined(__MSDOS__) && defined(__TURBOC__) && (__TURBOC__ < 0x0410)
|
|
||||||
# define __ACC_RENAME_A 1
|
|
||||||
# elif defined(__PACIFIC__) && defined(DOS)
|
|
||||||
# if !defined(__far)
|
|
||||||
# define __far far
|
|
||||||
# endif
|
|
||||||
# if !defined(__near)
|
|
||||||
# define __near near
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# if defined(__ACC_RENAME_A)
|
|
||||||
# if !defined(__cdecl)
|
|
||||||
# define __cdecl cdecl
|
|
||||||
# endif
|
|
||||||
# if !defined(__far)
|
|
||||||
# define __far far
|
|
||||||
# endif
|
|
||||||
# if !defined(__huge)
|
|
||||||
# define __huge huge
|
|
||||||
# endif
|
|
||||||
# if !defined(__near)
|
|
||||||
# define __near near
|
|
||||||
# endif
|
|
||||||
# if !defined(__pascal)
|
|
||||||
# define __pascal pascal
|
|
||||||
# endif
|
|
||||||
# if !defined(__huge)
|
|
||||||
# define __huge huge
|
|
||||||
# endif
|
|
||||||
# elif defined(__ACC_RENAME_B)
|
|
||||||
# if !defined(__cdecl)
|
|
||||||
# define __cdecl _cdecl
|
|
||||||
# endif
|
|
||||||
# if !defined(__far)
|
|
||||||
# define __far _far
|
|
||||||
# endif
|
|
||||||
# if !defined(__huge)
|
|
||||||
# define __huge _huge
|
|
||||||
# endif
|
|
||||||
# if !defined(__near)
|
|
||||||
# define __near _near
|
|
||||||
# endif
|
|
||||||
# if !defined(__pascal)
|
|
||||||
# define __pascal _pascal
|
|
||||||
# endif
|
|
||||||
# elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__)
|
|
||||||
# if !defined(__cdecl)
|
|
||||||
# define __cdecl cdecl
|
|
||||||
# endif
|
|
||||||
# if !defined(__pascal)
|
|
||||||
# define __pascal pascal
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# undef __ACC_RENAME_A
|
|
||||||
# undef __ACC_RENAME_B
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (UINT_MAX == ACC_0xffffL)
|
|
||||||
#if defined(__AZTEC_C__) && defined(__DOS__)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
#elif defined(_MSC_VER) && defined(MSDOS)
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
# endif
|
|
||||||
# if (_MSC_VER < 700)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_PROMOTION 1
|
|
||||||
# define ACC_BROKEN_SIZEOF 1
|
|
||||||
# endif
|
|
||||||
#elif defined(__PACIFIC__) && defined(DOS)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
#elif defined(__TURBOC__) && defined(__MSDOS__)
|
|
||||||
# if (__TURBOC__ < 0x0150)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
# define ACC_BROKEN_INTEGRAL_PROMOTION 1
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0200)
|
|
||||||
# define ACC_BROKEN_SIZEOF 1
|
|
||||||
# endif
|
|
||||||
# if (__TURBOC__ < 0x0400) && defined(__cplusplus)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
# endif
|
|
||||||
#elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__)
|
|
||||||
# define ACC_BROKEN_CDECL_ALT_SYNTAX 1
|
|
||||||
# define ACC_BROKEN_SIZEOF 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if defined(__WATCOMC__) && (__WATCOMC__ < 900)
|
|
||||||
# define ACC_BROKEN_INTEGRAL_CONSTANTS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// ANSI C preprocessor macros (cpp)
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#define ACC_CPP_STRINGIZE(x) #x
|
|
||||||
#define ACC_CPP_MACRO_EXPAND(x) ACC_CPP_STRINGIZE(x)
|
|
||||||
|
|
||||||
/* concatenate */
|
|
||||||
#define ACC_CPP_CONCAT2(a,b) a ## b
|
|
||||||
#define ACC_CPP_CONCAT3(a,b,c) a ## b ## c
|
|
||||||
#define ACC_CPP_CONCAT4(a,b,c,d) a ## b ## c ## d
|
|
||||||
#define ACC_CPP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e
|
|
||||||
|
|
||||||
/* expand and concatenate (by using one level of indirection) */
|
|
||||||
#define ACC_CPP_ECONCAT2(a,b) ACC_CPP_CONCAT2(a,b)
|
|
||||||
#define ACC_CPP_ECONCAT3(a,b,c) ACC_CPP_CONCAT3(a,b,c)
|
|
||||||
#define ACC_CPP_ECONCAT4(a,b,c,d) ACC_CPP_CONCAT4(a,b,c,d)
|
|
||||||
#define ACC_CPP_ECONCAT5(a,b,c,d,e) ACC_CPP_CONCAT5(a,b,c,d,e)
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// stdc macros
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
# undef __STDC_CONSTANT_MACROS
|
|
||||||
# undef __STDC_LIMIT_MACROS
|
|
||||||
# define __STDC_CONSTANT_MACROS 1
|
|
||||||
# define __STDC_LIMIT_MACROS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// misc macros
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
# define ACC_EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
# define ACC_EXTERN_C extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(ACC_VERSION)
|
|
||||||
# if defined ACC_CONFIG_INCLUDE
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc.h")
|
|
||||||
# else
|
|
||||||
# include "acc.h"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_INCD_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_incd.h")
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_INCE_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_ince.h")
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_INCI_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_inci.h")
|
|
||||||
#endif
|
|
||||||
#ifndef __ACC_LIB_H_INCLUDED
|
|
||||||
# include ACC_CONFIG_INCLUDE("acc_lib.h")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/bele.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hmemcpy.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hstring.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/halloc.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/dosalloc.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hfread.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/hread.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/opendir.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/rand.ch")
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/misc.ch")
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* modules which use floating point are not included by default */
|
|
||||||
#include ACC_CONFIG_INCLUDE("acclib/uclock.ch")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,528 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ACC_LIB_H_INCLUDED
|
|
||||||
#define __ACC_LIB_H_INCLUDED 1
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__ACCLIB_FUNCNAME)
|
|
||||||
# define __ACCLIB_FUNCNAME(f) f
|
|
||||||
#endif
|
|
||||||
#if !defined(ACCLIB_EXTERN)
|
|
||||||
# define ACCLIB_EXTERN(r,f) extern r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__ACCLIB_CONST_CAST_RETURN)
|
|
||||||
#if (ACC_CC_GNUC)
|
|
||||||
# define __ACCLIB_CONST_CAST_RETURN(type,var) \
|
|
||||||
{ union { type a; const type b; } u; u.b = (var); return u.a; }
|
|
||||||
#else
|
|
||||||
# define __ACCLIB_CONST_CAST_RETURN(type,var) return (type) (var);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_WIN64)
|
|
||||||
# define acclib_handle_t acc_int64l_t
|
|
||||||
# define acclib_uhandle_t acc_uint64l_t
|
|
||||||
#elif (ACC_ARCH_IA32 && ACC_CC_MSC && (_MSC_VER >= 1300))
|
|
||||||
typedef __w64 long acclib_handle_t;
|
|
||||||
typedef __w64 unsigned long acclib_uhandle_t;
|
|
||||||
# define acclib_handle_t acclib_handle_t
|
|
||||||
# define acclib_uhandle_t acclib_uhandle_t
|
|
||||||
#else
|
|
||||||
# define acclib_handle_t long
|
|
||||||
# define acclib_uhandle_t unsigned long
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap <ctype.h>
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_digit) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_islower) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_isupper) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_tolower) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_toupper) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_utolower) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_utoupper) (int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define acc_ascii_isdigit(c) (((unsigned)(c) - 48) < 10)
|
|
||||||
#define acc_ascii_islower(c) (((unsigned)(c) - 97) < 26)
|
|
||||||
#define acc_ascii_isupper(c) (((unsigned)(c) - 65) < 26)
|
|
||||||
#define acc_ascii_tolower(c) ((int)(c) + (acc_ascii_isupper(c) << 5))
|
|
||||||
#define acc_ascii_toupper(c) ((int)(c) - (acc_ascii_islower(c) << 5))
|
|
||||||
|
|
||||||
#define acc_ascii_utolower(c) acc_ascii_tolower((unsigned char)(c))
|
|
||||||
#define acc_ascii_utoupper(c) acc_ascii_toupper((unsigned char)(c))
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// huge pointer layer
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifndef acc_hsize_t
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
# define acc_hsize_t unsigned long
|
|
||||||
# define acc_hvoid_p void __huge *
|
|
||||||
# define acc_hchar_p char __huge *
|
|
||||||
# define acc_hchar_pp char __huge * __huge *
|
|
||||||
# define acc_hbyte_p unsigned char __huge *
|
|
||||||
#else
|
|
||||||
# define acc_hsize_t size_t
|
|
||||||
# define acc_hvoid_p void *
|
|
||||||
# define acc_hchar_p char *
|
|
||||||
# define acc_hchar_pp char **
|
|
||||||
# define acc_hbyte_p unsigned char *
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef ACC_FILE_P
|
|
||||||
#define ACC_FILE_P FILE *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* halloc */
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_halloc) (acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(void, acc_hfree) (acc_hvoid_p);
|
|
||||||
|
|
||||||
/* dos_alloc */
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216)
|
|
||||||
ACCLIB_EXTERN(void __far*, acc_dos_alloc) (unsigned long);
|
|
||||||
ACCLIB_EXTERN(int, acc_dos_free) (void __far*);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* string */
|
|
||||||
ACCLIB_EXTERN(int, acc_hmemcmp) (const acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemcpy) (acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemmove) (acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemset) (acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
|
|
||||||
/* string */
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrlen) (const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrcmp) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrncmp)(const acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_hstricmp) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_hstrnicmp)(const acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_ascii_hmemicmp) (const acc_hvoid_p, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrstr) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstristr) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemmem) (const acc_hvoid_p, acc_hsize_t, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemimem) (const acc_hvoid_p, acc_hsize_t, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrcpy) (acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrcat) (acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrlcpy) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrlcat) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrscpy) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(int, acc_hstrscat) (acc_hchar_p, const acc_hchar_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrccpy) (acc_hchar_p, const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemccpy) (acc_hvoid_p, const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrchr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrrchr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrichr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrrichr) (const acc_hchar_p, int);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemchr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_hmemrchr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemichr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemrichr) (const acc_hvoid_p, int, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrrspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrcspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hstrrcspn) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrpbrk) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrrpbrk) (const acc_hchar_p, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrsep) (acc_hchar_pp, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_hstrrsep) (acc_hchar_pp, const acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrlwr) (acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrupr) (acc_hchar_p);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemlwr) (acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemupr) (acc_hvoid_p, acc_hsize_t);
|
|
||||||
|
|
||||||
/* stdio */
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hfread) (ACC_FILE_P, acc_hvoid_p, acc_hsize_t);
|
|
||||||
ACCLIB_EXTERN(acc_hsize_t, acc_hfwrite) (ACC_FILE_P, const acc_hvoid_p, acc_hsize_t);
|
|
||||||
|
|
||||||
/* io */
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
ACCLIB_EXTERN(long, acc_hread) (int, acc_hvoid_p, long);
|
|
||||||
ACCLIB_EXTERN(long, acc_hwrite) (int, const acc_hvoid_p, long);
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(long, acc_safe_hread) (int, acc_hvoid_p, long);
|
|
||||||
ACCLIB_EXTERN(long, acc_safe_hwrite) (int, const acc_hvoid_p, long);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap filename limits
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
/* maximum length of full pathname (excl. '\0') */
|
|
||||||
#if !defined(ACC_FN_PATH_MAX)
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
# define ACC_FN_PATH_MAX 143
|
|
||||||
#elif (ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# define ACC_FN_PATH_MAX 259
|
|
||||||
#elif (ACC_OS_TOS)
|
|
||||||
# define ACC_FN_PATH_MAX 259
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if !defined(ACC_FN_PATH_MAX)
|
|
||||||
/* arbitrary limit for acclib implementation */
|
|
||||||
# define ACC_FN_PATH_MAX 1024
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* maximum length of a filename (a single path component) (excl. '\0') */
|
|
||||||
#if !defined(ACC_FN_NAME_MAX)
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
# define ACC_FN_NAME_MAX 12
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# define ACC_FN_NAME_MAX 12
|
|
||||||
#elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
#elif (ACC_OS_DOS32)
|
|
||||||
# define ACC_FN_NAME_MAX 12
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if !defined(ACC_FN_NAME_MAX)
|
|
||||||
# define ACC_FN_NAME_MAX ACC_FN_PATH_MAX
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define ACC_FNMATCH_NOESCAPE 1
|
|
||||||
#define ACC_FNMATCH_PATHNAME 2
|
|
||||||
#define ACC_FNMATCH_PATHSTAR 4
|
|
||||||
#define ACC_FNMATCH_PERIOD 8
|
|
||||||
#define ACC_FNMATCH_ASCII_CASEFOLD 16
|
|
||||||
ACCLIB_EXTERN(int, acc_fnmatch) (const acc_hchar_p, const acc_hchar_p, int);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap <dirent.h>
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#undef __ACCLIB_USE_OPENDIR
|
|
||||||
#if (HAVE_DIRENT_H || ACC_CC_WATCOMC)
|
|
||||||
# define __ACCLIB_USE_OPENDIR 1
|
|
||||||
# if (ACC_OS_DOS32 && defined(__BORLANDC__))
|
|
||||||
# elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# elif (ACC_OS_OS2 || ACC_OS_OS216)
|
|
||||||
# elif (ACC_OS_TOS && ACC_CC_GNUC)
|
|
||||||
# elif (ACC_OS_WIN32 && !defined(ACC_HAVE_WINDOWS_H))
|
|
||||||
# elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_TOS || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# undef __ACCLIB_USE_OPENDIR
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
#if defined(__ACCLIB_USE_OPENDIR)
|
|
||||||
void *u_dirp; /* private */
|
|
||||||
# if (ACC_CC_WATCOMC)
|
|
||||||
unsigned short f_time;
|
|
||||||
unsigned short f_date;
|
|
||||||
unsigned long f_size;
|
|
||||||
# endif
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
#elif (ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
acclib_handle_t u_handle; /* private */
|
|
||||||
unsigned f_attr;
|
|
||||||
unsigned f_size_low;
|
|
||||||
unsigned f_size_high;
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
#elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_TOS || ACC_OS_WIN16)
|
|
||||||
char u_dta[21]; /* private */
|
|
||||||
unsigned char f_attr;
|
|
||||||
unsigned short f_time;
|
|
||||||
unsigned short f_date;
|
|
||||||
unsigned short f_size_low;
|
|
||||||
unsigned short f_size_high;
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
char u_dirp; /* private */
|
|
||||||
#else
|
|
||||||
void *u_dirp; /* private */
|
|
||||||
char f_name[ACC_FN_NAME_MAX+1];
|
|
||||||
#endif
|
|
||||||
} acc_dir_t;
|
|
||||||
|
|
||||||
#ifndef acc_dir_p
|
|
||||||
#define acc_dir_p acc_dir_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(int, acc_opendir) (acc_dir_p, const char*);
|
|
||||||
ACCLIB_EXTERN(int, acc_readdir) (acc_dir_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_closedir) (acc_dir_p);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// wrap misc
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_GNUC) && (defined(__CYGWIN__) || defined(__MINGW32__))
|
|
||||||
# define acc_alloca(x) __builtin_alloca((x))
|
|
||||||
#elif (ACC_CC_BORLANDC) && defined(__linux__)
|
|
||||||
/* FIXME: alloca does not work */
|
|
||||||
#elif (HAVE_ALLOCA)
|
|
||||||
# define acc_alloca(x) alloca((x))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__)
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0410))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0400))
|
|
||||||
# if (ACC_OS_WIN16) && (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
# else
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
# endif
|
|
||||||
#elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && (ACC_CC_DMC || ACC_CC_SYMANTECC))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16) && ACC_CC_MSC && (_MSC_VER >= 700))
|
|
||||||
# define acc_stackavail() _stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16) && ACC_CC_MSC)
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && ACC_CC_TURBOC && (__TURBOC__ >= 0x0450))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_TURBOC && (__TURBOC__ >= 0x0400))
|
|
||||||
ACC_EXTERN_C size_t __cdecl stackavail(void);
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && (ACC_CC_WATCOMC))
|
|
||||||
# define acc_stackavail() stackavail()
|
|
||||||
#elif (ACC_ARCH_IA16 && ACC_CC_ZORTECHC)
|
|
||||||
# define acc_stackavail() _chkstack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(acclib_handle_t, acc_get_osfhandle) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_isatty) (int);
|
|
||||||
ACCLIB_EXTERN(int, acc_mkdir) (const char*, unsigned);
|
|
||||||
ACCLIB_EXTERN(int, acc_response) (int*, char***);
|
|
||||||
ACCLIB_EXTERN(int, acc_set_binmode) (int, int);
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(acc_int32l_t, acc_muldiv32) (acc_int32l_t, acc_int32l_t, acc_int32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_umuldiv32) (acc_uint32l_t, acc_uint32l_t, acc_uint32l_t);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// uclock (real, i.e. "wall" clock)
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
ACCLIB_EXTERN(int, acc_tsc_read) (acc_uint32e_t*);
|
|
||||||
ACCLIB_EXTERN(int, acc_tsc_read_add) (acc_uint32e_t*);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acclib_handle_t h;
|
|
||||||
int mode;
|
|
||||||
#if (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t)
|
|
||||||
double qpf;
|
|
||||||
#endif
|
|
||||||
} acc_uclock_handle_t;
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
union {
|
|
||||||
acc_uint32l_t t32;
|
|
||||||
#if !(ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
double td;
|
|
||||||
# if defined(acc_int64l_t)
|
|
||||||
acc_int64l_t t64;
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
} ticks;
|
|
||||||
#if (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t)
|
|
||||||
acc_int64l_t qpc;
|
|
||||||
#endif
|
|
||||||
} acc_uclock_t;
|
|
||||||
|
|
||||||
#ifndef acc_uclock_handle_p
|
|
||||||
#define acc_uclock_handle_p acc_uclock_handle_t *
|
|
||||||
#endif
|
|
||||||
#ifndef acc_uclock_p
|
|
||||||
#define acc_uclock_p acc_uclock_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(int, acc_uclock_open) (acc_uclock_handle_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_uclock_close) (acc_uclock_handle_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_uclock_read) (acc_uclock_handle_p, acc_uclock_p);
|
|
||||||
ACCLIB_EXTERN(double, acc_uclock_get_elapsed) (acc_uclock_handle_p, const acc_uclock_p, const acc_uclock_p);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// performance counters (virtual clock)
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_int64l_t)
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
#if (ACC_OS_POSIX_LINUX)
|
|
||||||
void* h;
|
|
||||||
unsigned cpu_type, cpu_features, cpu_khz, cpu_nrctrs;
|
|
||||||
const char* cpu_name;
|
|
||||||
#else
|
|
||||||
void* h;
|
|
||||||
#endif
|
|
||||||
} acc_perfctr_handle_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
acc_uint64l_t tsc;
|
|
||||||
#if (ACC_OS_POSIX_LINUX)
|
|
||||||
acc_uint64l_t pmc[18];
|
|
||||||
#else
|
|
||||||
acc_uint64l_t pmc[1];
|
|
||||||
#endif
|
|
||||||
} acc_perfctr_clock_t;
|
|
||||||
|
|
||||||
#ifndef acc_perfctr_handle_p
|
|
||||||
#define acc_perfctr_handle_p acc_perfctr_handle_t *
|
|
||||||
#endif
|
|
||||||
#ifndef acc_perfctr_clock_p
|
|
||||||
#define acc_perfctr_clock_p acc_perfctr_clock_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(int, acc_perfctr_open) (acc_perfctr_handle_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_perfctr_close) (acc_perfctr_handle_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_perfctr_read) (acc_perfctr_handle_p, acc_perfctr_clock_p);
|
|
||||||
ACCLIB_EXTERN(double, acc_perfctr_get_elapsed) (acc_perfctr_handle_p, const acc_perfctr_clock_p, const acc_perfctr_clock_p);
|
|
||||||
ACCLIB_EXTERN(double, acc_perfctr_get_elapsed_tsc) (acc_perfctr_handle_p, acc_uint64l_t);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// Big Endian / Little Endian
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(unsigned, acc_get_be16) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_be24) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_be32) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be16) (acc_hvoid_p, unsigned);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be24) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be32) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(unsigned, acc_get_le16) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_le24) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_get_le32) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le16) (acc_hvoid_p, unsigned);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le24) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le32) (acc_hvoid_p, acc_uint32l_t);
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
ACCLIB_EXTERN(acc_uint64l_t, acc_get_be64) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_be64) (acc_hvoid_p, acc_uint64l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint64l_t, acc_get_le64) (const acc_hvoid_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_set_le64) (acc_hvoid_p, acc_uint64l_t);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* inline versions */
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
# define ACC_GET_LE16(p) (* (const unsigned short *) (p))
|
|
||||||
# define ACC_GET_LE32(p) (* (const acc_uint32e_t *) (p))
|
|
||||||
# define ACC_SET_LE16(p,v) (* (unsigned short *) (p) = (unsigned short) (v))
|
|
||||||
# define ACC_SET_LE32(p,v) (* (acc_uint32e_t *) (p) = (acc_uint32e_t) (v))
|
|
||||||
#endif
|
|
||||||
#if (ACC_ARCH_AMD64)
|
|
||||||
# define ACC_GET_LE64(p) (* (const acc_uint64l_t *) (p))
|
|
||||||
# define ACC_SET_LE64(p,v) (* (acc_uint64l_t *) (p) = (acc_uint64l_t) (v))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// getopt
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
const char* name;
|
|
||||||
int has_arg;
|
|
||||||
int* flag;
|
|
||||||
int val;
|
|
||||||
} acc_getopt_longopt_t;
|
|
||||||
#ifndef acc_getopt_longopt_p
|
|
||||||
#define acc_getopt_longopt_p acc_getopt_longopt_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int go_argc;
|
|
||||||
char** go_argv;
|
|
||||||
const char* go_shortopts;
|
|
||||||
const acc_getopt_longopt_p longopts;
|
|
||||||
#if (ACC_BROKEN_CDECL_ALT_SYNTAX)
|
|
||||||
int __acc_cdecl_va (*go_error)(const char *, ...);
|
|
||||||
#else
|
|
||||||
int (__acc_cdecl_va *go_error)(const char *, ...);
|
|
||||||
#endif
|
|
||||||
} acc_getopt_t;
|
|
||||||
#ifndef acc_getopt_p
|
|
||||||
#define acc_getopt_p acc_getopt_t *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ACCLIB_EXTERN(void, acc_getopt_init) (acc_getopt_p);
|
|
||||||
ACCLIB_EXTERN(int, acc_getopt) (acc_getopt_p);
|
|
||||||
ACCLIB_EXTERN(void, acc_getopt_close)(acc_getopt_p);
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// rand
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acc_uint32l_t seed;
|
|
||||||
} acc_rand31_t;
|
|
||||||
#ifndef acc_rand31_p
|
|
||||||
#define acc_rand31_p acc_rand31_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srand31) (acc_rand31_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand31) (acc_rand31_p);
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acc_uint64l_t seed;
|
|
||||||
} acc_rand48_t;
|
|
||||||
#ifndef acc_rand48_p
|
|
||||||
#define acc_rand48_p acc_rand48_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srand48) (acc_rand48_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand48) (acc_rand48_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand48_r32) (acc_rand48_p);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
typedef struct { /* all private */
|
|
||||||
acc_uint64l_t seed;
|
|
||||||
} acc_rand64_t;
|
|
||||||
#ifndef acc_rand64_p
|
|
||||||
#define acc_rand64_p acc_rand64_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srand64) (acc_rand64_p, acc_uint64l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand64) (acc_rand64_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_rand64_r32) (acc_rand64_p);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct { /* all private */
|
|
||||||
unsigned n;
|
|
||||||
acc_uint32l_t s[624];
|
|
||||||
} acc_randmt_t;
|
|
||||||
#ifndef acc_randmt_p
|
|
||||||
#define acc_randmt_p acc_randmt_t *
|
|
||||||
#endif
|
|
||||||
ACCLIB_EXTERN(void, acc_srandmt) (acc_randmt_p, acc_uint32l_t);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_randmt) (acc_randmt_p);
|
|
||||||
ACCLIB_EXTERN(acc_uint32l_t, acc_randmt_r32) (acc_randmt_p);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Memory Model - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_MM_FLAT [default]
|
|
||||||
* ACC_MM_TINY
|
|
||||||
* ACC_MM_SMALL
|
|
||||||
* ACC_MM_MEDIUM
|
|
||||||
* ACC_MM_COMPACT
|
|
||||||
* ACC_MM_LARGE
|
|
||||||
* ACC_MM_HUGE
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
|
|
||||||
#if (UINT_MAX != ACC_0xffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
#endif
|
|
||||||
#if defined(__TINY__) || defined(M_I86TM) || defined(_M_I86TM)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif defined(__HUGE__) || defined(_HUGE_) || defined(M_I86HM) || defined(_M_I86HM)
|
|
||||||
# define ACC_MM_HUGE 1
|
|
||||||
#elif defined(__SMALL__) || defined(M_I86SM) || defined(_M_I86SM) || defined(SMALL_MODEL)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif defined(__MEDIUM__) || defined(M_I86MM) || defined(_M_I86MM)
|
|
||||||
# define ACC_MM_MEDIUM 1
|
|
||||||
#elif defined(__COMPACT__) || defined(M_I86CM) || defined(_M_I86CM)
|
|
||||||
# define ACC_MM_COMPACT 1
|
|
||||||
#elif defined(__LARGE__) || defined(M_I86LM) || defined(_M_I86LM) || defined(LARGE_MODEL)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif (ACC_CC_AZTECC)
|
|
||||||
# if defined(_LARGE_CODE) && defined(_LARGE_DATA)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
# elif defined(_LARGE_CODE)
|
|
||||||
# define ACC_MM_MEDIUM 1
|
|
||||||
# elif defined(_LARGE_DATA)
|
|
||||||
# define ACC_MM_COMPACT 1
|
|
||||||
# else
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_ZORTECHC && defined(__VCM__))
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* ACC_HAVE_MM_HUGE_PTR ... working __huge pointers
|
|
||||||
* ACC_HAVE_MM_HUGE_ARRAY ... char __huge x[256*1024L] works */
|
|
||||||
#define ACC_HAVE_MM_HUGE_PTR 1
|
|
||||||
#define ACC_HAVE_MM_HUGE_ARRAY 1
|
|
||||||
|
|
||||||
#if (ACC_MM_TINY)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_CC_AZTECC || ACC_CC_PACIFICC || ACC_CC_ZORTECHC)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_PTR
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#elif (ACC_CC_MSC && defined(_QC))
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
# if (_MSC_VER < 600)
|
|
||||||
# undef ACC_HAVE_MM_HUGE_PTR
|
|
||||||
# endif
|
|
||||||
#elif (ACC_CC_TURBOC && (__TURBOC__ < 0x0295))
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#elif (ACC_CC_WATCOMC && (__WATCOMC__ >= 1200))
|
|
||||||
/* pointer arithmetics with __huge arrays seems broken in OpenWatcom 1.x */
|
|
||||||
# undef ACC_HAVE_MM_HUGE_ARRAY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#if (ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0200))
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif (ACC_CC_MSC || ACC_CC_TOPSPEEDC)
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif (ACC_CC_TURBOC && (__TURBOC__ >= 0x0295))
|
|
||||||
extern void __near __cdecl _AHSHIFT(void);
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _AHSHIFT)
|
|
||||||
#elif ((ACC_CC_AZTECC || ACC_CC_PACIFICC || ACC_CC_TURBOC) && ACC_OS_DOS16)
|
|
||||||
# define ACC_MM_AHSHIFT 12
|
|
||||||
#elif (ACC_CC_WATCOMC)
|
|
||||||
extern unsigned char _HShift;
|
|
||||||
# define ACC_MM_AHSHIFT ((unsigned) _HShift)
|
|
||||||
#else
|
|
||||||
# error "FIXME - implement ACC_MM_AHSHIFT"
|
|
||||||
#endif
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_ARCH_C166)
|
|
||||||
#if !defined(__MODEL__)
|
|
||||||
# error "FIXME - C166 __MODEL__"
|
|
||||||
#elif ((__MODEL__) == 0)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 1)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 2)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif ((__MODEL__) == 3)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif ((__MODEL__) == 4)
|
|
||||||
# define ACC_MM_XTINY 1
|
|
||||||
#elif ((__MODEL__) == 5)
|
|
||||||
# define ACC_MM_XSMALL 1
|
|
||||||
#else
|
|
||||||
# error "FIXME - C166 __MODEL__"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_ARCH_MCS251)
|
|
||||||
#if !defined(__MODEL__)
|
|
||||||
# error "FIXME - MCS251 __MODEL__"
|
|
||||||
#elif ((__MODEL__) == 0)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 2)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif ((__MODEL__) == 3)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif ((__MODEL__) == 4)
|
|
||||||
# define ACC_MM_XTINY 1
|
|
||||||
#elif ((__MODEL__) == 5)
|
|
||||||
# define ACC_MM_XSMALL 1
|
|
||||||
#else
|
|
||||||
# error "FIXME - MCS251 __MODEL__"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#elif (ACC_ARCH_MCS51)
|
|
||||||
#if !defined(__MODEL__)
|
|
||||||
# error "FIXME - MCS51 __MODEL__"
|
|
||||||
#elif ((__MODEL__) == 1)
|
|
||||||
# define ACC_MM_SMALL 1
|
|
||||||
#elif ((__MODEL__) == 2)
|
|
||||||
# define ACC_MM_LARGE 1
|
|
||||||
#elif ((__MODEL__) == 3)
|
|
||||||
# define ACC_MM_TINY 1
|
|
||||||
#elif ((__MODEL__) == 4)
|
|
||||||
# define ACC_MM_XTINY 1
|
|
||||||
#elif ((__MODEL__) == 5)
|
|
||||||
# define ACC_MM_XSMALL 1
|
|
||||||
#else
|
|
||||||
# error "FIXME - MCS51 __MODEL__"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
# define ACC_MM_FLAT 1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_MM_FLAT)
|
|
||||||
# define ACC_INFO_MM "flat"
|
|
||||||
#elif (ACC_MM_TINY)
|
|
||||||
# define ACC_INFO_MM "tiny"
|
|
||||||
#elif (ACC_MM_SMALL)
|
|
||||||
# define ACC_INFO_MM "small"
|
|
||||||
#elif (ACC_MM_MEDIUM)
|
|
||||||
# define ACC_INFO_MM "medium"
|
|
||||||
#elif (ACC_MM_COMPACT)
|
|
||||||
# define ACC_INFO_MM "compact"
|
|
||||||
#elif (ACC_MM_LARGE)
|
|
||||||
# define ACC_INFO_MM "large"
|
|
||||||
#elif (ACC_MM_HUGE)
|
|
||||||
# define ACC_INFO_MM "huge"
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,200 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Operating System - exactly one of:
|
|
||||||
*
|
|
||||||
* ACC_OS_POSIX [default]
|
|
||||||
* ACC_OS_AMIGAOS
|
|
||||||
* ACC_OS_BEOS
|
|
||||||
* ACC_OS_CYGWIN hybrid WIN32 and POSIX
|
|
||||||
* ACC_OS_DOS16 16-bit DOS (segmented memory model)
|
|
||||||
* ACC_OS_DOS32
|
|
||||||
* ACC_OS_EMX hybrid OS/2, DOS32, WIN32 (with RSX) and POSIX
|
|
||||||
* ACC_OS_MACCLASSIC Macintosh Classic
|
|
||||||
* ACC_OS_PALMOS
|
|
||||||
* ACC_OS_OS2 OS/2
|
|
||||||
* ACC_OS_OS216 16-bit OS/2 1.x (segmented memory model)
|
|
||||||
* ACC_OS_QNX
|
|
||||||
* ACC_OS_RISCOS
|
|
||||||
* ACC_OS_TOS Atari TOS / MiNT
|
|
||||||
* ACC_OS_VMS
|
|
||||||
* ACC_OS_WIN16 16-bit Windows 3.x (segmented memory model)
|
|
||||||
* ACC_OS_WIN32
|
|
||||||
* ACC_OS_WIN64 64-bit Windows (LLP64 programming model)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__CYGWIN__) && defined(__GNUC__)
|
|
||||||
# define ACC_OS_CYGWIN 1
|
|
||||||
# define ACC_INFO_OS "cygwin"
|
|
||||||
#elif defined(__EMX__) && defined(__GNUC__)
|
|
||||||
# define ACC_OS_EMX 1
|
|
||||||
# define ACC_INFO_OS "emx"
|
|
||||||
#elif defined(__BEOS__)
|
|
||||||
# define ACC_OS_BEOS 1
|
|
||||||
# define ACC_INFO_OS "beos"
|
|
||||||
#elif defined(__QNX__)
|
|
||||||
# define ACC_OS_QNX 1
|
|
||||||
# define ACC_INFO_OS "qnx"
|
|
||||||
#elif defined(__BORLANDC__) && defined(__DPMI32__) && (__BORLANDC__ >= 0x0460)
|
|
||||||
# define ACC_OS_DOS32 1
|
|
||||||
# define ACC_INFO_OS "dos32"
|
|
||||||
#elif defined(__BORLANDC__) && defined(__DPMI16__)
|
|
||||||
# define ACC_OS_DOS16 1
|
|
||||||
# define ACC_INFO_OS "dos16"
|
|
||||||
#elif defined(__ZTC__) && defined(DOS386)
|
|
||||||
# define ACC_OS_DOS32 1
|
|
||||||
# define ACC_INFO_OS "dos32"
|
|
||||||
#elif defined(__OS2__) || defined(__OS2V2__)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_OS216 1
|
|
||||||
# define ACC_INFO_OS "os216"
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define ACC_OS_OS2 1
|
|
||||||
# define ACC_INFO_OS "os2"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__WIN64__) || defined(_WIN64) || defined(WIN64)
|
|
||||||
# define ACC_OS_WIN64 1
|
|
||||||
# define ACC_INFO_OS "win64"
|
|
||||||
#elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS_386__)
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
#elif defined(__MWERKS__) && defined(__INTEL__)
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
#elif defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_WIN16 1
|
|
||||||
# define ACC_INFO_OS "win16"
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__DOS__) || defined(__MSDOS__) || defined(_MSDOS) || defined(MSDOS) || (defined(__PACIFIC__) && defined(DOS))
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_DOS16 1
|
|
||||||
# define ACC_INFO_OS "dos16"
|
|
||||||
# elif (UINT_MAX == ACC_0xffffffffL)
|
|
||||||
# define ACC_OS_DOS32 1
|
|
||||||
# define ACC_INFO_OS "dos32"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__WATCOMC__)
|
|
||||||
# if defined(__NT__) && (UINT_MAX == ACC_0xffffL)
|
|
||||||
/* wcl: NT host defaults to DOS target */
|
|
||||||
# define ACC_OS_DOS16 1
|
|
||||||
# define ACC_INFO_OS "dos16"
|
|
||||||
# elif defined(__NT__) && (__WATCOMC__ < 1100)
|
|
||||||
/* wcl386: Watcom C 11 defines _WIN32 */
|
|
||||||
# define ACC_OS_WIN32 1
|
|
||||||
# define ACC_INFO_OS "win32"
|
|
||||||
# else
|
|
||||||
# error "please specify a target using the -bt compiler option"
|
|
||||||
# endif
|
|
||||||
#elif defined(__palmos__)
|
|
||||||
# if (UINT_MAX == ACC_0xffffL)
|
|
||||||
# define ACC_OS_PALMOS 1
|
|
||||||
# define ACC_INFO_OS "palmos"
|
|
||||||
# else
|
|
||||||
# error "check your limits.h header"
|
|
||||||
# endif
|
|
||||||
#elif defined(__TOS__) || defined(__atarist__)
|
|
||||||
# define ACC_OS_TOS 1
|
|
||||||
# define ACC_INFO_OS "tos"
|
|
||||||
#elif defined(macintosh) && !defined(__ppc__)
|
|
||||||
# define ACC_OS_MACCLASSIC 1
|
|
||||||
# define ACC_INFO_OS "macclassic"
|
|
||||||
#elif defined(__VMS)
|
|
||||||
# define ACC_OS_VMS 1
|
|
||||||
# define ACC_INFO_OS "vms"
|
|
||||||
#else
|
|
||||||
# define ACC_OS_POSIX 1
|
|
||||||
# define ACC_INFO_OS "posix"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_POSIX)
|
|
||||||
# if defined(_AIX) || defined(__AIX__) || defined(__aix__)
|
|
||||||
# define ACC_OS_POSIX_AIX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "aix"
|
|
||||||
# elif defined(__FreeBSD__)
|
|
||||||
# define ACC_OS_POSIX_FREEBSD 1
|
|
||||||
# define ACC_INFO_OS_POSIX "freebsd"
|
|
||||||
# elif defined(__hpux__) || defined(__hpux)
|
|
||||||
# define ACC_OS_POSIX_HPUX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "hpux"
|
|
||||||
# elif defined(__IRIX__) || defined(__irix__)
|
|
||||||
# define ACC_OS_POSIX_IRIX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "irix"
|
|
||||||
# elif defined(__linux__) || defined(__linux)
|
|
||||||
# define ACC_OS_POSIX_LINUX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "linux"
|
|
||||||
# elif defined(__APPLE__) || defined(__MACOS__)
|
|
||||||
# define ACC_OS_POSIX_MACOSX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "macosx"
|
|
||||||
# elif defined(__NetBSD__)
|
|
||||||
# define ACC_OS_POSIX_NETBSD 1
|
|
||||||
# define ACC_INFO_OS_POSIX "netbsd"
|
|
||||||
# elif defined(__OpenBSD__)
|
|
||||||
# define ACC_OS_POSIX_OPENBSD 1
|
|
||||||
# define ACC_INFO_OS_POSIX "openbsd"
|
|
||||||
# elif defined(__osf__)
|
|
||||||
# define ACC_OS_POSIX_OSF 1
|
|
||||||
# define ACC_INFO_OS_POSIX "osf"
|
|
||||||
# elif defined(__solaris__) || defined(__sun)
|
|
||||||
# if defined(__SVR4) || defined(__svr4__)
|
|
||||||
# define ACC_OS_POSIX_SOLARIS 1
|
|
||||||
# define ACC_INFO_OS_POSIX "solaris"
|
|
||||||
# else
|
|
||||||
# define ACC_OS_POSIX_SUNOS 1
|
|
||||||
# define ACC_INFO_OS_POSIX "sunos"
|
|
||||||
# endif
|
|
||||||
# elif defined(__ultrix__) || defined(__ultrix)
|
|
||||||
# define ACC_OS_POSIX_ULTRIX 1
|
|
||||||
# define ACC_INFO_OS_POSIX "ultrix"
|
|
||||||
# else
|
|
||||||
# define ACC_OS_POSIX_UNKNOWN 1
|
|
||||||
# define ACC_INFO_OS_POSIX "unknown"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_OS216 || ACC_OS_WIN16)
|
|
||||||
# if (UINT_MAX != ACC_0xffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# if (UINT_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
# if (ULONG_MAX != ACC_0xffffffffL)
|
|
||||||
# error "this should not happen"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,319 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
//
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_CC_GNUC >= 0x020800ul) /* 2.8.0 */
|
|
||||||
# define __acc_gnuc_extension__ __extension__
|
|
||||||
#else
|
|
||||||
# define __acc_gnuc_extension__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (SIZEOF_LONG_LONG > 0)
|
|
||||||
__acc_gnuc_extension__ typedef long long acc_llong_t;
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_UNSIGNED_LONG_LONG > 0)
|
|
||||||
__acc_gnuc_extension__ typedef unsigned long long acc_ullong_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (!(SIZEOF_SHORT > 0 && SIZEOF_INT > 0 && SIZEOF_LONG > 0))
|
|
||||||
# error "missing defines for sizes"
|
|
||||||
#endif
|
|
||||||
#if (!(SIZEOF_PTRDIFF_T > 0 && SIZEOF_SIZE_T > 0 && SIZEOF_VOID_P > 0 && SIZEOF_CHAR_P > 0))
|
|
||||||
# error "missing defines for sizes"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// some <stdint.h> types:
|
|
||||||
// required: least & fast: acc_int32l_t, acc_int32f_t
|
|
||||||
// optional: exact32 acc_int32e_t
|
|
||||||
// optional: least64 acc_int64l_t
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
/* acc_int32e_t is int32_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int32e_t)
|
|
||||||
#if (SIZEOF_INT == 4)
|
|
||||||
# define acc_int32e_t int
|
|
||||||
# define acc_uint32e_t unsigned int
|
|
||||||
# define ACC_INT32E_C(c) c
|
|
||||||
# define ACC_UINT32E_C(c) c##U
|
|
||||||
#elif (SIZEOF_LONG == 4)
|
|
||||||
# define acc_int32e_t long int
|
|
||||||
# define acc_uint32e_t unsigned long int
|
|
||||||
# define ACC_INT32E_C(c) c##L
|
|
||||||
# define ACC_UINT32E_C(c) c##UL
|
|
||||||
#elif (SIZEOF_SHORT == 4)
|
|
||||||
# define acc_int32e_t short int
|
|
||||||
# define acc_uint32e_t unsigned short int
|
|
||||||
# define ACC_INT32E_C(c) c
|
|
||||||
# define ACC_UINT32E_C(c) c##U
|
|
||||||
#elif (SIZEOF_LONG_LONG == 4 && SIZEOF_UNSIGNED_LONG_LONG == 4)
|
|
||||||
# define acc_int32e_t acc_llong_t
|
|
||||||
# define acc_uint32e_t acc_ullong_t
|
|
||||||
# define ACC_INT32E_C(c) c##LL
|
|
||||||
# define ACC_UINT32E_C(c) c##ULL
|
|
||||||
#elif (SIZEOF___INT32 == 4 && SIZEOF_UNSIGNED___INT32 == 4)
|
|
||||||
# define acc_int32e_t __int32
|
|
||||||
# define acc_uint32e_t unsigned __int32
|
|
||||||
# if (SIZEOF_INT > 4)
|
|
||||||
# define ACC_INT32E_C(c) c
|
|
||||||
# define ACC_UINT32E_C(c) c##U
|
|
||||||
# elif (SIZEOF_LONG > 4)
|
|
||||||
# define ACC_INT32E_C(c) c##L
|
|
||||||
# define ACC_UINT32E_C(c) c##UL
|
|
||||||
# else
|
|
||||||
# define ACC_INT32E_C(c) c##i32
|
|
||||||
# define ACC_UINT32E_C(c) c##ui32
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
/* no exact 32-bit integral type on this machine */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
# define SIZEOF_ACC_INT32E_T 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* acc_int32l_t is int_least32_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int32l_t)
|
|
||||||
#if defined(acc_int32e_t)
|
|
||||||
# define acc_int32l_t acc_int32e_t
|
|
||||||
# define acc_uint32l_t acc_uint32e_t
|
|
||||||
# define ACC_INT32L_C(c) ACC_INT32E_C(c)
|
|
||||||
# define ACC_UINT32L_C(c) ACC_UINT32E_C(c)
|
|
||||||
# define SIZEOF_ACC_INT32L_T SIZEOF_ACC_INT32E_T
|
|
||||||
#elif (SIZEOF_INT > 4)
|
|
||||||
# define acc_int32l_t int
|
|
||||||
# define acc_uint32l_t unsigned int
|
|
||||||
# define ACC_INT32L_C(c) c
|
|
||||||
# define ACC_UINT32L_C(c) c##U
|
|
||||||
# define SIZEOF_ACC_INT32L_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG > 4)
|
|
||||||
# define acc_int32l_t long int
|
|
||||||
# define acc_uint32l_t unsigned long int
|
|
||||||
# define ACC_INT32L_C(c) c##L
|
|
||||||
# define ACC_UINT32L_C(c) c##UL
|
|
||||||
# define SIZEOF_ACC_INT32L_T SIZEOF_LONG
|
|
||||||
#else
|
|
||||||
# error "acc_int32l_t"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* acc_int32f_t is int_fast32_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int32f_t)
|
|
||||||
#if (SIZEOF_INT >= 4)
|
|
||||||
# define acc_int32f_t int
|
|
||||||
# define acc_uint32f_t unsigned int
|
|
||||||
# define ACC_INT32F_C(c) c
|
|
||||||
# define ACC_UINT32F_C(c) c##U
|
|
||||||
# define SIZEOF_ACC_INT32F_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG >= 4)
|
|
||||||
# define acc_int32f_t long int
|
|
||||||
# define acc_uint32f_t unsigned long int
|
|
||||||
# define ACC_INT32F_C(c) c##L
|
|
||||||
# define ACC_UINT32F_C(c) c##UL
|
|
||||||
# define SIZEOF_ACC_INT32F_T SIZEOF_LONG
|
|
||||||
#elif defined(acc_int32e_t)
|
|
||||||
# define acc_int32f_t acc_int32e_t
|
|
||||||
# define acc_uint32f_t acc_uint32e_t
|
|
||||||
# define ACC_INT32F_C(c) ACC_INT32E_C(c)
|
|
||||||
# define ACC_UINT32F_C(c) ACC_UINT32E_C(c)
|
|
||||||
# define SIZEOF_ACC_INT32F_T SIZEOF_ACC_INT32E_T
|
|
||||||
#else
|
|
||||||
# error "acc_int32f_t"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* acc_int64l_t is int_least64_t in <stdint.h> terminology */
|
|
||||||
#if !defined(acc_int64l_t)
|
|
||||||
#if (SIZEOF___INT64 >= 8 && SIZEOF_UNSIGNED___INT64 >= 8)
|
|
||||||
# if (ACC_CC_BORLANDC) && !defined(ACC_CONFIG_PREFER___INT64)
|
|
||||||
# define ACC_CONFIG_PREFER___INT64 1
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if (SIZEOF_INT >= 8)
|
|
||||||
# define acc_int64l_t int
|
|
||||||
# define acc_uint64l_t unsigned int
|
|
||||||
# define ACC_INT64L_C(c) c
|
|
||||||
# define ACC_UINT64L_C(c) c##U
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG >= 8)
|
|
||||||
# define acc_int64l_t long int
|
|
||||||
# define acc_uint64l_t unsigned long int
|
|
||||||
# define ACC_INT64L_C(c) c##L
|
|
||||||
# define ACC_UINT64L_C(c) c##UL
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF_LONG
|
|
||||||
#elif (SIZEOF_LONG_LONG >= 8 && SIZEOF_UNSIGNED_LONG_LONG >= 8) && !defined(ACC_CONFIG_PREFER___INT64)
|
|
||||||
# define acc_int64l_t acc_llong_t
|
|
||||||
# define acc_uint64l_t acc_ullong_t
|
|
||||||
# if (ACC_CC_BORLANDC)
|
|
||||||
# define ACC_INT64L_C(c) ((c) + 0ll)
|
|
||||||
# define ACC_UINT64L_C(c) ((c) + 0ull)
|
|
||||||
# else
|
|
||||||
# define ACC_INT64L_C(c) c##LL
|
|
||||||
# define ACC_UINT64L_C(c) c##ULL
|
|
||||||
# endif
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF_LONG_LONG
|
|
||||||
#elif (SIZEOF___INT64 >= 8 && SIZEOF_UNSIGNED___INT64 >= 8)
|
|
||||||
# define acc_int64l_t __int64
|
|
||||||
# define acc_uint64l_t unsigned __int64
|
|
||||||
# if (ACC_CC_BORLANDC)
|
|
||||||
# define ACC_INT64L_C(c) ((c) + 0i64)
|
|
||||||
# define ACC_UINT64L_C(c) ((c) + 0ui64)
|
|
||||||
# else
|
|
||||||
# define ACC_INT64L_C(c) c##i64
|
|
||||||
# define ACC_UINT64L_C(c) c##ui64
|
|
||||||
# endif
|
|
||||||
# define SIZEOF_ACC_INT64L_T SIZEOF___INT64
|
|
||||||
#else
|
|
||||||
/* no least 64-bit integral type on this machine */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(acc_intptr_t)
|
|
||||||
#if (ACC_ARCH_IA32 && ACC_CC_MSC && (_MSC_VER >= 1300))
|
|
||||||
typedef __w64 int acc_intptr_t;
|
|
||||||
typedef __w64 unsigned int acc_uintptr_t;
|
|
||||||
# define acc_intptr_t acc_intptr_t
|
|
||||||
# define acc_uintptr_t acc_uintptr_t
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_INT >= SIZEOF_VOID_P)
|
|
||||||
# define acc_intptr_t int
|
|
||||||
# define acc_uintptr_t unsigned int
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_INT
|
|
||||||
#elif (SIZEOF_LONG >= SIZEOF_VOID_P)
|
|
||||||
# define acc_intptr_t long
|
|
||||||
# define acc_uintptr_t unsigned long
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_LONG
|
|
||||||
#elif (SIZEOF_ACC_INT64L_T >= SIZEOF_VOID_P)
|
|
||||||
# define acc_intptr_t acc_int64l_t
|
|
||||||
# define acc_uintptr_t acc_uint64l_t
|
|
||||||
# define SIZEOF_ACC_INTPTR_T SIZEOF_ACC_INT64L_T
|
|
||||||
#else
|
|
||||||
# error "acc_intptr_t"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* workaround for broken compilers */
|
|
||||||
#if (ACC_BROKEN_INTEGRAL_CONSTANTS)
|
|
||||||
# undef ACC_INT32E_C
|
|
||||||
# undef ACC_UINT32E_C
|
|
||||||
# undef ACC_INT32L_C
|
|
||||||
# undef ACC_UINT32L_C
|
|
||||||
# undef ACC_INT32F_C
|
|
||||||
# undef ACC_UINT32F_C
|
|
||||||
# if (SIZEOF_INT == 4)
|
|
||||||
# define ACC_INT32E_C(c) ((c) + 0)
|
|
||||||
# define ACC_UINT32E_C(c) ((c) + 0U)
|
|
||||||
# define ACC_INT32L_C(c) ((c) + 0)
|
|
||||||
# define ACC_UINT32L_C(c) ((c) + 0U)
|
|
||||||
# define ACC_INT32F_C(c) ((c) + 0)
|
|
||||||
# define ACC_UINT32F_C(c) ((c) + 0U)
|
|
||||||
# elif (SIZEOF_LONG == 4)
|
|
||||||
# define ACC_INT32E_C(c) ((c) + 0L)
|
|
||||||
# define ACC_UINT32E_C(c) ((c) + 0UL)
|
|
||||||
# define ACC_INT32L_C(c) ((c) + 0L)
|
|
||||||
# define ACC_UINT32L_C(c) ((c) + 0UL)
|
|
||||||
# define ACC_INT32F_C(c) ((c) + 0L)
|
|
||||||
# define ACC_UINT32F_C(c) ((c) + 0UL)
|
|
||||||
# else
|
|
||||||
# error "integral constants"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// calling conventions
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64)
|
|
||||||
# if (ACC_CC_GNUC || ACC_CC_HIGHC || ACC_CC_NDPC || ACC_CC_PACIFICC)
|
|
||||||
# elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
# define __acc_cdecl __cdecl
|
|
||||||
# define __acc_cdecl_atexit
|
|
||||||
# define __acc_cdecl_main __cdecl
|
|
||||||
# if (ACC_OS_OS2 && (ACC_CC_DMC || ACC_CC_SYMANTECC))
|
|
||||||
# define __acc_cdecl_qsort __pascal
|
|
||||||
# elif (ACC_OS_OS2 && (ACC_CC_ZORTECHC))
|
|
||||||
# define __acc_cdecl_qsort _stdcall
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl_qsort __cdecl
|
|
||||||
# endif
|
|
||||||
# elif (ACC_CC_WATCOMC)
|
|
||||||
# define __acc_cdecl __cdecl
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl __cdecl
|
|
||||||
# define __acc_cdecl_atexit __cdecl
|
|
||||||
# define __acc_cdecl_main __cdecl
|
|
||||||
# define __acc_cdecl_qsort __cdecl
|
|
||||||
# endif
|
|
||||||
# if (ACC_CC_GNUC || ACC_CC_HIGHC || ACC_CC_NDPC || ACC_CC_PACIFICC || ACC_CC_WATCOMC)
|
|
||||||
# elif (ACC_OS_OS2 && (ACC_CC_DMC || ACC_CC_SYMANTECC))
|
|
||||||
# define __acc_cdecl_sighandler __pascal
|
|
||||||
# elif (ACC_OS_OS2 && (ACC_CC_ZORTECHC))
|
|
||||||
# define __acc_cdecl_sighandler _stdcall
|
|
||||||
# elif (ACC_CC_MSC && (_MSC_VER >= 600 && _MSC_VER < 700))
|
|
||||||
# if defined(_DLL)
|
|
||||||
# define __acc_cdecl_sighandler _far _cdecl _loadds
|
|
||||||
# elif defined(_MT)
|
|
||||||
# define __acc_cdecl_sighandler _far _cdecl
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl_sighandler _cdecl
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
# define __acc_cdecl_sighandler __cdecl
|
|
||||||
# endif
|
|
||||||
#elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC))
|
|
||||||
# define __acc_cdecl cdecl
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__acc_cdecl)
|
|
||||||
# define __acc_cdecl
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_atexit)
|
|
||||||
# define __acc_cdecl_atexit
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_main)
|
|
||||||
# define __acc_cdecl_main
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_qsort)
|
|
||||||
# define __acc_cdecl_qsort
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_sighandler)
|
|
||||||
# define __acc_cdecl_sighandler
|
|
||||||
#endif
|
|
||||||
#if !defined(__acc_cdecl_va)
|
|
||||||
# define __acc_cdecl_va __acc_cdecl
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (ACC_BROKEN_CDECL_ALT_SYNTAX)
|
|
||||||
typedef void __acc_cdecl_sighandler (*acc_sighandler_t)(int);
|
|
||||||
#elif defined(RETSIGTYPE)
|
|
||||||
typedef RETSIGTYPE (__acc_cdecl_sighandler *acc_sighandler_t)(int);
|
|
||||||
#else
|
|
||||||
typedef void (__acc_cdecl_sighandler *acc_sighandler_t)(int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
fnmatch.ch
|
|
||||||
getopt.ch
|
|
||||||
perfctr.ch
|
|
||||||
@@ -1,250 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_BELE_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// be16 / be24 / be32
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(unsigned, acc_get_be16) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((unsigned)b[1]) | ((unsigned)b[0] << 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_be24) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[2]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[0] << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_be32) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[3]) | ((acc_uint32l_t)b[2] << 8) | ((acc_uint32l_t)b[1] << 16) | ((acc_uint32l_t)b[0] << 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be16) (acc_hvoid_p p, unsigned v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[1] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be24) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[2] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be32) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[3] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(unsigned, acc_get_le16) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
return (* (const unsigned short *) (p));
|
|
||||||
#else
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((unsigned)b[0]) | ((unsigned)b[1] << 8);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_le24) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint32l_t, acc_get_le32) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
return (* (const acc_uint32e_t *) (p));
|
|
||||||
#else
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16) | ((acc_uint32l_t)b[3] << 24);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// le16 / le24 / le32
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le16) (acc_hvoid_p p, unsigned v)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
(* (unsigned short *) (p) = (unsigned short) (v));
|
|
||||||
#else
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le24) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le32) (acc_hvoid_p p, acc_uint32l_t v)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64 || ACC_ARCH_IA32)
|
|
||||||
(* (acc_uint32e_t *) (p) = (acc_uint32e_t) (v));
|
|
||||||
#else
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// be64
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint64l_t, acc_get_be64) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
#if (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
return ((acc_uint64l_t)b[7]) | ((acc_uint64l_t)b[6] << 8) | ((acc_uint64l_t)b[5] << 16) | ((acc_uint64l_t)b[4] << 24) | ((acc_uint64l_t)b[3] << 32) | ((acc_uint64l_t)b[2] << 40) | ((acc_uint64l_t)b[1] << 48) | ((acc_uint64l_t)b[0] << 56);
|
|
||||||
#else
|
|
||||||
acc_uint32l_t v0, v1;
|
|
||||||
v1 = ((acc_uint32l_t)b[3]) | ((acc_uint32l_t)b[2] << 8) | ((acc_uint32l_t)b[1] << 16) | ((acc_uint32l_t)b[0] << 24);
|
|
||||||
b += 4;
|
|
||||||
v0 = ((acc_uint32l_t)b[3]) | ((acc_uint32l_t)b[2] << 8) | ((acc_uint32l_t)b[1] << 16) | ((acc_uint32l_t)b[0] << 24);
|
|
||||||
return ((acc_uint64l_t)v0) | ((acc_uint64l_t)v1 << 32);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_be64) (acc_hvoid_p p, acc_uint64l_t v)
|
|
||||||
{
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
#if (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
b[7] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[4] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((v >> 32) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 40) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 48) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((v >> 56) & 0xff);
|
|
||||||
#else
|
|
||||||
acc_uint32l_t x;
|
|
||||||
x = (acc_uint32l_t) (v >> 0);
|
|
||||||
b[7] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[4] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
x = (acc_uint32l_t) (v >> 32);
|
|
||||||
b[3] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[0] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* acc_uint64l_t */
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
// le64
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#if defined(acc_uint64l_t)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_uint64l_t, acc_get_le64) (const acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64)
|
|
||||||
return (* (const acc_uint64l_t *) (p));
|
|
||||||
#elif (ACC_ARCH_IA32)
|
|
||||||
const acc_uint32e_t* b = (const acc_uint32e_t*) p;
|
|
||||||
return ((acc_uint64l_t)b[0]) | ((acc_uint64l_t)b[1] << 32);
|
|
||||||
#elif (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
return ((acc_uint64l_t)b[0]) | ((acc_uint64l_t)b[1] << 8) | ((acc_uint64l_t)b[2] << 16) | ((acc_uint64l_t)b[3] << 24) | ((acc_uint64l_t)b[4] << 32) | ((acc_uint64l_t)b[5] << 40) | ((acc_uint64l_t)b[6] << 48) | ((acc_uint64l_t)b[7] << 56);
|
|
||||||
#else
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) p;
|
|
||||||
acc_uint32l_t v0, v1;
|
|
||||||
v0 = ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16) | ((acc_uint32l_t)b[3] << 24);
|
|
||||||
b += 4;
|
|
||||||
v1 = ((acc_uint32l_t)b[0]) | ((acc_uint32l_t)b[1] << 8) | ((acc_uint32l_t)b[2] << 16) | ((acc_uint32l_t)b[3] << 24);
|
|
||||||
return ((acc_uint64l_t)v0) | ((acc_uint64l_t)v1 << 32);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_set_le64) (acc_hvoid_p p, acc_uint64l_t v)
|
|
||||||
{
|
|
||||||
#if (ACC_ARCH_AMD64)
|
|
||||||
(* (acc_uint64l_t *) (p)) = v;
|
|
||||||
#elif (ACC_ARCH_IA32)
|
|
||||||
(((acc_uint32e_t *)(p))[0] = (acc_uint32e_t) (v >> 0));
|
|
||||||
(((acc_uint32e_t *)(p))[1] = (acc_uint32e_t) (v >> 32));
|
|
||||||
#elif (SIZEOF_LONG >= 8) || (SIZEOF_SIZE_T >= 8)
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
b[0] = (unsigned char) ((v >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((v >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((v >> 16) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((v >> 24) & 0xff);
|
|
||||||
b[4] = (unsigned char) ((v >> 32) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((v >> 40) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((v >> 48) & 0xff);
|
|
||||||
b[7] = (unsigned char) ((v >> 56) & 0xff);
|
|
||||||
#else
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) p;
|
|
||||||
acc_uint32l_t x;
|
|
||||||
x = (acc_uint32l_t) (v >> 0);
|
|
||||||
b[0] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[1] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[2] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[3] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
x = (acc_uint32l_t) (v >> 32);
|
|
||||||
b[4] = (unsigned char) ((x >> 0) & 0xff);
|
|
||||||
b[5] = (unsigned char) ((x >> 8) & 0xff);
|
|
||||||
b[6] = (unsigned char) ((x >> 16) & 0xff);
|
|
||||||
b[7] = (unsigned char) ((x >> 24) & 0xff);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* acc_uint64l_t */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_DOSALLOC_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_OS216)
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosAllocHuge(unsigned short, unsigned short, unsigned short __far *, unsigned short, unsigned short);
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosFreeSeg(unsigned short);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// dos_alloc
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#if (ACC_OS_DOS16 || ACC_OS_WIN16)
|
|
||||||
#if !defined(ACC_CC_AZTECC)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void __far*, acc_dos_alloc) (unsigned long size)
|
|
||||||
{
|
|
||||||
void __far* p = 0;
|
|
||||||
union REGS ri, ro;
|
|
||||||
|
|
||||||
if ((long)size <= 0)
|
|
||||||
return p;
|
|
||||||
size = (size + 15) >> 4;
|
|
||||||
if (size > 0xffffu)
|
|
||||||
return p;
|
|
||||||
ri.x.ax = 0x4800;
|
|
||||||
ri.x.bx = (unsigned short) size;
|
|
||||||
int86(0x21, &ri, &ro);
|
|
||||||
if ((ro.x.cflag & 1) == 0) /* if carry flag not set */
|
|
||||||
p = (void __far*) ACC_MK_FP(ro.x.ax, 0);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_dos_free) (void __far* p)
|
|
||||||
{
|
|
||||||
union REGS ri, ro;
|
|
||||||
struct SREGS rs;
|
|
||||||
|
|
||||||
if (!p)
|
|
||||||
return 0;
|
|
||||||
if (ACC_FP_OFF(p) != 0)
|
|
||||||
return -1;
|
|
||||||
segread(&rs);
|
|
||||||
ri.x.ax = 0x4900;
|
|
||||||
rs.es = ACC_FP_SEG(p);
|
|
||||||
int86x(0x21, &ri, &ro, &rs);
|
|
||||||
if (ro.x.cflag & 1) /* if carry flag set */
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_OS_OS216)
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void __far*, acc_dos_alloc) (unsigned long size)
|
|
||||||
{
|
|
||||||
void __far* p = 0;
|
|
||||||
unsigned short sel = 0;
|
|
||||||
|
|
||||||
if ((long)size <= 0)
|
|
||||||
return p;
|
|
||||||
if (DosAllocHuge((unsigned short)(size >> 16), (unsigned short)size, &sel, 0, 0) == 0)
|
|
||||||
p = (void __far*) ACC_MK_FP(sel, 0);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(int, acc_dos_free) (void __far* p)
|
|
||||||
{
|
|
||||||
if (!p)
|
|
||||||
return 0;
|
|
||||||
if (ACC_FP_OFF(p) != 0)
|
|
||||||
return -1;
|
|
||||||
if (DosFreeSeg(ACC_FP_SEG(p)) != 0)
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HALLOC_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
#if 1 && (ACC_OS_DOS16 && defined(BLX286))
|
|
||||||
# define __ACCLIB_HALLOC_USE_DAH 1
|
|
||||||
#elif 1 && (ACC_OS_DOS16 && defined(DOSX286))
|
|
||||||
# define __ACCLIB_HALLOC_USE_DAH 1
|
|
||||||
#elif 1 && (ACC_OS_OS216)
|
|
||||||
# define __ACCLIB_HALLOC_USE_DAH 1
|
|
||||||
#elif 1 && (ACC_OS_WIN16)
|
|
||||||
# define __ACCLIB_HALLOC_USE_GA 1
|
|
||||||
#elif 1 && (ACC_OS_DOS16) && (ACC_CC_BORLANDC) && defined(__DPMI16__)
|
|
||||||
# define __ACCLIB_HALLOC_USE_GA 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if (__ACCLIB_HALLOC_USE_DAH)
|
|
||||||
#if 0 && (ACC_OS_OS216)
|
|
||||||
#include <os2.h>
|
|
||||||
#else
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosAllocHuge(unsigned short, unsigned short, unsigned short __far *, unsigned short, unsigned short);
|
|
||||||
ACC_EXTERN_C unsigned short __far __pascal DosFreeSeg(unsigned short);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__ACCLIB_HALLOC_USE_GA)
|
|
||||||
#if 0
|
|
||||||
#define STRICT 1
|
|
||||||
#include <windows.h>
|
|
||||||
#else
|
|
||||||
ACC_EXTERN_C const void __near* __far __pascal GlobalAlloc(unsigned, unsigned long);
|
|
||||||
ACC_EXTERN_C const void __near* __far __pascal GlobalFree(const void __near*);
|
|
||||||
ACC_EXTERN_C unsigned long __far __pascal GlobalHandle(unsigned);
|
|
||||||
ACC_EXTERN_C void __far* __far __pascal GlobalLock(const void __near*);
|
|
||||||
ACC_EXTERN_C int __far __pascal GlobalUnlock(const void __near*);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// halloc
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hvoid_p, acc_halloc) (acc_hsize_t size)
|
|
||||||
{
|
|
||||||
acc_hvoid_p p = 0;
|
|
||||||
|
|
||||||
if (size <= 0)
|
|
||||||
return p;
|
|
||||||
|
|
||||||
#if 0 && defined(__palmos__)
|
|
||||||
p = MemPtrNew(size);
|
|
||||||
#elif !defined(ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
if (size < (size_t) -1)
|
|
||||||
p = malloc((size_t) size);
|
|
||||||
#else
|
|
||||||
if ((long)size <= 0)
|
|
||||||
return p;
|
|
||||||
{
|
|
||||||
#if (__ACCLIB_HALLOC_USE_DAH)
|
|
||||||
unsigned short sel = 0;
|
|
||||||
if (DosAllocHuge((unsigned short)(size >> 16), (unsigned short)size, &sel, 0, 0) == 0)
|
|
||||||
p = (acc_hvoid_p) ACC_MK_FP(sel, 0);
|
|
||||||
#elif (__ACCLIB_HALLOC_USE_GA)
|
|
||||||
const void __near* h = GlobalAlloc(2, size);
|
|
||||||
if (h) {
|
|
||||||
p = GlobalLock(h);
|
|
||||||
if (p && ACC_FP_OFF(p) != 0) {
|
|
||||||
GlobalUnlock(h);
|
|
||||||
p = 0;
|
|
||||||
}
|
|
||||||
if (!p)
|
|
||||||
GlobalFree(h);
|
|
||||||
}
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 700))
|
|
||||||
p = _halloc(size, 1);
|
|
||||||
#elif (ACC_CC_MSC || ACC_CC_WATCOMC)
|
|
||||||
p = halloc(size, 1);
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
p = farmalloc(size);
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
p = farmalloc(size);
|
|
||||||
#elif defined(ACC_CC_AZTECC)
|
|
||||||
p = lmalloc(size);
|
|
||||||
#else
|
|
||||||
if (size < (size_t) -1)
|
|
||||||
p = malloc((size_t) size);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(void, acc_hfree) (acc_hvoid_p p)
|
|
||||||
{
|
|
||||||
if (!p)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#if 0 && defined(__palmos__)
|
|
||||||
MemPtrFree(p);
|
|
||||||
#elif !defined(ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
free(p);
|
|
||||||
#else
|
|
||||||
#if (__ACCLIB_HALLOC_USE_DAH)
|
|
||||||
if (ACC_FP_OFF(p) == 0)
|
|
||||||
DosFreeSeg((unsigned short) ACC_FP_SEG(p));
|
|
||||||
#elif (__ACCLIB_HALLOC_USE_GA)
|
|
||||||
if (ACC_FP_OFF(p) == 0) {
|
|
||||||
const void __near* h = (const void __near*) (unsigned) GlobalHandle(ACC_FP_SEG(p));
|
|
||||||
if (h) {
|
|
||||||
GlobalUnlock(h);
|
|
||||||
GlobalFree(h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif (ACC_CC_MSC && (_MSC_VER >= 700))
|
|
||||||
_hfree(p);
|
|
||||||
#elif (ACC_CC_MSC || ACC_CC_WATCOMC)
|
|
||||||
hfree(p);
|
|
||||||
#elif (ACC_CC_DMC || ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
|
|
||||||
farfree((void __far*) p);
|
|
||||||
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
|
|
||||||
farfree((void __far*) p);
|
|
||||||
#elif defined(ACC_CC_AZTECC)
|
|
||||||
lfree(p);
|
|
||||||
#else
|
|
||||||
free(p);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
/* ACC -- Automatic Compiler Configuration
|
|
||||||
|
|
||||||
Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
|
|
||||||
All Rights Reserved.
|
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of
|
|
||||||
the GNU General Public License. Please consult the file "ACC_LICENSE"
|
|
||||||
for details.
|
|
||||||
|
|
||||||
Markus F.X.J. Oberhumer
|
|
||||||
<markus@oberhumer.com>
|
|
||||||
http://www.oberhumer.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define __ACCLIB_HFREAD_CH_INCLUDED 1
|
|
||||||
#if !defined(ACCLIB_PUBLIC)
|
|
||||||
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
// huge pointer layer - stdio.h
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hfread) (ACC_FILE_P fp, acc_hvoid_p buf, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
#define __ACCLIB_REQUIRE_HMEMCPY_CH 1
|
|
||||||
unsigned char tmp[512];
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n = size - l > sizeof(tmp) ? sizeof(tmp) : (size_t) (size - l);
|
|
||||||
n = fread(tmp, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
__ACCLIB_FUNCNAME(acc_hmemcpy)((acc_hbyte_p)buf + l, tmp, (acc_hsize_t)n);
|
|
||||||
l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
acc_hbyte_p b = (acc_hbyte_p) buf;
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n;
|
|
||||||
n = ACC_FP_OFF(b); n = (n <= 1) ? 0x8000u : (0u - n);
|
|
||||||
if ((acc_hsize_t) n > size - l)
|
|
||||||
n = (size_t) (size - l);
|
|
||||||
n = fread((void __far*)b, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
return fread(buf, 1, size, fp);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ACCLIB_PUBLIC(acc_hsize_t, acc_hfwrite) (ACC_FILE_P fp, const acc_hvoid_p buf, acc_hsize_t size)
|
|
||||||
{
|
|
||||||
#if (ACC_HAVE_MM_HUGE_PTR)
|
|
||||||
#if (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM)
|
|
||||||
#define __ACCLIB_REQUIRE_HMEMCPY_CH 1
|
|
||||||
unsigned char tmp[512];
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n = size - l > sizeof(tmp) ? sizeof(tmp) : (size_t) (size - l);
|
|
||||||
__ACCLIB_FUNCNAME(acc_hmemcpy)(tmp, (const acc_hbyte_p)buf + l, (acc_hsize_t)n);
|
|
||||||
n = fwrite(tmp, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#elif (ACC_MM_COMPACT || ACC_MM_LARGE || ACC_MM_HUGE)
|
|
||||||
const acc_hbyte_p b = (const acc_hbyte_p) buf;
|
|
||||||
acc_hsize_t l = 0;
|
|
||||||
|
|
||||||
while (l < size)
|
|
||||||
{
|
|
||||||
size_t n;
|
|
||||||
n = ACC_FP_OFF(b); n = (n <= 1) ? 0x8000u : (0u - n);
|
|
||||||
if ((acc_hsize_t) n > size - l)
|
|
||||||
n = (size_t) (size - l);
|
|
||||||
n = fwrite((void __far*)b, 1, n, fp);
|
|
||||||
if (n == 0)
|
|
||||||
break;
|
|
||||||
b += n; l += n;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
#else
|
|
||||||
# error "unknown memory model"
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
return fwrite(buf, 1, size, fp);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
vi:ts=4:et
|
|
||||||
*/
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user