Compare commits
789 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d767332943 | |||
| f3d4503e93 | |||
| 70cb4aadda | |||
| 75325bf9ef | |||
| 669bf2251f | |||
| 190fd76583 | |||
| 8622e22be0 | |||
| 139a0324b6 | |||
| e39f2b2b2f | |||
| 7a46365296 | |||
| f83b7690e5 | |||
| 98c00d0fcb | |||
| b04d566b83 | |||
| b3c765ac7c | |||
| f7146b5af9 | |||
| 5dbf94e49b | |||
| 2e39c924d5 | |||
| 3068d19492 | |||
| 09d7d08e55 | |||
| 31ff38049f | |||
| a5f5e7fc73 | |||
| 3533ebe804 | |||
| c4ed5cc159 | |||
| 303ac34539 | |||
| e8947a6812 | |||
| 533e642945 | |||
| 8ab47ba8a4 | |||
| e4c638aa73 | |||
| 4ec866594b | |||
| a3d5a0a7b8 | |||
| 59d5d25a77 | |||
| e60ebd4027 | |||
| 3a61782f12 | |||
| 11041f44e6 | |||
| 649063c8c6 | |||
| 36271c3244 | |||
| 3c3caaa567 | |||
| d3504d8af2 | |||
| 12d1c6bbda | |||
| 466ceb4a1f | |||
| 3b71139426 | |||
| b11f043d64 | |||
| aef93548f9 | |||
| 26ca21f6cb | |||
| 404fb48668 | |||
| e85e8bec5d | |||
| 4530e5c264 | |||
| 1188d2933b | |||
| 4e88556c94 | |||
| 1f0036a460 | |||
| 5d30472ee2 | |||
| 9866b9bca9 | |||
| bbf52cee67 | |||
| b9b77965b7 | |||
| 852666010e | |||
| bbb886ae4d | |||
| b52d3e0772 | |||
| 27f8f4f62e | |||
| 21ec7e7410 | |||
| ae6d5303ba | |||
| fbbc2bc874 | |||
| 62f22d61e6 | |||
| 3f1f76f8a3 | |||
| 518712c613 | |||
| c0c08c9f43 | |||
| c4113b6bd6 | |||
| 4988868e61 | |||
| 5a513ab16f | |||
| f1a9d1bec9 | |||
| 70a3acfded | |||
| 3ec6a3cce0 | |||
| dd0a8856cc | |||
| c51a1130b8 | |||
| 9851fba246 | |||
| 8054543671 | |||
| 17d0e897ba | |||
| a7940fd19b | |||
| 1fbd34035e | |||
| 945d9157fa | |||
| 915bfbd82e | |||
| ef01a73e8f | |||
| 7e4e6a3cb1 | |||
| ca97430db2 | |||
| 7530643d1d | |||
| 073cdb0d58 | |||
| 9a93b5d1c1 | |||
| 44ce469b84 | |||
| 4d8d330f21 | |||
| 793e1622ea | |||
| 92a33fa0cc | |||
| e8c49a2c35 | |||
| d2e9db7112 | |||
| b728b0e021 | |||
| a1ef410509 | |||
| 24b4ec42e7 | |||
| 52dde5789e | |||
| 730c6ce6c5 | |||
| 5ed1d5b2b3 | |||
| 23c70ec447 | |||
| e29e73a4e4 | |||
| 27289a7589 | |||
| e509bb87e9 | |||
| 5cec09966e | |||
| b5789fb321 | |||
| a1b0fd987f | |||
| a468b92e3a | |||
| ddf0b50c6d | |||
| 3af2b21869 | |||
| c4bfebeceb | |||
| d23484b9db | |||
| 071579b5b6 | |||
| ff9d577e46 | |||
| a25c20ee0b | |||
| ff75a462a4 | |||
| e0b6ff1924 | |||
| 1c5fae74e0 | |||
| 6f650ca16f | |||
| c2da21ba4e | |||
| 903ca50391 | |||
| 70f1ab8cb7 | |||
| 6998449715 | |||
| fb0f6c6a00 | |||
| dbde75028c | |||
| 90d86ea59e | |||
| 64891286ba | |||
| e52a3ceb48 | |||
| 8cce9cf641 | |||
| 896dff9619 | |||
| 84a0347df1 | |||
| fc5e44f391 | |||
| 8bf49aa4f2 | |||
| b8079bb6eb | |||
| 5dcad7a387 | |||
| 83e5f74b3d | |||
| 3d402134f5 | |||
| b8b64a3e0f | |||
| c0bf7bf9ab | |||
| 0144f81c28 | |||
| 78f4959521 | |||
| eff1ef2d70 | |||
| 782b07c752 | |||
| bd67677389 | |||
| 8c9e04daaf | |||
| bddc05e787 | |||
| a49d023bd0 | |||
| 7b06ba0b78 | |||
| 344b73dab0 | |||
| 0870514194 | |||
| 0a61ffea3a | |||
| fbc650791d | |||
| 4b41aa1226 | |||
| 3fd68d3ec6 | |||
| d41ceb0d31 | |||
| aee970e80b | |||
| ef8a24ba53 | |||
| 2edf91d315 | |||
| 9fe377b288 | |||
| 996ca8d17d | |||
| b356595eb5 | |||
| e4668e5328 | |||
| a846e483be | |||
| f6e3df69eb | |||
| 1a6c1f0589 | |||
| e3e5d8a3a5 | |||
| 505f6b7373 | |||
| 7d907d9d65 | |||
| d00ba4b465 | |||
| d4deb2a100 | |||
| 5999b0a959 | |||
| e2f1e6697a | |||
| baee96347d | |||
| f60d8f6d18 | |||
| d3300e9564 | |||
| 877390a2ba | |||
| 5afe2af365 | |||
| 5028d559c5 | |||
| deda4f1bae | |||
| 927a9d10a7 | |||
| ad96cee14c | |||
| f95bb4953f | |||
| 8c594de432 | |||
| 330ac2443c | |||
| ebe6272ac7 | |||
| 982e732b74 | |||
| 27de5f42bb | |||
| 37dff58289 | |||
| fc9d90c231 | |||
| 68b31d31c3 | |||
| f7f08be312 | |||
| d14901548a | |||
| 6ebdf92d40 | |||
| abced6720b | |||
| f4604db164 | |||
| 8327c390cf | |||
| bd251c0dbd | |||
| d04209d30f | |||
| 8782778eb3 | |||
| c8515ae862 | |||
| a2fa417af9 | |||
| 93f420939e | |||
| 88cd02d750 | |||
| a35e50c02a | |||
| 566c1eebd2 | |||
| 65c3195b39 | |||
| 76b0b4ce9c | |||
| 02b9ac9764 | |||
| 17b94cdfe5 | |||
| 83166e21a5 | |||
| b4ea89f9d6 | |||
| 00706f0ccc | |||
| 3798dde3aa | |||
| 5bf2258505 | |||
| 33b9c68677 | |||
| 58d9b00a0a | |||
| 7ef018fed0 | |||
| 3d9fc7ab53 | |||
| 3d6b2e4617 | |||
| 886e325cbf | |||
| 60bdffee84 | |||
| a9dc43f7fb | |||
| 0cc0e51d5d | |||
| 14d75b222f | |||
| b10d2b7365 | |||
| 8aa3679323 | |||
| 3403b87cb7 | |||
| d55fdf2205 | |||
| 7cb3f40dab | |||
| 65c362efce | |||
| 8065eebca3 | |||
| 7f062c7ca5 | |||
| 0adad4a053 | |||
| cb39e6e0b8 | |||
| 94eebc3ee5 | |||
| 5d5f4d1765 | |||
| ed0665407a | |||
| 3869a67180 | |||
| 7e75491e88 | |||
| ca33d66816 | |||
| 055e3db80a | |||
| 620ddf1228 | |||
| d71fe3eda0 | |||
| bff5049a98 | |||
| 536b2c2475 | |||
| 7a3033c150 | |||
| 05db054fb9 | |||
| 8aa445e2fc | |||
| 3658136b82 | |||
| 64419ca4f4 | |||
| 913cddec61 | |||
| 25e6a31004 | |||
| 3d58035b41 | |||
| b94a150685 | |||
| 22717c15af | |||
| cb07fc2abc | |||
| ea2a190bd1 | |||
| e6f3c1b3da | |||
| 22f732aa4e | |||
| 5e531d7cca | |||
| 0deae5f0b8 | |||
| 9ff4187fb3 | |||
| 6a1e70bf40 | |||
| d097218a45 | |||
| cc87a2c867 | |||
| b26ba9c4d3 | |||
| 88c94d1cc0 | |||
| 6cda0b6016 | |||
| 66dc1d90d8 | |||
| f7cab0cf71 | |||
| 83e2df4c46 | |||
| 31216ed1b2 | |||
| e9930bb2bc | |||
| c8a0540fd2 | |||
| a9b7a0cb27 | |||
| c0ff491972 | |||
| 146c105961 | |||
| 35fca2062e | |||
| 2c4e5c7a47 | |||
| e561da33bd | |||
| 5f6bdb0a8f | |||
| 6276a4a7c4 | |||
| 4fa50b96ad | |||
| 5aef158ff0 | |||
| 4054ac192a | |||
| febe8e4d9e | |||
| c924c32d54 | |||
| 743eb5cc26 | |||
| f4585cdf77 | |||
| c36977f0b1 | |||
| 44e4bd0b54 | |||
| 1427b8137a | |||
| a9cb354225 | |||
| b4db17ab3c | |||
| ba969fb9f2 | |||
| 87ac252c8d | |||
| ada9081ea2 | |||
| d6a29e582f | |||
| 03c4184067 | |||
| 0a82280f20 | |||
| a7fa2f87c5 | |||
| 3a11a5a82e | |||
| 08a38af553 | |||
| 043a54cf3e | |||
| 16c8f6d160 | |||
| 285472bc78 | |||
| a77adcd4c7 | |||
| cebd4392f2 | |||
| 64a3de5a7a | |||
| 261609f706 | |||
| 17cf73001c | |||
| ad566d793a | |||
| b499ed3d20 | |||
| de8de9c0f0 | |||
| 3b36dce5c2 | |||
| dcd8dfd5fc | |||
| 78f3b6297c | |||
| a49fe3b04a | |||
| f23cc7daa3 | |||
| cafd9d7ace | |||
| 1b6c120864 | |||
| 99afc50ebf | |||
| 3286f7c5ba | |||
| 72ccca9faf | |||
| 3c294d9721 | |||
| 1aff5f5bb7 | |||
| 937ae4c5e0 | |||
| 056865f59a | |||
| c58246b43c | |||
| 3495d1affd | |||
| b0ce072370 | |||
| 9f4d18baac | |||
| f65c8f8c6f | |||
| e0633b89bb | |||
| c3341ce4dc | |||
| 43f9b90c92 | |||
| 6ee45dcdcd | |||
| 344246725b | |||
| 57763ca1e2 | |||
| 40b7e24fcc | |||
| 9e0f16a629 | |||
| 33f4f3a5a1 | |||
| 07a3b75b3e | |||
| bdea2539d1 | |||
| ed3d7b0c45 | |||
| cba44c45fc | |||
| 07b533f95b | |||
| 7b0a79dec5 | |||
| befd01aa96 | |||
| 1cc263624d | |||
| 4daa2c1cde | |||
| 7081c57571 | |||
| 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 |
+10
-27
@@ -1,44 +1,27 @@
|
||||
# "Gofmt's style is nobody's favourite, but gofmt is everybody's favourite." --Rob Pike
|
||||
#
|
||||
# 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:
|
||||
- __acc_cdecl
|
||||
- __acc_cdecl_atexit
|
||||
- __acc_cdecl_qsort
|
||||
- __acc_cdecl_sighandler
|
||||
- __acc_forceinline
|
||||
- __acc_noinline
|
||||
- __acc_static_noinline
|
||||
- __acc_static_forceinline
|
||||
- forceinline
|
||||
- noinline
|
||||
- DELETED_FUNCTION
|
||||
- XSPAN_DELETED_FUNCTION
|
||||
- may_throw
|
||||
EmptyLineBeforeAccessModifier: Leave
|
||||
# IndentPPDirectives: AfterHash # TODO later
|
||||
SortIncludes: false
|
||||
SpaceAfterCStyleCast: true
|
||||
Standard: Cpp03
|
||||
StatementMacros:
|
||||
- ACCCHK_ASSERT
|
||||
- ACCCHK_ASSERT_IS_SIGNED_T
|
||||
- ACCCHK_ASSERT_IS_UNSIGNED_T
|
||||
- ACCCHK_ASSERT_SIGN_T
|
||||
- ACC_BLOCK_BEGIN
|
||||
- ACC_COMPILE_TIME_ASSERT
|
||||
- ACC_COMPILE_TIME_ASSERT_HEADER
|
||||
- ACC_CXX_DISABLE_NEW_DELETE
|
||||
- ACC_CXX_TRIGGER_FUNCTION
|
||||
- ACC_CXX_TRIGGER_FUNCTION_IMPL
|
||||
- CLANG_FORMAT_DUMMY_STATEMENT
|
||||
- COMPILE_TIME_ASSERT
|
||||
- COMPILE_TIME_ASSERT_ALIGNED1
|
||||
WhitespaceSensitiveMacros:
|
||||
- ACC_PP_MACRO_EXPAND
|
||||
- ACC_PP_STRINGIZE
|
||||
...
|
||||
|
||||
+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,
|
||||
-bugprone-unintended-char-ostream-output,
|
||||
clang-analyzer-*,
|
||||
-clang-analyzer-optin.performance.Padding,
|
||||
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||
-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
|
||||
...
|
||||
+3
-2
@@ -1,3 +1,4 @@
|
||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
# see https://editorconfig.org/
|
||||
|
||||
root = true
|
||||
@@ -14,8 +15,8 @@ trim_trailing_whitespace = true
|
||||
indent_size = 8
|
||||
indent_style = tab
|
||||
|
||||
[*.S]
|
||||
[{*.asm,*.S}]
|
||||
indent_size = 8
|
||||
|
||||
[*.yml]
|
||||
[{*.yaml,*.yml}]
|
||||
indent_size = 2
|
||||
|
||||
+33
-7
@@ -1,10 +1,36 @@
|
||||
# make GitHub language detection more accurate, see https://github.com/github/linguist
|
||||
# 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
|
||||
|
||||
src/*.h linguist-language=C++
|
||||
src/*/*.h linguist-language=C++
|
||||
# disable all line ending conversions
|
||||
* -text
|
||||
|
||||
src/stub/**/*.ash linguist-language=Assembly
|
||||
src/stub/**/*.asm linguist-language=Assembly
|
||||
src/stub/**/*.S linguist-language=Assembly
|
||||
#
|
||||
# tell diff tools that these files are generated automatically
|
||||
#
|
||||
|
||||
src/stub/tmp/** linguist-vendored
|
||||
/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
|
||||
@@ -1,8 +0,0 @@
|
||||
version: 2
|
||||
|
||||
updates:
|
||||
- package-ecosystem: 'github-actions'
|
||||
directory: '/'
|
||||
schedule:
|
||||
# Check for updates to GitHub Actions every weekday
|
||||
interval: 'daily'
|
||||
@@ -1,209 +0,0 @@
|
||||
########## 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="\
|
||||
693102863358cc906bce946afec10dd0e15d0effc6ceb462d9beaaba25967304 *amd64-linux.elf/upx-3.91
|
||||
4aa9e1868d7797b50768cf1ae0ab0e93cc2eff81f3abaf36f2fdb5faf673f7b7 *amd64-linux.elf/upx-3.95
|
||||
996dc60b7b6aa8c4c55b4fbec9b1ad3e2f82f9986fd1cdcd2cb41ab01877d5a9 *amd64-win64.pe/upx-3.95.exe
|
||||
bb6cd600a28de3abc86c618125d72231d3d4b40de0260d2da7393970859723dd *arm-linux.elf/upx-3.95
|
||||
bc945bc3f64a318a00ecbfde2e4a4bac2d298f753e5a8dbdc6a972bcabfce6eb *arm-wince.pe/upx-3.91.exe
|
||||
19bdd27706f3476dfd46e5cdde782908af5bf9d068bf337ad8a26024d51ede8f *arm64-linux.elf/upx-3.95
|
||||
3b6e5e9eeb660859e35d9d3e005fb51a8163bfe548d8be6525660a30d1ea5c37 *armeb-linux.elf/upx-3.91
|
||||
2f2d916ee977e06b07429e563aeab0d052b7ba359dd61a7d767e2a7ef7fa049d *armeb-linux.elf/upx-3.95
|
||||
1e8cded938d4ee16bcc66fb5462650733a8862a1c9fab264a77a22e7958b36a7 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
6f439d62cdb735570c6c5e941924b6d2819024cad6c3453db020edc1e9e0d66b *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
f6a8a76b9af29272722be6785242a9822ce6b2ca3483cd953c2c34e4d85e1cf4 *i386-linux.elf/upx-3.91
|
||||
7eead732dddffdb1db5e5002babe112f8589eeb8251cb23e0b6f29dacfad3817 *i386-linux.elf/upx-3.95
|
||||
2c41d77ae9ac810cde23a222046d05b57a272c90aa75b127e0697a586be1ce1f *i386-win32.pe/upx-3.91.exe
|
||||
0218c00a3686363148a2bbe7d89634d54a2d7840beeab7f5fef2f269e56d517e *i386-win32.pe/upx-3.95.exe
|
||||
44034fc9a3609538d8edfbe3996aa3946b1745e537d1ea2ca14181c177b98034 *m68k-atari.tos/upx-3.91.ttp
|
||||
55c6151325fdf1638584f0fa5ee228547445e239bb0c8f4c6f31c30945e114b1 *mips-linux.elf/upx-3.95
|
||||
b6905f55277b3abc8ad10eb1ca95135ce9f2a5d87c992f7de78ca8e69d8e819e *mipsel-linux.elf/upx-3.91
|
||||
3a5eb4b01cb334e4a30a0ebb1c7d9f85f2035e6e5989acc296beb3ff34c98152 *mipsel-linux.elf/upx-3.95
|
||||
df4157e8e613f62fb26b1965b1c22dc44bf18f4aec4611283afadb9889d267d4 *powerpc-linux.elf/upx-3.91
|
||||
054a126aa7e17c6c5b8a00f608c4bf98f252ec4ab9ca2c03aebf9c92e30bda4f *powerpc-linux.elf/upx-3.95
|
||||
4667d37cb2474a30b184cd4d7ca8ba071650c396ebe9f1f9a39172c924676090 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
|
||||
f3cfc0be5885525965fbd3e56f5a4083a727414978bb4c018b4b0355c5b06921 *amd64-linux.elf/upx-3.91
|
||||
06f933cf1c5e42f2f00ffb6a5312fa687846b6a566d372459208f8cad34e34bb *amd64-linux.elf/upx-3.95
|
||||
db33236e886947a74c766e632ded0249166e2e5f74a3d03cda37cc07901cd1b1 *amd64-win64.pe/upx-3.95.exe
|
||||
3564858c026c2b0637e3c8e41a972fabc609ccc69c7ddd0ae457dd4ba7a62008 *arm-linux.elf/upx-3.95
|
||||
dceda960aa7b15b13a06bf88d1512d52e7e460d85a81207b6b5407bdbb51ffe8 *arm-wince.pe/upx-3.91.exe
|
||||
52b93b549591081ef72d19fe09d4588d7f2bc736f2ad50a32be03fb7fcd70e95 *arm64-linux.elf/upx-3.95
|
||||
1877be1f5f5333f1ee7c77bfb020f35f5c125e7f6b661a92a6918b468c02484f *armeb-linux.elf/upx-3.91
|
||||
a4d1f01a3dc748e92dd33e1377885ef2955c2c35fd379474c6622ce67267fac2 *armeb-linux.elf/upx-3.95
|
||||
d5d3cf6ecf1a89f5871bcfef9c59794f249b9f7ca12afdf15b79d343a18ddefc *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
eca16dec497e1a9f334fd4d806f035cafcd3438749d25b494e95f4935760ae4f *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
1ab8d00e13d149f6e74187eadaacd1d8cfa4777ce7489cef88fba4cbde9bcdee *i386-linux.elf/upx-3.91
|
||||
dd3169256039f7df2db15a86114818b275c03bd96c3ee828d724131b98fcc6f2 *i386-linux.elf/upx-3.95
|
||||
17a97d24ebbdaa3bd8f7ec9633e38bca1754c8af2d79250aaa5472499a98e0ec *i386-win32.pe/upx-3.91.exe
|
||||
1bb873ed8a8cbb11238f98c3f616ec6a34f4765a6021e10d9686158f382458f0 *i386-win32.pe/upx-3.95.exe
|
||||
13b0b57643342d0e08fe084cbf799f518b3d44ac9f39edda7db3e6b6c36386cc *m68k-atari.tos/upx-3.91.ttp
|
||||
91145a85e926495a536661d4e842a7b5b259707ef6accf5f08d13adcec173f13 *mips-linux.elf/upx-3.95
|
||||
8090533000872748b70c761d5581d78fde421d66884ab238527ca41d1446c2ae *mipsel-linux.elf/upx-3.91
|
||||
f82e7b166647f157c981af92eaeec63bf080609591a5d13f76f84cd49c8e7495 *mipsel-linux.elf/upx-3.95
|
||||
ae312cc5d34fd889ed9582a928ab03c589c0caddb111aceade7e072f928c6361 *powerpc-linux.elf/upx-3.91
|
||||
fd28cb894be895afb8aec675739b276810e7a35c5212016c3f7acde853d8c763 *powerpc-linux.elf/upx-3.95
|
||||
e299bb500c34d2f90b2b35a7186a0b24fb5ac80e56d4a2d80f9c8bd32cf2be62 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
|
||||
eea59d6755beed52bff26941d31362f28097d029d4f61a2f9065dcc63cd628fb *amd64-linux.elf/upx-3.91
|
||||
b89f4ca39165071a7a5eb107ed9b7c6c77b7c7ad90acdb2b073314571aacc23a *amd64-linux.elf/upx-3.95
|
||||
6af6bc4f2d4bdb1e7694f44ce695c54d181011b734f159018d5e2c515d14a47c *amd64-win64.pe/upx-3.95.exe
|
||||
9ae22ad9af331ec8c08ab22b0a8e0e0ff849512a6d11257c55fe7c423c0b7937 *arm-linux.elf/upx-3.95
|
||||
8605ddb612a1a3e096e272cb876e7777585804fa000f338f2164437a6da3de9a *arm-wince.pe/upx-3.91.exe
|
||||
2ab36b41db84e6e3002420ec397d79abed451869a7a8b703ab3b81f79c487753 *arm64-linux.elf/upx-3.95
|
||||
38879c80525760492a95de9bfcbce49997c5bff30bb43a6bb173b1978d21f248 *armeb-linux.elf/upx-3.91
|
||||
72e3bf259bf1304235a7ebe600f5b37be21297b8552f2fbdf47e28e3aa19e807 *armeb-linux.elf/upx-3.95
|
||||
3af56cb84be62f4078ae39be3370ef68061b094c62b3cbcd5d38e99e0e91df7f *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
224b882b4dcebc1112ced3df1b468ea8dc58083dac4893fa0061dc50ce6abf7c *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
59e3a1d456036bed175056978d12484a64405f356b1a1fa480866e7e31c9543b *i386-linux.elf/upx-3.91
|
||||
9662deb5f74b23c5b63d09457442895091f4b6cfd619f7bd6ffc27ec75f08682 *i386-linux.elf/upx-3.95
|
||||
3c585a745cd105073bb7324f2183731be84cfc4669f2bab1ef20c9bff909d2fc *i386-win32.pe/upx-3.91.exe
|
||||
fc796dad77cb6cb99bcb5700c3ff0a7b185c1fe8b129a293dd0e45d0903b13e6 *i386-win32.pe/upx-3.95.exe
|
||||
da41cb691775b8b0ef969954ea272262ed77e83b57257b2ba0ba19427a2ab991 *m68k-atari.tos/upx-3.91.ttp
|
||||
ea6ff916a226e39a5e67b2118fc3ceb0dbc69d8d473051a5df19af14e03ae25e *mips-linux.elf/upx-3.95
|
||||
0cbc8eaecb2aa7dcc2e9d7b11ba0c0e26193f1328a35107cf1069a8c5f9e63be *mipsel-linux.elf/upx-3.91
|
||||
7b112c59fccf3e5f3d4ec253fdb25761e47705a1c5d3a0103249b1747bbbe7d9 *mipsel-linux.elf/upx-3.95
|
||||
de8354fbeaf0623f3d08c3945dcdb5a8f0c078fe3e8082a13767979e841e6677 *powerpc-linux.elf/upx-3.91
|
||||
403c26bc1dda0cbf23032bc5ec5ac42ed8537a640a077c4332446227c8a3eb7b *powerpc-linux.elf/upx-3.95
|
||||
093a7fdbb555c8aea8728b4d6240ed3b723ee9007c5f6ea40a8daf2d1eb63f54 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t140_compress_lzma_2_no_filter="\
|
||||
6dd472386ff2a9683d75fe4cc8d0d40be223681f4d7305a51a7aacf25501e60f *amd64-linux.elf/upx-3.91
|
||||
4bbb96b109ae2b8b43b957bc66c3cdc2cfcf3a692377153ef912d09a495c876c *amd64-linux.elf/upx-3.95
|
||||
510fc860ac393abcfdbb547e999c12a6c6e928ead026607a6879fa7ca1e2d568 *amd64-win64.pe/upx-3.95.exe
|
||||
a54c0e5b61257154c56f076460f64efbb4216c913c846073d0a695ac3c0ddffd *arm-linux.elf/upx-3.95
|
||||
9182294f2e31db89b138294cbbc6f6d03ea39a00565adf0e052ed3d21491e1b5 *arm-wince.pe/upx-3.91.exe
|
||||
fde8face710b6a479a96d7d2d40a29ac8894d5483403e33acbf4a5d6f9cdb29d *arm64-linux.elf/upx-3.95
|
||||
0a92af3f6034487034ea062bc44c93bba74219fa5fdcbb34d1643a95f7daa9ed *armeb-linux.elf/upx-3.91
|
||||
2c11ec89ad145e9f82c3cbbd63ed1e1eca2b0d3c3081fce3e0500ed33c05a623 *armeb-linux.elf/upx-3.95
|
||||
13cbcb06079492a21b7440b981250f84ff2be48a69daa168d95cee798f8fbf77 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
adfdcd033340a7b14945c9a60da036e25d44c8b1ee0811ac0a4ef1cbca423cc5 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
e5fff5b965da26349311c0513d09086600c3b466f1d53e42d6e35d6b4656168e *i386-linux.elf/upx-3.91
|
||||
cf8df3858bbb1c92a06e57ce1b971e11bbf280954f2fc1dc7e5b5a4641d72819 *i386-linux.elf/upx-3.95
|
||||
ddc4952ef008b7f31e69bf53310d6f03b36a959ebb1cd3c3985d560efcbd4296 *i386-win32.pe/upx-3.91.exe
|
||||
99b0b637b562798a440ba605d44e34cf7d4ff995b04dc2e54ebee288ed5180b4 *i386-win32.pe/upx-3.95.exe
|
||||
89a5de403a012256afefff0f88e1cff4696dee611946e326ad15416dbdba7d13 *m68k-atari.tos/upx-3.91.ttp
|
||||
eac695bc19163050c5bee9271393156a195bfef9c3c76f5aaf3aaef00f5602eb *mips-linux.elf/upx-3.95
|
||||
b1331b88421cdf8ef73f8ef1a2c86045fc56a495c08d06d83018c88f5f3934de *mipsel-linux.elf/upx-3.91
|
||||
9644118e26647d489e811ebe3bfd320e2976dbe26621e994fe979b0f9d175818 *mipsel-linux.elf/upx-3.95
|
||||
64a4a31815e4bf43e2ea866faa494c69a4209ed53055f16562d0d2d6ba7fd927 *powerpc-linux.elf/upx-3.91
|
||||
dec559bf9cbd4d1745e8f3bf2cedf016a72f443d037f75eab0d2baab191f0ae1 *powerpc-linux.elf/upx-3.95
|
||||
f10b8afa319b1056a82f24dd52d13003c5cf005fc3cc3481dad1e58ef33e973f *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t150_compress_ucl_2_all_filters="\
|
||||
2e89a5b8192957b066d5a5ee39e47663518f49c1e7811f6806e21d938201d5b6 *amd64-linux.elf/upx-3.91
|
||||
d1cfdda4b93d697211c052f3d85cd745e533261f05cc06c2869a8561c07b4f57 *amd64-linux.elf/upx-3.95
|
||||
c7381363e31af6789111f58ca590b0d751956c322684efa1914f1d918ecc23ce *amd64-win64.pe/upx-3.95.exe
|
||||
4dc8ba75edd4b1c3d890c9deeb033d9abf08fb65054eddb4f34138d34503c21d *arm-linux.elf/upx-3.95
|
||||
36f744d6dca6ecb8c60ee456859ac6a1ac241d12ababa20a5e2d0d79551d53aa *arm-wince.pe/upx-3.91.exe
|
||||
72d3de2abdc3985c790d833a9535054683e2b3feaa6b96778e55ea8f448846a3 *arm64-linux.elf/upx-3.95
|
||||
233d4f130995bb7155064ce6f651b9f6ac61268c8698ccc90a8ea3b2e297cb39 *armeb-linux.elf/upx-3.91
|
||||
a107428a7675181974a8efc359d39da74510098d8307347865f7bcdd707e28ad *armeb-linux.elf/upx-3.95
|
||||
bd57c1e3844310c2a864384f2b83a5781933a5beb05a5eb748a6094e37621166 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
1a13debece417ada4e18d5ec02efa7ef1c354ddfa4674b5717e0aa6bc90c16e3 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
f7b56af17d3d8402310387d1e82f90fa670dfa058feb3fe413ac81c01a1efbb1 *i386-linux.elf/upx-3.91
|
||||
fe9162fbfe8f4eb1c9f286df68107c08f25592d2edaaf5707540c81f709e29ac *i386-linux.elf/upx-3.95
|
||||
aaa267d824bd0520c016edcc1a6642d4898030760879e1da883b8211cf071350 *i386-win32.pe/upx-3.91.exe
|
||||
d178699c0ed805829e457987ea5da21f4e37cf1eb74529235d9b1275bf3122f6 *i386-win32.pe/upx-3.95.exe
|
||||
8376ba3954c4fd9cd5e5e8e38923759db005a4048c3d86dc76476e9f3d92a07d *m68k-atari.tos/upx-3.91.ttp
|
||||
65a0227127b7952a42216c79a8431d1bbe7f04c9efdc81f72095d095a969cb80 *mips-linux.elf/upx-3.95
|
||||
c2bd45b55980bfbc5e568a640643772e3e82bc02cd2c7559cb1c57fc0809d01e *mipsel-linux.elf/upx-3.91
|
||||
74e25daba42baeaaffadab00bacca56b1de5f151a00160592077288a678f41f2 *mipsel-linux.elf/upx-3.95
|
||||
904310944bec344897fc6b7a61dfe8ee639d136c555a950c736059cbc6cac8be *powerpc-linux.elf/upx-3.91
|
||||
5304a95cdcdbdcb76cfac2b93e254f601fb73f68be0a44ed282096aec8d55ae8 *powerpc-linux.elf/upx-3.95
|
||||
7ebd0be91bc9f60e22304103b3543b16a0fd128aa22f11474e31aecc97703e43 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
|
||||
4d8069614af5721c7878daf10ee1d30a6bffc5446532963e2ff0e6cb6f1feecd *amd64-linux.elf/upx-3.91
|
||||
f1971902f7d8f840fdc70ad9edbf5587db556ba046947f5ee7b4130e9ba7de5a *amd64-linux.elf/upx-3.95
|
||||
0198a6cfd468f7ec7cd32294333400a4c97bf1cac32602594681db8f08c87700 *amd64-win64.pe/upx-3.95.exe
|
||||
d46340dcd209cce0f1d65d6a50754ea3246cdbba730199765b2c2ac40957bd55 *arm-linux.elf/upx-3.95
|
||||
aa03361a7dae633d5b6c8b4164726c99bfc28fcf4f1ac8ebea6fc44e90c03244 *arm-wince.pe/upx-3.91.exe
|
||||
aa0a3dda3e2f073eb36d6614c02f4af79590876a23437623ea6c231be8e070fa *arm64-linux.elf/upx-3.95
|
||||
578547a4d527655c7fd661148dfcf0f7dc9585dfb08063c13b116364a881bf15 *armeb-linux.elf/upx-3.91
|
||||
0034809b31b0105631b0e4c0a4378cfd26a80dfca2016228e8084f410025f091 *armeb-linux.elf/upx-3.95
|
||||
55b9b578a97a7b8637a9041a222269f2563a4e1f75c329c533f83432c8f9652c *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
98a9f601d095f910c68bbf35ff50f19e3e851ef5dae78fc0e9ef4462dd8a314d *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
45f714365212b31419986016b5b730ca77523036469e28242543bfde4dc44678 *i386-linux.elf/upx-3.91
|
||||
e45f6ae7ad7b9e719e5080bfbd04e7c961242473bb8f1574cb625bc8a1abd201 *i386-linux.elf/upx-3.95
|
||||
0b5d940059fc6f2a3d5664eadd0781399210c306be99411beeb8f6f02ea85762 *i386-win32.pe/upx-3.91.exe
|
||||
0f5b50dfe0db34ae07f113871a39c64624f964ed16dc8d49922e6a891c17a3bd *i386-win32.pe/upx-3.95.exe
|
||||
56fd999694feb66cdc2272daf86bb91b3c66b857867f3e0c071f3e70624760f4 *m68k-atari.tos/upx-3.91.ttp
|
||||
2d8d2e02bedad8ba1e7d69a89888b173b9be48ee154e2461c205ba4eae6ececa *mips-linux.elf/upx-3.95
|
||||
c478c21ecabe91910cf861ebc6b6d38deeb31545e5ae44eaf826dafb477bbfba *mipsel-linux.elf/upx-3.91
|
||||
4d66e1b32ca6b1d399616de5643ee5d1c54a7bf1eca761055570450f56efe4f9 *mipsel-linux.elf/upx-3.95
|
||||
72c85b48afb30cc191483af41f797a397225cfaaa44e2eaf7a9d59d9033335e1 *powerpc-linux.elf/upx-3.91
|
||||
c0ed0c72fd6a6e0bfb4444b8c358018246f80cbc732388a22bd2492fd9fdc59c *powerpc-linux.elf/upx-3.95
|
||||
070f4c2ca60717abedda0ab4030d546cca8a75b9872038a414e2946b8d8f93e7 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t170_compress_all_methods_no_lzma_5_no_filter="\
|
||||
223bcdc5f11daa4d0258090e967d4e0b5986d764d6b21fcfadba7212676396f2 *amd64-linux.elf/upx-3.91
|
||||
a3e5f1a20bd9db4ae920c5c7e7f1707a63fa3f557f9db50b5e1004b706e3a52c *amd64-linux.elf/upx-3.95
|
||||
355011427a4d433ccef5060e4cbebc59b0ecc38a430566cdb684330388ea0812 *amd64-win64.pe/upx-3.95.exe
|
||||
1e0a8363b539953181dc95283a1e3100bacce961f49e875c8f430b18d0e6672d *arm-linux.elf/upx-3.95
|
||||
e281362e2172468d20ea2c7171c847f47e01a63d912cafacf977236655708521 *arm-wince.pe/upx-3.91.exe
|
||||
7f3497c67e816b3f2af6642f09ba809166f8a0a65f52936cfb2e3d9756d7bd44 *arm64-linux.elf/upx-3.95
|
||||
7d9d52959a64c5dd19ea343c8c2bdd4d70fd0644d13c62924760407515fd74ba *armeb-linux.elf/upx-3.91
|
||||
e05ad251ec24e2f788de71c4c8cf7c8880a8eb7d8a516ca8d6ab94c715c2f77d *armeb-linux.elf/upx-3.95
|
||||
00a030d8967c5145b955eba17d84edd44b21c93b570f80a44e894a10a3ebf99f *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
b4b0e3c774dbf3940af777d28e1ba7c62bfedaa710e3376e81259218779eae56 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
f903265140b193e672c4dd2bc28e68b9f822d73517f0b339fc715ad781a49fab *i386-linux.elf/upx-3.91
|
||||
6253062e41c4619bb3aeb807665a2925b1f01095d000c614c443b81d44112a1d *i386-linux.elf/upx-3.95
|
||||
7664ed4ce00b962a21ca5654993c4c4cb2ec1afcf9dc921cd90862f8412572cc *i386-win32.pe/upx-3.91.exe
|
||||
6ef354d0b2dffc71c32fc33f3f89b0b8ae7035e43e8a684a12d6ce2c53caf706 *i386-win32.pe/upx-3.95.exe
|
||||
5890050fe690bb93bf70693f1bef0e6ea708029836c7d8aa57de02b6aefe4239 *m68k-atari.tos/upx-3.91.ttp
|
||||
2bce2082ae39dedcc21a1a6c83e954073b368e9172ee0c7f2a3f13b3447a7898 *mips-linux.elf/upx-3.95
|
||||
d5b88d291a8a2141d9d9f07a6a21e11522e510c6520ba0c36ebf94d089962607 *mipsel-linux.elf/upx-3.91
|
||||
ff42d564999e02346c86d4156266f423edd55b3887aadf76d81a8c355e3b175d *mipsel-linux.elf/upx-3.95
|
||||
f33205ad8252524d8c48d18cdb03bba507e29c9cc931f94327a5a46480f70843 *powerpc-linux.elf/upx-3.91
|
||||
011683a891e30ea346efe9ba5c1488fb50f143e4090bd2be07537c696d6167db *powerpc-linux.elf/upx-3.95
|
||||
9d919460b0ceec4b880cdf14850fea8096d6796c2457467b3cc9b2ce954cc6de *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
########## end .sha256sums.recreate
|
||||
@@ -1,290 +0,0 @@
|
||||
#! /bin/bash
|
||||
## vim:set ts=4 sw=4 et:
|
||||
set -e; set -o pipefail
|
||||
argv0=$0; argv0abs=$(readlink -en -- "$0"); argv0dir=$(dirname "$argv0abs")
|
||||
|
||||
# very first version of the upx-testsuite; requires:
|
||||
# $upx_exe
|
||||
# $upx_testsuite_SRCDIR
|
||||
# $upx_testsuite_BUILDDIR (optional)
|
||||
# $BM_T (optional)
|
||||
|
||||
# convenience
|
||||
[[ -z $upx_testsuite_BUILDDIR ]] && upx_testsuite_BUILDDIR=./tmp-upx-testsuite
|
||||
[[ -f $upx_exe ]] && upx_exe=$(readlink -en -- "$upx_exe")
|
||||
|
||||
# make dirs absolute
|
||||
upx_testsuite_SRCDIR=$(readlink -en -- "$upx_testsuite_SRCDIR")
|
||||
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'
|
||||
echo ' and set (export) the envvar upx_testsuite_SRCDIR to the local file path'
|
||||
exit 1
|
||||
fi
|
||||
mkdir -p "$upx_testsuite_BUILDDIR"
|
||||
upx_testsuite_BUILDDIR=$(readlink -en -- "$upx_testsuite_BUILDDIR")
|
||||
|
||||
cd / && cd "$upx_testsuite_BUILDDIR" || exit 1
|
||||
|
||||
# /***********************************************************************
|
||||
# // support functions
|
||||
# ************************************************************************/
|
||||
|
||||
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 */* | 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 */* | 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
|
||||
$upx_run -qq --prefer-ucl "$@" $f -o $testdir/$fsubdir/$fb
|
||||
$upx_run -qq -d $testdir/$fsubdir/$fb -o $testdir/.decompressed/$fsubdir/$fb
|
||||
done
|
||||
testsuite_check_sha $testdir
|
||||
$upx_run -qq -l $testdir/*/*
|
||||
$upx_run -qq --file-info $testdir/*/*
|
||||
$upx_run -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/travis_testsuite_1-expected_sha256sums.sh" || exit 1
|
||||
|
||||
# /***********************************************************************
|
||||
# // init
|
||||
# ************************************************************************/
|
||||
|
||||
#set -x # debug
|
||||
exit_code=0
|
||||
num_errors=0
|
||||
all_errors=
|
||||
|
||||
if [[ $BM_T =~ (^|\+)ALLOW_FAIL($|\+) ]]; then
|
||||
echo "ALLOW_FAIL"
|
||||
set +e
|
||||
fi
|
||||
|
||||
if [[ -z $upx_exe ]]; then exit 1; fi
|
||||
upx_run=$upx_exe
|
||||
if [[ $BM_T =~ (^|\+)qemu($|\+) && -n $upx_qemu ]]; then
|
||||
upx_run="$upx_qemu $upx_qemu_flags -- $upx_exe"
|
||||
fi
|
||||
if [[ $BM_T =~ (^|\+)wine($|\+) && -n $upx_wine ]]; then
|
||||
upx_run="$upx_wine $upx_wine_flags $upx_exe"
|
||||
fi
|
||||
if [[ $BM_T =~ (^|\+)valgrind($|\+) ]]; then
|
||||
if [[ -z $upx_valgrind ]]; then
|
||||
upx_valgrind="valgrind"
|
||||
fi
|
||||
if [[ -z $upx_valgrind_flags ]]; then
|
||||
#upx_valgrind_flags="--leak-check=full --show-reachable=yes"
|
||||
#upx_valgrind_flags="-q --leak-check=no --error-exitcode=1"
|
||||
upx_valgrind_flags="--leak-check=no --error-exitcode=1"
|
||||
fi
|
||||
upx_run="$upx_valgrind $upx_valgrind_flags $upx_exe"
|
||||
fi
|
||||
|
||||
export UPX="--prefer-ucl --no-color --no-progress"
|
||||
export UPX_DEBUG_DISABLE_GITREV_WARNING=1
|
||||
export UPX_DEBUG_DOCTEST_VERBOSE=0
|
||||
|
||||
# let's go
|
||||
if ! $upx_run --version-short; then echo "UPX-ERROR: FATAL: upx --version-short FAILED"; exit 1; fi
|
||||
if ! $upx_run -L >/dev/null 2>&1; then echo "UPX-ERROR: FATAL: upx -L FAILED"; exit 1; fi
|
||||
if ! $upx_run --help >/dev/null; then echo "UPX-ERROR: FATAL: upx --help FAILED"; exit 1; fi
|
||||
rm -rf ./testsuite_1
|
||||
mkdir testsuite_1
|
||||
cd testsuite_1 || 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
|
||||
$upx_run -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
|
||||
$upx_run -qq --prefer-ucl -1 $f -o $testdir/$fsubdir/.packed/$fb
|
||||
$upx_run -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
|
||||
# ************************************************************************/
|
||||
|
||||
case $UPX_TESTSUITE_FAST in
|
||||
[0-7]) ;;
|
||||
*) UPX_TESTSUITE_FAST=999 ;;
|
||||
esac
|
||||
|
||||
if [[ $UPX_TESTSUITE_FAST -ge 1 ]]; 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_FAST -ge 2 ]]; 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_FAST -ge 3 ]]; 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_FAST -ge 4 ]]; 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_FAST -ge 5 ]]; 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_FAST -ge 6 ]]; 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_FAST -ge 7 ]]; 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"
|
||||
if ! $upx_run --version-short; then
|
||||
echo "UPX-ERROR: upx --version-short FAILED"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "upx_exe='$upx_exe'"
|
||||
if [[ $upx_run != "$upx_exe" ]]; then
|
||||
echo "upx_run='$upx_run'"
|
||||
fi
|
||||
if [[ -f $upx_exe ]]; then
|
||||
ls -l "$upx_exe"
|
||||
file "$upx_exe" || true
|
||||
fi
|
||||
echo "upx_testsuite_SRCDIR='$upx_testsuite_SRCDIR'"
|
||||
echo "upx_testsuite_BUILDDIR='$upx_testsuite_BUILDDIR'"
|
||||
echo ".sha256sums.{expected,current}:"
|
||||
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
|
||||
+647
-279
File diff suppressed because it is too large
Load Diff
@@ -1,38 +0,0 @@
|
||||
name: 'Static Analyzer - CodeQL'
|
||||
|
||||
on:
|
||||
# push:
|
||||
# branches: [ 'devel', 'devel4', 'devel5', 'master' ]
|
||||
# pull_request:
|
||||
# # The branches below must be a subset of the branches above
|
||||
# branches: [ 'devel', 'devel4', 'devel5' ]
|
||||
schedule:
|
||||
- cron: '20 1 * * 3'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'cpp' ]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
with: { submodules: true }
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
+12
-10
@@ -1,3 +1,5 @@
|
||||
# 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
|
||||
|
||||
@@ -10,28 +12,28 @@
|
||||
# Abandoned Issues and Pull Request".
|
||||
# https://igorwiese.com/images/papers/Paper_BotSE_19.pdf
|
||||
|
||||
name: 'GitHub - Close inactive issues'
|
||||
name: GitHub - Close stale issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 6 * * 4'
|
||||
schedule: [cron: "50 0 * * 1"] # run weekly Monday 00:50 UTC
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
close-issues:
|
||||
name: 'Close inactive issues'
|
||||
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@v7
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
operations-per-run: 300
|
||||
exempt-all-milestones: true
|
||||
exempt-issue-labels: 'blocker,enhancement,regression'
|
||||
days-before-stale: 60
|
||||
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 60 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 60 days with no activity. Please remove the stale label or add a comment or this PR will be closed in 30 days.'
|
||||
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 }}
|
||||
@@ -1,29 +0,0 @@
|
||||
# minimal GitHub CI building UPX with clang and gcc in an Alpine Linux container
|
||||
|
||||
name: 'CI - Minimal CI with Alpine Linux'
|
||||
|
||||
on: { workflow_dispatch: }
|
||||
jobs:
|
||||
job-alpine-cmake:
|
||||
strategy: {matrix: {container: ['alpine:3.12','alpine:3.17','alpine:edge']}}
|
||||
name: ${{ format('container {0}', matrix.container) }}
|
||||
runs-on: ubuntu-latest
|
||||
container: ${{ matrix.container }}
|
||||
steps:
|
||||
- name: ${{ format('Install packages {0}', matrix.container) }}
|
||||
run: 'apk update && apk upgrade && apk add bash clang cmake g++ git make'
|
||||
- name: ${{ format('Check out code upx-{0}', github.ref_name) }}
|
||||
run: |
|
||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx
|
||||
git -C upx submodule update --init
|
||||
echo "artifact_name=upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-minimal-ci-${{ matrix.container }}" | sed 's/[:,; ]/-/g' >> $GITHUB_ENV
|
||||
- { name: 'Build clang', run: 'make -C upx UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static"' }
|
||||
- { name: 'Build gcc', run: 'make -C upx UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static"' }
|
||||
- { name: 'Strip release binaries', run: 'strip -p --strip-unneeded upx/build/*/*/release/upx' }
|
||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.artifact_name }}
|
||||
path: 'upx*/build/*/*/*/upx'
|
||||
- { name: 'Run basic tests clang', run: 'make -C upx/build/xtarget/clang-static/release test' }
|
||||
- { name: 'Run basic tests gcc', run: 'make -C upx/build/xtarget/gcc-static/release test' }
|
||||
@@ -1,16 +0,0 @@
|
||||
name: 'GitHub - Close pull requests'
|
||||
on:
|
||||
#pull_request:
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
close-pull-requests:
|
||||
name: 'Close pull requests'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: 'Close pull requests'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh pr list --repo='${{ github.repository }}' --state=open --json=number | jq '.[].number' | xargs -r -n1 -- gh pr close --repo='${{ github.repository }}'
|
||||
@@ -1,22 +0,0 @@
|
||||
name: 'Static Analyzer - scan-build'
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '40 1 * * 3'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
container: 'alpine:edge'
|
||||
steps:
|
||||
- name: 'Install packages'
|
||||
run: 'apk update && apk upgrade && apk add bash clang clang-analyzer cmake g++ git make'
|
||||
- name: 'Check out code'
|
||||
uses: actions/checkout@v3
|
||||
with: { submodules: true }
|
||||
- name: 'Perform scan-build Analysis Debug'
|
||||
run: 'make build/extra/scan-build/debug'
|
||||
- name: 'Perform scan-build Analysis Release'
|
||||
run: 'make build/extra/scan-build/release'
|
||||
+38
-18
@@ -1,42 +1,62 @@
|
||||
/.cache*
|
||||
/.idea/
|
||||
/.hg*
|
||||
/.vscode*
|
||||
/Makevars.global*
|
||||
/.zed/
|
||||
/CMakeCache*
|
||||
/CMakeFiles*
|
||||
/CTest*
|
||||
/Makevars[.-]global*
|
||||
/Testing*
|
||||
/build*
|
||||
/maint*
|
||||
/vendor*
|
||||
|
||||
GNUmakefile
|
||||
MMakefile
|
||||
Makevars.local*
|
||||
GNUmakefile*
|
||||
MMakefile*
|
||||
Makevars[.-]local*
|
||||
compile_commands*.json
|
||||
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
|
||||
/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/**/.*-stamp
|
||||
/src/stub/src/**/tmp*/*
|
||||
/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/tools/sstrip/amd64-linux-sstrip
|
||||
src/stub/tools/sstrip/i386-linux-sstrip
|
||||
src/stub/tools/sstrip/sstrip
|
||||
/src/stub/tools/sstrip/amd64-linux-sstrip
|
||||
/src/stub/tools/sstrip/i386-linux-sstrip
|
||||
/src/stub/tools/sstrip/sstrip
|
||||
|
||||
+377
-187
@@ -1,46 +1,106 @@
|
||||
cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)
|
||||
#
|
||||
# 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)
|
||||
elseif(NOT ${CMAKE_VERSION} VERSION_LESS "3.10")
|
||||
cmake_minimum_required(VERSION "3.10" 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")
|
||||
upx_print_var(CMAKE_VERSION UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION CMAKE_GENERATOR)
|
||||
upx_print_var(CMAKE_GENERATOR_TOOLSET CMAKE_GENERATOR_PLATFORM)
|
||||
upx_print_env_var(CC CXX CPPFLAGS CFLAGS CXXFLAGS)
|
||||
|
||||
#***********************************************************************
|
||||
# options
|
||||
#***********************************************************************
|
||||
|
||||
upx_cmake_include_hook(1_options)
|
||||
|
||||
# compilation config options
|
||||
if(NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git")
|
||||
if(NOT USE_STRICT_DEFAULTS)
|
||||
# permissive config defaults when building from source code tarball
|
||||
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with default Git version info." ON)
|
||||
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with default sanitize options." ON)
|
||||
option(UPX_CONFIG_DISABLE_WERROR "Do not compile with default -Werror option." ON)
|
||||
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 devel builds
|
||||
message(STATUS "===== UPX info: strict config defaults enabled")
|
||||
option(UPX_CONFIG_DISABLE_GITREV "Do not compile with default Git version info." OFF)
|
||||
option(UPX_CONFIG_DISABLE_SANITIZE "Do not compile with default sanitize options." OFF)
|
||||
option(UPX_CONFIG_DISABLE_WERROR "Do not compile with default -Werror option." OFF)
|
||||
# strict config defaults for Git developer builds
|
||||
message(STATUS "===== UPX NOTE: strict developer 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)
|
||||
# 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)
|
||||
# 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
|
||||
#***********************************************************************
|
||||
|
||||
# Disallow in-source builds. Note that you will still have to manually
|
||||
# clean up a few files if you accidentally try an in-source build.
|
||||
if(NOT MSVC_IDE)
|
||||
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
|
||||
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
|
||||
if(",${CMAKE_CURRENT_SOURCE_DIR}," STREQUAL ",${CMAKE_CURRENT_BINARY_DIR},")
|
||||
message(FATAL_ERROR "ERROR: In-source builds are not allowed, please use an extra build dir.")
|
||||
endif()
|
||||
endif()
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(UPX_VERSION_STRING "5.1.0") # this should match src/version.h
|
||||
|
||||
# determine git revision
|
||||
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 that default to OFF; useful for CI jobs
|
||||
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_DISABLE_SAVE_TEMPS UPX_CONFIG_DISABLE_SHARED_LIBS UPX_CONFIG_REQUIRE_THREADS
|
||||
)
|
||||
upx_cache_bool_vars(ON UPX_CONFIG_EXPECT_THREADS)
|
||||
|
||||
# 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 AND NOT UPX_CONFIG_DISABLE_GITREV)
|
||||
if(Git_FOUND)
|
||||
execute_process(
|
||||
COMMAND "${GIT_EXECUTABLE}" rev-parse --short=12 HEAD
|
||||
RESULT_VARIABLE result ERROR_QUIET
|
||||
@@ -64,8 +124,6 @@ if(Git_FOUND AND NOT UPX_CONFIG_DISABLE_GITREV)
|
||||
set(GIT_DESCRIBE "${CMAKE_MATCH_1}-devel.${CMAKE_MATCH_2}+git-${CMAKE_MATCH_3}")
|
||||
endif()
|
||||
endif()
|
||||
if(NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.git") # extra check
|
||||
set(GITREV_SHORT "")
|
||||
endif()
|
||||
if(GITREV_SHORT)
|
||||
message(STATUS "UPX_VERSION_GITREV = \"${GITREV_SHORT}${GITREV_PLUS}\"")
|
||||
@@ -79,152 +137,270 @@ else()
|
||||
endif()
|
||||
|
||||
# CMake init
|
||||
project(upx VERSION 4.0.2 LANGUAGES C CXX)
|
||||
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()
|
||||
upx_set_global_vars()
|
||||
upx_check_working_build_rpath(UPX_CONFIG_HAVE_WORKING_BUILD_RPATH)
|
||||
|
||||
# set default build type to "Release"
|
||||
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if(is_multi_config)
|
||||
set(c "${CMAKE_CONFIGURATION_TYPES}")
|
||||
list(INSERT c 0 "Release")
|
||||
list(INSERT c 1 "Debug")
|
||||
if (CMAKE_BUILD_TYPE)
|
||||
list(INSERT c 0 "${CMAKE_BUILD_TYPE}")
|
||||
if(DEFINED UPX_CONFIG_CMAKE_EXECUTABLE_SUFFIX)
|
||||
set(CMAKE_EXECUTABLE_SUFFIX "${UPX_CONFIG_CMAKE_EXECUTABLE_SUFFIX}")
|
||||
endif()
|
||||
list(REMOVE_DUPLICATES c)
|
||||
set(CMAKE_CONFIGURATION_TYPES "${c}" CACHE STRING "List of supported configuration types." FORCE)
|
||||
elseif(NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
|
||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_INSTALL AND CMAKE_INSTALL_PREFIX)
|
||||
include(GNUInstallDirs)
|
||||
endif()
|
||||
|
||||
#***********************************************************************
|
||||
# targets and compilation flags
|
||||
# common compilation flags
|
||||
#***********************************************************************
|
||||
|
||||
#find_package(Threads) # multithreading is currently not used; maybe in UPX version 5
|
||||
set(UPX_CONFIG_DISABLE_ZSTD ON) # zstd is currently not used; maybe in UPX version 5
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckFunctionExists)
|
||||
include(CheckIncludeFile)
|
||||
include(CheckStructHasMember)
|
||||
include(CheckSymbolExists)
|
||||
include(CheckTypeSize)
|
||||
|
||||
file(GLOB ucl_SOURCES "vendor/ucl/src/*.c")
|
||||
list(SORT ucl_SOURCES)
|
||||
add_library(upx_vendor_ucl STATIC ${ucl_SOURCES})
|
||||
set_property(TARGET upx_vendor_ucl PROPERTY C_STANDARD 11)
|
||||
upx_cmake_include_hook(3_common_compilation_flags)
|
||||
|
||||
file(GLOB zlib_SOURCES "vendor/zlib/*.c")
|
||||
list(SORT zlib_SOURCES)
|
||||
add_library(upx_vendor_zlib STATIC ${zlib_SOURCES})
|
||||
set_property(TARGET upx_vendor_zlib PROPERTY C_STANDARD 11)
|
||||
|
||||
if(NOT UPX_CONFIG_DISABLE_ZSTD)
|
||||
file(GLOB zstd_SOURCES "vendor/zstd/lib/*/*.c")
|
||||
list(SORT zstd_SOURCES)
|
||||
add_library(upx_vendor_zstd STATIC ${zstd_SOURCES})
|
||||
set_property(TARGET upx_vendor_zstd PROPERTY C_STANDARD 11)
|
||||
# assert sane type sizes
|
||||
check_type_size("size_t" C_SIZEOF_SIZE_T LANGUAGE C)
|
||||
check_type_size("size_t" CXX_SIZEOF_SIZE_T LANGUAGE CXX)
|
||||
if(NOT "${C_SIZEOF_SIZE_T}" MATCHES "^(4|8|16)$")
|
||||
message(FATAL_ERROR "ERROR: unexpected C_SIZEOF_SIZE_T '${C_SIZEOF_SIZE_T}'")
|
||||
endif()
|
||||
if(NOT ",${C_SIZEOF_SIZE_T}," STREQUAL ",${CXX_SIZEOF_SIZE_T},")
|
||||
message(FATAL_ERROR "FATAL ERROR: '${C_SIZEOF_SIZE_T}' '${CXX_SIZEOF_SIZE_T}' mismatch")
|
||||
endif()
|
||||
|
||||
file(GLOB upx_SOURCES "src/*.cpp" "src/[cfu]*/*.cpp")
|
||||
list(SORT upx_SOURCES)
|
||||
add_executable(upx ${upx_SOURCES})
|
||||
set_property(TARGET upx PROPERTY CXX_STANDARD 17)
|
||||
target_link_libraries(upx upx_vendor_ucl upx_vendor_zlib)
|
||||
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(NOT MSVC)
|
||||
# rather strict default compilation warnings
|
||||
set(warn_strict
|
||||
-Wall -Wextra -Wcast-align -Wcast-qual -Wmissing-declarations
|
||||
-Wpointer-arith -Wshadow -Wvla -Wwrite-strings
|
||||
)
|
||||
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 MSVC)
|
||||
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)
|
||||
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)
|
||||
# set __cplusplus according to selected C++ standard; use new preprocessor
|
||||
add_definitions(-Zc:__cplusplus -Zc:preprocessor)
|
||||
else()
|
||||
add_definitions(-D_SCL_SECURE_NO_DEPRECATE)
|
||||
add_definitions(-D_SCL_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"
|
||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||
add_definitions(-fno-delete-null-pointer-checks -fno-lifetime-dse)
|
||||
endif()
|
||||
add_definitions(-fno-strict-aliasing -fno-strict-overflow -funsigned-char)
|
||||
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
|
||||
add_definitions(-fno-tree-vectorize)
|
||||
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()
|
||||
|
||||
# compile a target with -O2 in Debug build
|
||||
function(upx_compile_target_debug_with_O2 t)
|
||||
if(MSVC)
|
||||
# msvc uses some Debug compile options like -RTC1 that are incompatible with -O2
|
||||
else()
|
||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:-O2>)
|
||||
# examine compiler configuration
|
||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO)
|
||||
upx_print_common_symbols()
|
||||
upx_print_mingw_symbols()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(upx_sanitize_target t)
|
||||
if(NOT UPX_CONFIG_DISABLE_SANITIZE AND NOT MSVC)
|
||||
if(CMAKE_C_PLATFORM_ID MATCHES "^MinGW" OR MINGW OR CYGWIN)
|
||||
# avoid link errors with current MinGW-w64 versions
|
||||
# see https://www.mingw-w64.org/contribute/#sanitizers-asan-tsan-usan
|
||||
#***********************************************************************
|
||||
# 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 6
|
||||
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 6
|
||||
|
||||
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()
|
||||
# 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:Release>:-fstack-protector>)
|
||||
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
|
||||
if(UPX_CONFIG_REQUIRE_THREADS OR (UPX_CONFIG_EXPECT_THREADS AND NOT UPX_CONFIG_DISABLE_THREADS))
|
||||
message(WARNING "Threads FAILED ${f}: ${output}") # output from try_compile()
|
||||
endif()
|
||||
endfunction()
|
||||
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)
|
||||
target_compile_options(${t} PRIVATE -J -W4 ${warn_WX})
|
||||
else()
|
||||
target_compile_options(${t} PRIVATE ${warn_strict} ${warn_Werror})
|
||||
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)
|
||||
target_include_directories(${t} PRIVATE vendor/zlib)
|
||||
upx_compile_target_debug_with_O2(${t})
|
||||
upx_sanitize_target(${t})
|
||||
if(MSVC)
|
||||
target_compile_options(${t} PRIVATE -DHAVE_STDARG_H -DHAVE_VSNPRINTF -J -W3 ${warn_WX})
|
||||
else()
|
||||
target_compile_options(${t} PRIVATE -DHAVE_STDARG_H -DHAVE_UNISTD_H -DHAVE_VSNPRINTF)
|
||||
# clang-15: -Wno-strict-prototypes is needed to silence the new -Wdeprecated-non-prototype warning
|
||||
target_compile_options(${t} PRIVATE -Wall -Wextra -Wvla -Wno-strict-prototypes ${warn_Werror})
|
||||
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_options(${t} PRIVATE -DDYNAMIC_BMI2=0 -DZSTD_DISABLE_ASM)
|
||||
if(MSVC)
|
||||
target_compile_options(${t} PRIVATE -J -W4 ${warn_WX})
|
||||
else()
|
||||
target_compile_options(${t} PRIVATE ${warn_strict} ${warn_Werror})
|
||||
endif()
|
||||
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 vendor/boost-pfr/include)
|
||||
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}")
|
||||
@@ -232,118 +408,132 @@ if(GITREV_SHORT)
|
||||
target_compile_definitions(${t} PRIVATE UPX_VERSION_GIT_DESCRIBE="${GIT_DESCRIBE}")
|
||||
endif()
|
||||
endif()
|
||||
#upx_compile_target_debug_with_O2(${t})
|
||||
upx_sanitize_target(${t})
|
||||
if(MSVC)
|
||||
target_compile_options(${t} PRIVATE -EHsc -J -W4 ${warn_WX})
|
||||
else()
|
||||
target_compile_options(${t} PRIVATE ${warn_strict} ${warn_Werror})
|
||||
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)
|
||||
target_link_libraries(upx upx_vendor_zstd)
|
||||
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)
|
||||
|
||||
#***********************************************************************
|
||||
# "ctest"
|
||||
# "make test"
|
||||
# "ninja test"
|
||||
# test
|
||||
# ctest
|
||||
# make test
|
||||
# ninja test
|
||||
#***********************************************************************
|
||||
|
||||
upx_cmake_include_hook(6_test)
|
||||
|
||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_TEST)
|
||||
|
||||
add_custom_command(TARGET upx POST_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/XTesting/$<CONFIG>")
|
||||
|
||||
include(CTest)
|
||||
if(NOT CMAKE_CROSSCOMPILING)
|
||||
add_test(NAME upx-version COMMAND upx --version)
|
||||
add_test(NAME upx-help COMMAND upx --help)
|
||||
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")
|
||||
upx_self_pack_test()
|
||||
endif()
|
||||
if(NOT CMAKE_CROSSCOMPILING AND NOT UPX_CONFIG_DISABLE_SELF_PACK_TEST)
|
||||
# NOTE: these tests can only work if the host executable format is supported by UPX!
|
||||
function(upx_add_test)
|
||||
set(name ${ARGV0})
|
||||
list(REMOVE_AT ARGV 0)
|
||||
add_test(NAME ${name} COMMAND ${ARGV})
|
||||
set_tests_properties(${name} PROPERTIES RUN_SERIAL TRUE) # run these tests sequentially
|
||||
endfunction()
|
||||
set(exe ${CMAKE_EXECUTABLE_SUFFIX})
|
||||
set(upx_self_exe "$<TARGET_FILE:upx>")
|
||||
set(fo "--force-overwrite")
|
||||
upx_add_test(upx-self-pack upx -3 ${upx_self_exe} ${fo} -o upx-packed${exe})
|
||||
upx_add_test(upx-self-pack-n2b upx -3 --nrv2b ${upx_self_exe} ${fo} -o upx-packed-n2b${exe})
|
||||
upx_add_test(upx-self-pack-n2d upx -3 --nrv2d ${upx_self_exe} ${fo} -o upx-packed-n2d${exe})
|
||||
upx_add_test(upx-self-pack-n2e upx -3 --nrv2e ${upx_self_exe} ${fo} -o upx-packed-n2e${exe})
|
||||
upx_add_test(upx-self-pack-lzma upx -3 --lzma ${upx_self_exe} ${fo} -o upx-packed-lzma${exe})
|
||||
upx_add_test(upx-list upx -l upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
||||
upx_add_test(upx-fileinfo upx --fileinfo upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
||||
upx_add_test(upx-test upx -t upx-packed${exe} upx-packed-n2b${exe} upx-packed-n2d${exe} upx-packed-n2e${exe} upx-packed-lzma${exe})
|
||||
upx_add_test(upx-unpack upx -d upx-packed${exe} ${fo} -o upx-unpacked${exe})
|
||||
upx_add_test(upx-run-unpacked ./upx-unpacked${exe} --version-short)
|
||||
upx_add_test(upx-run-packed ./upx-packed${exe} --version-short)
|
||||
endif()
|
||||
|
||||
endif() # UPX_CONFIG_CMAKE_DISABLE_TEST
|
||||
|
||||
#***********************************************************************
|
||||
# "cmake --install ."
|
||||
# "make install"
|
||||
# "ninja install"
|
||||
# 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.")
|
||||
#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()
|
||||
if(CMAKE_INSTALL_PREFIX AND DEFINED CMAKE_INSTALL_FULL_BINDIR)
|
||||
install(TARGETS upx DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}")
|
||||
# install files
|
||||
if(CMAKE_INSTALL_PREFIX AND DEFINED CMAKE_INSTALL_BINDIR)
|
||||
install(TARGETS upx DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||
install(FILES
|
||||
COPYING LICENSE NEWS README THANKS doc/upx-doc.html doc/upx-doc.txt
|
||||
DESTINATION "${CMAKE_INSTALL_FULL_DOCDIR}"
|
||||
COPYING LICENSE NEWS README doc/THANKS.txt doc/upx-doc.html doc/upx-doc.txt
|
||||
DESTINATION "${CMAKE_INSTALL_DOCDIR}"
|
||||
)
|
||||
install(FILES doc/upx.1 DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man1")
|
||||
install(FILES doc/upx.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1")
|
||||
endif()
|
||||
|
||||
endif() # UPX_CONFIG_CMAKE_DISABLE_INSTALL
|
||||
|
||||
#***********************************************************************
|
||||
# finally print some info about the build configuration
|
||||
# summary
|
||||
# print some info about the build configuration
|
||||
#***********************************************************************
|
||||
|
||||
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/maint/make/CMakeLists.maint.txt")
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/maint/make/CMakeLists.maint.txt")
|
||||
endif()
|
||||
upx_cmake_include_hook(8_summary)
|
||||
|
||||
function(print_var)
|
||||
foreach(v ${ARGV})
|
||||
if(${v})
|
||||
message(STATUS "${v} = ${${v}}")
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
upx_print_var(CMAKE_VERSION UPX_CONFIG_CMAKE_MINIMUM_REQUIRED_VERSION CMAKE_GENERATOR)
|
||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO)
|
||||
print_var(CMAKE_HOST_SYSTEM_NAME CMAKE_HOST_SYSTEM_VERSION)
|
||||
print_var(CMAKE_SYSTEM_NAME CMAKE_SYSTEM_VERSION CMAKE_CROSSCOMPILING)
|
||||
print_var(CMAKE_C_COMPILER_ID CMAKE_C_COMPILER_VERSION CMAKE_C_COMPILER_ARCHITECTURE_ID CMAKE_C_PLATFORM_ID CMAKE_C_COMPILER_ABI)
|
||||
print_var(CMAKE_CXX_COMPILER_ID CMAKE_CXX_COMPILER_VERSION CMAKE_CXX_COMPILER_ARCHITECTURE_ID CMAKE_CXX_PLATFORM_ID CMAKE_CXX_COMPILER_ABI)
|
||||
endif() # UPX_CONFIG_CMAKE_DISABLE_PRINT_INFO
|
||||
print_var(CMAKE_INSTALL_PREFIX CMAKE_CONFIGURATION_TYPES CMAKE_BUILD_TYPE)
|
||||
if (CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release)$")
|
||||
# print detailed info
|
||||
include("${CMAKE_CURRENT_SOURCE_DIR}/misc/cmake/print_info.cmake")
|
||||
upx_print_info()
|
||||
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()
|
||||
|
||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK)
|
||||
# extra sanity checks to detect incompatible C vs CXX settings
|
||||
if(NOT ",${CMAKE_C_PLATFORM_ID}," STREQUAL ",${CMAKE_CXX_PLATFORM_ID},")
|
||||
message(FATAL_ERROR "ERROR: CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID mismatch")
|
||||
if(NOT UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK)
|
||||
upx_platform_check_c_cxx_mismatch()
|
||||
endif()
|
||||
if(NOT ",${CMAKE_C_COMPILER_ABI}," STREQUAL ",${CMAKE_CXX_COMPILER_ABI},")
|
||||
message(FATAL_ERROR "ERROR: CMAKE_C_COMPILER_ABI CMAKE_CXX_COMPILER_ABI mismatch")
|
||||
endif()
|
||||
endif() # UPX_CONFIG_CMAKE_DISABLE_PLATFORM_CHECK
|
||||
|
||||
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,19 +1,21 @@
|
||||
#
|
||||
# UPX top-level Makefile - needs GNU make and CMake >= 3.13
|
||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
#
|
||||
|
||||
# INFO: this Makefile is just a convenience wrapper for calling CMake
|
||||
|
||||
# NOTE: if you only have an older CMake 3.x then you can invoke cmake manually like this:
|
||||
# HINT: if you only have an older CMake 3.x then you can invoke cmake manually like this:
|
||||
# mkdir -p build/release
|
||||
# cd build/release
|
||||
# cmake ../..
|
||||
# make -j (or use "cmake --build . --parallel")
|
||||
# cmake ../.. # run config
|
||||
# make -j4 # and run build
|
||||
|
||||
CMAKE = cmake
|
||||
UPX_CMAKE_BUILD_FLAGS += --parallel
|
||||
ifneq ($(VERBOSE),)
|
||||
UPX_CMAKE_BUILD_FLAGS += --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
|
||||
@@ -22,14 +24,19 @@ endif
|
||||
# default
|
||||
#***********************************************************************
|
||||
|
||||
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 CMakeCache.txt already exists
|
||||
run_config = $(if $(wildcard $1/CMakeCache.txt),,$(call run_cmake_config,$1,$2))
|
||||
run_build = $(call run_cmake_build,$1,$2)
|
||||
|
||||
.DEFAULT_GOAL = build/release
|
||||
|
||||
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
|
||||
.PHONY: PHONY
|
||||
.SECONDEXPANSION:
|
||||
.SUFFIXES:
|
||||
|
||||
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/.*_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)
|
||||
@@ -38,149 +45,64 @@ build/release: PHONY
|
||||
$(call run_config,$@,Release)
|
||||
$(call run_build,$@,Release)
|
||||
|
||||
# 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
|
||||
all: build/debug build/release
|
||||
debug: build/debug
|
||||
release: build/release
|
||||
debug+test: build/debug+test PHONY
|
||||
release+test: build/release+test PHONY
|
||||
all+test build/all+test: build/debug+test build/release+test PHONY
|
||||
|
||||
.PHONY: PHONY
|
||||
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
|
||||
.SUFFIXES:
|
||||
|
||||
# END of Makefile; extra stuff follows
|
||||
test: $$(patsubst %+test,%,$$(.DEFAULT_GOAL))+test PHONY
|
||||
|
||||
#***********************************************************************
|
||||
# extra builds: some pre-defined build configurations
|
||||
# install
|
||||
#***********************************************************************
|
||||
|
||||
define run_config_and_build
|
||||
$(call run_config,$1,$2)
|
||||
$(call run_build,$1,$2)
|
||||
endef
|
||||
build/debug+install: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CMAKE) --install . --config Debug
|
||||
build/%/debug+install: $$(dir $$@)debug PHONY; cd "$(dir $@)debug" && $(CMAKE) --install . --config Debug
|
||||
build/release+install: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CMAKE) --install . --config Release
|
||||
build/%/release+install: $$(dir $$@)release PHONY; cd "$(dir $@)release" && $(CMAKE) --install . --config Release
|
||||
build/%/all+install: $$(dir $$@)debug+install $$(dir $$@)release+install PHONY ;
|
||||
|
||||
# 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 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 clang Static Analyzer (scan-build)
|
||||
build/extra/scan-build/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/scan-build/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/scan-build/%: CMAKE := scan-build $(CMAKE)
|
||||
build/extra/scan-build/%: export CCC_CC ?= clang
|
||||
build/extra/scan-build/%: export CCC_CXX ?= clang++
|
||||
|
||||
# cross compiler: Linux glibc aarch64-linux-gnu
|
||||
build/extra/cross-linux-aarch64/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/cross-linux-aarch64/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/cross-linux-aarch64/%: export CC = aarch64-linux-gnu-gcc
|
||||
build/extra/cross-linux-aarch64/%: export CXX = aarch64-linux-gnu-g++
|
||||
|
||||
# cross compiler: Linux glibc arm-linux-gnueabihf
|
||||
build/extra/cross-linux-arm/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/cross-linux-arm/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/cross-linux-arm/%: export CC = arm-linux-gnueabihf-gcc
|
||||
build/extra/cross-linux-arm/%: export CXX = arm-linux-gnueabihf-g++ -Wno-psabi
|
||||
|
||||
# cross compiler: Windows x86 win32 MinGW
|
||||
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
|
||||
build/extra/cross-windows-mingw32/%: export CXX = i686-w64-mingw32-g++
|
||||
|
||||
# cross compiler: Windows x64 win64 MinGW
|
||||
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
|
||||
build/extra/cross-windows-mingw64/%: export CXX = x86_64-w64-mingw32-g++
|
||||
|
||||
# cross compiler: macOS arm64
|
||||
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
|
||||
|
||||
# cross compiler: macOS x86_64
|
||||
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
|
||||
|
||||
#***********************************************************************
|
||||
# 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/xtarget/$(UPX_XTARGET)/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/xtarget/$(UPX_XTARGET)/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/xtarget/$(UPX_XTARGET)/%: export CC
|
||||
build/xtarget/$(UPX_XTARGET)/%: export CXX
|
||||
# shortcuts
|
||||
xtarget/debug: build/xtarget/$(UPX_XTARGET)/debug
|
||||
xtarget/release: build/xtarget/$(UPX_XTARGET)/release
|
||||
# set new default
|
||||
.DEFAULT_GOAL = xtarget/release
|
||||
debug+install: build/debug+install PHONY
|
||||
release+install: build/release+install PHONY
|
||||
all+install build/all+install: build/debug+install build/release+install PHONY
|
||||
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
install: $$(patsubst %+install,%,$$(.DEFAULT_GOAL))+install PHONY
|
||||
|
||||
#***********************************************************************
|
||||
# check git submodules
|
||||
# END of Makefile
|
||||
#***********************************************************************
|
||||
|
||||
SUBMODULES = doctest lzma-sdk ucl valgrind zlib
|
||||
# extra pre-defined build configurations and some utility; optional
|
||||
-include ./Makevars-local.mk
|
||||
-include ./misc/make/Makefile-extra.mk
|
||||
|
||||
dummy := $(foreach m,$(SUBMODULES),$(if $(wildcard vendor/$m/[CL]*),$m,\
|
||||
$(error ERROR: missing git submodule $m; run 'git submodule update --init')))
|
||||
# developer convenience
|
||||
ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc.
|
||||
ifneq ($(and $(wildcard ./misc/scripts/.),$(wildcard ./doc/upx.pod)),)
|
||||
check-whitespace clang-format run-testsuite run-testsuite-all run-testsuite-debug run-testsuite-release: src/Makefile PHONY
|
||||
$(MAKE) -C src $@
|
||||
endif
|
||||
endif
|
||||
|
||||
# vim:set ts=8 sw=8 noet:
|
||||
|
||||
@@ -2,6 +2,52 @@
|
||||
User visible changes for UPX
|
||||
==================================================================
|
||||
|
||||
Changes in 5.1.0 (XX XXX XXXX):
|
||||
* bug fixes - see https://github.com/upx/upx/milestone/21
|
||||
|
||||
Changes in 5.0.2 (20 Jul 2025):
|
||||
* bug fixes - see https://github.com/upx/upx/milestone/20
|
||||
|
||||
Changes in 5.0.1 (06 May 2025):
|
||||
* bug fixes - see https://github.com/upx/upx/milestone/19
|
||||
|
||||
Changes in 5.0.0 (20 Feb 2025):
|
||||
* ELF: use of memfd_create supports Enforcing mode of SELinux
|
||||
* ELF: two-step de-compression enables future per-PT_LOAD work
|
||||
* ELF: --unmap-all-pages completely avoids /proc/self/exe
|
||||
* ELF: PT_MIPS_ABIFLAGS is now forwarded into the compressed output;
|
||||
qemu-mips can choose the right floating-point emulation
|
||||
* ELF: many minor internal changes fix nits revealed by fuzzing
|
||||
* bug fixes - see https://github.com/upx/upx/milestone/18
|
||||
|
||||
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
|
||||
|
||||
@@ -75,7 +121,7 @@ Changes in 3.08 (12 Dec 2011):
|
||||
* 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.
|
||||
* 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.
|
||||
@@ -149,7 +195,7 @@ Changes in 2.92 beta (23 Jan 2007):
|
||||
|
||||
Changes in 2.91 beta (29 Nov 2006):
|
||||
* assorted bug fixes
|
||||
* arm/pe: fix "missing" icon & version info resource problem for wince 5
|
||||
* 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):
|
||||
@@ -203,7 +249,7 @@ Changes in 1.95 beta (09 Apr 2006):
|
||||
* win32/pe: really worked around R6002 runtime errors
|
||||
|
||||
Changes in 1.94 beta (11 Mar 2006):
|
||||
* new format: added support for arm/pe (ARM executables running on WinCE)
|
||||
* 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)
|
||||
@@ -255,7 +301,7 @@ Changes in 1.11 beta (20 Dec 2000):
|
||||
==================================================================
|
||||
|
||||
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
|
||||
* win32/pe: stricter checks of some PE values
|
||||
* source code: much improved portability using ACC, the
|
||||
@@ -520,12 +566,12 @@ Changes in 0.40 (05 Oct 1998)
|
||||
* fixed a small but fatal bug in dos/sys introduced in 0.30
|
||||
* fixed a rare bug in dos/exe
|
||||
* worked around a bug in djgpp's strip 2.8
|
||||
* djgpp/coff: Allegro packfile support should work now
|
||||
* djgpp2/coff: Allegro packfile support should work now
|
||||
* added dos/exeh compression method (works on 386+)
|
||||
|
||||
Changes in 0.30 (27 Jul 1998)
|
||||
* 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 !
|
||||
* the 16-bit uncompressors are a little bit shorter & faster
|
||||
* fixed progress indicator for VESA and SVGA text modes
|
||||
@@ -536,6 +582,5 @@ Changes in 0.20 (05 Jul 1998)
|
||||
|
||||
Changes in 0.05 (26 May 1998)
|
||||
* first public beta release
|
||||
|
||||
|
||||
# vim:set syntax=off tw=0 ts=4 sw=4 et: -*- coding: utf-8 -*-
|
||||
* based on experience gained from our previous packers DJP (djgpp2/coff, 1996),
|
||||
lzop (1996) and mfxpak (atari/tos, 1990)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
The Ultimate Packer for eXecutables
|
||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
https://upx.github.io
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ and run exactly as before, with no runtime or memory penalty for most
|
||||
of the supported formats.
|
||||
|
||||
UPX supports a number of different executable formats, including
|
||||
Windows programs and DLLs, macOS apps and Linux executables.
|
||||
Windows programs and DLLs, and Linux executables.
|
||||
|
||||
UPX is free software distributed under the term of the GNU General
|
||||
Public License. Full source code is available.
|
||||
@@ -61,8 +61,9 @@ SHORT DOCUMENTATION
|
||||
'upx program.exe' will compress a program or DLL. For best compression
|
||||
results try 'upx --best program.exe' or 'upx --brute program.exe'.
|
||||
|
||||
Please see the file UPX.DOC for the full documentation. The files
|
||||
NEWS and BUGS also contain various tidbits of information.
|
||||
Please see the file doc/upx-doc.txt for the full documentation. The files
|
||||
NEWS and doc/BUGS.txt also contain various tidbits of information, as
|
||||
does the output of 'upx --help'.
|
||||
|
||||
|
||||
THE FUTURE
|
||||
@@ -85,13 +86,13 @@ THE FUTURE
|
||||
COPYRIGHT
|
||||
=========
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 2000-2023 John F. Reiser
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
Copyright (C) 2000-2025 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
|
||||
the file COPYING), or (at your option) under the GPLv2+ with special
|
||||
exceptions and restrictions granting the free usage for all binaries
|
||||
including commercial programs (see the file LICENSE).
|
||||
|
||||
|
||||
+56
-2
@@ -44,7 +44,7 @@ Short overview
|
||||
Tools needed to build/modify the UPX sources
|
||||
--------------------------------------------
|
||||
|
||||
- A C++ compiler that supports C++ 17: clang-5, gcc-8 or msvc-2019 16.11
|
||||
- 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)
|
||||
|
||||
- GNU make
|
||||
@@ -61,7 +61,7 @@ To compile the packer sources
|
||||
If you want to modify the stub sources you'll also need
|
||||
-------------------------------------------------------
|
||||
|
||||
- Podman/Docker: see misc/rebuild-stubs-with-podman - this
|
||||
- Podman/Docker: see misc/podman/rebuild-stubs - this
|
||||
is the preferred way of rebuilding the stubs
|
||||
|
||||
- otherwise you will need:
|
||||
@@ -71,6 +71,60 @@ If you want to modify the stub sources you'll also need
|
||||
https://github.com/upx/upx-stubtools/releases
|
||||
|
||||
|
||||
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
|
||||
|
||||
# Some of the pre-built tools need i386 libz. On Ubuntu:
|
||||
# # dpkg --add-architecture i386
|
||||
# # apt-get update
|
||||
# # apt-get install zlib1g-dev
|
||||
|
||||
# aarch64-linux-gnu/4.9.2/cc1 needs libmpfr.so.4. Make a symlink:
|
||||
# # ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4
|
||||
|
||||
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
|
||||
|
||||
9a) Install GNU g++ so that it is used when invoking "c++" compiler.
|
||||
On Ubuntu 24.04 with
|
||||
cmake: cmake version 3.28.3
|
||||
g++: Ubuntu clang version 18.1.3 (1ubuntu1)
|
||||
/lib/llvm-18/lib/cmake/llvm/HandleLLVMOptions.cmake:
|
||||
add_flag_if_supported("-fno-lifetime-dse" CMAKE_CXX_FLAGS)
|
||||
then cmake invoking c++ uses -fno-lifetime-dse but gets
|
||||
c++: error: unknown argument: '-fno-lifetime-dse'
|
||||
Commenting out the "add_flag_if_supported' line still uses that unknown argument.
|
||||
Installing g++ avoids the problem.
|
||||
9b) $ 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
|
||||
|
||||
|
||||
|
||||
Misc. notes
|
||||
-----------
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
-std=gnu++17
|
||||
-Ivendor
|
||||
-fno-strict-aliasing
|
||||
-fno-strict-overflow
|
||||
-funsigned-char
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
The Ultimate Packer for eXecutables
|
||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
https://upx.github.io
|
||||
|
||||
|
||||
|
||||
+9
-4
@@ -1,8 +1,9 @@
|
||||
#
|
||||
# UPX doc Makefile - needs GNU make, pod2html, pod2man and pod2text
|
||||
# UPX doc Makefile - needs GNU make, sed, pod2html, pod2man and pod2text
|
||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
#
|
||||
|
||||
BUILT_SOURCES = upx.1 upx-doc.html upx-doc.txt
|
||||
BUILT_SOURCES := upx.1 upx-doc.html upx-doc.txt
|
||||
|
||||
top_srcdir ?= ..
|
||||
|
||||
@@ -25,6 +26,10 @@ DETAB2 := sed -e 's/$(tab)/ /g'
|
||||
|
||||
.DEFAULT_GOAL = all
|
||||
|
||||
.PHONY: PHONY
|
||||
.SECONDEXPANSION:
|
||||
.SUFFIXES:
|
||||
|
||||
all: $(BUILT_SOURCES) PHONY
|
||||
|
||||
mostlyclean clean distclean maintainer-clean: PHONY
|
||||
@@ -34,12 +39,13 @@ mostlyclean clean distclean maintainer-clean: PHONY
|
||||
# rules
|
||||
#***********************************************************************
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .1 .html .man .pod .ps .tex .txt
|
||||
|
||||
%.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) > $@
|
||||
@@ -68,4 +74,3 @@ mostlyclean clean distclean maintainer-clean: PHONY
|
||||
|
||||
$(BUILT_SOURCES): $(top_srcdir)/src/version.h $(MAKEFILE_LIST)
|
||||
.DELETE_ON_ERROR: $(BUILT_SOURCES)
|
||||
.PHONY: PHONY
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
The Ultimate Packer for eXecutables
|
||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
https://upx.github.io
|
||||
|
||||
|
||||
@@ -37,16 +37,20 @@ Charles W. Sandmann <sandmann@clio.rice.edu>
|
||||
for the idea with the stubless decompressor in djgpp2/coff
|
||||
Ice
|
||||
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
|
||||
for the relocation & address optimization ideas
|
||||
John S. Fine <johnfine@erols.com>
|
||||
for the new version of the dos/exe decompressor
|
||||
Kornel Pal
|
||||
for the EFI support
|
||||
Lukundoo <Lukundoo@softhome.net>
|
||||
for beta testing
|
||||
Michael Devore
|
||||
for initial dos/exe device driver support
|
||||
Oleg V. Volkov <rover@lglobus.ru>
|
||||
for various FreeBSD specific informations
|
||||
for various FreeBSD specific information
|
||||
The Owl & G-RoM
|
||||
for the --compress-icons fix
|
||||
Ralph Roth <RalphRoth@gmx.net>
|
||||
+46
-44
@@ -1,5 +1,5 @@
|
||||
Decompressing ELF Directly to Memory on Linux/x86
|
||||
Copyright (C) 2000-2023 John F. Reiser jreiser@BitWagon.com
|
||||
Copyright (C) 2000-2025 John F. Reiser jreiser@BitWagon.com
|
||||
|
||||
References:
|
||||
<elf.h> definitions for the ELF file format
|
||||
@@ -15,7 +15,7 @@ the value that is manipulated by system call 45 (__NR_brk in
|
||||
there will be no execve() except for the execve() of the decompressor
|
||||
program itself. So, the decompressor program (which contains the
|
||||
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).
|
||||
See src/p_lx_elf.cpp, function PackLinuxElf32::generateElfHdr.
|
||||
All of the decompressor's code, and all of the compressed image
|
||||
@@ -25,35 +25,27 @@ decompressor program.
|
||||
The decompressor program stub is just under 2K bytes when linked.
|
||||
After linking, the decompressor code is converted to an initialized
|
||||
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
|
||||
startup and decompression subroutine of the decompressor itself,
|
||||
saving a few hundred bytes. The startup code first decompresses the
|
||||
rest of the decompressor, then jumps to it. A nonstandard linker
|
||||
script src/stub/l_lx_elf86.lds places both the .text and .data
|
||||
of the decompressor into the same PT_LOAD at 0x00401000. The
|
||||
compressor includes the compressed bytes of the original executable
|
||||
at the end of this first PT_LOAD.
|
||||
script src/stub/src/i386-linux.elf-entry.lds arranges the SECTIONS
|
||||
so that PackLinuxElf32x86::buildLoader() and buildLinuxLoader()
|
||||
generate the desired stub code, which goes into PT_LOAD[1].
|
||||
|
||||
At runtime, the decompressed stub lives at 0x00400000. In order for the
|
||||
decompressed stub to work properly at an address that is different
|
||||
from its link-time address, the compiled code must contain no absolute
|
||||
addresses. So, the data items in l_lx_elf.c must be only parameters
|
||||
and automatic (on-stack) local variables; no global data, no static data,
|
||||
and no string constants. Use "size l_le_n2b.o l_6e_n2b.o" to check
|
||||
that both data and bss have length zero. Also, the '&' operator
|
||||
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 4 MiB. The address
|
||||
0x00401000 was chosen as 1 page up from a 64 KiB boundary, to
|
||||
make the startup code and its constants smaller.
|
||||
At runtime, the decompressed stub lives close beyond the brk().
|
||||
In order for the decompressed stub to work properly at an address
|
||||
that is different from its link-time address, the compiled code must
|
||||
contain no absolute addresses. So, the data items in stub code
|
||||
must be only parameters and automatic (on-stack) local variables;
|
||||
no global data, no static data, and no string constants. Also,
|
||||
the '&' operator may not be used to take the address of a function.
|
||||
|
||||
Decompression of the executable begins by decompressing the Elf32_Ehdr
|
||||
and Elf32_Phdr, and then uses the Ehdr and Phdrs to control decompression
|
||||
of the PT_LOAD segments.
|
||||
Subroutine do_xmap() of src/stub/l_lx_elf.c performs the
|
||||
and Elf32_Phdr, and then uses those Ehdr and Phdrs to control decompression
|
||||
of the PT_LOAD segments. Subroutine do_xmap() of src/stub/src/
|
||||
i386-linux.elf-main.c performs the
|
||||
"virtual execve()" using the compressed data as source, and stores
|
||||
the decompressed bytes directly into the appropriate virtual addresses.
|
||||
|
||||
@@ -74,22 +66,17 @@ expanding $ORIGIN in -rpath, or for application code that relies on
|
||||
--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.
|
||||
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".
|
||||
|
||||
On arm*-linux-elf there is no good address at which to retain one
|
||||
page of the compressed executable. Pages below the usual .p_vaddr
|
||||
0x8000 (32KiB) are rejected by the kernel. Using a page above the
|
||||
original uncompressed brk(0) would require placing the entire initial
|
||||
compressed program above uncompressed brk(0), which would significantly
|
||||
increase the running brk(0); but too many programs break if brk(0)
|
||||
moves. Thus on arm*-linux-elf the compressed executable begins
|
||||
with 0x8000==.p_vaddr, all pages mapped by execve() that are also
|
||||
occupied by decompressed bytes are removed before overwriting, and
|
||||
/proc/self/exe becomes a "(deleted)" symlink. It might be possible
|
||||
to preserve /proc/self/exe if the original uncompressed executable
|
||||
were created with 0x9000==.p_vaddr (one page higher than the usual
|
||||
0x8000) so that the compressed page mapped at 0x8000 would linger.
|
||||
[This has not been tested.]
|
||||
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
|
||||
@@ -99,9 +86,24 @@ 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 any chdir().
|
||||
to the working directory, so look before performing any chdir().
|
||||
|
||||
The Elf formats for Linux add an environment variable named " " [three
|
||||
spaces] which saves the results of readlink("/proc/self/exe",,) before
|
||||
the runtime stub unmaps all its pages. As of 2006-10-03 this works
|
||||
for linux/elf386 and linux/ElfAMD.
|
||||
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.
|
||||
|
||||
Generated
+6
-10
@@ -22,7 +22,7 @@
|
||||
<h1 id="ABSTRACT">ABSTRACT</h1>
|
||||
|
||||
<pre><code> The Ultimate Packer for eXecutables
|
||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
Copyright (c) 1996-2025 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>
|
||||
@@ -160,7 +160,7 @@ Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
|
||||
<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 overlayed data.</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]
|
||||
|
||||
@@ -779,19 +779,15 @@ http://www.oberhumer.com
|
||||
|
||||
Laszlo Molnar <ezerotven+github@gmail.com>
|
||||
|
||||
John F. Reiser <jreiser@BitWagon.com>
|
||||
|
||||
Jens Medoch <jssg@users.sourceforge.net></code></pre>
|
||||
John F. Reiser <jreiser@BitWagon.com></code></pre>
|
||||
|
||||
<h1 id="COPYRIGHT">COPYRIGHT</h1>
|
||||
|
||||
<p>Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer</p>
|
||||
<p>Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer</p>
|
||||
|
||||
<p>Copyright (C) 1996-2023 Laszlo Molnar</p>
|
||||
<p>Copyright (C) 1996-2025 Laszlo Molnar</p>
|
||||
|
||||
<p>Copyright (C) 2000-2023 John F. Reiser</p>
|
||||
|
||||
<p>Copyright (C) 2002-2023 Jens Medoch</p>
|
||||
<p>Copyright (C) 2000-2025 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>
|
||||
|
||||
|
||||
Generated
+5
-9
@@ -6,7 +6,7 @@ SYNOPSIS
|
||||
|
||||
ABSTRACT
|
||||
The Ultimate Packer for eXecutables
|
||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
https://upx.github.io
|
||||
|
||||
UPX is a portable, extendable, high-performance executable packer for
|
||||
@@ -153,7 +153,7 @@ OVERLAY HANDLING OPTIONS
|
||||
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 overlayed data.
|
||||
actually accesses this overlaid data.
|
||||
|
||||
--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||
|
||||
@@ -815,16 +815,12 @@ AUTHORS
|
||||
|
||||
John F. Reiser <jreiser@BitWagon.com>
|
||||
|
||||
Jens Medoch <jssg@users.sourceforge.net>
|
||||
|
||||
COPYRIGHT
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
|
||||
Copyright (C) 2000-2023 John F. Reiser
|
||||
|
||||
Copyright (C) 2002-2023 Jens Medoch
|
||||
Copyright (C) 2000-2025 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
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42)
|
||||
.\" -*- mode: troff; coding: utf-8 -*-
|
||||
.\" Automatically generated by Pod::Man
|
||||
.\"
|
||||
.\" Standard preamble:
|
||||
.\" ========================================================================
|
||||
@@ -15,29 +16,12 @@
|
||||
.ft R
|
||||
.fi
|
||||
..
|
||||
.\" Set up some character translations and predefined strings. \*(-- will
|
||||
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
|
||||
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
|
||||
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
|
||||
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
|
||||
.\" nothing in troff, for use with C<>.
|
||||
.tr \(*W-
|
||||
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
|
||||
.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
|
||||
.ie n \{\
|
||||
. ds -- \(*W-
|
||||
. ds PI pi
|
||||
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
|
||||
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
|
||||
. ds L" ""
|
||||
. ds R" ""
|
||||
. ds C` ""
|
||||
. ds C' ""
|
||||
'br\}
|
||||
.el\{\
|
||||
. ds -- \|\(em\|
|
||||
. ds PI \(*p
|
||||
. ds L" ``
|
||||
. ds R" ''
|
||||
. ds C`
|
||||
. ds C'
|
||||
'br\}
|
||||
@@ -68,110 +52,48 @@
|
||||
. \}
|
||||
.\}
|
||||
.rr rF
|
||||
.\"
|
||||
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
|
||||
.\" Fear. Run. Save yourself. No user-serviceable parts.
|
||||
. \" fudge factors for nroff and troff
|
||||
.if n \{\
|
||||
. ds #H 0
|
||||
. ds #V .8m
|
||||
. ds #F .3m
|
||||
. ds #[ \f1
|
||||
. ds #] \fP
|
||||
.\}
|
||||
.if t \{\
|
||||
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
|
||||
. ds #V .6m
|
||||
. ds #F 0
|
||||
. ds #[ \&
|
||||
. ds #] \&
|
||||
.\}
|
||||
. \" simple accents for nroff and troff
|
||||
.if n \{\
|
||||
. ds ' \&
|
||||
. ds ` \&
|
||||
. ds ^ \&
|
||||
. ds , \&
|
||||
. ds ~ ~
|
||||
. ds /
|
||||
.\}
|
||||
.if t \{\
|
||||
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
|
||||
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
|
||||
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
|
||||
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
|
||||
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
|
||||
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
|
||||
.\}
|
||||
. \" troff and (daisy-wheel) nroff accents
|
||||
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
|
||||
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
|
||||
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
|
||||
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
|
||||
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
|
||||
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
|
||||
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
|
||||
.ds ae a\h'-(\w'a'u*4/10)'e
|
||||
.ds Ae A\h'-(\w'A'u*4/10)'E
|
||||
. \" corrections for vroff
|
||||
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
|
||||
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
|
||||
. \" for low resolution devices (crt and lpr)
|
||||
.if \n(.H>23 .if \n(.V>19 \
|
||||
\{\
|
||||
. ds : e
|
||||
. ds 8 ss
|
||||
. ds o a
|
||||
. ds d- d\h'-1'\(ga
|
||||
. ds D- D\h'-1'\(hy
|
||||
. ds th \o'bp'
|
||||
. ds Th \o'LP'
|
||||
. ds ae ae
|
||||
. ds Ae AE
|
||||
.\}
|
||||
.rm #[ #] #H #V #F C
|
||||
.\" ========================================================================
|
||||
.\"
|
||||
.IX Title "UPX 1"
|
||||
.TH UPX 1 "2023-01-30" "upx 4.0.2" " "
|
||||
.TH UPX 1 2025-10-24 "upx 5.1.0" " "
|
||||
.\" 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"
|
||||
.SH NAME
|
||||
upx \- compress or expand executable files
|
||||
.SH "SYNOPSIS"
|
||||
.SH SYNOPSIS
|
||||
.IX Header "SYNOPSIS"
|
||||
\&\fBupx\fR [\ \fIcommand\fR\ ] [\ \fIoptions\fR\ ] \fIfilename\fR...
|
||||
.SH "ABSTRACT"
|
||||
.SH ABSTRACT
|
||||
.IX Header "ABSTRACT"
|
||||
.Vb 3
|
||||
\& The Ultimate Packer for eXecutables
|
||||
\& Copyright (c) 1996\-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
\& Copyright (c) 1996\-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
\& https://upx.github.io
|
||||
.Ve
|
||||
.PP
|
||||
\&\fB\s-1UPX\s0\fR is a portable, extendable, high-performance executable packer for
|
||||
\&\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"
|
||||
.SH DISCLAIMER
|
||||
.IX Header "DISCLAIMER"
|
||||
\&\fB\s-1UPX\s0\fR comes with \s-1ABSOLUTELY NO WARRANTY\s0; for details see the file \s-1COPYING.\s0
|
||||
\&\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"
|
||||
\&\s-1IMPORTANT NOTE:\s0 \fB\s-1UPX\s0\fR inherits the security context of any files it handles.
|
||||
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 \fB\s-1UPX\s0\fR on trusted files only!
|
||||
.SH "DESCRIPTION"
|
||||
Use \fBUPX\fR on trusted files only!
|
||||
.SH DESCRIPTION
|
||||
.IX Header "DESCRIPTION"
|
||||
\&\fB\s-1UPX\s0\fR is a versatile executable packer with the following features:
|
||||
\&\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
|
||||
@@ -204,32 +126,32 @@ Use \fB\s-1UPX\s0\fR on trusted files only!
|
||||
\& for commercial programs
|
||||
.Ve
|
||||
.PP
|
||||
You probably understand now why we call \fB\s-1UPX\s0\fR the "\fIultimate\fR"
|
||||
You probably understand now why we call \fBUPX\fR the "\fIultimate\fR"
|
||||
executable packer.
|
||||
.SH "COMMANDS"
|
||||
.SH COMMANDS
|
||||
.IX Header "COMMANDS"
|
||||
.SS "Compress"
|
||||
.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"
|
||||
.SS Decompress
|
||||
.IX Subsection "Decompress"
|
||||
All \fB\s-1UPX\s0\fR supported file formats can be unpacked using the \fB\-d\fR switch, eg.
|
||||
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"
|
||||
.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"
|
||||
.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"
|
||||
.SH OPTIONS
|
||||
.IX Header "OPTIONS"
|
||||
\&\fB\-q\fR: be quiet, suppress warnings
|
||||
.PP
|
||||
@@ -239,10 +161,10 @@ shows the compressed / uncompressed size and the compression ratio of
|
||||
.PP
|
||||
\&\fB\-\-help\fR: prints the help
|
||||
.PP
|
||||
\&\fB\-\-version\fR: print the version of \fB\s-1UPX\s0\fR
|
||||
\&\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. [\s-1NOTE:\s0 this is work in progress and is
|
||||
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
|
||||
@@ -255,16 +177,16 @@ as compared to the first decompressed version.]
|
||||
[ ...more docs need to be written... \- type `\fBupx \-\-help\fR' for now ]
|
||||
.SH "COMPRESSION LEVELS & TUNING"
|
||||
.IX Header "COMPRESSION LEVELS & TUNING"
|
||||
\&\fB\s-1UPX\s0\fR offers ten different compression levels from \fB\-1\fR to \fB\-9\fR,
|
||||
\&\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
|
||||
.IP \(bu 4
|
||||
Compression levels 1, 2 and 3 are pretty fast.
|
||||
.IP "\(bu" 4
|
||||
.IP \(bu 4
|
||||
Compression levels 4, 5 and 6 achieve a good time/ratio performance.
|
||||
.IP "\(bu" 4
|
||||
.IP \(bu 4
|
||||
Compression levels 7, 8 and 9 favor compression ratio over speed.
|
||||
.IP "\(bu" 4
|
||||
.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
|
||||
@@ -272,31 +194,31 @@ 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
|
||||
.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 \s-1LZMA\s0 compression, which compresses better but
|
||||
.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
|
||||
.IP \(bu 4
|
||||
Try if \fB\-\-overlay=strip\fR works.
|
||||
.IP "\(bu" 4
|
||||
.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 \*(L"overlay\*(R" means auxiliary data attached 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
|
||||
(this is a common practice to avoid an extra data file, though
|
||||
it would be better to use resource sections).
|
||||
.PP
|
||||
\&\fB\s-1UPX\s0\fR handles overlays like many other executable packers do: it simply
|
||||
\&\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 overlayed data.
|
||||
actually accesses this overlaid data.
|
||||
.PP
|
||||
.Vb 1
|
||||
\& \-\-overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||
@@ -309,8 +231,8 @@ actually accesses this overlayed data.
|
||||
.Ve
|
||||
.SH "ENVIRONMENT VARIABLE"
|
||||
.IX Header "ENVIRONMENT VARIABLE"
|
||||
The environment variable \fB\s-1UPX\s0\fR can hold a set of default
|
||||
options for \fB\s-1UPX\s0\fR. These options are interpreted first and
|
||||
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
|
||||
@@ -321,18 +243,18 @@ For example:
|
||||
.Ve
|
||||
.PP
|
||||
Under DOS/Windows you must use '#' instead of '=' when setting the
|
||||
environment variable because of a \s-1COMMAND.COM\s0 limitation.
|
||||
environment variable because of a COMMAND.COM limitation.
|
||||
.PP
|
||||
Not all of the options are valid in the environment variable \-
|
||||
\&\fB\s-1UPX\s0\fR will tell you.
|
||||
\&\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 "\s-1NOTES FOR ATARI/TOS\s0"
|
||||
.SS "NOTES FOR ATARI/TOS"
|
||||
.IX Subsection "NOTES FOR ATARI/TOS"
|
||||
This is the executable format used by the Atari \s-1ST/TT,\s0 a Motorola 68000
|
||||
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 :\-).
|
||||
@@ -349,12 +271,12 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default method gives the best results anyway.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR BVMLINUZ/I386\s0"
|
||||
.SS "NOTES FOR BVMLINUZ/I386"
|
||||
.IX Subsection "NOTES FOR BVMLINUZ/I386"
|
||||
Same as vmlinuz/i386.
|
||||
.SS "\s-1NOTES FOR DOS/COM\s0"
|
||||
.SS "NOTES FOR DOS/COM"
|
||||
.IX Subsection "NOTES FOR DOS/COM"
|
||||
Obviously \fB\s-1UPX\s0\fR won't work with executables that want to read data from
|
||||
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+.
|
||||
@@ -378,11 +300,11 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default filter gives the best results anyway.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR DOS/EXE\s0"
|
||||
.SS "NOTES FOR DOS/EXE"
|
||||
.IX Subsection "NOTES FOR DOS/EXE"
|
||||
dos/exe stands for all \*(L"normal\*(R" 16\-bit \s-1DOS\s0 executables.
|
||||
dos/exe stands for all "normal" 16\-bit DOS executables.
|
||||
.PP
|
||||
Obviously \fB\s-1UPX\s0\fR won't work with executables that want to read data from
|
||||
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+.
|
||||
@@ -399,7 +321,7 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default method gives the best results anyway.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR DOS/SYS\s0"
|
||||
.SS "NOTES FOR DOS/SYS"
|
||||
.IX Subsection "NOTES FOR DOS/SYS"
|
||||
Compressed programs only work on a 286+.
|
||||
.PP
|
||||
@@ -422,20 +344,20 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default filter gives the best results anyway.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR DJGPP2/COFF\s0"
|
||||
.SS "NOTES FOR DJGPP2/COFF"
|
||||
.IX Subsection "NOTES FOR DJGPP2/COFF"
|
||||
First of all, it is recommended to use \fB\s-1UPX\s0\fR *instead* of \fBstrip\fR. strip has
|
||||
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 \fB\s-1UPX\s0\fR corrects a bug/feature in strip v2.8.x: it
|
||||
Additionally \fBUPX\fR corrects a bug/feature in strip v2.8.x: it
|
||||
will fix the 4 KiB alignment of the stub.
|
||||
.PP
|
||||
\&\fB\s-1UPX\s0\fR includes the full functionality of stubify. This means it will
|
||||
automatically stubify your \s-1COFF\s0 files. Use the option \fB\-\-coff\fR to
|
||||
\&\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
|
||||
\&\fB\s-1UPX\s0\fR automatically handles Allegro packfiles.
|
||||
\&\fBUPX\fR automatically handles Allegro packfiles.
|
||||
.PP
|
||||
The \s-1DLM\s0 format (a rather exotic shared library extension) is not supported.
|
||||
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.
|
||||
@@ -456,7 +378,7 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default filter gives the best results anyway.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR LINUX\s0 [general]"
|
||||
.SS "NOTES FOR LINUX [general]"
|
||||
.IX Subsection "NOTES FOR LINUX [general]"
|
||||
Introduction
|
||||
.PP
|
||||
@@ -593,15 +515,15 @@ General notes:
|
||||
\& been modified after compression.
|
||||
\& Running \`strace \-o strace.log compressed_file\*(Aq will tell you more.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR LINUX/ELF386\s0"
|
||||
.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 \s-1RAM,\s0
|
||||
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 \s-1ELF\s0 executables.
|
||||
Linux/elf386 is automatically selected for Linux ELF executables.
|
||||
.PP
|
||||
Packed programs will be byte-identical to the original after uncompression.
|
||||
.PP
|
||||
@@ -641,12 +563,12 @@ Extra options available for this executable format:
|
||||
.Vb 1
|
||||
\& (none)
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR LINUX/SH386\s0"
|
||||
.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. \fB\s-1UPX\s0\fR decompresses the shell script
|
||||
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.
|
||||
@@ -691,7 +613,7 @@ Extra options available for this executable format:
|
||||
.Vb 1
|
||||
\& (none)
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR LINUX/386\s0"
|
||||
.SS "NOTES FOR LINUX/386"
|
||||
.IX Subsection "NOTES FOR LINUX/386"
|
||||
Please read the general Linux description first.
|
||||
.PP
|
||||
@@ -764,10 +686,10 @@ Extra options available for this executable format:
|
||||
\& format, i.e. do not try the linux/elf386 and
|
||||
\& linux/sh386 formats.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR PS1/EXE\s0"
|
||||
.SS "NOTES FOR PS1/EXE"
|
||||
.IX Subsection "NOTES FOR PS1/EXE"
|
||||
This is the executable format used by the Sony PlayStation (PSone),
|
||||
a \s-1MIPS R3000\s0 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
|
||||
nostalgic feelings of one of the authors.
|
||||
.PP
|
||||
@@ -816,12 +738,12 @@ Extra options available for this executable format:
|
||||
\& but the compressed executable will not boot from a CD.
|
||||
\& Use it for console transfer only !
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR RTM32/PE\s0 and \s-1ARM/PE\s0"
|
||||
.SS "NOTES FOR RTM32/PE and ARM/PE"
|
||||
.IX Subsection "NOTES FOR RTM32/PE and ARM/PE"
|
||||
Same as win32/pe.
|
||||
.SS "\s-1NOTES FOR TMT/ADAM\s0"
|
||||
.SS "NOTES FOR TMT/ADAM"
|
||||
.IX Subsection "NOTES FOR TMT/ADAM"
|
||||
This format is used by the \s-1TMT\s0 Pascal compiler \- see http://www.tmt.com/ .
|
||||
This format is used by the TMT Pascal compiler \- see http://www.tmt.com/ .
|
||||
.PP
|
||||
Extra options available for this executable format:
|
||||
.PP
|
||||
@@ -836,11 +758,11 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default filter gives the best results anyway.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR VMLINUZ/386\s0"
|
||||
.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 (\*(L"vmlinuz\*(R", \*(L"zImage\*(R", \*(L"bzImage\*(R"),
|
||||
gzip-decompress it and re-compress it with the \fB\s-1UPX\s0\fR compression method.
|
||||
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.
|
||||
@@ -889,14 +811,14 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default filter gives the best results anyway.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR WATCOM/LE\s0"
|
||||
.SS "NOTES FOR WATCOM/LE"
|
||||
.IX Subsection "NOTES FOR WATCOM/LE"
|
||||
\&\fB\s-1UPX\s0\fR has been successfully tested with the following extenders:
|
||||
\s-1DOS4G, DOS4GW, PMODE/W,\s0 DOS32a, CauseWay.
|
||||
The \s-1WDOS/X\s0 extender is partly supported (for details
|
||||
see the file bugs \s-1BUGS\s0).
|
||||
\&\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 \s-1LX\s0 format are not supported.
|
||||
DLLs and the LX format are not supported.
|
||||
.PP
|
||||
Extra options available for this executable format:
|
||||
.PP
|
||||
@@ -904,12 +826,12 @@ Extra options available for this executable format:
|
||||
\& \-\-le Produce an unbound LE output instead of
|
||||
\& keeping the current stub.
|
||||
.Ve
|
||||
.SS "\s-1NOTES FOR WIN32/PE\s0"
|
||||
.SS "NOTES FOR WIN32/PE"
|
||||
.IX Subsection "NOTES FOR WIN32/PE"
|
||||
The \s-1PE\s0 support in \fB\s-1UPX\s0\fR is quite stable now, but probably there are
|
||||
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 \fB\s-1UPX\s0\fR (and other packers for this format) works, you
|
||||
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
|
||||
@@ -922,17 +844,17 @@ 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.
|
||||
.PP
|
||||
DLLs are supported. But \s-1UPX\s0 compressed DLLs can not share common data and
|
||||
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 \*(L".scr\*(R" (as screensavers are handled slightly different
|
||||
must end with ".scr" (as screensavers are handled slightly different
|
||||
than normal exe files).
|
||||
.PP
|
||||
\&\s-1UPX\s0 compressed \s-1PE\s0 files have some minor memory overhead (usually in the
|
||||
10 \- 30 KiB range) which can be seen by specifying the \*(L"\-i\*(R" command
|
||||
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:
|
||||
@@ -996,16 +918,16 @@ Extra options available for this executable format:
|
||||
\& the compression ratio in some cases, but usually
|
||||
\& the default filter gives the best results anyway.
|
||||
.Ve
|
||||
.SH "DIAGNOSTICS"
|
||||
.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
|
||||
\&\fB\s-1UPX\s0\fR's diagnostics are intended to be self-explanatory.
|
||||
.SH "BUGS"
|
||||
\&\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"
|
||||
.SH AUTHORS
|
||||
.IX Header "AUTHORS"
|
||||
.Vb 2
|
||||
\& Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||
@@ -1014,29 +936,25 @@ Please report all bugs immediately to the authors.
|
||||
\& Laszlo Molnar <ezerotven+github@gmail.com>
|
||||
\&
|
||||
\& John F. Reiser <jreiser@BitWagon.com>
|
||||
\&
|
||||
\& Jens Medoch <jssg@users.sourceforge.net>
|
||||
.Ve
|
||||
.SH "COPYRIGHT"
|
||||
.SH COPYRIGHT
|
||||
.IX Header "COPYRIGHT"
|
||||
Copyright (C) 1996\-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996\-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
.PP
|
||||
Copyright (C) 1996\-2023 Laszlo Molnar
|
||||
Copyright (C) 1996\-2025 Laszlo Molnar
|
||||
.PP
|
||||
Copyright (C) 2000\-2023 John F. Reiser
|
||||
Copyright (C) 2000\-2025 John F. Reiser
|
||||
.PP
|
||||
Copyright (C) 2002\-2023 Jens Medoch
|
||||
.PP
|
||||
\&\fB\s-1UPX\s0\fR is distributed with full source code under the terms of the
|
||||
\&\s-1GNU\s0 General Public License v2+; either under the pure GPLv2+ (see
|
||||
the file \s-1COPYING\s0), or (at your option) under the GPLv+2 with special
|
||||
\&\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 \s-1LICENSE\s0).
|
||||
including commercial programs (see the file LICENSE).
|
||||
.PP
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but \s-1WITHOUT ANY WARRANTY\s0; without even the implied warranty of
|
||||
\&\s-1MERCHANTABILITY\s0 or \s-1FITNESS FOR A PARTICULAR PURPOSE.\s0
|
||||
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 \s-1UPX\s0 License Agreements along
|
||||
with this program; see the files \s-1COPYING\s0 and \s-1LICENSE.\s0 If not,
|
||||
visit the \s-1UPX\s0 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.
|
||||
|
||||
+5
-9
@@ -13,7 +13,7 @@ B<upx> S<[ I<command> ]> S<[ I<options> ]> I<filename>...
|
||||
=head1 ABSTRACT
|
||||
|
||||
The Ultimate Packer for eXecutables
|
||||
Copyright (c) 1996-2023 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
Copyright (c) 1996-2025 Markus Oberhumer, Laszlo Molnar & John Reiser
|
||||
https://upx.github.io
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ it would be better to use resource sections).
|
||||
B<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 overlayed data.
|
||||
actually accesses this overlaid data.
|
||||
|
||||
--overlay=copy Copy any extra data attached to the file. [DEFAULT]
|
||||
|
||||
@@ -926,19 +926,15 @@ Please report all bugs immediately to the authors.
|
||||
|
||||
John F. Reiser <jreiser@BitWagon.com>
|
||||
|
||||
Jens Medoch <jssg@users.sourceforge.net>
|
||||
|
||||
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
|
||||
Copyright (C) 2000-2023 John F. Reiser
|
||||
|
||||
Copyright (C) 2002-2023 Jens Medoch
|
||||
Copyright (C) 2000-2025 John F. Reiser
|
||||
|
||||
B<UPX> is distributed with full source code under the terms of the
|
||||
GNU General Public License v2+; either under the pure GPLv2+ (see
|
||||
|
||||
@@ -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,455 @@
|
||||
#
|
||||
# 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()
|
||||
|
||||
# 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()
|
||||
|
||||
# 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()
|
||||
# also enable some global settings by default
|
||||
if(NOT DEFINED CMAKE_C_STANDARD_REQUIRED)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
endif()
|
||||
if(NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
endif()
|
||||
if(NOT DEFINED CMAKE_EXPORT_COMPILE_COMMANDS)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
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()
|
||||
|
||||
# set MINGW, MSVC_FRONTEND, GNU_FRONTEND and MSVC_SIMULATE
|
||||
macro(upx_set_global_vars)
|
||||
if(NOT DEFINED MINGW AND CMAKE_C_PLATFORM_ID MATCHES "^MinGW")
|
||||
set(MINGW 1)
|
||||
endif()
|
||||
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|LLVM)"))
|
||||
set(GNU_FRONTEND 1)
|
||||
endif()
|
||||
if(NOT DEFINED MSVC_SIMULATE AND (CMAKE_C_SIMULATE_ID MATCHES "^MSVC"))
|
||||
set(MSVC_SIMULATE 1)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
# useful for CI jobs: check for working BUILD_RPATH
|
||||
macro(upx_check_working_build_rpath var_name)
|
||||
if(WIN32 OR MINGW OR CYGWIN)
|
||||
# always works; DLLs reside next to the executables
|
||||
set(${var_name} ON)
|
||||
upx_cache_bool_vars(ON ${var_name})
|
||||
elseif(CMAKE_BUILD_WITH_INSTALL_RPATH OR CMAKE_SKIP_RPATH OR CMAKE_SKIP_BUILD_RPATH)
|
||||
# cannot work; BUILD_RPATH is disabled by global CMake settings
|
||||
set(${var_name} OFF)
|
||||
upx_cache_bool_vars(OFF ${var_name})
|
||||
else()
|
||||
# we do not know if/how the BUILD_RPATH is set; be cautious by default
|
||||
upx_cache_bool_vars(OFF ${var_name})
|
||||
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_maybe_unused_var) # ARGV
|
||||
foreach(var_name ${ARGV})
|
||||
if(DEFINED ${var_name})
|
||||
set(dummy "${${var_name}}")
|
||||
endif()
|
||||
endforeach()
|
||||
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()
|
||||
|
||||
# check for incompatible C vs CXX settings
|
||||
function(upx_platform_check_c_cxx_mismatch)
|
||||
upx_platform_check_mismatch(CMAKE_C_PLATFORM_ID CMAKE_CXX_PLATFORM_ID)
|
||||
upx_platform_check_mismatch(CMAKE_C_SIMULATE_ID CMAKE_CXX_SIMULATE_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)
|
||||
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
|
||||
if(NOT DEFINED UPX_CONFIG_SANITIZE_FLAGS_DEBUG)
|
||||
# default sanitizer for Debug builds
|
||||
set(UPX_CONFIG_SANITIZE_FLAGS_DEBUG -fsanitize=undefined -fsanitize-undefined-trap-on-error -fstack-protector-all)
|
||||
endif()
|
||||
if(NOT DEFINED UPX_CONFIG_SANITIZE_FLAGS_RELEASE)
|
||||
# default sanitizer for Release builds
|
||||
set(UPX_CONFIG_SANITIZE_FLAGS_RELEASE -fstack-protector)
|
||||
endif()
|
||||
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()
|
||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Debug>:${UPX_CONFIG_SANITIZE_FLAGS_DEBUG}>)
|
||||
target_compile_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||
target_compile_options(${t} PRIVATE $<$<CONFIG:Release>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||
target_compile_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||
get_target_property(target_type ${t} TYPE)
|
||||
if(NOT ",${target_type}," STREQUAL ",STATIC_LIBRARY,")
|
||||
if(${CMAKE_VERSION} VERSION_GREATER "3.12.99")
|
||||
target_link_options(${t} PRIVATE $<$<CONFIG:Debug>:${UPX_CONFIG_SANITIZE_FLAGS_DEBUG}>)
|
||||
target_link_options(${t} PRIVATE $<$<CONFIG:MinSizeRel>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||
target_link_options(${t} PRIVATE $<$<CONFIG:Release>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||
target_link_options(${t} PRIVATE $<$<CONFIG:RelWithDebInfo>:${UPX_CONFIG_SANITIZE_FLAGS_RELEASE}>)
|
||||
endif() # CMAKE_VERSION
|
||||
endif() # target_type
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
#***********************************************************************
|
||||
# test
|
||||
#***********************************************************************
|
||||
|
||||
function(upx_add_test) # ARGV
|
||||
set(name "${ARGV0}")
|
||||
list(REMOVE_AT ARGV 0)
|
||||
set(wd "${CMAKE_CURRENT_BINARY_DIR}/XTesting/$<CONFIG>")
|
||||
add_test(NAME "${name}" WORKING_DIRECTORY "${wd}" 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,62 @@
|
||||
#
|
||||
# UPX "CMake" build file; see https://cmake.org/
|
||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
#
|
||||
|
||||
#***********************************************************************
|
||||
# summary section
|
||||
# print some info about the build configuration
|
||||
#***********************************************************************
|
||||
|
||||
function(upx_print_info)
|
||||
get_property(PROPERTY_GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
get_property(PROPERTY_TARGET_SUPPORTS_SHARED_LIBS GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
|
||||
|
||||
# generator
|
||||
upx_print_var(CMAKE_GENERATOR_TOOLSET CMAKE_GENERATOR_PLATFORM)
|
||||
upx_print_var(PROPERTY_GENERATOR_IS_MULTI_CONFIG)
|
||||
|
||||
# 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_VS_PLATFORM_TOOLSET CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE CMAKE_VS_PLATFORM_TOOLSET_VERSION)
|
||||
upx_print_var(CMAKE_CROSSCOMPILING CMAKE_CROSSCOMPILING_EMULATOR)
|
||||
upx_print_var(CMAKE_SIZEOF_VOID_P)
|
||||
|
||||
# binutils
|
||||
upx_print_var(CMAKE_EXECUTABLE_FORMAT CMAKE_EXECUTABLE_SUFFIX UPX_CONFIG_CMAKE_EXECUTABLE_SUFFIX)
|
||||
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_ARG1)
|
||||
upx_print_var(CMAKE_${lang}_COMPILER_ID)
|
||||
upx_print_var(CMAKE_${lang}_SIMULATE_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_BUILD_WITH_INSTALL_RPATH CMAKE_SKIP_RPATH CMAKE_SKIP_BUILD_RPATH CMAKE_SKIP_INSTALL_RPATH)
|
||||
upx_print_var(CMAKE_INTERPROCEDURAL_OPTIMIZATION CMAKE_POSITION_INDEPENDENT_CODE)
|
||||
upx_print_var(PROPERTY_TARGET_SUPPORTS_SHARED_LIBS)
|
||||
upx_print_var(UPX_CONFIG_SANITIZE_FLAGS_DEBUG UPX_CONFIG_SANITIZE_FLAGS_RELEASE)
|
||||
|
||||
# shortcuts
|
||||
upx_print_var(AIX APPLE CLANG CYGWIN GNU_FRONTEND GNUC MINGW MSVC MSVC_FRONTEND MSVC_IDE MSVC_SIMULATE MSVC_TOOLSET_VERSION MSVC_VERSION MSYS UNIX WIN32 WIN64)
|
||||
endfunction()
|
||||
|
||||
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||
@@ -0,0 +1,157 @@
|
||||
#
|
||||
# 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!
|
||||
#***********************************************************************
|
||||
|
||||
function(upx_self_pack_test)
|
||||
|
||||
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)
|
||||
foreach(small IN ITEMS normal small)
|
||||
set(s "${method}-${level}")
|
||||
set(ss "")
|
||||
if(small MATCHES "small")
|
||||
set(s "${method}-${level}-${small}")
|
||||
set(ss "--small")
|
||||
endif()
|
||||
upx_add_test(upx-self-pack-${s} upx --${method} -${level} ${ss} --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)
|
||||
set(i 0)
|
||||
while(${i} LESS 20)
|
||||
math(EXPR i "${i} + 1")
|
||||
upx_add_test(upx-run-packed-${s}-${i} ${emu} ./upx-packed-${s}${exe} --version-short)
|
||||
upx_test_depends(upx-run-packed-${s}-${i} upx-self-pack-${s})
|
||||
endwhile()
|
||||
endif()
|
||||
endforeach()
|
||||
endforeach()
|
||||
endforeach()
|
||||
endif() # UPX_CONFIG_DISABLE_EXHAUSTIVE_TESTS
|
||||
|
||||
endfunction()
|
||||
|
||||
# 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,11 @@
|
||||
#
|
||||
# UPX "CMake" build file; see https://cmake.org/
|
||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
#
|
||||
|
||||
if(NOT DEFINED USE_STRICT_DEFAULTS)
|
||||
# use strict config defaults for Git developer builds
|
||||
set(USE_STRICT_DEFAULTS TRUE CACHE INTERNAL "" FORCE)
|
||||
endif()
|
||||
|
||||
# vim:set ft=cmake ts=4 sw=4 tw=0 et:
|
||||
@@ -1,17 +0,0 @@
|
||||
#! /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
|
||||
|
||||
# NOTE: this image is based on rebuild-stubs-with-podman/upx-stubtools-20221212-v4,
|
||||
# so you have to create that image first
|
||||
# WARNING: we install many packages, so the resulting image needs A LOT of disk space!
|
||||
image=upx-cross-compile-20230115-v2
|
||||
|
||||
podman build -t "$image" -f "$argv0dir/Dockerfile" "$argv0dir"
|
||||
|
||||
podman image list "$image"
|
||||
podman image tree "$image"
|
||||
@@ -1,53 +0,0 @@
|
||||
#! /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
|
||||
|
||||
image=upx-cross-compile-20230115-v2
|
||||
|
||||
flags=( -ti --read-only --rm )
|
||||
flags+=( --cap-drop=all ) # drop all capabilities
|
||||
flags+=( --network=none ) # no network needed
|
||||
flags+=( -e TERM="$TERM" ) # 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
|
||||
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
|
||||
|
||||
podman run "${flags[@]}" "$image" bash -l
|
||||
|
||||
# now we can cross-compile UPX for Windows:
|
||||
# cd /home/upx/src/upx
|
||||
# rm -rf ./build/extra/cross-windows-mingw64/release
|
||||
# make build/extra/cross-windows-mingw64/release
|
||||
|
||||
# and we can run the clang Static Analyzer (scan-build)
|
||||
# cd /home/upx/src/upx
|
||||
# rm -rf ./build/extra/scan-build/release
|
||||
# make build/extra/scan-build/release
|
||||
|
||||
# and lots of other cross-compilers are installed; see "ls /usr/bin/*g++*"
|
||||
|
||||
# and finally see misc/cross-compile-upx-with-podman/build-all-inside-container.sh
|
||||
# after running that script we can do cool things like:
|
||||
# cd /home/upx/src/upx/build/cross-compile-upx-with-podman/alpha-linux-gnu/debug
|
||||
# qemu-alpha -L /usr/alpha-linux-gnu upx --version
|
||||
# cd /home/upx/src/upx/build/cross-compile-upx-with-podman/hppa-linux-gnu/debug
|
||||
# qemu-hppa -L /usr/hppa-linux-gnu upx --version
|
||||
# (similar for many other architectures/builds)
|
||||
@@ -1,54 +0,0 @@
|
||||
# NOTE: this image is based on rebuild-stubs-with-podman/upx-stubtools-20221212-v4,
|
||||
# so you have to create that image first
|
||||
# WARNING: we install many packages, so the resulting image needs A LOT of disk space!
|
||||
FROM localhost/upx-stubtools-20221212-v4
|
||||
ENV UPX_CONTAINER_IMAGE_NAME=upx-cross-compile-20230115-v2
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
USER root
|
||||
|
||||
# Ubuntu 22.04
|
||||
RUN apt-get update && apt-get upgrade -y \
|
||||
&& apt-get install -y \
|
||||
# Linux glibc cross compilers
|
||||
g++-aarch64-linux-gnu \
|
||||
g++-alpha-linux-gnu \
|
||||
g++-arm-linux-gnueabi \
|
||||
g++-arm-linux-gnueabihf \
|
||||
g++-hppa-linux-gnu \
|
||||
g++-i686-linux-gnu \
|
||||
g++-m68k-linux-gnu \
|
||||
g++-mips-linux-gnu \
|
||||
g++-mipsel-linux-gnu \
|
||||
g++-mips64-linux-gnuabi64 \
|
||||
g++-mips64el-linux-gnuabi64 \
|
||||
g++-powerpc-linux-gnu \
|
||||
g++-powerpc64-linux-gnu \
|
||||
g++-powerpc64le-linux-gnu \
|
||||
g++-riscv64-linux-gnu \
|
||||
g++-s390x-linux-gnu \
|
||||
g++-sh4-linux-gnu \
|
||||
g++-sparc64-linux-gnu \
|
||||
# Linux glibc cross compilers - ILP32 on 64-bit CPUs
|
||||
g++-x86-64-linux-gnux32 \
|
||||
# Windows cross compilers
|
||||
g++-mingw-w64-i686 \
|
||||
g++-mingw-w64-x86-64 \
|
||||
&& true
|
||||
RUN apt-get install -y \
|
||||
# clang-14 and tools
|
||||
clang-14 clang-format-14 clang-tidy-14 clang-tools-14 lldb-14 llvm-14 \
|
||||
# QEMU and Wine
|
||||
qemu-system qemu-user wine wine32 \
|
||||
# misc
|
||||
gdb lsb-release valgrind \
|
||||
&& true
|
||||
RUN cd /usr/bin \
|
||||
# create unversioned clang symlinks in /usr/local/bin
|
||||
&& for f in clang*-14 llvm-*-14 scan-*-14; do ln -s -v ../../bin/$f /usr/local/bin/${f%-14}; done \
|
||||
&& ln -s -v ../../bin/obj2yaml-14 /usr/local/bin/llvm-obj2yaml \
|
||||
&& ln -s -v ../../bin/yaml2obj-14 /usr/local/bin/llvm-yaml2obj \
|
||||
&& true
|
||||
|
||||
# switch back to default user upx 2000:2000
|
||||
USER upx
|
||||
@@ -1,93 +0,0 @@
|
||||
#! /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")"
|
||||
|
||||
# build UPX for 21 targets; must be run inside the container!
|
||||
# using a rootless Podman container
|
||||
|
||||
# simple sanity check that we are indeed running inside the container
|
||||
if [[ $UPX_CONTAINER_IMAGE_NAME != upx-cross-compile-* ]]; then
|
||||
echo "$argv0: NOTE: please run this script *inside* the container"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# go to upx top-level directory
|
||||
cd "$argv0dir/../.." || exit 1
|
||||
pwd
|
||||
[[ -f src/version.h ]] || exit 1 # sanity check
|
||||
|
||||
function run_config_and_build {
|
||||
# requires: AR CC CXX RANLIB
|
||||
local toolchain=$1
|
||||
local cmake_config_flags build_type bdir
|
||||
# cmake flags
|
||||
cmake_config_flags=
|
||||
case $toolchain in
|
||||
# these old architectures do not support sanitize
|
||||
alpha-linux-gnu) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
||||
hppa-linux-gnu) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
||||
# avoid link errors with current MinGW-w64 versions
|
||||
i686-w64-mingw32) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
||||
x86_64-w64-mingw32) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
||||
# avoid warnings about arm libstdc++ ABI change in gcc-7
|
||||
arm-linux-*) CXX="$CXX -Wno-psabi" ;;
|
||||
esac
|
||||
if [[ 1 == 1 ]]; then
|
||||
# prefer building with Ninja (ninja-build)
|
||||
cmake_config_flags="$cmake_config_flags -G Ninja -DUPX_CONFIG_CMAKE_DISABLE_INSTALL=ON"
|
||||
fi
|
||||
# for all build types
|
||||
for build_type in Debug Release; do
|
||||
bdir=build/cross-compile-upx-with-podman/$toolchain/${build_type,,}
|
||||
mkdir -p $bdir
|
||||
# run_config
|
||||
if [[ ! -f $bdir/CMakeCache.txt ]]; then
|
||||
cmake -S . -B $bdir -DCMAKE_BUILD_TYPE=$build_type -DCMAKE_AR=$AR -DCMAKE_RANLIB=$RANLIB $cmake_config_flags
|
||||
fi
|
||||
# run_build
|
||||
cmake --build $bdir --config $build_type --parallel
|
||||
done
|
||||
}
|
||||
|
||||
# see Dockerfile for packages
|
||||
for package in \
|
||||
g++-aarch64-linux-gnu \
|
||||
g++-alpha-linux-gnu \
|
||||
g++-arm-linux-gnueabi \
|
||||
g++-arm-linux-gnueabihf \
|
||||
g++-hppa-linux-gnu \
|
||||
g++-i686-linux-gnu \
|
||||
g++-m68k-linux-gnu \
|
||||
g++-mips-linux-gnu \
|
||||
g++-mipsel-linux-gnu \
|
||||
g++-mips64-linux-gnuabi64 \
|
||||
g++-mips64el-linux-gnuabi64 \
|
||||
g++-powerpc-linux-gnu \
|
||||
g++-powerpc64-linux-gnu \
|
||||
g++-powerpc64le-linux-gnu \
|
||||
g++-riscv64-linux-gnu \
|
||||
g++-s390x-linux-gnu \
|
||||
g++-sh4-linux-gnu \
|
||||
g++-sparc64-linux-gnu \
|
||||
g++-x86-64-linux-gnux32 \
|
||||
g++-mingw-w64-i686 \
|
||||
g++-mingw-w64-x86-64
|
||||
do
|
||||
# setup toolchain and environment variables
|
||||
toolchain=$package
|
||||
toolchain=${toolchain/-x86-64/-x86_64}
|
||||
toolchain=${toolchain/g++-/}
|
||||
case $toolchain in
|
||||
mingw-w64-i686) toolchain=i686-w64-mingw32 ;;
|
||||
mingw-w64-x86_64) toolchain=x86_64-w64-mingw32 ;;
|
||||
esac
|
||||
echo "========== $toolchain"
|
||||
export AR=/usr/bin/${toolchain}-ar
|
||||
export CC=/usr/bin/${toolchain}-gcc
|
||||
export CXX=/usr/bin/${toolchain}-g++
|
||||
export RANLIB=/usr/bin/${toolchain}-ranlib
|
||||
ls -l $AR $CC $CXX $RANLIB
|
||||
run_config_and_build $toolchain
|
||||
unset AR CC CXX RANLIB
|
||||
done
|
||||
@@ -0,0 +1,385 @@
|
||||
#
|
||||
# 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 the 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++ -flto=auto
|
||||
build/extra/clang-lto-auto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/clang-lto-auto/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/clang-lto-auto/%: export CC = clang -flto=auto
|
||||
build/extra/clang-lto-auto/%: export CXX = clang++ -flto=auto
|
||||
|
||||
# force building with clang/clang++ -pie
|
||||
build/extra/clang-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/clang-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/clang-pie/%: export CC = clang -pie -fPIE -Wno-unused-command-line-argument
|
||||
build/extra/clang-pie/%: export CXX = clang++ -pie -fPIE -Wno-unused-command-line-argument
|
||||
build/extra/clang-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# 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
|
||||
build/extra/clang-static/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# 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
|
||||
build/extra/clang-static-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# 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
|
||||
build/extra/clang-static-lto/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# force building with clang/clang++ C++20 (and C17)
|
||||
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++ C++23 (and C23)
|
||||
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 -Wno-constant-logical-operand
|
||||
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 clang/clang++ C++26 (and C23)
|
||||
build/extra/clang-std-cxx26/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/clang-std-cxx26/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/clang-std-cxx26/%: export CC = clang -std=gnu2x -Wno-constant-logical-operand
|
||||
build/extra/clang-std-cxx26/%: export CXX = clang++ -std=gnu++2c
|
||||
build/extra/clang-std-cxx26/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
|
||||
build/extra/clang-std-cxx26/%: 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++ -flto=auto
|
||||
build/extra/gcc-lto-auto/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/gcc-lto-auto/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/gcc-lto-auto/%: export CC = gcc -flto=auto
|
||||
build/extra/gcc-lto-auto/%: export CXX = g++ -flto=auto
|
||||
|
||||
# force building with gcc/g++ -pie
|
||||
build/extra/gcc-pie/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/gcc-pie/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/gcc-pie/%: export CC = gcc -pie -fPIE
|
||||
build/extra/gcc-pie/%: export CXX = g++ -pie -fPIE
|
||||
build/extra/gcc-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# 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
|
||||
build/extra/gcc-static/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# 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
|
||||
build/extra/gcc-static-pie/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# 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
|
||||
build/extra/gcc-static-lto/%: export UPX_CONFIG_DISABLE_SHARED_LIBS = ON
|
||||
|
||||
# force building with gcc/g++ C++20 (and C17)
|
||||
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++ C++23 (and C23)
|
||||
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
|
||||
|
||||
# force building with gcc/g++ C++26 (and C23)
|
||||
build/extra/gcc-std-cxx26/debug: PHONY; $(call run_config_and_build,$@,Debug)
|
||||
build/extra/gcc-std-cxx26/release: PHONY; $(call run_config_and_build,$@,Release)
|
||||
build/extra/gcc-std-cxx26/%: export CC = gcc -std=gnu23
|
||||
build/extra/gcc-std-cxx26/%: export CXX = g++ -std=gnu++26
|
||||
build/extra/gcc-std-cxx26/%: export UPX_CONFIG_DISABLE_C_STANDARD = ON
|
||||
build/extra/gcc-std-cxx26/%: 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 $$@)
|
||||
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: PHONY
|
||||
|
||||
# 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/debug: build/$(UPX_XTARGET)/debug PHONY
|
||||
xtarget/release: build/$(UPX_XTARGET)/release PHONY
|
||||
xtarget/all: xtarget/debug xtarget/release PHONY
|
||||
xtarget/debug+test: build/$(UPX_XTARGET)/debug+test PHONY
|
||||
xtarget/release+test: build/$(UPX_XTARGET)/release+test PHONY
|
||||
xtarget/all+test: xtarget/debug+test 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
|
||||
#***********************************************************************
|
||||
|
||||
UPX_CMAKE_CONFIG_FLAGS += $(UPX_CMAKE_CONFIG_FLAGS_GENERATOR)
|
||||
UPX_CMAKE_CONFIG_FLAGS += $(UPX_CMAKE_CONFIG_FLAGS_TOOLSET)
|
||||
UPX_CMAKE_CONFIG_FLAGS += $(UPX_CMAKE_CONFIG_FLAGS_PLATFORM)
|
||||
|
||||
$(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_INSTALL_PREFIX)
|
||||
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
|
||||
|
||||
# vim:set ts=8 sw=8 noet:
|
||||
@@ -0,0 +1,30 @@
|
||||
From 741b9d2f24b5796fc499a411f632820ab4f889e5 Mon Sep 17 00:00:00 2001
|
||||
From: "Markus F.X.J. Oberhumer" <markus@oberhumer.com>
|
||||
Date: Wed, 9 Apr 2025 20:00:24 +0200
|
||||
Subject: [PATCH] x
|
||||
|
||||
---
|
||||
lib/libcxx/include/__config | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/libcxx/include/__config b/lib/libcxx/include/__config
|
||||
index fec323f..a16d145 100644
|
||||
--- a/lib/libcxx/include/__config
|
||||
+++ b/lib/libcxx/include/__config
|
||||
@@ -637,9 +637,12 @@ typedef __char32_t char32_t;
|
||||
# define _DECLARE_C99_LDBL_MATH 1
|
||||
# endif
|
||||
|
||||
+# if defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION)
|
||||
+# define _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION 0
|
||||
+# elif defined(_LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION)
|
||||
// If we are getting operator new from the MSVC CRT, then allocation overloads
|
||||
// for align_val_t were added in 19.12, aka VS 2017 version 15.3.
|
||||
-# if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
|
||||
+# elif defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
|
||||
# define _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION 0
|
||||
# elif defined(_LIBCPP_ABI_VCRUNTIME) && !defined(__cpp_aligned_new)
|
||||
// We're deferring to Microsoft's STL to provide aligned new et al. We don't
|
||||
--
|
||||
2.49.0
|
||||
|
||||
+4
-1
@@ -5,10 +5,13 @@ 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-20221212-v4
|
||||
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'
|
||||
+12
-4
@@ -5,13 +5,14 @@ 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=upx-stubtools-20221212-v4
|
||||
image="$("$argv0dir/10-create-image.sh" --print-image)"
|
||||
|
||||
flags=( -ti --read-only --rm )
|
||||
flags=( --read-only --rm --pull=never )
|
||||
flags+=( --cap-drop=all ) # drop all capabilities
|
||||
flags+=( --network=none ) # no network needed
|
||||
flags+=( -e TERM="$TERM" ) # pass $TERM
|
||||
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 )
|
||||
@@ -21,8 +22,11 @@ if [[ 1 == 1 ]]; then
|
||||
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+=( -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
|
||||
@@ -30,7 +34,11 @@ else
|
||||
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
|
||||
+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,104 @@
|
||||
# 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 coreutils curl diffutils findutils git grep gzip \
|
||||
less libmpc3 make ncurses-term perl-base python3 sed sudo tar time util-linux 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 bat bfs btop bubblewrap busybox bzip2 bzip3 cabextract ccache chrpath cmake cpio \
|
||||
dash diffstat direnv dmidecode elfutils execstack eza fd-find file fish fzf \
|
||||
g++ gawk gdb gh gojq ht htop hyperfine jq just ksh \
|
||||
lftp libzstd-dev lsb-release lsd lz4 lzip lzop minify mksh moreutils musl neovim ninja-build \
|
||||
p7zip parallel patch patchelf patchutils pax-utils proot \
|
||||
python3-pyasn1 python3-pycryptodome python3-pycurl python3-tomli python3-tomli-w \
|
||||
python3-yaml python3-zstd \
|
||||
re2c ripgrep rsync screen socat 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 \
|
||||
&& apt-get install -y \
|
||||
gcc-riscv64-linux-gnu \
|
||||
&& 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 \
|
||||
&& curl -sS -L -O 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 4.2.4 5.0.0 5.0.1 5.0.2" \
|
||||
&& for v in $xzversions; do curl -sS -L -O 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 path='echo PATH=\"\$PATH\"'" >> .bashrc \
|
||||
&& echo "alias md=mkdir" >> .bashrc \
|
||||
&& echo "alias rd=rmdir" >> .bashrc \
|
||||
&& echo 'mdd() { mkdir "$1" && cd "$1"; }' >> .bashrc \
|
||||
&& echo 'm() { make "$@"; }' >> .bashrc \
|
||||
&& echo 'mm() { make -j8 "$@"; }' >> .bashrc \
|
||||
&& echo 'tn() { time nice "$@"; }' >> .bashrc \
|
||||
&& echo 'tnm() { time nice make "$@"; }' >> .bashrc \
|
||||
&& echo 'tnmm() { time nice make -j8 "$@"; }' >> .bashrc \
|
||||
&& echo 'source /usr/share/bash-completion/completions/make' >> .bashrc \
|
||||
&& echo 'complete -F _make m mm 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
+804
@@ -0,0 +1,804 @@
|
||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||
localhost/upx-stubtools-20240405-v1 latest e35ec64e37eb 3 minutes ago 1.62 GB
|
||||
|
||||
Image ID: e35ec64e37eb
|
||||
Tags: [localhost/upx-stubtools-20240405-v1:latest]
|
||||
Size: 1.616GB
|
||||
Image Layers
|
||||
├── ID: 073ec47a8c22 Size: 80.63MB Top Layer of: [docker.io/library/ubuntu:24.04]
|
||||
├── ID: cc32efc504cb Size: 1.168GB
|
||||
├── ID: 0ad248142047 Size: 9.477MB
|
||||
├── ID: 1b5f23a7b45a Size: 457.2kB
|
||||
├── ID: fde08588dc3b Size: 320.1MB
|
||||
├── ID: 028612b01bc7 Size: 37.45MB
|
||||
└── ID: a8359823a285 Size: 44.03kB Top Layer of: [localhost/upx-stubtools-20240405-v1:latest]
|
||||
|
||||
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.8.3 amd64 commandline package manager
|
||||
ii aria2 1.37.0+debian-1build3 amd64 High speed download utility
|
||||
ii base-files 13ubuntu10.3 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 bat 0.24.0-1build1 amd64 cat(1) clone with syntax highlighting and git integration
|
||||
ii bfs 3.1.2-1build1 amd64 Breadth-first version of find(1)
|
||||
ii binutils 2.42-4ubuntu2.6 amd64 GNU assembler, linker and binary utilities
|
||||
ii binutils-common:amd64 2.42-4ubuntu2.6 amd64 Common files for the GNU assembler, linker and binary utilities
|
||||
ii binutils-riscv64-linux-gnu 2.42-4ubuntu2.6 amd64 GNU binary utilities, for riscv64-linux-gnu target
|
||||
ii binutils-x86-64-linux-gnu 2.42-4ubuntu2.6 amd64 GNU binary utilities, for x86-64-linux-gnu target
|
||||
ii bsdextrautils 2.39.3-9ubuntu6.3 amd64 extra utilities from 4.4BSD-Lite
|
||||
ii bsdutils 1:2.39.3-9ubuntu6.3 amd64 basic utilities from 4.4BSD-Lite
|
||||
ii btop 1.3.0-1 amd64 Modern and colorful command line resource monitor that shows usage and stats
|
||||
ii bubblewrap 0.9.0-1ubuntu0.1 amd64 utility for unprivileged chroot and namespace manipulation
|
||||
ii busybox 1:1.36.1-6ubuntu3.1 amd64 Tiny utilities for small and embedded systems
|
||||
ii bzip2 1.0.8-5.1build0.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.1 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.3.0-6ubuntu2~24.04 amd64 GNU C preprocessor
|
||||
ii cpp-13-riscv64-linux-gnu 13.3.0-6ubuntu2~24.04cross1 amd64 GNU C preprocessor for riscv64-linux-gnu
|
||||
ii cpp-13-x86-64-linux-gnu 13.3.0-6ubuntu2~24.04 amd64 GNU C preprocessor for x86_64-linux-gnu
|
||||
ii cpp-riscv64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C preprocessor (cpp) for the riscv64 architecture
|
||||
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.6 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 direnv 2.32.1-2ubuntu0.24.04.3 amd64 Utility to set directory specific environment variables
|
||||
ii dmidecode 3.5-3ubuntu0.1 amd64 SMBIOS/DMI table decoder
|
||||
ii dpkg 1.22.6ubuntu6.5 amd64 Debian package management system
|
||||
ii e2fsprogs 1.47.0-2.4~exp1ubuntu4.1 amd64 ext2/ext3/ext4 file system utilities
|
||||
ii elfutils 0.190-1.1ubuntu0.1 amd64 collection of utilities to handle ELF objects
|
||||
ii execstack 0.0.20131005-1.1ubuntu1 amd64 ELF GNU_STACK program header editing utility
|
||||
ii eza 0.18.2-1 amd64 Modern replacement for ls
|
||||
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-1ubuntu0.3 amd64 general-purpose command-line fuzzy finder
|
||||
ii g++ 4:13.2.0-7ubuntu1 amd64 GNU C++ compiler
|
||||
ii g++-13 13.3.0-6ubuntu2~24.04 amd64 GNU C++ compiler
|
||||
ii g++-13-multilib 13.3.0-6ubuntu2~24.04 amd64 GNU C++ compiler (multilib support)
|
||||
ii g++-13-x86-64-linux-gnu 13.3.0-6ubuntu2~24.04 amd64 GNU C++ compiler for x86_64-linux-gnu architecture
|
||||
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.3.0-6ubuntu2~24.04 amd64 GNU C compiler
|
||||
ii gcc-13-base:amd64 13.3.0-6ubuntu2~24.04 amd64 GCC, the GNU Compiler Collection (base package)
|
||||
ii gcc-13-cross-base 13.3.0-6ubuntu2~24.04cross1 all GCC, the GNU Compiler Collection (library base package)
|
||||
ii gcc-13-multilib 13.3.0-6ubuntu2~24.04 amd64 GNU C compiler (multilib support)
|
||||
ii gcc-13-riscv64-linux-gnu 13.3.0-6ubuntu2~24.04cross1 amd64 GNU C compiler for the riscv64-linux-gnu architecture
|
||||
ii gcc-13-riscv64-linux-gnu-base:amd64 13.3.0-6ubuntu2~24.04cross1 amd64 GCC, the GNU Compiler Collection (base package)
|
||||
ii gcc-13-x86-64-linux-gnu 13.3.0-6ubuntu2~24.04 amd64 GNU C compiler for the x86_64-linux-gnu architecture
|
||||
ii gcc-14-base:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC, the GNU Compiler Collection (base package)
|
||||
ii gcc-14-base:i386 14.2.0-4ubuntu2~24.04 i386 GCC, the GNU Compiler Collection (base package)
|
||||
ii gcc-14-cross-base 14.2.0-4ubuntu2~24.04cross1 all GCC, the GNU Compiler Collection (library base package)
|
||||
ii gcc-riscv64-linux-gnu 4:13.2.0-7ubuntu1 amd64 GNU C compiler for the riscv64 architecture
|
||||
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 gh 2.45.0-1ubuntu0.3 amd64 GitHub CLI, GitHub’s official command line tool
|
||||
ii git 1:2.43.0-1ubuntu7.3 amd64 fast, scalable, distributed revision control system
|
||||
ii git-man 1:2.43.0-1ubuntu7.3 all fast, scalable, distributed revision control system (manual pages)
|
||||
ii gojq 0.12.13-1ubuntu0.24.04.3 amd64 pure Go implementation of jq (program)
|
||||
ii gpgv 2.4.4-2ubuntu17.3 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.1 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-3ubuntu0.24.04.1 amd64 lightweight and flexible command-line JSON processor
|
||||
ii just 1.21.0-1 amd64 Save and run project-specific commands
|
||||
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 lftp 4.9.2-2ubuntu1.1 amd64 Sophisticated command-line FTP/HTTP/BitTorrent client programs
|
||||
ii lib32asan8 14.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector (32bit)
|
||||
ii lib32atomic1 14.2.0-4ubuntu2~24.04 amd64 support library providing __atomic built-in functions (32bit)
|
||||
ii lib32gcc-13-dev 13.3.0-6ubuntu2~24.04 amd64 GCC support library (32 bit development files)
|
||||
ii lib32gcc-s1 14.2.0-4ubuntu2~24.04 amd64 GCC support library (32 bit Version)
|
||||
ii lib32gomp1 14.2.0-4ubuntu2~24.04 amd64 GCC OpenMP (GOMP) support library (32bit)
|
||||
ii lib32itm1 14.2.0-4ubuntu2~24.04 amd64 GNU Transactional Memory Library (32bit)
|
||||
ii lib32quadmath0 14.2.0-4ubuntu2~24.04 amd64 GCC Quad-Precision Math Library (32bit)
|
||||
ii lib32stdc++-13-dev 13.3.0-6ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (development files)
|
||||
ii lib32stdc++6 14.2.0-4ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (32 bit Version)
|
||||
ii lib32ubsan1 14.2.0-4ubuntu2~24.04 amd64 UBSan -- undefined behaviour sanitizer (32bit)
|
||||
ii libacl1:amd64 2.3.2-1build1.1 amd64 access control list - shared library
|
||||
ii libapparmor1:amd64 4.0.1really4.0.1-0ubuntu0.24.04.4 amd64 changehat AppArmor library
|
||||
ii libapt-pkg6.0t64:amd64 2.8.3 amd64 package management runtime library
|
||||
ii libarchive13t64:amd64 3.7.2-2ubuntu0.5 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-riscv64-cross 14.2.0-4ubuntu2~24.04cross1 all AddressSanitizer -- a fast memory error detector
|
||||
ii libasan8:amd64 14.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector
|
||||
ii libasm1t64:amd64 0.190-1.1ubuntu0.1 amd64 library with a programmable assembler interface
|
||||
ii libassuan0:amd64 2.5.6-1build1 amd64 IPC library for the GnuPG components
|
||||
ii libatomic1-riscv64-cross 14.2.0-4ubuntu2~24.04cross1 all support library providing __atomic built-in functions
|
||||
ii libatomic1:amd64 14.2.0-4ubuntu2~24.04 amd64 support library providing __atomic built-in functions
|
||||
ii libattr1:amd64 1:2.5.2-1build1.1 amd64 extended attribute handling - shared library
|
||||
ii libaudit-common 1:3.1.2-2.1build1.1 all Dynamic library for security auditing - common files
|
||||
ii libaudit1:amd64 1:3.1.2-2.1build1.1 amd64 Dynamic library for security auditing
|
||||
ii libbabeltrace1:amd64 1.5.11-3build3 amd64 Babeltrace conversion libraries
|
||||
ii libbinutils:amd64 2.42-4ubuntu2.6 amd64 GNU binary utilities (private shared library)
|
||||
ii libblkid1:amd64 2.39.3-9ubuntu6.3 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.1 amd64 utility functions from BSD systems - shared library
|
||||
ii libbz2-1.0:amd64 1.0.8-5.1build0.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.6 amd64 GNU C Library: Binaries
|
||||
ii libc-dev-bin 2.39-0ubuntu8.6 amd64 GNU C Library: Development binaries
|
||||
ii libc6-dbg:amd64 2.39-0ubuntu8.6 amd64 GNU C Library: detached debugging symbols
|
||||
ii libc6-dev-i386 2.39-0ubuntu8.6 amd64 GNU C Library: 32-bit development libraries for AMD64
|
||||
ii libc6-dev-riscv64-cross 2.39-0ubuntu8cross1 all GNU C Library: Development Libraries and Header Files (for cross-compiling)
|
||||
ii libc6-dev-x32 2.39-0ubuntu8.6 amd64 GNU C Library: X32 ABI Development Libraries for AMD64
|
||||
ii libc6-dev:amd64 2.39-0ubuntu8.6 amd64 GNU C Library: Development Libraries and Header Files
|
||||
ii libc6-i386 2.39-0ubuntu8.6 amd64 GNU C Library: 32-bit shared libraries for AMD64
|
||||
ii libc6-riscv64-cross 2.39-0ubuntu8cross1 all GNU C Library: Shared libraries (for cross-compiling)
|
||||
ii libc6-x32 2.39-0ubuntu8.6 amd64 GNU C Library: X32 ABI Shared libraries for AMD64
|
||||
ii libc6:amd64 2.39-0ubuntu8.6 amd64 GNU C Library: Shared libraries
|
||||
ii libc6:i386 2.39-0ubuntu8.6 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.2 amd64 POSIX 1003.1e capabilities (library)
|
||||
ii libcares2:amd64 1.27.0-1.0ubuntu1 amd64 asynchronous name resolver
|
||||
ii libcc1-0:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC cc1 plugin for GDB
|
||||
ii libcom-err2:amd64 1.47.0-2.4~exp1ubuntu4.1 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.6 amd64 Compact C Type Format library (runtime, no BFD dependency)
|
||||
ii libctf0:amd64 2.42-4ubuntu2.6 amd64 Compact C Type Format library (runtime, BFD dependency)
|
||||
ii libcurl3t64-gnutls:amd64 8.5.0-2ubuntu10.6 amd64 easy-to-use client-side URL transfer library (GnuTLS flavour)
|
||||
ii libcurl4t64:amd64 8.5.0-2ubuntu10.6 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.1ubuntu0.1 all configuration to enable the Debian debug info server
|
||||
ii libdebuginfod1t64:amd64 0.190-1.1ubuntu0.1 amd64 library to interact with debuginfod (development files)
|
||||
ii libdw1t64:amd64 0.190-1.1ubuntu0.1 amd64 library that provides access to the DWARF debug information
|
||||
ii libelf1t64:amd64 0.190-1.1ubuntu0.1 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-2ubuntu0.3 amd64 XML parsing C library - runtime library
|
||||
ii libext2fs2t64:amd64 1.47.0-2.4~exp1ubuntu4.1 amd64 ext2/ext3/ext4 file system libraries
|
||||
ii libffi8:amd64 3.4.6-1build1 amd64 Foreign Function Interface library runtime
|
||||
ii libgcc-13-dev-riscv64-cross 13.3.0-6ubuntu2~24.04cross1 all GCC support library (development files)
|
||||
ii libgcc-13-dev:amd64 13.3.0-6ubuntu2~24.04 amd64 GCC support library (development files)
|
||||
ii libgcc-s1-riscv64-cross 14.2.0-4ubuntu2~24.04cross1 all GCC support library (riscv64)
|
||||
ii libgcc-s1:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC support library
|
||||
ii libgcc-s1:i386 14.2.0-4ubuntu2~24.04 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 libgit2-1.7:amd64 1.7.2+ds-1ubuntu3 amd64 low-level Git library
|
||||
ii libglib2.0-0t64:amd64 2.80.0-6ubuntu3.4 amd64 GLib library of C routines
|
||||
ii libgmp10:amd64 2:6.3.0+dfsg-2ubuntu6.1 amd64 Multiprecision arithmetic library
|
||||
ii libgnutls30t64:amd64 3.8.3-1.1ubuntu3.4 amd64 GNU TLS library - main runtime library
|
||||
ii libgomp1-riscv64-cross 14.2.0-4ubuntu2~24.04cross1 all GCC OpenMP (GOMP) support library
|
||||
ii libgomp1:amd64 14.2.0-4ubuntu2~24.04 amd64 GCC OpenMP (GOMP) support library
|
||||
ii libgpg-error0:amd64 1.47-3build2.1 amd64 GnuPG development runtime library
|
||||
ii libgprofng0:amd64 2.42-4ubuntu2.6 amd64 GNU Next Generation profiler (runtime library)
|
||||
ii libgssapi-krb5-2:amd64 1.20.1-6ubuntu2.6 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.1 amd64 low level cryptographic library (public-key cryptos)
|
||||
ii libhttp-parser2.9:amd64 2.9.4-6build1 amd64 parser for HTTP messages written in C
|
||||
ii libhwasan0:amd64 14.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector
|
||||
ii libicu74:amd64 74.2-1ubuntu3.1 amd64 International Components for Unicode
|
||||
ii libidn2-0:amd64 2.3.7-2build1.1 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.1 amd64 manipulating sets and relations of integer points bounded by linear constraints
|
||||
ii libitm1-riscv64-cross 14.2.0-4ubuntu2~24.04cross1 all GNU Transactional Memory Library
|
||||
ii libitm1:amd64 14.2.0-4ubuntu2~24.04 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-3ubuntu0.24.04.1 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.6 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.6 amd64 MIT Kerberos runtime libraries
|
||||
ii libkrb5support0:amd64 1.20.1-6ubuntu2.6 amd64 MIT Kerberos runtime libraries - Support library
|
||||
ii libldap2:amd64 2.6.7+dfsg-1~exp1ubuntu8.2 amd64 OpenLDAP libraries
|
||||
ii liblsan0:amd64 14.2.0-4ubuntu2~24.04 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.1 amd64 Fast LZ compression algorithm library - runtime
|
||||
ii liblzma5:amd64 5.6.1+really5.4.5-1ubuntu0.2 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.1 amd64 message digest functions from BSD systems - shared library
|
||||
ii libmount1:amd64 2.39.3-9ubuntu6.3 amd64 device mounting library
|
||||
ii libmpc3:amd64 1.3.1-1build1.1 amd64 multiple precision complex floating-point library
|
||||
ii libmpfr6:amd64 4.2.1-1build1.1 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.1 amd64 low level cryptographic library (symmetric and one-way cryptos)
|
||||
ii libnghttp2-14:amd64 1.59.0-1ubuntu0.2 amd64 library implementing HTTP/2 protocol (shared library)
|
||||
ii libnl-3-200:amd64 3.7.0-0.3build1.1 amd64 library for dealing with netlink sockets
|
||||
ii libnl-genl-3-200:amd64 3.7.0-0.3build1.1 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.1 amd64 library for loading and coordinating access to PKCS#11 modules - runtime
|
||||
ii libpam-modules-bin 1.5.3-5ubuntu5.5 amd64 Pluggable Authentication Modules for PAM - helper binaries
|
||||
ii libpam-modules:amd64 1.5.3-5ubuntu5.5 amd64 Pluggable Authentication Modules for PAM
|
||||
ii libpam-runtime 1.5.3-5ubuntu5.5 all Runtime support for the PAM library
|
||||
ii libpam0g:amd64 1.5.3-5ubuntu5.5 amd64 Pluggable Authentication Modules library
|
||||
ii libpcre2-32-0:amd64 10.42-4ubuntu2.1 amd64 New Perl Compatible Regular Expression Library - 32 bit runtime files
|
||||
ii libpcre2-8-0:amd64 10.42-4ubuntu2.1 amd64 New Perl Compatible Regular Expression Library- 8 bit runtime files
|
||||
ii libperl5.38t64:amd64 5.38.2-3.2ubuntu0.2 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.2 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-0ubuntu2 amd64 interactive high-level object-oriented language (default python3 version)
|
||||
ii libpython3.12-minimal:amd64 3.12.3-1ubuntu0.8 amd64 Minimal subset of the Python language (version 3.12)
|
||||
ii libpython3.12-stdlib:amd64 3.12.3-1ubuntu0.8 amd64 Interactive high-level object-oriented language (standard library, version 3.12)
|
||||
ii libpython3.12t64:amd64 3.12.3-1ubuntu0.8 amd64 Shared Python runtime library (version 3.12)
|
||||
ii libquadmath0:amd64 14.2.0-4ubuntu2~24.04 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.1 amd64 Cyrus SASL - authentication abstraction library
|
||||
ii libsasl2-modules-db:amd64 2.1.28+dfsg1-5ubuntu3.1 amd64 Cyrus SASL - pluggable authentication modules (DB)
|
||||
ii libseccomp2:amd64 2.5.5-1ubuntu3.1 amd64 high level interface to Linux seccomp filter
|
||||
ii libselinux1:amd64 3.5-2ubuntu2.1 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.6 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.3 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.5 amd64 SQLite 3 shared library
|
||||
ii libss2:amd64 1.47.0-2.4~exp1ubuntu4.1 amd64 command-line interface parsing library
|
||||
ii libssh-4:amd64 0.10.6-2ubuntu0.2 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.6 amd64 Secure Sockets Layer toolkit - shared libraries
|
||||
ii libstdc++-13-dev:amd64 13.3.0-6ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (development files)
|
||||
ii libstdc++6-riscv64-cross 14.2.0-4ubuntu2~24.04cross1 all GNU Standard C++ Library v3 (riscv64)
|
||||
ii libstdc++6:amd64 14.2.0-4ubuntu2~24.04 amd64 GNU Standard C++ Library v3
|
||||
ii libsystemd0:amd64 255.4-1ubuntu8.11 amd64 systemd utility library
|
||||
ii libtalloc2:amd64 2.4.2-1build2 amd64 hierarchical pool based memory allocator
|
||||
ii libtasn1-6:amd64 4.19.0-3ubuntu0.24.04.1 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.2.0-4ubuntu2~24.04 amd64 ThreadSanitizer -- a Valgrind-based detector of data races (runtime)
|
||||
ii libubsan1-riscv64-cross 14.2.0-4ubuntu2~24.04cross1 all UBSan -- undefined behaviour sanitizer (runtime)
|
||||
ii libubsan1:amd64 14.2.0-4ubuntu2~24.04 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.11 amd64 libudev shared library
|
||||
ii libunibilium4:amd64 2.1.0-3 amd64 simple, self-contained terminfo library
|
||||
ii libunistring5:amd64 1.1-2build1.1 amd64 Unicode string library for C
|
||||
ii libunwind8:amd64 1.6.2-3build1.1 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.3 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 libwrap0:amd64 7.6.q-33 amd64 Wietse Venema's TCP wrappers 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.2.0-4ubuntu2~24.04 amd64 AddressSanitizer -- a fast memory error detector (x32)
|
||||
ii libx32atomic1 14.2.0-4ubuntu2~24.04 amd64 support library providing __atomic built-in functions (x32)
|
||||
ii libx32gcc-13-dev 13.3.0-6ubuntu2~24.04 amd64 GCC support library (x32 development files)
|
||||
ii libx32gcc-s1 14.2.0-4ubuntu2~24.04 amd64 GCC support library (x32)
|
||||
ii libx32gomp1 14.2.0-4ubuntu2~24.04 amd64 GCC OpenMP (GOMP) support library (x32)
|
||||
ii libx32itm1 14.2.0-4ubuntu2~24.04 amd64 GNU Transactional Memory Library (x32)
|
||||
ii libx32quadmath0 14.2.0-4ubuntu2~24.04 amd64 GCC Quad-Precision Math Library (x32)
|
||||
ii libx32stdc++-13-dev 13.3.0-6ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (development files)
|
||||
ii libx32stdc++6 14.2.0-4ubuntu2~24.04 amd64 GNU Standard C++ Library v3 (x32)
|
||||
ii libx32ubsan1 14.2.0-4ubuntu2~24.04 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.6 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.1 amd64 fast lossless compression algorithm -- development files
|
||||
ii libzstd1:amd64 1.5.5+dfsg2-2build1.1 amd64 fast lossless compression algorithm
|
||||
ii linux-libc-dev-riscv64-cross 6.8.0-25.25cross1 all Linux Kernel Headers for development (for cross-compiling)
|
||||
ii linux-libc-dev:amd64 6.8.0-87.88 amd64 Linux Kernel Headers for development
|
||||
ii login 1:4.13+dfsg1-4ubuntu3.2 amd64 system login tools
|
||||
ii logsave 1.47.0-2.4~exp1ubuntu4.1 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 lsd 1.0.0-2 amd64 ls command with a lot of pretty colors and some other stuff
|
||||
ii lua-luv:amd64 1.48.0-2-2build1 amd64 libuv bindings for Lua
|
||||
ii lz4 1.9.4-1build1.1 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.3 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.6 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.2 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.2ubuntu0.2 amd64 Larry Wall's Practical Extraction and Report Language
|
||||
ii perl-base 5.38.2-3.2ubuntu0.2 amd64 minimal Perl system
|
||||
ii perl-modules-5.38 5.38.2-3.2ubuntu0.2 all Core Perl modules
|
||||
ii procps 2:4.0.4-4ubuntu3.2 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-0ubuntu2 amd64 interactive high-level object-oriented language (default python3 version)
|
||||
ii python3-argcomplete 3.1.4-1ubuntu0.1 all bash tab completion for argparse (for Python 3)
|
||||
ii python3-minimal 3.12.3-0ubuntu2 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-tomli 2.0.1-2 all lil' TOML parser for Python
|
||||
ii python3-tomli-w 1.0.0-2 all lil' TOML writer for Python
|
||||
ii python3-xmltodict 0.13.0-1ubuntu0.24.04.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-1ubuntu0.8 amd64 Interactive high-level object-oriented language (version 3.12)
|
||||
ii python3.12-minimal 3.12.3-1ubuntu0.8 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.2 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 socat 1.8.0.0-4build3 amd64 multipurpose relay for bidirectional data transfer
|
||||
ii strace 6.8-0ubuntu2 amd64 System call tracer
|
||||
ii sudo 1.9.15p5-3ubuntu5.24.04.1 amd64 Provide limited super user privileges to specific users
|
||||
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 2025b-0ubuntu0.24.04.1 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 unminimize 0.2.1 amd64 Un-minimize your minimial images or setup
|
||||
ii unzip 6.0-28ubuntu4.1 amd64 De-archiver for .zip files
|
||||
ii util-linux 2.39.3-9ubuntu6.3 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.1 amd64 retrieves files from the web
|
||||
ii xz-utils 5.6.1+really5.4.5-1ubuntu0.2 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-13ubuntu0.2 amd64 Archiver for .zip files
|
||||
ii zlib1g-dev:amd64 1:1.3.dfsg-3.1ubuntu2.1 amd64 compression library - development
|
||||
ii zlib1g:amd64 1:1.3.dfsg-3.1ubuntu2.1 amd64 compression library - runtime
|
||||
ii zlib1g:i386 1:1.3.dfsg-3.1ubuntu2.1 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.1 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:
|
||||
1156978 ===== TOTAL (390 packages)
|
||||
76943 valgrind amd64
|
||||
61804 gcc-13-riscv64-linux-gnu amd64
|
||||
61333 gcc-13-x86-64-linux-gnu amd64
|
||||
44381 gh amd64
|
||||
36493 cmake amd64
|
||||
35919 libicu74 amd64
|
||||
33545 g++-13-x86-64-linux-gnu amd64
|
||||
30811 cpp-13-x86-64-linux-gnu amd64
|
||||
29774 cpp-13-riscv64-linux-gnu amd64
|
||||
29333 libperl5.38t64 amd64
|
||||
21815 neovim-runtime all
|
||||
21692 git amd64
|
||||
21662 libstdc++-13-dev amd64
|
||||
19159 perl-modules-5.38 all
|
||||
18028 libgcc-13-dev-riscv64-cross all
|
||||
16248 zsh-common all
|
||||
16082 libgcc-13-dev amd64
|
||||
13431 libc6 amd64
|
||||
13112 libc6-dev amd64
|
||||
12519 gdb amd64
|
||||
12321 fish-common all
|
||||
12297 libc6 i386
|
||||
12004 libc6-x32 amd64
|
||||
11989 libc6-i386 amd64
|
||||
11549 binutils-x86-64-linux-gnu amd64
|
||||
11179 libc6-dbg amd64
|
||||
10984 cmake-data all
|
||||
10791 libasan8 amd64
|
||||
9704 libx32asan8 amd64
|
||||
9539 lib32asan8 amd64
|
||||
9420 binutils-riscv64-linux-gnu amd64
|
||||
9023 libpython3.12-stdlib amd64
|
||||
8924 libpython3.12t64 amd64
|
||||
8902 libtsan2 amd64
|
||||
8335 libmagic-mgc amd64
|
||||
8296 lib32gcc-13-dev amd64
|
||||
8119 libc6-dev-x32 amd64
|
||||
7927 python3.12-minimal amd64
|
||||
7913 perl-base amd64
|
||||
7531 libx32gcc-13-dev amd64
|
||||
7493 linux-libc-dev amd64
|
||||
7226 lib32stdc++-13-dev amd64
|
||||
7059 libx32stdc++-13-dev amd64
|
||||
7025 linux-libc-dev-riscv64-cross all
|
||||
7024 direnv amd64
|
||||
6947 libc6-dev-i386 amd64
|
||||
6944 coreutils amd64
|
||||
6775 neovim amd64
|
||||
6608 libssl3t64 amd64
|
||||
6237 dpkg amd64
|
||||
6158 7zip amd64
|
||||
5219 bat amd64
|
||||
5210 ripgrep amd64
|
||||
5181 libpython3.12-minimal amd64
|
||||
4897 libhwasan0 amd64
|
||||
4341 ncurses-term all
|
||||
4244 minify amd64
|
||||
4193 libglib2.0-0t64 amd64
|
||||
4108 apt amd64
|
||||
4074 gojq amd64
|
||||
3956 python3-pycryptodome amd64
|
||||
3833 libgprofng0 amd64
|
||||
3828 liblsan0 amd64
|
||||
3738 fzf amd64
|
||||
3721 groff-base amd64
|
||||
3605 python2.7-minimal amd64
|
||||
3568 just amd64
|
||||
3468 sudo amd64
|
||||
3443 fish amd64
|
||||
3441 re2c amd64
|
||||
3438 util-linux amd64
|
||||
3408 lsd amd64
|
||||
3403 libaria2-0 amd64
|
||||
3382 fd-find amd64
|
||||
3364 libubsan1 amd64
|
||||
3249 libapt-pkg6.0t64 amd64
|
||||
3181 libx32ubsan1 amd64
|
||||
3181 libstdc++6-riscv64-cross all
|
||||
3111 ksh93u+m amd64
|
||||
3110 libstdc++6 amd64
|
||||
3104 lib32ubsan1 amd64
|
||||
2995 parallel all
|
||||
2958 elfutils amd64
|
||||
2928 man-db amd64
|
||||
2894 lib32stdc++6 amd64
|
||||
2810 libx32stdc++6 amd64
|
||||
2785 libpython2.7-minimal amd64
|
||||
2642 libasan8-riscv64-cross all
|
||||
2431 zsh amd64
|
||||
2419 passwd amd64
|
||||
2352 libgnutls30t64 amd64
|
||||
2350 libbinutils amd64
|
||||
2191 ht amd64
|
||||
2183 libc-bin amd64
|
||||
2162 git-man all
|
||||
2103 strace amd64
|
||||
2079 libxml2 amd64
|
||||
2032 libisl23 amd64
|
||||
2009 universal-ctags amd64
|
||||
1980 aria2 amd64
|
||||
1900 bash amd64
|
||||
1885 openssl amd64
|
||||
1848 lftp amd64
|
||||
1802 zstd amd64
|
||||
1800 procps amd64
|
||||
1761 libdb5.3t64 amd64
|
||||
1757 libunistring5 amd64
|
||||
1736 gawk amd64
|
||||
1731 libsqlite3-0 amd64
|
||||
1712 libp11-kit0 amd64
|
||||
1634 mksh amd64
|
||||
1610 socat amd64
|
||||
1582 btop amd64
|
||||
1579 ccache amd64
|
||||
1504 e2fsprogs amd64
|
||||
1454 bash-completion all
|
||||
1452 sysstat amd64
|
||||
1448 yash amd64
|
||||
1396 libgcrypt20 amd64
|
||||
1387 tzdata all
|
||||
1362 libx11-6 amd64
|
||||
1342 libx11-data all
|
||||
1322 zlib1g-dev amd64
|
||||
1314 hyperfine amd64
|
||||
1237 libzstd-dev amd64
|
||||
1237 libgit2-1.7 amd64
|
||||
1186 libmpfr6 amd64
|
||||
1150 libpam-modules amd64
|
||||
1142 eza amd64
|
||||
1136 zoxide amd64
|
||||
1026 libsystemd0 amd64
|
||||
1015 libkrb5-3 amd64
|
||||
996 screen amd64
|
||||
925 libcurl4t64 amd64
|
||||
916 wget amd64
|
||||
906 libcurl3t64-gnutls amd64
|
||||
905 libarchive13t64 amd64
|
||||
884 login amd64
|
||||
852 busybox amd64
|
||||
851 libubsan1-riscv64-cross all
|
||||
843 libbrotli1 amd64
|
||||
812 lua-luv amd64
|
||||
785 musl amd64
|
||||
781 rsync amd64
|
||||
766 libdw1t64 amd64
|
||||
761 libzstd1 amd64
|
||||
751 libsepol2 amd64
|
||||
745 libsource-highlight4t64 amd64
|
||||
737 python3.12 amd64
|
||||
732 xz-utils amd64
|
||||
708 tar amd64
|
||||
672 perl amd64
|
||||
647 ncurses-bin amd64
|
||||
635 libpcre2-8-0 amd64
|
||||
629 libonig5 amd64
|
||||
624 python3-pyelftools all
|
||||
614 lib32quadmath0 amd64
|
||||
602 libluajit-5.1-2 amd64
|
||||
564 binutils-common amd64
|
||||
556 libtinfo6 amd64
|
||||
554 libpcre2-32-0 amd64
|
||||
553 gcc-13 amd64
|
||||
552 findutils amd64
|
||||
543 libgmp10 amd64
|
||||
540 libldap2 amd64
|
||||
538 libext2fs2t64 amd64
|
||||
536 zip amd64
|
||||
521 curl amd64
|
||||
512 python3-yaml amd64
|
||||
508 libbabeltrace1 amd64
|
||||
497 libssh-4 amd64
|
||||
493 debconf all
|
||||
467 libreadline8t64 amd64
|
||||
452 diffutils amd64
|
||||
426 libgssapi-krb5-2 amd64
|
||||
426 base-files amd64
|
||||
424 libnettle8t64 amd64
|
||||
424 htop amd64
|
||||
422 libncursesw6 amd64
|
||||
415 libssh2-1t64 amd64
|
||||
404 make amd64
|
||||
389 python3-pyasn1 all
|
||||
388 libexpat1 amd64
|
||||
386 ca-certificates all
|
||||
384 ncurses-base all
|
||||
379 liblzma5 amd64
|
||||
375 unzip amd64
|
||||
373 libgomp1 amd64
|
||||
367 libmount1 amd64
|
||||
362 libgomp1-riscv64-cross all
|
||||
358 libjq1 amd64
|
||||
357 bfs amd64
|
||||
355 ninja-build amd64
|
||||
351 libx32gomp1 amd64
|
||||
348 mount amd64
|
||||
346 lib32gomp1 amd64
|
||||
344 libcrypt-dev amd64
|
||||
344 grep amd64
|
||||
340 sed amd64
|
||||
337 libhogweed6t64 amd64
|
||||
337 gpgv amd64
|
||||
336 libncurses6 amd64
|
||||
328 cpio amd64
|
||||
315 libudev1 amd64
|
||||
311 libx32quadmath0 amd64
|
||||
309 less amd64
|
||||
307 libctf-nobfd0 amd64
|
||||
305 libsource-highlight-common all
|
||||
300 libquadmath0 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
|
||||
270 libpam-modules-bin amd64
|
||||
264 libuv1t64 amd64
|
||||
258 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
|
||||
230 librhash0 amd64
|
||||
228 dmidecode amd64
|
||||
226 libcrypt1 amd64
|
||||
224 libidn2-0 amd64
|
||||
224 debianutils amd64
|
||||
223 lib32gcc-s1 amd64
|
||||
218 patch amd64
|
||||
218 libluajit-5.1-common all
|
||||
215 patchutils amd64
|
||||
214 ucf all
|
||||
211 libmagic1t64 amd64
|
||||
209 libpam0g amd64
|
||||
207 libuchardet0 amd64
|
||||
206 proot amd64
|
||||
204 libelf1t64 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
|
||||
188 libx32gcc-s1 amd64
|
||||
187 libunwind8 amd64
|
||||
187 dash amd64
|
||||
185 libgpg-error0 amd64
|
||||
176 libcares2 amd64
|
||||
172 libnl-3-200 amd64
|
||||
171 libsmartcols1 amd64
|
||||
163 zlib1g amd64
|
||||
163 lzip amd64
|
||||
160 binutils amd64
|
||||
158 zlib1g i386
|
||||
157 lzop amd64
|
||||
157 liblzo2-2 amd64
|
||||
155 liblz4-1 amd64
|
||||
151 libaudit1 amd64
|
||||
150 python3-argcomplete all
|
||||
149 libmpc3 amd64
|
||||
149 libitm1-riscv64-cross all
|
||||
148 libsasl2-2 amd64
|
||||
148 libcc1-0 amd64
|
||||
143 libyaml-0-2 amd64
|
||||
143 libseccomp2 amd64
|
||||
137 librtmp1 amd64
|
||||
136 libhiredis1.1.0 amd64
|
||||
133 libkrb5support0 amd64
|
||||
133 libgcc-s1-riscv64-cross all
|
||||
131 libipt2 amd64
|
||||
130 init-system-helpers all
|
||||
130 bubblewrap amd64
|
||||
127 libsframe1 amd64
|
||||
127 libbsd0 amd64
|
||||
126 time amd64
|
||||
123 libtimedate-perl all
|
||||
122 libtasn1-6 amd64
|
||||
120 libpopt0 amd64
|
||||
115 libitm1 amd64
|
||||
115 libapparmor1 amd64
|
||||
113 gcc-13-riscv64-linux-gnu-base amd64
|
||||
113 gcc-13-base amd64
|
||||
112 jq amd64
|
||||
112 gcc-14-base i386
|
||||
112 gcc-14-base amd64
|
||||
111 python3-minimal amd64
|
||||
109 libx32itm1 amd64
|
||||
109 bzip2 amd64
|
||||
107 sysvinit-utils amd64
|
||||
107 libwrap0 amd64
|
||||
106 libc-dev-bin amd64
|
||||
106 gcc-13-cross-base all
|
||||
105 lib32itm1 amd64
|
||||
105 gcc-14-cross-base all
|
||||
103 libio-pty-perl amd64
|
||||
100 libassuan0 amd64
|
||||
99 libpsl5t64 amd64
|
||||
98 libmspack0t64 amd64
|
||||
98 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 cabextract amd64
|
||||
81 python3 amd64
|
||||
81 libbzip3-0 amd64
|
||||
79 libsensors5 amd64
|
||||
79 libmd0 amd64
|
||||
77 readline-common all
|
||||
77 python3-toml all
|
||||
75 libsasl2-modules-db amd64
|
||||
75 libasm1t64 amd64
|
||||
74 libacl1 amd64
|
||||
72 libffi8 amd64
|
||||
72 diffstat amd64
|
||||
70 libdebuginfod1t64 amd64
|
||||
69 yq all
|
||||
69 libss2 amd64
|
||||
69 liberror-perl all
|
||||
67 libpipeline1 amd64
|
||||
66 libhttp-parser2.9 amd64
|
||||
66 bzip3 amd64
|
||||
63 sensible-utils all
|
||||
63 libtermkey1 amd64
|
||||
63 file amd64
|
||||
61 ksh all
|
||||
60 python3-tomli all
|
||||
60 libcap-ng0 amd64
|
||||
60 libattr1 amd64
|
||||
57 libcom-err2 amd64
|
||||
53 libnl-genl-3-200 amd64
|
||||
51 logsave amd64
|
||||
51 libutempter0 amd64
|
||||
51 libdebuginfod-common all
|
||||
49 python3-xmltodict all
|
||||
49 libatomic1 amd64
|
||||
48 libmsgpackc2 amd64
|
||||
47 libx32atomic1 amd64
|
||||
47 libsigsegv2 amd64
|
||||
46 hostname amd64
|
||||
44 python3-zstd amd64
|
||||
42 libnpth0t64 amd64
|
||||
41 libxdmcp6 amd64
|
||||
41 libkeyutils1 amd64
|
||||
40 libatomic1-riscv64-cross all
|
||||
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
|
||||
31 python3-tomli-w all
|
||||
29 ubuntu-keyring all
|
||||
29 g++-13 amd64
|
||||
27 libpython3-stdlib amd64
|
||||
26 libsemanage-common all
|
||||
25 libsensors-config all
|
||||
25 gcc-x86-64-linux-gnu amd64
|
||||
25 gcc-riscv64-linux-gnu amd64
|
||||
20 cpp-x86-64-linux-gnu amd64
|
||||
20 cpp-riscv64-linux-gnu amd64
|
||||
17 lsb-release all
|
||||
17 libaudit-common all
|
||||
16 unminimize amd64
|
||||
13 g++ amd64
|
||||
11 g++-x86-64-linux-gnu amd64
|
||||
11 cpp-13 amd64
|
||||
8 p7zip all
|
||||
6 gcc-13-multilib amd64
|
||||
6 g++-13-multilib amd64
|
||||
0 libc6-riscv64-cross all
|
||||
0 libc6-dev-riscv64-cross all
|
||||
@@ -1,58 +0,0 @@
|
||||
FROM docker.io/library/ubuntu:22.04
|
||||
ENV UPX_CONTAINER_IMAGE_NAME=upx-stubtools-20221212-v4
|
||||
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 ca-certificates git less libmpc3 libncurses5 make \
|
||||
ncurses-term perl-base python2-minimal 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 bzip2 cmake curl elfutils fd-find file fzf g++ gdb gojq htop hyperfine \
|
||||
jq libzstd-dev lsb-release lzip lzop ninja-build p7zip patch patchelf pax-utils \
|
||||
ripgrep rsync screen universal-ctags unzip vim zip zlib1g-dev zsh zstd \
|
||||
# extra packages for compiling with "gcc -m32" and and "gcc -mx32":
|
||||
gcc-multilib g++-multilib \
|
||||
&& true
|
||||
|
||||
# manually install compat libs from Ubuntu 16.04; REQUIRED
|
||||
RUN cd /root \
|
||||
&& aria2c --checksum=sha-256=de22baf3dd851a10e16fbf66a243e70149ca46e06b2939fdc79429196cefc090 \
|
||||
'http://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 \
|
||||
&& for v in 3.92 3.93 3.94 3.95 3.96 4.0.0 4.0.1 4.0.2; 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 3.92 3.93 3.94 3.95 3.96 4.0.0 4.0.1 4.0.2; 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 user upx 2000:2000
|
||||
RUN useradd upx -U --uid 2000 --shell /bin/bash -m \
|
||||
&& mkdir -p /home/upx/.cache/zig /home/upx/.local/bin /home/upx/src/upx \
|
||||
&& ln -s /usr/local/bin/bin-upx-20221212 /home/upx/.local/bin/bin-upx \
|
||||
&& chown -R upx:upx /home/upx \
|
||||
&& true
|
||||
USER upx
|
||||
@@ -25,13 +25,13 @@ LC_ALL=C sort -z | xargs -0r perl -n -e '
|
||||
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 ($ARGV =~ m,\.patch$,) { }
|
||||
else { print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1); }
|
||||
}
|
||||
if (m,\t,) {
|
||||
if ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { }
|
||||
if ($ARGV =~ m,\.patch$,) { }
|
||||
elsif ($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); }
|
||||
|
||||
@@ -19,13 +19,13 @@ git ls-files --full-name -z | perl -0 -n -e '
|
||||
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 ($ARGV =~ m,\.patch$,) { }
|
||||
else { print "ERROR: trailing whitespace detected $ARGV: $_"; exit(1); }
|
||||
}
|
||||
if (m,\t,) {
|
||||
if ($ARGV =~ m,(^|/)(gnu|m)?make(file|vars),i) { }
|
||||
if ($ARGV =~ m,\.patch$,) { }
|
||||
elsif ($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); }
|
||||
|
||||
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_INSTALL_PREFIX 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
|
||||
@@ -2,11 +2,13 @@
|
||||
## 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
|
||||
@@ -27,6 +29,6 @@ fi
|
||||
# limit memory usage to 1 GiB (in case of clang-format problems with invalid files)
|
||||
ulimit -v 1048576 || true
|
||||
|
||||
#echo $UPX_CLANG_FORMAT
|
||||
#echo "$UPX_CLANG_FORMAT"
|
||||
exec "$UPX_CLANG_FORMAT" -style=file "$@"
|
||||
exit 1
|
||||
exit 99
|
||||
Executable
+184
@@ -0,0 +1,184 @@
|
||||
#! /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")
|
||||
#
|
||||
|
||||
# Debugging aid for locating failing commands. Depends on 'bash' shell.
|
||||
# (BASH_LINENO is relative to current FUNCTION only; non-function ==> 0)
|
||||
# Notice single-quoting of entire first argument.
|
||||
trap 'echo ERROR: pwd=\"$PWD\" file=\"$BASH_SOURCE\" line=${BASH_LINENO[0]} cmd=\"$BASH_COMMAND\"' ERR
|
||||
# Example: "false a b c" ==> ERROR: pwd="path/misc/testsuite" file="./mimic_ctest.sh" line=0 cmd="false a b c"
|
||||
|
||||
#***********************************************************************
|
||||
# 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
|
||||
"${run_upx[@]}" --version-short || true
|
||||
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 -j8" 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
|
||||
for small in normal small; do
|
||||
s="${method}-${level}"
|
||||
ss=
|
||||
if [[ $small == "small" ]]; then
|
||||
s="${method}-${level}-${small}"
|
||||
ss="--small"
|
||||
fi
|
||||
echo "========== $s =========="
|
||||
"${run_upx[@]}" -qq --${method} -${level} ${ss} --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
|
||||
: ${upx_run_packed_test_count:=20}
|
||||
for ((i = 0; i < $upx_run_packed_test_count; i++)); do
|
||||
"${emu[@]}" ./upx-packed-${s}${exe} --version-short
|
||||
done
|
||||
fi
|
||||
done
|
||||
done
|
||||
done
|
||||
fi
|
||||
|
||||
echo "run_upx='${run_upx[*]}'"
|
||||
echo "All done."
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#! /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")
|
||||
#
|
||||
|
||||
cat >catch-sigsegv.gdb <<'EOF'
|
||||
catch signal SIGSEGV
|
||||
commands
|
||||
x/i $pc
|
||||
info reg
|
||||
x/32i $pc-0x20
|
||||
quit 77
|
||||
end
|
||||
EOF
|
||||
|
||||
catcher=$(readlink -fn catch-sigsegv.gdb)
|
||||
|
||||
function emu_gdb() {
|
||||
gdb -q -x "$catcher" <<EOF --args "$@"
|
||||
run
|
||||
EOF
|
||||
}
|
||||
|
||||
if [[ -n $upx_exe_runner ]]; then
|
||||
true
|
||||
elif [[ -n $CMAKE_CROSSCOMPILING_EMULATOR ]]; then
|
||||
true
|
||||
else
|
||||
upx_exe_runner=emu_gdb
|
||||
: ${upx_run_packed_test_count:=20}
|
||||
fi
|
||||
|
||||
source "$argv0dir/mimic_ctest.sh"
|
||||
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="\
|
||||
836d9c5d9092421e49aeb573cde449ef740afbfea54d131ccbd88d8c7d87860d *amd64-linux.elf/upx-3.91
|
||||
9776a2d030719f9d74413d17c1bb732aaabb610b341031facd2c1a75348fc661 *amd64-linux.elf/upx-3.95
|
||||
822718cc0f6ac5e57bb23eeb65be6f3f7e73df8b062853abddcc924ec8207596 *amd64-win64.pe/upx-3.95.exe
|
||||
40353c37020fd4bb713c5d54273b8dc07666e262b83a4f0652ccb8a236465f9c *arm-linux.elf/upx-3.95
|
||||
1440d6b44968954baf56fbc2a0739a51873455876114d4445ae4b67cb5e7893b *arm-wince.pe/upx-3.91.exe
|
||||
35c08bf5086fe21ff19e3512359e54ac97c6d4513e6bb9ef4a59294bebf18f6a *arm64-linux.elf/upx-3.95
|
||||
0ca2dcd9e8b5c3f16dcb31e30b42ec57a70b8fe90281d412081095a3d7812f01 *armeb-linux.elf/upx-3.91
|
||||
462a72efbb580a2e90564412737bb3c1db1d930cde5b4f2c94782df91c8e4f4b *armeb-linux.elf/upx-3.95
|
||||
a7ee051c5f9dcf233e2ee248274121b99fb8f098eff95469bc0638a7423723f0 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
85cf31be166cb59587a99419cdd0fc5a79825d7508ab2c9a4bc0d700d603354d *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
fc7656d9a877967be7e339bfc98a0c63ea7b5abc30b96fa9e5931c75ecbe9827 *i386-linux.elf/upx-3.91
|
||||
d454a7639e96b986ad422b02045ecfefa3b9405901eaa32d92a2c489292b9600 *i386-linux.elf/upx-3.95
|
||||
934dd17076c0298d35a738533ea668e1fcbf8fc85c6671fcdd3a12e7722502ce *i386-win32.pe/upx-3.91.exe
|
||||
519a9f6b3de56f5f080151074b9d5d81e31c1961cd6e395f73d2d522b7f7f8e0 *i386-win32.pe/upx-3.95.exe
|
||||
a7bd9f616231d883f6700b09e3c9a0af2880c6b5e5b0ce1cd8f06de43c48856c *m68k-atari.tos/upx-3.91.ttp
|
||||
7a0479691e51ea4a8a0246a1f0ffa9694ee2f0e0cf3aa43dc0f1324c4d427ba3 *mips-linux.elf/upx-3.95
|
||||
f60bab42fe3914109ab1b9f5d00a5be753cd0a2c1a79a3998d58800efedbfff7 *mipsel-linux.elf/upx-3.91
|
||||
b6d8cc9e2023a3fc415166afc378ccf2eb505487df84c8d959ec74b3fb4f8256 *mipsel-linux.elf/upx-3.95
|
||||
acd3dc5ed3e4c4eeaa42e7cca71a79d687dd844ce5f384666ed6e78327b5a8e3 *powerpc-linux.elf/upx-3.91
|
||||
03600584c97fa466ef58239452baf9ec6ff2f06b79d97d45c8490953080de6e3 *powerpc-linux.elf/upx-3.95
|
||||
3f02885d1e94e59062eb78c4c910cde042475a6cadb77a85a603de747a50f45c *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t120_compress_ucl_nrv2d_3_no_filter="\
|
||||
8431343adec632690cec669038c246438c799e7dc1b8bc85586e0d2bcd2eebad *amd64-linux.elf/upx-3.91
|
||||
1852bded40be6eb5ddb07a491476dcfcca69cadda45a5f128aa8f967d567fa0b *amd64-linux.elf/upx-3.95
|
||||
5ab022e2c3ecb09931e2181fb5f7699f35e2b453b54c823e42653c84b0df5f2c *amd64-win64.pe/upx-3.95.exe
|
||||
6de0cf1903760710a95cb5330d0ffb406a93f081dbe6806935f51b0c75e23f03 *arm-linux.elf/upx-3.95
|
||||
53121baf42c85991900aa3947f3d817fe6e894bc6f325ab1d576de6fba5fbcbf *arm-wince.pe/upx-3.91.exe
|
||||
3c9e49445280de6a771e77f6a88b3c3957815baa193e92a893d5defe6699f50a *arm64-linux.elf/upx-3.95
|
||||
627a3c77adfcd4ef8c32f1638a6b99e20e79bb914cbcebed6fb9ad5f96936530 *armeb-linux.elf/upx-3.91
|
||||
7faf9f0adf508cf29bf0ac2a62234df06d6c9153d6d59cf61019361db906daf8 *armeb-linux.elf/upx-3.95
|
||||
51e4faea51e12c7442b27bb50150f532ac51d8102f77a669cbce82f2675a2ef2 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
1196f578ab0b862bae8ac6b5166b770f072cf0ac521a2a23a6347c19ea82a0da *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
3015651261f28fb43ed43a8c1fa257bcfcdc788e6fd3f436f3de23733736c724 *i386-linux.elf/upx-3.91
|
||||
8cca96ea354af889f5e9d3074b2c7005f982463a3f22e1cca2bc01aed9232de1 *i386-linux.elf/upx-3.95
|
||||
3edf364443a3cd56efd04e95cc7d7c1846bf76addedd7263cfe8330771f19509 *i386-win32.pe/upx-3.91.exe
|
||||
48141fd66443f85ea867d7fa0bb3a50debb10f15bdb26c71888026e17c88d3a8 *i386-win32.pe/upx-3.95.exe
|
||||
07e1c09a953a9c87afa33d1236f46244280161bf3802273a523d380318886177 *m68k-atari.tos/upx-3.91.ttp
|
||||
39b3a5c780d9354714d5e2ed69068511422f8faf9ab660706adc8ad5ecdf3598 *mips-linux.elf/upx-3.95
|
||||
123ce137e4cd555470fcf9fe67df75179b6f337fee66d075ddc06f9848817a37 *mipsel-linux.elf/upx-3.91
|
||||
b78d8cd3a3402fed266c737cc34a32cc21b2b67b573e9e9071d4faf9fca89b89 *mipsel-linux.elf/upx-3.95
|
||||
ea9cae1d1701db3a0c53e9a651766db5bdc30032f48913a4a9e99f193a800acc *powerpc-linux.elf/upx-3.91
|
||||
aea86bf87870a1e48a454ac1ea9a80d90d8abe5113d418a71d8a9c4a74bb2d0a *powerpc-linux.elf/upx-3.95
|
||||
62038c87489dc5cd3772e8e4051cf1d416edecf267d37f390a649f4ae657e0f9 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t130_compress_ucl_nrv2e_3_no_filter="\
|
||||
f817034e8b7765d8b422dac9cb6f24f78ce5bfd7169cd3b33e8224e00b131eca *amd64-linux.elf/upx-3.91
|
||||
d21441a05514c085c10e99b00d8cc4d45484297a8e4e8a246364ca4347d0ed56 *amd64-linux.elf/upx-3.95
|
||||
7bd7cd37093200fa94d21dd7fdfef4d7fb9c3049fbf5f408f1f242cb8d9c6a55 *amd64-win64.pe/upx-3.95.exe
|
||||
d328a89b333d0b36e96d0c61375bf686e8f3b73a188dd4d0df4d78e30af08632 *arm-linux.elf/upx-3.95
|
||||
ad0a7a18e87657d28260b7c527d284863becd3c5f92259c570125465f88d4042 *arm-wince.pe/upx-3.91.exe
|
||||
0b700f0f7dde3118694155e876e6c2003ef701fe94856d6562936ec081278747 *arm64-linux.elf/upx-3.95
|
||||
53a1d04fa62e25e64e6f792b079e21b4c42676a73503ae6d9e67ae16c98e6d04 *armeb-linux.elf/upx-3.91
|
||||
33ed1e3b84836d2af52295ba0b90343ac0b8d524539ce3b8d0aa9f19a51d70dd *armeb-linux.elf/upx-3.95
|
||||
6fcdc8e34ce8b3501db2260c8a921c6e963954fdeffedfefca353a27bcc02d56 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
6f4f901c1838252f9b3104060475a6f13a2ebec830096ff28d870148580e4287 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
8127f8380300508e8062e9391e321abd0429a6a31fec41e769cc7fe80af27e27 *i386-linux.elf/upx-3.91
|
||||
b0a7e6b822f038b7940a54ea160b045d2241e3dfa15a5081a23fbc4d42fb6773 *i386-linux.elf/upx-3.95
|
||||
c78db15a8113b806e56812fd842fb467d2a9c9557fcdc0467dae3f4c33316630 *i386-win32.pe/upx-3.91.exe
|
||||
89314e8621c4a00e1a65e045686245d3c1e2ba0a858f1dcc8f3cc2d0eedccfb5 *i386-win32.pe/upx-3.95.exe
|
||||
710ad88b63cc7e0fa0b413ebdbcebf41140678f551b5dd883ed6220507be3601 *m68k-atari.tos/upx-3.91.ttp
|
||||
c7e3478872650b7f4f8ccb4a0649944e62f44f5a9249cb9425210333e1f2fdf4 *mips-linux.elf/upx-3.95
|
||||
cd9b3d3780a79cb416b261d622e8e86f2369fa8bb9bc49b529c50cac2980d528 *mipsel-linux.elf/upx-3.91
|
||||
5baf7db9e4335c0227106262efc9d18ad23b88c6d6bb636656aea67bb063b6ec *mipsel-linux.elf/upx-3.95
|
||||
aba8bd826ee52d533f9e1c4270d4f4194fe8d8747ea10a1d3ce59b6443f1a9f2 *powerpc-linux.elf/upx-3.91
|
||||
6f737ccbf8c830476bed9c4dd33dd7757ea25bf2f8fb03b44d03e9b77ada0f1b *powerpc-linux.elf/upx-3.95
|
||||
d313dd128a54189b9551a529b1ed21b222aa0394a30f9ba552cde96edcd4011e *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t140_compress_lzma_2_no_filter="\
|
||||
fefac6fbd1e95479eb4066519f9bd801a30c29966685840b6a011e2911b984ca *amd64-linux.elf/upx-3.91
|
||||
64487a0e0aade092a8ff7e6d8d9528ca550540cac8d432005ba610179782d042 *amd64-linux.elf/upx-3.95
|
||||
a55ec5a7f2911f6da8b9336daf4f1051e753cfb7a4458c7f7baa6b63340c6daf *amd64-win64.pe/upx-3.95.exe
|
||||
9f405739b904bb85053b75187c9175e4ac7f66a07ac5e320eaa4e9771e1ec79e *arm-linux.elf/upx-3.95
|
||||
7a6c603eecf214e5d6742f1fce922223c97c8bd2527678a968640dd6c1bc0d71 *arm-wince.pe/upx-3.91.exe
|
||||
c8435e2f82ba72a0b6abad4146539d40d495461c5e480af705b2bbd21d192128 *arm64-linux.elf/upx-3.95
|
||||
21fc48eaaedc73fe9239159fb864c6149f729ef1661a8407b88ad9c9a19f9a54 *armeb-linux.elf/upx-3.91
|
||||
742db587dc53f616c7b276a930c3f586da2b7c3ce6ccd523c041e88a9671b99b *armeb-linux.elf/upx-3.95
|
||||
7a8eaa5139b95cc56591200fce62d3c9af163671467952cab6fcf487318107bb *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
9b5fc0f54a5f811bda190c36fb2fa5c5b03c6c3de0c62693e4191230b5a419b8 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
68b4ce63cb0bd7dd5b287e1f9fa5d9bc234ac36359ce3ebff863984c503a698e *i386-linux.elf/upx-3.91
|
||||
aa75cf22f0b59cc796de678198432a3dc2d40ab871e4989dd97ff1a6c148f294 *i386-linux.elf/upx-3.95
|
||||
0e0780f5fccc52f6c78414f7279263b26e31de7c6ca1ec65a240e37cf0a4f5c9 *i386-win32.pe/upx-3.91.exe
|
||||
3ddd6265d69e374f5f0f8c9f602e0e59c895da2f3fef611ef89f0ee4ae2c592b *i386-win32.pe/upx-3.95.exe
|
||||
e268c98fdacfd04268d76644f2bb4746ae04b57801407aaa1867798840eeeea0 *m68k-atari.tos/upx-3.91.ttp
|
||||
499e1d1486810cfa5b6662e30189183979e25f45d35654d8cd60fd793d0c07d8 *mips-linux.elf/upx-3.95
|
||||
4a30189ad7312eafb2d47e1b526ec22eaf614a895f8dce96f3e1c7385438f44c *mipsel-linux.elf/upx-3.91
|
||||
339d38602413d97d9bba113f39884815af10ebcdccf37e3f5e8d0879f262a048 *mipsel-linux.elf/upx-3.95
|
||||
6d4f9d4383ebc9d8411d06a7c219dcf3e8513ea8c989f2d31ab382602f873ba5 *powerpc-linux.elf/upx-3.91
|
||||
5dd727d8d5a35cc0ab86d629285d8ff450f52b538118679edaa886ce9c1fed7d *powerpc-linux.elf/upx-3.95
|
||||
efec1e5bbb9bcf11dbc7081adfc2020de18fae326ad86194551c44fba0d2148d *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t150_compress_ucl_2_all_filters="\
|
||||
05b29bde32af1e63e837e2be499567c4b10d7e692c88082f24e3417e0c7b9f40 *amd64-linux.elf/upx-3.91
|
||||
65c142ee01af09fa8741932c1f21d466be971aad059cc5afddbb7ecdf142c1bb *amd64-linux.elf/upx-3.95
|
||||
cbb5c90bd9195bd9e3acd931312a70deeccfab5540f398ceda8826f8d6b332bf *amd64-win64.pe/upx-3.95.exe
|
||||
1ea1bb18c0ac85c07450f0a6704b84e58a1322556757e2943340ef381b2ce675 *arm-linux.elf/upx-3.95
|
||||
76a5f0518fc797bd3f132ce6eb61ca187b5d463f191417883a73d4584716c23a *arm-wince.pe/upx-3.91.exe
|
||||
4df30002376a4f18029ea9dd8260d395bec3a3fa11fbc5aa19859c2f0efdc2e6 *arm64-linux.elf/upx-3.95
|
||||
ba03fd4889210435c9673f2dcbd2269162037090eccc79cf7d2b896e64a57e2e *armeb-linux.elf/upx-3.91
|
||||
681f32d01c76ff31776b8d6f1556daa38eee297f675aa40ff1bb2e47e12adf15 *armeb-linux.elf/upx-3.95
|
||||
aa05c3a2953f0f2d70842cba45786b707a79ffef22fd084f51e304762cc67765 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
c677241e9a8753ba1332ac3875ab6398fb2d792d2627edd9e58f2535b3131abe *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
7bcd42f58dcc8ddb6cb1a4e33d56b584fe6d49b002b01a0859571d1324dd593a *i386-linux.elf/upx-3.91
|
||||
b6fe6220c0b3f4df131da3aaae566810f2aa1f13b63d23de3ead9174d08d82e1 *i386-linux.elf/upx-3.95
|
||||
8ec02f816f4727b519e8775edc1afb1df32991319a6c6f050ece416011925379 *i386-win32.pe/upx-3.91.exe
|
||||
d5aeeedada49c0c2870ea450ed66b2cea31369bccfccf9407378ae0fb0736deb *i386-win32.pe/upx-3.95.exe
|
||||
e414ad0aba43790d0498b26c23055fb051129b6cbe3e070a1406c91ac5b8032b *m68k-atari.tos/upx-3.91.ttp
|
||||
c5107a84d32de820c81401259a7dd23435ea625588d56c6c75ad6fa14b0dbf8b *mips-linux.elf/upx-3.95
|
||||
78473f7d7ddf56812b8dee087ca62517ecdbd10fa14972ba6670338fc19061d1 *mipsel-linux.elf/upx-3.91
|
||||
fd9ea397a29b41a2143f9e02217e181d0075d7ad7d87bdbadc7fc94bfb1b0d76 *mipsel-linux.elf/upx-3.95
|
||||
c47d1299f6ecf86e62528fc54979117b2b2ddbb6c80f553689402399fc7eab28 *powerpc-linux.elf/upx-3.91
|
||||
77c3b4ba6909a4e20180bc13775e280086d67240519c323c2005f3fcee6e0b78 *powerpc-linux.elf/upx-3.95
|
||||
e3ce51b863905a4831958c72541b04e9f893f0d9827f32e615822db7aebd56bc *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t160_compress_all_methods_1_no_filter="\
|
||||
94c91b97fcce7402a4494b22699b2450e8e4e2a9f4ddd66e1133c76ce198c167 *amd64-linux.elf/upx-3.91
|
||||
5b3e85adb37919d051c6eaff205b8e1d77a2dfde0d8e7dcdee7c22f8fd5dc8c7 *amd64-linux.elf/upx-3.95
|
||||
5a0ecb45658904bcd0b823b77dba039c9814e2eff4ed429784c36b7074b9858c *amd64-win64.pe/upx-3.95.exe
|
||||
de93a219ca3c4ea84bd9c1b5fb37ff4aaa0a08ea6eac18da6d7a5865e4dad19c *arm-linux.elf/upx-3.95
|
||||
fdbe0395ac401285edb9c2f9bfbb0fbd3c0eaad5052a88d8369b1a66b35a8a3e *arm-wince.pe/upx-3.91.exe
|
||||
acdb7ff90d7c6f403872ec333e2987ee74e99d6e1390863b321b528d312c1084 *arm64-linux.elf/upx-3.95
|
||||
54860e61da36414dc105aafcdbb86c79b745913a7d0da911fa58a6941f111e2d *armeb-linux.elf/upx-3.91
|
||||
7c36b75cc8a0712515e12a9e565df4ca43bff6cc0077afb282d367fcc2ee2acd *armeb-linux.elf/upx-3.95
|
||||
0a0099246096d20ff6035a4df6566954b9d8aff9ed8fdbd35aa5ee4995b02bfe *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
5df7aa9f0896df87eb8798119ad16a9b89c87a7568a67339e33b5baa99ec361f *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
53e5aae9bc70f58e3dc2aef5a94f66df2517d547670e72ee2b3189b7da809f41 *i386-linux.elf/upx-3.91
|
||||
adaa1e2f46f7a235ab838b15aa7e820057e5ed7011d9d07c67dc770a88e3dd62 *i386-linux.elf/upx-3.95
|
||||
f3d33c5c9809943a902133490bcf0cfbe39a5ef1635a0c29b3bdc4f35dfffa50 *i386-win32.pe/upx-3.91.exe
|
||||
474e68a2390cf0376f59402eaef4c902daa49428b628e025b1c8506428a37937 *i386-win32.pe/upx-3.95.exe
|
||||
1561dd69f67e8705804dba41ebd876bce6a4ce8ed8b0bc0d0e7628697e7fee68 *m68k-atari.tos/upx-3.91.ttp
|
||||
74f7f69b4a8b2b7c428fa55e3970ee767c1947f19ed1b0644870ecb6b3cb713d *mips-linux.elf/upx-3.95
|
||||
12a42365234c001a52586b74a9597dc7d65184ddf1ee1d40734823a3443cd92a *mipsel-linux.elf/upx-3.91
|
||||
68f674d081d87e86e54f0051eee9e2bc85b566051992774ab28ff3173cbcb75a *mipsel-linux.elf/upx-3.95
|
||||
f569d8f49d7110bb8b262a48055b39d889e9977c40c5f1b21e74f8cbf93b27ae *powerpc-linux.elf/upx-3.91
|
||||
d8227a8a88c083760889acaf259e7da59eab75a23e341289bc8e3c60563ae344 *powerpc-linux.elf/upx-3.95
|
||||
e4b58ed65025b765953af02e80be9a171c49b6c707c835949b1c888fdbe8bba0 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
expected_sha256sums__t170_compress_all_methods_no_lzma_5_no_filter="\
|
||||
52a39c30b60abb82c1ec2826297eb46abdc29b5dd55d7a7a41dd2fc1c573f60a *amd64-linux.elf/upx-3.91
|
||||
f0c728c42e8775767e0d963e1eef7ca78711f3f6dd180df980a1faef926d7cac *amd64-linux.elf/upx-3.95
|
||||
e07e9babdeb12fddeebbfa1b0293163cc5e63017d6f0933d02587c8da1e90a82 *amd64-win64.pe/upx-3.95.exe
|
||||
f0359efa2247e9ea756f54c85e7518d61f3b293e08f566c3812c64c7d5f0db0f *arm-linux.elf/upx-3.95
|
||||
8d1706ab02013b536c3a4cec20d40a96591ffa45fdcb464ccd3f038567006d79 *arm-wince.pe/upx-3.91.exe
|
||||
14932490ff17e27bb5bedde576b8683892c4720f4a0058f373aab9f8894fda09 *arm64-linux.elf/upx-3.95
|
||||
64a73512e40c2fb49d8ae3a1d496b379c97b8724cf8ca4461a85825ff04366a0 *armeb-linux.elf/upx-3.91
|
||||
078e7cd073ba071f17ad4292e2211b7d635f57e974546e7f156cc87f9aa716e2 *armeb-linux.elf/upx-3.95
|
||||
dda2c348c43741a1bd65049a8e7b51be1ebf873d215370ec002185c85390c168 *i386-dos32.djgpp2.coff/upx-3.91.exe
|
||||
560392427ded22f2f3fea59ef10e55d65cf841001e67b1e4558ef13514baa602 *i386-dos32.djgpp2.coff/upx-3.95.exe
|
||||
f3f8feceebe8536633554b204df68c2e94e1d1a313fe7a576b7f5d404c916083 *i386-linux.elf/upx-3.91
|
||||
e7f98419e346670f72d66ac25f3d6ad53201e768819980eecae24d801366be27 *i386-linux.elf/upx-3.95
|
||||
3510bc5627237752bedd275e73c42bc02cd46145ff916e7bccbdec663f763ee4 *i386-win32.pe/upx-3.91.exe
|
||||
ad47c7522167f6f7e47d495e1fa119431386ca5ea9bc16b6a4b9cb38cf9cd29f *i386-win32.pe/upx-3.95.exe
|
||||
1c999e5c6cded8c99a7f6b4595879893ae63d2af1388dc61dd8b4e3106676480 *m68k-atari.tos/upx-3.91.ttp
|
||||
55a098c2cdce1917b76ce0845f434fc23b0bd30b34e884b19401c51c8c7f4756 *mips-linux.elf/upx-3.95
|
||||
4b6487d412f43acb8e41951a2135e56025139a9ad3e57102749df4d4bef934fa *mipsel-linux.elf/upx-3.91
|
||||
1dcd626fc4566c608e987fd6999b695793c5cae7f78872e3d1a9a23942fea188 *mipsel-linux.elf/upx-3.95
|
||||
2047a4a880322bf41e8afbb4787f6103364de4a299b543808251a4144c4d990b *powerpc-linux.elf/upx-3.91
|
||||
63679bd238f30bfb14853246eb257536471fea10f942b2adfdd43cbef21dea30 *powerpc-linux.elf/upx-3.95
|
||||
c75d1548db879ed589b55bc1319869b49d37595f4560a64b34016951dc02f997 *powerpc64le-linux.elf/upx-3.95
|
||||
"
|
||||
########## end .sha256sums.recreate
|
||||
Executable
+336
@@ -0,0 +1,336 @@
|
||||
#! /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 flags="--disable-random-id --fake-stub-version=5.01 --fake-stub-year=2025"
|
||||
local ec=0
|
||||
if [[ $UPX_TESTSUITE_VERBOSE == 1 ]]; then
|
||||
echo "LOG: '${run_upx[*]}' $*"
|
||||
fi
|
||||
"${run_upx[@]}" $flags "$@" || 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,47 @@
|
||||
#
|
||||
# valgrind suppressions for musl libc
|
||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
#
|
||||
|
||||
# musl malloc
|
||||
{
|
||||
musl-malloc-enframe
|
||||
Memcheck:Cond
|
||||
fun:enframe
|
||||
}
|
||||
{
|
||||
musl-malloc-get_nominal_size
|
||||
Memcheck:Cond
|
||||
fun:get_nominal_size
|
||||
fun:__libc_free
|
||||
}
|
||||
|
||||
# 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
|
||||
}
|
||||
+67
-65
@@ -1,49 +1,44 @@
|
||||
#
|
||||
# UPX Makefile - needs GNU make
|
||||
# UPX src Makefile - needs GNU make and CMake >= 3.13
|
||||
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
#
|
||||
|
||||
# IMPORTANT NOTE: this Makefile is deprecated - please
|
||||
# directly use the CMake build instead!
|
||||
|
||||
MAKEFLAGS += -r
|
||||
.SUFFIXES:
|
||||
export SHELL = /bin/sh
|
||||
# NOTE: this Makefile is intended for developers - please use
|
||||
# the top-level Makefile instead
|
||||
|
||||
ifndef srcdir
|
||||
srcdir := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
srcdir := $(shell echo '$(srcdir)' | sed 's,/*$$,,' || echo 'ERROR')
|
||||
srcdir := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
|
||||
endif
|
||||
ifndef top_srcdir
|
||||
top_srcdir := $(srcdir)/..
|
||||
endif
|
||||
|
||||
#
|
||||
# redirect to top-level CMake build
|
||||
#
|
||||
#***********************************************************************
|
||||
# redirect to top-level Makefile
|
||||
#***********************************************************************
|
||||
|
||||
.DEFAULT_GOAL = build/debug
|
||||
|
||||
build/debug: $(top_srcdir)/build/debug/upx
|
||||
build/release: $(top_srcdir)/build/release/upx
|
||||
# shortcuts
|
||||
all: build/debug build/release
|
||||
debug: build/debug
|
||||
release: build/release
|
||||
|
||||
$(top_srcdir)/build/debug/upx: PHONY
|
||||
$(MAKE) -C $(top_srcdir) build/debug
|
||||
$(top_srcdir)/build/release/upx: PHONY
|
||||
$(MAKE) -C $(top_srcdir) build/release
|
||||
# NOTE that the top-level Makefile .DEFAULT_GOAL is build/release
|
||||
.DEFAULT_GOAL = build/all
|
||||
|
||||
.NOTPARALLEL: # because the actual builds use "cmake --parallel"
|
||||
.PHONY: PHONY
|
||||
.NOTPARALLEL:
|
||||
.SECONDEXPANSION:
|
||||
.SUFFIXES:
|
||||
|
||||
#
|
||||
# "make run-testsuite"
|
||||
#
|
||||
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)" $@
|
||||
|
||||
# search for the UPX testsuite -- git clone https://github.com/upx/upx-testsuite.git
|
||||
# you also can override upx_testsuite_SRCDIR
|
||||
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"
|
||||
ifndef upx_testsuite_SRCDIR
|
||||
# search standard locations below $(top_srcdir)
|
||||
ifneq ($(wildcard $(top_srcdir)/../upx--upx-testsuite.git/files/packed/.),)
|
||||
@@ -56,51 +51,58 @@ endif
|
||||
endif
|
||||
|
||||
# run the UPX testsuite
|
||||
# The expected (old) checksums are in $(top_srcdir)/.github/travis_testsuite_1-expected_sha256sums.sh
|
||||
# The actual (new) checksums are in ./tmp-testsuite/testsuite_1/.sha256sums.recreate
|
||||
# The expected (old) checksums are in $(top_srcdir)/misc/testsuite/upx_testsuite_1-expected_sha256sums.sh
|
||||
# The actual (new) checksums are in ./tmp-upx-testsuite-*/testsuite_1/.sha256sums.recreate
|
||||
ifneq ($(wildcard $(upx_testsuite_SRCDIR)/files/packed/.),)
|
||||
ifneq ($(wildcard $(top_srcdir)/.github/travis_testsuite_1.sh),)
|
||||
run-testsuite: run-testsuite-release
|
||||
ifneq ($(wildcard $(top_srcdir)/misc/testsuite/upx_testsuite_1.sh),)
|
||||
run-testsuite: run-testsuite-release PHONY
|
||||
run-testsuite-all: run-testsuite-debug run-testsuite-release PHONY
|
||||
run-testsuite-%: export upx_testsuite_SRCDIR := $(upx_testsuite_SRCDIR)
|
||||
run-testsuite-%: export upx_testsuite_BUILDDIR := ./tmp-testsuite
|
||||
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: PHONY $(top_srcdir)/build/debug/upx
|
||||
time -p bash $(top_srcdir)/.github/travis_testsuite_1.sh
|
||||
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: PHONY $(top_srcdir)/build/release/upx
|
||||
time -p bash $(top_srcdir)/.github/travis_testsuite_1.sh
|
||||
run-testsuite-release: build/release PHONY
|
||||
time -p bash "$(top_srcdir)/misc/testsuite/upx_testsuite_1.sh"
|
||||
endif
|
||||
endif
|
||||
|
||||
#
|
||||
# "make clang-format"
|
||||
#
|
||||
#***********************************************************************
|
||||
# make check-whitespace
|
||||
#***********************************************************************
|
||||
|
||||
# automatically format some C++ source code files
|
||||
ifeq ($(shell uname),Linux)
|
||||
# Markus loves clang-format, but John hates it; find a compromise
|
||||
CLANG_FORMAT_EXCLUDE_FILES += conf.h miniacc.h version.h help.cpp
|
||||
CLANG_FORMAT_EXCLUDE_FILES += p_elf.h p_elf_enum.h p_lx_% p_mach% p_unix% p_vmli%
|
||||
CLANG_FORMAT_EXCLUDE_FILES += packer_c.cpp packer_f.cpp
|
||||
CLANG_FORMAT_EXCLUDE_FILES += compress/compress.h filter/filter_impl.cpp
|
||||
CLANG_FORMAT_FILES := $(sort $(wildcard *.[ch]* ../maint/src/*.[ch]* [cu]*/*.[ch]*))
|
||||
CLANG_FORMAT_FILES := $(filter-out $(CLANG_FORMAT_EXCLUDE_FILES),$(CLANG_FORMAT_FILES))
|
||||
clang-format: PHONY $(CLANG_FORMAT_FILES)
|
||||
@echo "running upx-clang-format"
|
||||
@$(top_srcdir)/misc/scripts/upx-clang-format -i $(CLANG_FORMAT_FILES)
|
||||
endif
|
||||
ifneq ($(wildcard /usr/bin/env),) # need Unix utils like bash, perl, sed, xargs, etc.
|
||||
|
||||
#
|
||||
# "make check-whitespace"
|
||||
#
|
||||
|
||||
CHECK_WHITESPACE =
|
||||
ifeq ($(shell uname),Linux)
|
||||
CHECK_WHITESPACE = $(top_srcdir)/misc/scripts/check_whitespace.sh $(top_srcdir)
|
||||
CHECK_WHITESPACE = bash "$(top_srcdir)/misc/scripts/check_whitespace.sh" "$(top_srcdir)"
|
||||
ifneq ($(wildcard $(top_srcdir)/.git/.),)
|
||||
CHECK_WHITESPACE = $(top_srcdir)/misc/scripts/check_whitespace_git.sh $(top_srcdir)
|
||||
CHECK_WHITESPACE = bash "$(top_srcdir)/misc/scripts/check_whitespace_git.sh" "$(top_srcdir)"
|
||||
endif
|
||||
check-whitespace: PHONY; $(CHECK_WHITESPACE)
|
||||
endif
|
||||
|
||||
endif # /usr/bin/env
|
||||
|
||||
#***********************************************************************
|
||||
# make clang-format
|
||||
#***********************************************************************
|
||||
|
||||
# automatically format most C++ source code files
|
||||
ifneq ($(wildcard /usr/bin/env),)
|
||||
ifeq ($(shell uname),Linux)
|
||||
|
||||
# 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:
|
||||
|
||||
+704
-246
File diff suppressed because it is too large
Load Diff
+36
-57
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -25,9 +25,7 @@
|
||||
<markus@oberhumer.com> <ezerotven+github@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef UPX_BELE_H__
|
||||
#error "this is an internal include file"
|
||||
#endif
|
||||
// this is an internal include file private to bele.h
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
@@ -35,22 +33,24 @@
|
||||
|
||||
#if defined(BELE_CTP)
|
||||
// CTP - Compile-Time Polymorphism (templates)
|
||||
#define V static inline
|
||||
#define V static inline bele_constexpr
|
||||
#define VV static forceinline_constexpr
|
||||
#define S static int __acc_cdecl_qsort
|
||||
#define C /*empty*/
|
||||
#define C noexcept
|
||||
#elif defined(BELE_RTP)
|
||||
// RTP - Run-Time Polymorphism (virtual functions)
|
||||
#define V virtual
|
||||
#define VV virtual
|
||||
#define S virtual int
|
||||
#define C const
|
||||
#define C const noexcept
|
||||
#else
|
||||
#error
|
||||
#endif
|
||||
|
||||
#if defined(BELE_RTP)
|
||||
struct AbstractPolicy {
|
||||
inline AbstractPolicy() {}
|
||||
virtual inline ~AbstractPolicy() {}
|
||||
explicit inline AbstractPolicy() noexcept = default;
|
||||
virtual inline ~AbstractPolicy() noexcept {}
|
||||
V bool isBE() C = 0;
|
||||
V bool isLE() C = 0;
|
||||
|
||||
@@ -80,33 +80,31 @@ struct AbstractPolicy {
|
||||
S u64_compare_signed(const void *a, const void *b) C = 0;
|
||||
|
||||
private:
|
||||
// disable copy, assignment and move assignment
|
||||
AbstractPolicy(const AbstractPolicy &) = delete;
|
||||
AbstractPolicy &operator=(const AbstractPolicy &) = delete;
|
||||
AbstractPolicy &operator=(AbstractPolicy &&) = delete;
|
||||
// disable copy and move
|
||||
UPX_CXX_DISABLE_COPY_MOVE(AbstractPolicy)
|
||||
// disable dynamic allocation
|
||||
ACC_CXX_DISABLE_NEW_DELETE
|
||||
UPX_CXX_DISABLE_NEW_DELETE(AbstractPolicy)
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(BELE_RTP)
|
||||
#undef C
|
||||
#define C const override
|
||||
#define C const noexcept override
|
||||
#endif
|
||||
|
||||
struct BEPolicy
|
||||
struct BEPolicy final
|
||||
#if defined(BELE_RTP)
|
||||
final : public AbstractPolicy
|
||||
: public AbstractPolicy
|
||||
#endif
|
||||
{
|
||||
inline BEPolicy() {}
|
||||
explicit inline BEPolicy() noexcept = default;
|
||||
#if defined(BELE_CTP)
|
||||
typedef N_BELE_RTP::BEPolicy RTP_Policy;
|
||||
#elif defined(BELE_RTP)
|
||||
typedef N_BELE_CTP::BEPolicy CTP_Policy;
|
||||
#endif
|
||||
V bool isBE() C { return true; }
|
||||
V bool isLE() C { return false; }
|
||||
VV bool isBE() C { return true; }
|
||||
VV bool isLE() C { return false; }
|
||||
|
||||
typedef BE16 U16;
|
||||
typedef BE32 U32;
|
||||
@@ -137,7 +135,7 @@ struct BEPolicy
|
||||
S u32_compare_signed(const void *a, const void *b) C { return be32_compare_signed(a, b); }
|
||||
S u64_compare_signed(const void *a, const void *b) C { return be64_compare_signed(a, b); }
|
||||
|
||||
static void compileTimeAssertions() {
|
||||
static void compileTimeAssertions() noexcept {
|
||||
COMPILE_TIME_ASSERT(sizeof(U16) == 2)
|
||||
COMPILE_TIME_ASSERT(sizeof(U32) == 4)
|
||||
COMPILE_TIME_ASSERT(sizeof(U64) == 8)
|
||||
@@ -147,27 +145,25 @@ struct BEPolicy
|
||||
}
|
||||
|
||||
private:
|
||||
// disable copy, assignment and move assignment
|
||||
BEPolicy(const BEPolicy &) = delete;
|
||||
BEPolicy &operator=(const BEPolicy &) = delete;
|
||||
BEPolicy &operator=(BEPolicy &&) = delete;
|
||||
// disable copy and move
|
||||
UPX_CXX_DISABLE_COPY_MOVE(BEPolicy)
|
||||
// disable dynamic allocation
|
||||
ACC_CXX_DISABLE_NEW_DELETE
|
||||
UPX_CXX_DISABLE_NEW_DELETE(BEPolicy)
|
||||
};
|
||||
|
||||
struct LEPolicy
|
||||
struct LEPolicy final
|
||||
#if defined(BELE_RTP)
|
||||
final : public AbstractPolicy
|
||||
: public AbstractPolicy
|
||||
#endif
|
||||
{
|
||||
inline LEPolicy() {}
|
||||
explicit inline LEPolicy() noexcept = default;
|
||||
#if defined(BELE_CTP)
|
||||
typedef N_BELE_RTP::LEPolicy RTP_Policy;
|
||||
#elif defined(BELE_RTP)
|
||||
typedef N_BELE_CTP::LEPolicy CTP_Policy;
|
||||
#endif
|
||||
V bool isBE() C { return false; }
|
||||
V bool isLE() C { return true; }
|
||||
VV bool isBE() C { return false; }
|
||||
VV bool isLE() C { return true; }
|
||||
|
||||
typedef LE16 U16;
|
||||
typedef LE32 U32;
|
||||
@@ -198,7 +194,7 @@ struct LEPolicy
|
||||
S u32_compare_signed(const void *a, const void *b) C { return le32_compare_signed(a, b); }
|
||||
S u64_compare_signed(const void *a, const void *b) C { return le64_compare_signed(a, b); }
|
||||
|
||||
static void compileTimeAssertions() {
|
||||
static void compileTimeAssertions() noexcept {
|
||||
COMPILE_TIME_ASSERT(sizeof(U16) == 2)
|
||||
COMPILE_TIME_ASSERT(sizeof(U32) == 4)
|
||||
COMPILE_TIME_ASSERT(sizeof(U64) == 8)
|
||||
@@ -208,42 +204,25 @@ struct LEPolicy
|
||||
}
|
||||
|
||||
private:
|
||||
// disable copy, assignment and move assignment
|
||||
LEPolicy(const LEPolicy &) = delete;
|
||||
LEPolicy &operator=(const LEPolicy &) = delete;
|
||||
LEPolicy &operator=(LEPolicy &&) = delete;
|
||||
// disable copy and move
|
||||
UPX_CXX_DISABLE_COPY_MOVE(LEPolicy)
|
||||
// disable dynamic allocation
|
||||
ACC_CXX_DISABLE_NEW_DELETE
|
||||
UPX_CXX_DISABLE_NEW_DELETE(LEPolicy)
|
||||
};
|
||||
|
||||
// native policy (aka host policy)
|
||||
// NE - Native Endianness policy (aka Host Policy)
|
||||
#if (ACC_ABI_BIG_ENDIAN)
|
||||
typedef BEPolicy NEPolicy;
|
||||
typedef BEPolicy HostPolicy;
|
||||
#elif (ACC_ABI_LITTLE_ENDIAN)
|
||||
typedef LEPolicy NEPolicy;
|
||||
typedef LEPolicy HostPolicy;
|
||||
#else
|
||||
#error "ACC_ABI_ENDIAN"
|
||||
#endif
|
||||
|
||||
#if 0 /* UNUSED */
|
||||
struct HostAlignedPolicy {
|
||||
#if defined(BELE_CTP)
|
||||
enum { isBE = HostPolicy::isBE, isLE = HostPolicy::isLE };
|
||||
#endif
|
||||
|
||||
typedef upx_uint16_t U16;
|
||||
typedef upx_uint32_t U32;
|
||||
typedef upx_uint64_t U64;
|
||||
|
||||
static void compileTimeAssertions() {
|
||||
COMPILE_TIME_ASSERT(sizeof(U16) == 2)
|
||||
COMPILE_TIME_ASSERT(sizeof(U32) == 4)
|
||||
COMPILE_TIME_ASSERT(sizeof(U64) == 8)
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
#undef V
|
||||
#undef VV
|
||||
#undef S
|
||||
#undef C
|
||||
|
||||
|
||||
+1212
-198
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+34
-8
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -24,28 +24,54 @@
|
||||
<markus@oberhumer.com>
|
||||
*/
|
||||
|
||||
#include "../util/system_defs.h"
|
||||
#include "../util/system_features.h"
|
||||
|
||||
/*************************************************************************
|
||||
// doctest support code implementation
|
||||
**************************************************************************/
|
||||
|
||||
#define DOCTEST_CONFIG_IMPLEMENT
|
||||
#if !defined(UPX_DOCTEST_CONFIG_MULTITHREADING)
|
||||
#define DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
|
||||
|
||||
#if !defined(DOCTEST_CONFIG_DISABLE)
|
||||
|
||||
#if defined(__wasi__)
|
||||
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
||||
#define DOCTEST_CONFIG_NO_POSIX_SIGNALS
|
||||
#elif defined(__i386__) && defined(__MSDOS__) && defined(__DJGPP__) && defined(__GNUC__)
|
||||
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
||||
#endif
|
||||
#if defined(__i386__) && defined(__MSDOS__) && defined(__DJGPP__) && defined(__GNUC__)
|
||||
#define DOCTEST_CONFIG_NO_POSIX_SIGNALS
|
||||
#elif defined(__m68k__) && defined(__atarist__) && defined(__GNUC__)
|
||||
#define DOCTEST_CONFIG_COLORS_NONE
|
||||
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
||||
#define DOCTEST_CONFIG_NO_POSIX_SIGNALS
|
||||
#pragma GCC diagnostic ignored "-Wshadow"
|
||||
#endif
|
||||
#define DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
|
||||
#if !defined(DOCTEST_CONFIG_DISABLE)
|
||||
#if defined(__clang__) && defined(__FAST_MATH__) && defined(__INTEL_LLVM_COMPILER)
|
||||
|
||||
#if !(WITH_THREADS) && !defined(UPX_DOCTEST_CONFIG_MULTITHREADING)
|
||||
#ifndef DOCTEST_CONFIG_NO_MULTITHREADING
|
||||
#define DOCTEST_CONFIG_NO_MULTITHREADING
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__FAST_MATH__) && defined(__clang__) && (__clang_major__ + 0 > 0)
|
||||
#if __clang_major__ >= 6
|
||||
// warning: comparison with NaN always evaluates to false in fast floating point modes
|
||||
#pragma clang diagnostic ignored "-Wtautological-constant-compare"
|
||||
#endif
|
||||
#include <doctest/doctest/parts/doctest.cpp>
|
||||
#if defined(__has_warning)
|
||||
#if __has_warning("-Wnan-infinity-disabled")
|
||||
// warning: use of NaN is undefined behavior due to the currently enabled floating-point options
|
||||
#pragma clang diagnostic ignored "-Wnan-infinity-disabled"
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// NOLINTBEGIN(bugprone-unintended-char-ostream-output)
|
||||
#include <doctest/doctest/parts/doctest.cpp>
|
||||
// NOLINTEND(bugprone-unintended-char-ostream-output)
|
||||
|
||||
#endif // DOCTEST_CONFIG_DISABLE
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
+425
-23
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -43,6 +43,7 @@ TEST_CASE("raw_bytes ptr") {
|
||||
ptr = buf;
|
||||
CHECK(ptr_udiff_bytes(raw_index_bytes(ptr, 1, 1), ptr) == 2u);
|
||||
CHECK(ptr_udiff_bytes(raw_index_bytes(ptr, 4, 0), ptr) == 8u);
|
||||
UNUSED(ptr);
|
||||
}
|
||||
|
||||
TEST_CASE("raw_bytes bounded array") {
|
||||
@@ -55,6 +56,7 @@ TEST_CASE("raw_bytes bounded array") {
|
||||
CHECK_THROWS(raw_index_bytes(buf, 3, 3));
|
||||
CHECK(ptr_udiff_bytes(raw_index_bytes(buf, 1, 1), buf) == 2u);
|
||||
CHECK(ptr_udiff_bytes(raw_index_bytes(buf, 4, 0), buf) == 8u);
|
||||
UNUSED(buf);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
@@ -62,7 +64,7 @@ TEST_CASE("raw_bytes bounded array") {
|
||||
**************************************************************************/
|
||||
|
||||
TEST_CASE("basic xspan usage") {
|
||||
char buf[4] = {0, 1, 2, 3};
|
||||
alignas(4) char buf[4] = {0, 1, 2, 3};
|
||||
|
||||
SUBCASE("XSPAN_x") {
|
||||
XSPAN_0(char) a0 = nullptr;
|
||||
@@ -91,6 +93,14 @@ TEST_CASE("basic xspan usage") {
|
||||
CHECK_NOTHROW(raw_bytes(a0, 0));
|
||||
CHECK_THROWS(raw_bytes(a0, 1));
|
||||
CHECK_THROWS(raw_index_bytes(a0, 0, 0));
|
||||
|
||||
CHECK(raw_bytes(b0, 0) == buf);
|
||||
CHECK(raw_bytes(bp, 0) == buf);
|
||||
// info: these will fail if we ever add an overload for bounded-arrays
|
||||
#if WITH_XSPAN >= 2
|
||||
CHECK(b0.raw_size_in_bytes() == 0u);
|
||||
CHECK(bp.raw_size_in_bytes() == 0u);
|
||||
#endif
|
||||
CHECK(raw_bytes(c0, 4) == buf);
|
||||
CHECK(raw_index_bytes(c0, 1, 3) == buf + 1);
|
||||
CHECK(raw_bytes(cp, 4) == buf);
|
||||
@@ -101,11 +111,31 @@ TEST_CASE("basic xspan usage") {
|
||||
CHECK_THROWS(raw_bytes(cs, 5));
|
||||
CHECK_THROWS(raw_index_bytes(cs, 1, 4));
|
||||
#endif
|
||||
|
||||
XSPAN_0(upx_uint16_t) c0_2 = XSPAN_TYPE_CAST(upx_uint16_t, c0 + 2);
|
||||
XSPAN_P(upx_uint16_t) cp_2 = XSPAN_TYPE_CAST(upx_uint16_t, cp + 2);
|
||||
XSPAN_S(upx_uint16_t) cs_2 = XSPAN_TYPE_CAST(upx_uint16_t, cs + 2);
|
||||
CHECK(ptr_udiff_bytes(c0_2, c0) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cp_2, c0) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cs_2, c0) == 2u);
|
||||
CHECK(ptr_udiff_bytes(c0_2, cp) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cp_2, cp) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cs_2, cp) == 2u);
|
||||
CHECK(ptr_udiff_bytes(c0_2, cs) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cp_2, cs) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cs_2, cs) == 2u);
|
||||
XSPAN_0(upx_uint16_t) c0_2b = XSPAN_TYPE_CAST(upx_uint16_t, c0) + 1;
|
||||
XSPAN_P(upx_uint16_t) cp_2b = XSPAN_TYPE_CAST(upx_uint16_t, cp) + 1;
|
||||
XSPAN_S(upx_uint16_t) cs_2b = XSPAN_TYPE_CAST(upx_uint16_t, cs) + 1;
|
||||
CHECK(c0_2 == c0_2b);
|
||||
CHECK(cp_2 == cp_2b);
|
||||
CHECK(cs_2 == cs_2b);
|
||||
|
||||
CHECK(sizeof(*c0) == 1u);
|
||||
CHECK(sizeof(*c0_2) == 2u);
|
||||
}
|
||||
|
||||
SUBCASE("XSPAN_x_VAR") {
|
||||
XSPAN_0_VAR(char, a0, nullptr);
|
||||
|
||||
XSPAN_0_VAR(char, b0, buf);
|
||||
XSPAN_P_VAR(char, bp, buf);
|
||||
|
||||
@@ -124,7 +154,6 @@ TEST_CASE("basic xspan usage") {
|
||||
XSPAN_0_VAR(const char, const z0p, yp);
|
||||
XSPAN_0_VAR(const char, const z0s, xs);
|
||||
|
||||
CHECK((a0 == nullptr));
|
||||
CHECK(c0 == b0);
|
||||
CHECK(cp == bp);
|
||||
CHECK(cs == bp);
|
||||
@@ -133,9 +162,21 @@ TEST_CASE("basic xspan usage") {
|
||||
CHECK(x0 == z0p);
|
||||
CHECK(xp == z0s);
|
||||
|
||||
#if WITH_XSPAN >= 1 || __cplusplus >= 201103L
|
||||
XSPAN_0_VAR(char, a0, nullptr);
|
||||
CHECK((a0 == nullptr));
|
||||
CHECK_NOTHROW(raw_bytes(a0, 0));
|
||||
CHECK_THROWS(raw_bytes(a0, 1));
|
||||
CHECK_THROWS(raw_index_bytes(a0, 0, 0));
|
||||
#endif
|
||||
|
||||
CHECK(raw_bytes(b0, 0) == buf);
|
||||
CHECK(raw_bytes(bp, 0) == buf);
|
||||
// info: these will fail if we ever add an overload for bounded-arrays
|
||||
#if WITH_XSPAN >= 2
|
||||
CHECK(b0.raw_size_in_bytes() == 0u);
|
||||
CHECK(bp.raw_size_in_bytes() == 0u);
|
||||
#endif
|
||||
CHECK(raw_bytes(c0, 4) == buf);
|
||||
CHECK(raw_index_bytes(c0, 1, 3) == buf + 1);
|
||||
CHECK(raw_bytes(cp, 4) == buf);
|
||||
@@ -146,6 +187,28 @@ TEST_CASE("basic xspan usage") {
|
||||
CHECK_THROWS(raw_bytes(cs, 5));
|
||||
CHECK_THROWS(raw_index_bytes(cs, 1, 4));
|
||||
#endif
|
||||
|
||||
XSPAN_0_VAR(upx_uint16_t, c0_2, XSPAN_TYPE_CAST(upx_uint16_t, c0 + 2));
|
||||
XSPAN_P_VAR(upx_uint16_t, cp_2, XSPAN_TYPE_CAST(upx_uint16_t, cp + 2));
|
||||
XSPAN_S_VAR(upx_uint16_t, cs_2, XSPAN_TYPE_CAST(upx_uint16_t, cs + 2));
|
||||
CHECK(ptr_udiff_bytes(c0_2, c0) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cp_2, c0) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cs_2, c0) == 2u);
|
||||
CHECK(ptr_udiff_bytes(c0_2, cp) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cp_2, cp) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cs_2, cp) == 2u);
|
||||
CHECK(ptr_udiff_bytes(c0_2, cs) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cp_2, cs) == 2u);
|
||||
CHECK(ptr_udiff_bytes(cs_2, cs) == 2u);
|
||||
XSPAN_0_VAR(upx_uint16_t, c0_2b, XSPAN_TYPE_CAST(upx_uint16_t, c0) + 1);
|
||||
XSPAN_P_VAR(upx_uint16_t, cp_2b, XSPAN_TYPE_CAST(upx_uint16_t, cp) + 1);
|
||||
XSPAN_S_VAR(upx_uint16_t, cs_2b, XSPAN_TYPE_CAST(upx_uint16_t, cs) + 1);
|
||||
CHECK(c0_2 == c0_2b);
|
||||
CHECK(cp_2 == cp_2b);
|
||||
CHECK(cs_2 == cs_2b);
|
||||
|
||||
CHECK(sizeof(*c0) == 1u);
|
||||
CHECK(sizeof(*c0_2) == 2u);
|
||||
}
|
||||
|
||||
SUBCASE("xspan in class") {
|
||||
@@ -172,6 +235,35 @@ TEST_CASE("basic xspan usage") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("xspan array access") {
|
||||
const size_t N = 16;
|
||||
char buf[N];
|
||||
memset(buf, 0, sizeof(buf));
|
||||
XSPAN_0_VAR(char, c0, buf, sizeof(buf));
|
||||
XSPAN_P_VAR(char, cp, buf, sizeof(buf));
|
||||
XSPAN_S_VAR(char, cs, buf, sizeof(buf));
|
||||
for (size_t i = 0; i != N; ++i)
|
||||
c0[i] += 1;
|
||||
for (size_t i = 0; i != N; ++i)
|
||||
cp[i] += 1;
|
||||
for (size_t i = 0; i != N; ++i)
|
||||
cs[i] += 1;
|
||||
#if __cplusplus >= 201103L
|
||||
for (auto ptr = c0; ptr != c0 + N; ++ptr)
|
||||
*ptr += 1;
|
||||
for (auto ptr = c0 + 0; ptr < c0 + N; ++ptr)
|
||||
*ptr += 1;
|
||||
for (auto ptr = cp; ptr != cp + N; ++ptr)
|
||||
*ptr += 1;
|
||||
for (auto ptr = cp + 0; ptr < cp + N; ++ptr)
|
||||
*ptr += 1;
|
||||
for (auto ptr = cs; ptr != cs + N; ++ptr)
|
||||
*ptr += 1;
|
||||
for (auto ptr = cs + 0; ptr < cs + N; ++ptr)
|
||||
*ptr += 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
**************************************************************************/
|
||||
@@ -382,6 +474,7 @@ TEST_CASE("PtrOrSpan") {
|
||||
CHECK_THROWS(sp_with_base = s0_no_base); // nullptr assignment
|
||||
CHECK_THROWS(sp_with_base = s0_with_base); // nullptr assignment
|
||||
#endif
|
||||
UNUSED(my_null);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
@@ -533,6 +626,7 @@ TEST_CASE("Span") {
|
||||
CHECK((XSPAN_S_MAKE(char, b1_b1).raw_base() == base_buf + 1));
|
||||
}
|
||||
#endif
|
||||
UNUSED(my_null);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
@@ -587,11 +681,16 @@ TEST_CASE("Span subspan") {
|
||||
CHECK((as + 2).subspan(0, -2)[0] == 0);
|
||||
CHECK_THROWS(as.subspan(1, 0)[0]);
|
||||
CHECK_THROWS(as.subspan(1, 1)[-1]);
|
||||
CHECK(as.subspan(1)[0] == 1);
|
||||
CHECK(as.subspan(2)[0] == 2);
|
||||
CHECK(as.subspan(3)[0] == 3);
|
||||
}
|
||||
|
||||
TEST_CASE("Span constness") {
|
||||
static char buf[4] = {0, 1, 2, 3};
|
||||
|
||||
// NOLINTBEGIN(performance-unnecessary-copy-initialization)
|
||||
|
||||
XSPAN_0(char) b0(buf, 4);
|
||||
XSPAN_P(char) bp(buf, 4);
|
||||
XSPAN_S(char) bs(buf, 4);
|
||||
@@ -612,6 +711,8 @@ TEST_CASE("Span constness") {
|
||||
XSPAN_P(const char) xpc(bp);
|
||||
XSPAN_S(const char) xsc(bs);
|
||||
|
||||
// NOLINTEND(performance-unnecessary-copy-initialization)
|
||||
|
||||
CHECK(ptr_diff_bytes(b0, buf) == 0);
|
||||
CHECK(ptr_diff_bytes(bp, buf) == 0);
|
||||
CHECK(ptr_diff_bytes(bs, buf) == 0);
|
||||
@@ -659,6 +760,7 @@ TEST_CASE("PtrOrSpan") {
|
||||
CHECK(my_memcmp_v1(buf, nullptr, 4) == -2);
|
||||
CHECK(my_memcmp_v2(buf + 4, buf + 4, 999) == 0);
|
||||
CHECK(my_memcmp_v2(buf, buf + 2, 3) == 0);
|
||||
UNUSED(buf);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
@@ -720,30 +822,241 @@ TEST_CASE("PtrOrSpan char") {
|
||||
}
|
||||
|
||||
TEST_CASE("PtrOrSpan int") {
|
||||
int buf[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
XSPAN_P(int) a(buf, XSpanCount(8));
|
||||
int buf[8] = {0, 11, 22, 33, 44, 55, 66, 77};
|
||||
XSPAN_P(const int) a(buf, XSpanCount(8));
|
||||
CHECK(a.raw_size_in_bytes() == 8 * sizeof(int));
|
||||
XSPAN_P(int) b = a.subspan(0, 7);
|
||||
XSPAN_P(const int) b = a.subspan(0, 7);
|
||||
CHECK(b.raw_size_in_bytes() == 7 * sizeof(int));
|
||||
XSPAN_P(int) c = (b + 1).subspan(0, 6);
|
||||
XSPAN_P(const int) c = (b + 1).subspan(0, 6);
|
||||
CHECK(c.raw_size_in_bytes() == 6 * sizeof(int));
|
||||
a += 1;
|
||||
CHECK(*a == 1);
|
||||
CHECK(*a++ == 1);
|
||||
CHECK(*++a == 3);
|
||||
CHECK(--*a == 2);
|
||||
CHECK(*a-- == 2);
|
||||
CHECK(a == buf + 1);
|
||||
CHECK(*a == 11);
|
||||
CHECK(*a++ == 11);
|
||||
CHECK(a == buf + 2);
|
||||
CHECK(*a == 22);
|
||||
CHECK(*++a == 33);
|
||||
CHECK(a == buf + 3);
|
||||
CHECK(*a == 33);
|
||||
CHECK(*--a == 22);
|
||||
CHECK(a == buf + 2);
|
||||
CHECK(*a == 22);
|
||||
CHECK(*a-- == 22);
|
||||
CHECK(a == buf + 1);
|
||||
CHECK(*a == 11);
|
||||
CHECK(*b == 0);
|
||||
CHECK(*c == 1);
|
||||
a = buf + 7;
|
||||
CHECK(*c == 11);
|
||||
a -= 1;
|
||||
a += 7;
|
||||
#ifdef UPX_VERSION_HEX
|
||||
CHECK(get_le32(a) == ne32_to_le32(7));
|
||||
CHECK(get_le32(a) == ne32_to_le32(77));
|
||||
#endif
|
||||
a++;
|
||||
#ifdef UPX_VERSION_HEX
|
||||
CHECK_THROWS(get_le32(a));
|
||||
#endif
|
||||
CHECK_THROWS(raw_bytes(a, 1));
|
||||
CHECK_THROWS(a++);
|
||||
CHECK_THROWS(++a);
|
||||
CHECK_THROWS(a += 1);
|
||||
CHECK(a == buf + 8);
|
||||
a = buf;
|
||||
CHECK_THROWS(a--);
|
||||
CHECK_THROWS(--a);
|
||||
CHECK_THROWS(a -= 1);
|
||||
CHECK_THROWS(a += 9);
|
||||
CHECK(a == buf);
|
||||
a += 8;
|
||||
CHECK(a == buf + 8);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
**************************************************************************/
|
||||
|
||||
#ifdef UPX_VERSION_HEX
|
||||
|
||||
namespace {
|
||||
template <class T>
|
||||
static noinline void check_bele_a(const T &mb, size_t i) {
|
||||
if (i < 2) {
|
||||
CHECK_THROWS(get_ne16(mb));
|
||||
CHECK_THROWS(get_be16(mb));
|
||||
CHECK_THROWS(get_le16(mb));
|
||||
CHECK_THROWS(set_ne16(mb, 0));
|
||||
CHECK_THROWS(set_be16(mb, 0));
|
||||
CHECK_THROWS(set_le16(mb, 0));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne16(mb));
|
||||
CHECK_NOTHROW(get_be16(mb));
|
||||
CHECK_NOTHROW(get_le16(mb));
|
||||
CHECK_NOTHROW(set_ne16(mb, 0));
|
||||
CHECK_NOTHROW(set_be16(mb, 0));
|
||||
CHECK_NOTHROW(set_le16(mb, 0));
|
||||
}
|
||||
if (i < 3) {
|
||||
CHECK_THROWS(get_ne24(mb));
|
||||
CHECK_THROWS(get_be24(mb));
|
||||
CHECK_THROWS(get_le24(mb));
|
||||
CHECK_THROWS(set_ne24(mb, 0));
|
||||
CHECK_THROWS(set_be24(mb, 0));
|
||||
CHECK_THROWS(set_le24(mb, 0));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne24(mb));
|
||||
CHECK_NOTHROW(get_be24(mb));
|
||||
CHECK_NOTHROW(get_le24(mb));
|
||||
CHECK_NOTHROW(set_ne24(mb, 0));
|
||||
CHECK_NOTHROW(set_be24(mb, 0));
|
||||
CHECK_NOTHROW(set_le24(mb, 0));
|
||||
}
|
||||
if (i < 4) {
|
||||
CHECK_THROWS(get_ne32(mb));
|
||||
CHECK_THROWS(get_be32(mb));
|
||||
CHECK_THROWS(get_le32(mb));
|
||||
CHECK_THROWS(set_ne32(mb, 0));
|
||||
CHECK_THROWS(set_be32(mb, 0));
|
||||
CHECK_THROWS(set_le32(mb, 0));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne32(mb));
|
||||
CHECK_NOTHROW(get_be32(mb));
|
||||
CHECK_NOTHROW(get_le32(mb));
|
||||
CHECK_NOTHROW(set_ne32(mb, 0));
|
||||
CHECK_NOTHROW(set_be32(mb, 0));
|
||||
CHECK_NOTHROW(set_le32(mb, 0));
|
||||
}
|
||||
if (i < 8) {
|
||||
CHECK_THROWS(get_ne64(mb));
|
||||
CHECK_THROWS(get_be64(mb));
|
||||
CHECK_THROWS(get_le64(mb));
|
||||
CHECK_THROWS(set_ne64(mb, 0));
|
||||
CHECK_THROWS(set_be64(mb, 0));
|
||||
CHECK_THROWS(set_le64(mb, 0));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne64(mb));
|
||||
CHECK_NOTHROW(get_be64(mb));
|
||||
CHECK_NOTHROW(get_le64(mb));
|
||||
CHECK_NOTHROW(set_ne64(mb, 0));
|
||||
CHECK_NOTHROW(set_be64(mb, 0));
|
||||
CHECK_NOTHROW(set_le64(mb, 0));
|
||||
}
|
||||
}
|
||||
template <class T>
|
||||
static noinline void check_bele_c(const T &mb, size_t i) {
|
||||
if (i < 2) {
|
||||
CHECK_THROWS(get_ne16(mb));
|
||||
CHECK_THROWS(get_be16(mb));
|
||||
CHECK_THROWS(get_le16(mb));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne16(mb));
|
||||
CHECK_NOTHROW(get_be16(mb));
|
||||
CHECK_NOTHROW(get_le16(mb));
|
||||
}
|
||||
if (i < 3) {
|
||||
CHECK_THROWS(get_ne24(mb));
|
||||
CHECK_THROWS(get_be24(mb));
|
||||
CHECK_THROWS(get_le24(mb));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne24(mb));
|
||||
CHECK_NOTHROW(get_be24(mb));
|
||||
CHECK_NOTHROW(get_le24(mb));
|
||||
}
|
||||
if (i < 4) {
|
||||
CHECK_THROWS(get_ne32(mb));
|
||||
CHECK_THROWS(get_be32(mb));
|
||||
CHECK_THROWS(get_le32(mb));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne32(mb));
|
||||
CHECK_NOTHROW(get_be32(mb));
|
||||
CHECK_NOTHROW(get_le32(mb));
|
||||
}
|
||||
if (i < 8) {
|
||||
CHECK_THROWS(get_ne64(mb));
|
||||
CHECK_THROWS(get_be64(mb));
|
||||
CHECK_THROWS(get_le64(mb));
|
||||
} else {
|
||||
CHECK_NOTHROW(get_ne64(mb));
|
||||
CHECK_NOTHROW(get_be64(mb));
|
||||
CHECK_NOTHROW(get_le64(mb));
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
#endif // UPX_VERSION_HEX
|
||||
|
||||
TEST_CASE("xspan global overloads") {
|
||||
byte buf_a[16] = {};
|
||||
const byte buf_c[16] = {};
|
||||
|
||||
for (size_t i = 0; i < 16; i++) {
|
||||
XSPAN_0_VAR(byte, a0, buf_a, i);
|
||||
XSPAN_P_VAR(byte, ap, buf_a, i);
|
||||
XSPAN_S_VAR(byte, as, buf_a, i);
|
||||
|
||||
XSPAN_0_VAR(const byte, c0, buf_c, i);
|
||||
XSPAN_P_VAR(const byte, cp, buf_c, i);
|
||||
XSPAN_S_VAR(const byte, cs, buf_c, i);
|
||||
|
||||
#ifdef UPX_VERSION_HEX
|
||||
check_bele_a(a0, i);
|
||||
check_bele_a(ap, i);
|
||||
check_bele_a(as, i);
|
||||
|
||||
check_bele_c(c0, i);
|
||||
check_bele_c(cp, i);
|
||||
check_bele_c(cs, i);
|
||||
|
||||
CHECK_THROWS(upx_adler32(a0, i + 1));
|
||||
CHECK_THROWS(upx_adler32(ap, i + 1));
|
||||
CHECK_THROWS(upx_adler32(as, i + 1));
|
||||
CHECK_THROWS(upx_adler32(c0, i + 1));
|
||||
CHECK_THROWS(upx_adler32(cp, i + 1));
|
||||
CHECK_THROWS(upx_adler32(cs, i + 1));
|
||||
|
||||
if (i == 0) {
|
||||
CHECK_THROWS(upx_safe_strlen(a0));
|
||||
CHECK_THROWS(upx_safe_strlen(ap));
|
||||
CHECK_THROWS(upx_safe_strlen(as));
|
||||
CHECK_THROWS(upx_safe_strlen(c0));
|
||||
CHECK_THROWS(upx_safe_strlen(cp));
|
||||
CHECK_THROWS(upx_safe_strlen(cs));
|
||||
}
|
||||
#endif
|
||||
|
||||
CHECK_THROWS(memchr(a0, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
CHECK_THROWS(memchr(ap, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
CHECK_THROWS(memchr(as, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
CHECK_THROWS(memchr(c0, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
CHECK_THROWS(memchr(cp, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
CHECK_THROWS(memchr(cs, 0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
|
||||
CHECK(memcmp(a0, a0, i) == 0);
|
||||
CHECK(memcmp(ap, a0, i) == 0);
|
||||
CHECK(memcmp(as, a0, i) == 0);
|
||||
CHECK_THROWS(memcmp(a0, a0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
CHECK_THROWS(memcmp(ap, a0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
CHECK_THROWS(memcmp(as, a0, i + 1)); // NOLINT(bugprone-unused-return-value)
|
||||
|
||||
CHECK_NOTHROW(memcpy(a0, c0, i));
|
||||
CHECK_NOTHROW(memcpy(ap, cp, i));
|
||||
CHECK_NOTHROW(memcpy(as, cs, i));
|
||||
CHECK_THROWS(memcpy(a0, c0, i + 1));
|
||||
CHECK_THROWS(memcpy(ap, cp, i + 1));
|
||||
CHECK_THROWS(memcpy(as, cs, i + 1));
|
||||
|
||||
CHECK_NOTHROW(memmove(a0, c0, i));
|
||||
CHECK_NOTHROW(memmove(ap, cp, i));
|
||||
CHECK_NOTHROW(memmove(as, cs, i));
|
||||
CHECK_THROWS(memmove(a0, c0, i + 1));
|
||||
CHECK_THROWS(memmove(ap, cp, i + 1));
|
||||
CHECK_THROWS(memmove(as, cs, i + 1));
|
||||
|
||||
CHECK_NOTHROW(memset(a0, 255, i));
|
||||
CHECK_NOTHROW(memset(ap, 255, i));
|
||||
CHECK_NOTHROW(memset(as, 255, i));
|
||||
CHECK_THROWS(memset(a0, 254, i + 1));
|
||||
CHECK_THROWS(memset(ap, 254, i + 1));
|
||||
CHECK_THROWS(memset(as, 254, i + 1));
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
@@ -752,12 +1065,15 @@ TEST_CASE("PtrOrSpan int") {
|
||||
|
||||
namespace {
|
||||
template <class T>
|
||||
__acc_static_noinline int foo(T p) {
|
||||
static noinline int foo(T p) {
|
||||
unsigned r = 0;
|
||||
r += *p++;
|
||||
r += *++p;
|
||||
p += 3;
|
||||
r += *p;
|
||||
r += *--p;
|
||||
r += *p--;
|
||||
r += *p;
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -779,13 +1095,99 @@ make_span_s(T *ptr, size_t count) {
|
||||
} // namespace
|
||||
|
||||
TEST_CASE("Span codegen") {
|
||||
char buf[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
CHECK(foo(buf) == 0 + 2 + 5);
|
||||
CHECK(foo(make_span_0(buf, 8)) == 0 + 2 + 5);
|
||||
CHECK(foo(make_span_p(buf, 8)) == 0 + 2 + 5);
|
||||
CHECK(foo(make_span_s(buf, 8)) == 0 + 2 + 5);
|
||||
upx_uint8_t buf[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
CHECK(foo(buf) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||
CHECK(foo(make_span_0(buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||
CHECK(foo(make_span_p(buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||
CHECK(foo(make_span_s(buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||
CHECK(foo(XSPAN_0_MAKE(upx_uint8_t, buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||
CHECK(foo(XSPAN_P_MAKE(upx_uint8_t, buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||
CHECK(foo(XSPAN_S_MAKE(upx_uint8_t, buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||
UNUSED(buf);
|
||||
}
|
||||
|
||||
#endif // WITH_XSPAN >= 2
|
||||
|
||||
/*************************************************************************
|
||||
// misc
|
||||
**************************************************************************/
|
||||
|
||||
namespace {
|
||||
template <class T>
|
||||
struct PointerTraits {
|
||||
typedef typename std::add_lvalue_reference<T>::type reference;
|
||||
typedef
|
||||
typename std::add_lvalue_reference<typename std::add_const<T>::type>::type const_reference;
|
||||
typedef typename std::add_pointer<T>::type pointer;
|
||||
typedef typename std::add_pointer<typename std::add_const<T>::type>::type const_pointer;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
|
||||
TEST_CASE("decltype integral constants") {
|
||||
static_assert((std::is_same<decltype(0), int>::value), "");
|
||||
static_assert((std::is_same<decltype(0u), unsigned>::value), "");
|
||||
static_assert((std::is_same<decltype(0l), long>::value), "");
|
||||
static_assert((std::is_same<decltype(0ul), unsigned long>::value), "");
|
||||
static_assert((std::is_same<decltype(0ll), long long>::value), "");
|
||||
static_assert((std::is_same<decltype(0ull), unsigned long long>::value), "");
|
||||
static_assert((std::is_same<decltype((char) 0), char>::value), "");
|
||||
static_assert((std::is_same<decltype((short) 0), short>::value), "");
|
||||
static_assert((std::is_same<decltype((long) 0), long>::value), "");
|
||||
static_assert((std::is_same<decltype((long long) 0), long long>::value), "");
|
||||
static_assert((std::is_same<decltype(char(0)), char>::value), "");
|
||||
static_assert((std::is_same<decltype(short(0)), short>::value), "");
|
||||
static_assert((std::is_same<decltype(long(0)), long>::value), "");
|
||||
}
|
||||
|
||||
TEST_CASE("decltype pointer") {
|
||||
int dummy = 0;
|
||||
int *p = &dummy;
|
||||
const int *c = &dummy;
|
||||
static_assert((std::is_same<decltype(p - p), std::ptrdiff_t>::value), "");
|
||||
static_assert((std::is_same<decltype(c - c), std::ptrdiff_t>::value), "");
|
||||
static_assert((std::is_same<decltype(p - c), std::ptrdiff_t>::value), "");
|
||||
static_assert((std::is_same<decltype(c - p), std::ptrdiff_t>::value), "");
|
||||
typedef PointerTraits<int> TInt;
|
||||
typedef PointerTraits<const int> TConstInt;
|
||||
static_assert((std::is_same<int *, TInt::pointer>::value), "");
|
||||
static_assert((std::is_same<const int *, TInt::const_pointer>::value), "");
|
||||
static_assert((std::is_same<const int *, TConstInt::pointer>::value), "");
|
||||
static_assert((std::is_same<const int *, TConstInt::const_pointer>::value), "");
|
||||
//
|
||||
static_assert((std::is_same<decltype(p), TInt::pointer>::value), "");
|
||||
static_assert((std::is_same<decltype(c), TInt::const_pointer>::value), "");
|
||||
static_assert((std::is_same<decltype(c), TConstInt::pointer>::value), "");
|
||||
static_assert((std::is_same<decltype(p + 1), TInt::pointer>::value), "");
|
||||
static_assert((std::is_same<decltype(c + 1), TInt::const_pointer>::value), "");
|
||||
static_assert((std::is_same<decltype(c + 1), TConstInt::pointer>::value), "");
|
||||
static_assert((std::is_same<decltype(c + 1), TConstInt::const_pointer>::value), "");
|
||||
static_assert((std::is_same<decltype(c + 1), const int *>::value), "");
|
||||
// dereference
|
||||
static_assert((std::is_same<decltype(*p), TInt::reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*c), TInt::const_reference>::value), "");
|
||||
#if 0
|
||||
// this works, but avoid clang warnings:
|
||||
// "Expression with side effects has no effect in an unevaluated context"
|
||||
static_assert((std::is_same<decltype(*p++), TInt::reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*++p), TInt::reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*c++), TInt::const_reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*c++), TConstInt::reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*c++), TConstInt::const_reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*++c), TInt::const_reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*++c), TConstInt::reference>::value), "");
|
||||
static_assert((std::is_same<decltype(*++c), TConstInt::const_reference>::value), "");
|
||||
#endif
|
||||
// array access
|
||||
static_assert((std::is_same<decltype(p[0]), TInt::reference>::value), "");
|
||||
static_assert((std::is_same<decltype(c[0]), TInt::const_reference>::value), "");
|
||||
static_assert((std::is_same<decltype(c[0]), TConstInt::reference>::value), "");
|
||||
static_assert((std::is_same<decltype(c[0]), TConstInt::const_reference>::value), "");
|
||||
UNUSED(p);
|
||||
UNUSED(c);
|
||||
}
|
||||
|
||||
#endif // __cplusplus >= 201103L
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -62,7 +62,7 @@ unsigned upx_crc32(const void *buf, unsigned len, unsigned crc)
|
||||
**************************************************************************/
|
||||
|
||||
int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb, int method, int level, const upx_compress_config_t *cconf,
|
||||
upx_callback_t *cb, int method, int level, const upx_compress_config_t *cconf,
|
||||
upx_compress_result_t *cresult) {
|
||||
int r = UPX_E_ERROR;
|
||||
upx_compress_result_t cresult_buffer;
|
||||
@@ -78,12 +78,12 @@ int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned
|
||||
// force users to provide *dst_len
|
||||
assert(*dst_len != 0);
|
||||
#endif
|
||||
// for UPX, we always require a reasonably sized outbut buffer
|
||||
// for UPX, we always require a reasonably sized output buffer
|
||||
assert(*dst_len >= MemBuffer::getSizeForCompression(src_len));
|
||||
|
||||
if (!cresult)
|
||||
cresult = &cresult_buffer;
|
||||
memset(cresult, 0, sizeof(*cresult));
|
||||
cresult->reset();
|
||||
#if 1
|
||||
// debugging aid
|
||||
cresult->debug.method = method;
|
||||
@@ -92,8 +92,13 @@ int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned
|
||||
cresult->debug.c_len = 0;
|
||||
#endif
|
||||
|
||||
const unsigned orig_dst_len = *dst_len;
|
||||
if (__acc_cte(false)) {
|
||||
}
|
||||
#if (WITH_BZIP2)
|
||||
else if (M_IS_BZIP2(method))
|
||||
r = upx_bzip2_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
||||
#endif
|
||||
#if (WITH_LZMA)
|
||||
else if (M_IS_LZMA(method))
|
||||
r = upx_lzma_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
||||
@@ -111,13 +116,14 @@ int upx_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned
|
||||
r = upx_zstd_compress(src, src_len, dst, dst_len, cb, method, level, cconf, cresult);
|
||||
#endif
|
||||
else {
|
||||
throwInternalError("unknown compression method");
|
||||
throwInternalError("unknown compression method %d", method);
|
||||
}
|
||||
|
||||
#if 1
|
||||
// debugging aid
|
||||
cresult->debug.c_len = *dst_len;
|
||||
#endif
|
||||
assert_noexcept(*dst_len <= orig_dst_len);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -135,8 +141,13 @@ int upx_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigne
|
||||
if (cresult && cresult->debug.method == 0)
|
||||
cresult = nullptr;
|
||||
|
||||
const unsigned orig_dst_len = *dst_len;
|
||||
if (__acc_cte(false)) {
|
||||
}
|
||||
#if (WITH_BZIP2)
|
||||
else if (M_IS_BZIP2(method))
|
||||
r = upx_bzip2_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||
#endif
|
||||
#if (WITH_LZMA)
|
||||
else if (M_IS_LZMA(method))
|
||||
r = upx_lzma_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||
@@ -158,9 +169,10 @@ int upx_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigne
|
||||
r = upx_zstd_decompress(src, src_len, dst, dst_len, method, cresult);
|
||||
#endif
|
||||
else {
|
||||
throwInternalError("unknown decompression method");
|
||||
throwInternalError("unknown compression method %d", method);
|
||||
}
|
||||
|
||||
assert_noexcept(*dst_len <= orig_dst_len);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -180,8 +192,13 @@ int upx_test_overlap(const upx_bytep buf, const upx_bytep tbuf, unsigned src_off
|
||||
unsigned overlap_overhead = src_off + src_len - *dst_len;
|
||||
assert((int) overlap_overhead > 0);
|
||||
|
||||
const unsigned orig_dst_len = *dst_len;
|
||||
if (__acc_cte(false)) {
|
||||
}
|
||||
#if (WITH_BZIP2)
|
||||
else if (M_IS_BZIP2(method))
|
||||
r = upx_bzip2_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||
#endif
|
||||
#if (WITH_LZMA)
|
||||
else if (M_IS_LZMA(method))
|
||||
r = upx_lzma_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||
@@ -199,9 +216,10 @@ int upx_test_overlap(const upx_bytep buf, const upx_bytep tbuf, unsigned src_off
|
||||
r = upx_zstd_test_overlap(buf, tbuf, src_off, src_len, dst_len, method, cresult);
|
||||
#endif
|
||||
else {
|
||||
throwInternalError("unknown decompression method");
|
||||
throwInternalError("unknown compression method %d", method);
|
||||
}
|
||||
|
||||
assert_noexcept(*dst_len <= orig_dst_len);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
+9
-17
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -25,8 +25,8 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef UPX_COMPRESS_H__
|
||||
#define UPX_COMPRESS_H__ 1
|
||||
|
||||
// clang-format off
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
@@ -37,7 +37,7 @@ int upx_bzip2_init(void);
|
||||
const char *upx_bzip2_version_string(void);
|
||||
int upx_bzip2_compress ( const upx_bytep src, unsigned src_len,
|
||||
upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb,
|
||||
upx_callback_t *cb,
|
||||
int method, int level,
|
||||
const upx_compress_config_t *cconf,
|
||||
upx_compress_result_t *cresult );
|
||||
@@ -53,13 +53,12 @@ int upx_bzip2_test_overlap ( const upx_bytep buf,
|
||||
const upx_compress_result_t *cresult );
|
||||
#endif
|
||||
|
||||
|
||||
#if (WITH_LZMA)
|
||||
int upx_lzma_init(void);
|
||||
const char *upx_lzma_version_string(void);
|
||||
int upx_lzma_compress ( const upx_bytep src, unsigned src_len,
|
||||
upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb,
|
||||
upx_callback_t *cb,
|
||||
int method, int level,
|
||||
const upx_compress_config_t *cconf,
|
||||
upx_compress_result_t *cresult );
|
||||
@@ -75,13 +74,12 @@ int upx_lzma_test_overlap ( const upx_bytep buf,
|
||||
const upx_compress_result_t *cresult );
|
||||
#endif
|
||||
|
||||
|
||||
#if (WITH_NRV)
|
||||
int upx_nrv_init(void);
|
||||
const char *upx_nrv_version_string(void);
|
||||
int upx_nrv_compress ( const upx_bytep src, unsigned src_len,
|
||||
upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb,
|
||||
upx_callback_t *cb,
|
||||
int method, int level,
|
||||
const upx_compress_config_t *cconf,
|
||||
upx_compress_result_t *cresult );
|
||||
@@ -97,13 +95,12 @@ int upx_nrv_test_overlap ( const upx_bytep buf,
|
||||
const upx_compress_result_t *cresult );
|
||||
#endif
|
||||
|
||||
|
||||
#if (WITH_UCL)
|
||||
int upx_ucl_init(void);
|
||||
const char *upx_ucl_version_string(void);
|
||||
int upx_ucl_compress ( const upx_bytep src, unsigned src_len,
|
||||
upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb,
|
||||
upx_callback_t *cb,
|
||||
int method, int level,
|
||||
const upx_compress_config_t *cconf,
|
||||
upx_compress_result_t *cresult );
|
||||
@@ -121,13 +118,12 @@ unsigned upx_ucl_adler32(const void *buf, unsigned len, unsigned adler);
|
||||
unsigned upx_ucl_crc32 (const void *buf, unsigned len, unsigned crc);
|
||||
#endif
|
||||
|
||||
|
||||
#if (WITH_ZLIB)
|
||||
int upx_zlib_init(void);
|
||||
const char *upx_zlib_version_string(void);
|
||||
int upx_zlib_compress ( const upx_bytep src, unsigned src_len,
|
||||
upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb,
|
||||
upx_callback_t *cb,
|
||||
int method, int level,
|
||||
const upx_compress_config_t *cconf,
|
||||
upx_compress_result_t *cresult );
|
||||
@@ -145,13 +141,12 @@ unsigned upx_zlib_adler32(const void *buf, unsigned len, unsigned adler);
|
||||
unsigned upx_zlib_crc32 (const void *buf, unsigned len, unsigned crc);
|
||||
#endif
|
||||
|
||||
|
||||
#if (WITH_ZSTD)
|
||||
int upx_zstd_init(void);
|
||||
const char *upx_zstd_version_string(void);
|
||||
int upx_zstd_compress ( const upx_bytep src, unsigned src_len,
|
||||
upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb,
|
||||
upx_callback_t *cb,
|
||||
int method, int level,
|
||||
const upx_compress_config_t *cconf,
|
||||
upx_compress_result_t *cresult );
|
||||
@@ -167,7 +162,4 @@ int upx_zstd_test_overlap ( const upx_bytep buf,
|
||||
const upx_compress_result_t *cresult );
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* already included */
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
@@ -0,0 +1,211 @@
|
||||
/* compress_bzip2.cpp --
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
and/or modify them 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; see the file COPYING.
|
||||
If not, write to the Free Software Foundation, Inc.,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Markus F.X.J. Oberhumer
|
||||
<markus@oberhumer.com>
|
||||
*/
|
||||
|
||||
#include "../util/system_headers.h"
|
||||
#if WITH_BZIP2
|
||||
#include <bzip2/bzlib.h>
|
||||
#endif
|
||||
#include "../conf.h"
|
||||
|
||||
void bzip2_compress_config_t::reset() noexcept { mem_clear(this); }
|
||||
|
||||
#if WITH_BZIP2
|
||||
#include "compress.h"
|
||||
#include "../util/membuffer.h"
|
||||
|
||||
#if defined(BZ_NO_STDIO) || 1
|
||||
// we need to supply bz_internal_error() when building with BZ_NO_STDIO
|
||||
extern "C" {
|
||||
extern void bz_internal_error(int);
|
||||
void bz_internal_error(int errcode) { throwInternalError("bz_internal_error %d", errcode); }
|
||||
}
|
||||
#endif // BZ_NO_STDIO
|
||||
|
||||
static int convert_errno_from_bzip2(int r) {
|
||||
switch (r) {
|
||||
case BZ_OK:
|
||||
return UPX_E_OK;
|
||||
case BZ_MEM_ERROR:
|
||||
return UPX_E_OUT_OF_MEMORY;
|
||||
// TODO later: convert to UPX_E_INPUT_OVERRUN, UPX_E_OUTPUT_OVERRUN
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return UPX_E_ERROR;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
**************************************************************************/
|
||||
|
||||
int upx_bzip2_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_t *cb_parm, int method, int level,
|
||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||
assert(method == M_BZIP2);
|
||||
assert(level > 0);
|
||||
assert(cresult != nullptr);
|
||||
UNUSED(cb_parm);
|
||||
int r = UPX_E_ERROR;
|
||||
const bzip2_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_bzip2 : nullptr;
|
||||
bzip2_compress_result_t *const res = &cresult->result_bzip2;
|
||||
res->reset();
|
||||
|
||||
int blockSize100k = (src_len + 100000 - 1) / 100000;
|
||||
if (blockSize100k < 1)
|
||||
blockSize100k = 1;
|
||||
if (blockSize100k > 9)
|
||||
blockSize100k = 9;
|
||||
// idea for later: could enhance lcconf to allow setting blockSize100k
|
||||
UNUSED(lcconf);
|
||||
if (level <= 3 && blockSize100k > level)
|
||||
blockSize100k = level;
|
||||
|
||||
char *dest = (char *) dst;
|
||||
char *source = (char *) const_cast<byte *>(src);
|
||||
r = BZ2_bzBuffToBuffCompress(dest, dst_len, source, src_len, blockSize100k, 0, 0);
|
||||
return convert_errno_from_bzip2(r);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
**************************************************************************/
|
||||
|
||||
int upx_bzip2_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||
int method, const upx_compress_result_t *cresult) {
|
||||
assert(method == M_BZIP2);
|
||||
UNUSED(method);
|
||||
UNUSED(cresult);
|
||||
char *dest = (char *) dst;
|
||||
char *source = (char *) const_cast<byte *>(src);
|
||||
int small = 0;
|
||||
int r = BZ2_bzBuffToBuffDecompress(dest, dst_len, source, src_len, small, 0);
|
||||
return convert_errno_from_bzip2(r);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
// test_overlap - see <ucl/ucl.h> for semantics
|
||||
**************************************************************************/
|
||||
|
||||
int upx_bzip2_test_overlap(const upx_bytep buf, const upx_bytep tbuf, unsigned src_off,
|
||||
unsigned src_len, unsigned *dst_len, int method,
|
||||
const upx_compress_result_t *cresult) {
|
||||
assert(method == M_BZIP2);
|
||||
|
||||
MemBuffer b(src_off + src_len);
|
||||
memcpy(b + src_off, buf + src_off, src_len);
|
||||
unsigned saved_dst_len = *dst_len;
|
||||
int r = upx_bzip2_decompress(raw_index_bytes(b, src_off, src_len), src_len,
|
||||
raw_bytes(b, *dst_len), dst_len, method, cresult);
|
||||
if (r != UPX_E_OK)
|
||||
return r;
|
||||
if (*dst_len != saved_dst_len)
|
||||
return UPX_E_ERROR;
|
||||
// NOTE: there is a very tiny possibility that decompression has
|
||||
// succeeded but the data is not restored correctly because of
|
||||
// in-place buffer overlapping, so we use an extra memcmp().
|
||||
if (tbuf != nullptr && memcmp(tbuf, b, *dst_len) != 0)
|
||||
return UPX_E_ERROR;
|
||||
return UPX_E_OK;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
// misc
|
||||
**************************************************************************/
|
||||
|
||||
int upx_bzip2_init(void) { return 0; }
|
||||
|
||||
const char *upx_bzip2_version_string(void) { return BZ2_bzlibVersion(); }
|
||||
|
||||
/*************************************************************************
|
||||
// doctest checks
|
||||
**************************************************************************/
|
||||
|
||||
#if DEBUG && !defined(DOCTEST_CONFIG_DISABLE) && 1
|
||||
|
||||
static bool check_bzip2(const int method, const int level, const unsigned expected_c_len) {
|
||||
const unsigned u_len = 16384;
|
||||
const unsigned c_extra = 4096;
|
||||
MemBuffer u_buf, c_buf, d_buf;
|
||||
unsigned c_len, d_len;
|
||||
upx_compress_result_t cresult;
|
||||
int r;
|
||||
|
||||
u_buf.alloc(u_len);
|
||||
memset(u_buf, 0, u_len);
|
||||
c_buf.allocForCompression(u_len, c_extra);
|
||||
d_buf.allocForDecompression(u_len);
|
||||
|
||||
c_len = c_buf.getSize() - c_extra;
|
||||
r = upx_bzip2_compress(raw_bytes(u_buf, u_len), u_len, raw_index_bytes(c_buf, c_extra, c_len),
|
||||
&c_len, nullptr, method, level, NULL_cconf, &cresult);
|
||||
if (r != 0 || c_len != expected_c_len)
|
||||
return false;
|
||||
|
||||
d_len = d_buf.getSize();
|
||||
r = upx_bzip2_decompress(raw_index_bytes(c_buf, c_extra, c_len), c_len, raw_bytes(d_buf, d_len),
|
||||
&d_len, method, nullptr);
|
||||
if (r != 0 || d_len != u_len || memcmp(u_buf, d_buf, u_len) != 0)
|
||||
return false;
|
||||
|
||||
d_len = u_len - 1;
|
||||
r = upx_bzip2_decompress(raw_index_bytes(c_buf, c_extra, c_len), c_len, raw_bytes(d_buf, d_len),
|
||||
&d_len, method, nullptr);
|
||||
if (r == 0)
|
||||
return false;
|
||||
|
||||
// TODO: rewrite Packer::findOverlapOverhead() so that we can test it here
|
||||
// unsigned x_len = d_len;
|
||||
// r = upx_bzip2_test_overlap(c_buf, u_buf, c_extra, c_len, &x_len, method, nullptr);
|
||||
return true;
|
||||
}
|
||||
|
||||
TEST_CASE("compress_bzip2") { CHECK(check_bzip2(M_BZIP2, 9, 46)); }
|
||||
|
||||
#endif // DEBUG
|
||||
|
||||
TEST_CASE("upx_bzip2_decompress") {
|
||||
#if 0 // TODO later, see above
|
||||
const byte *c_data;
|
||||
byte d_buf[32];
|
||||
unsigned d_len;
|
||||
int r;
|
||||
|
||||
c_data = (const byte *) "\x28\xb5\x2f\xfd\x20\x20\x3d\x00\x00\x08\xff\x01\x00\x34\x4e\x08";
|
||||
d_len = 32;
|
||||
r = upx_bzip2_decompress(c_data, 16, d_buf, &d_len, M_BZIP2, nullptr);
|
||||
CHECK((r == 0 && d_len == 32));
|
||||
r = upx_bzip2_decompress(c_data, 15, d_buf, &d_len, M_BZIP2, nullptr);
|
||||
CHECK(r == UPX_E_INPUT_OVERRUN);
|
||||
d_len = 31;
|
||||
r = upx_bzip2_decompress(c_data, 16, d_buf, &d_len, M_BZIP2, nullptr);
|
||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||
UNUSED(r);
|
||||
#endif // TODO
|
||||
}
|
||||
|
||||
#endif // WITH_BZIP2
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -30,18 +30,13 @@
|
||||
|
||||
#if (ACC_CC_CLANG)
|
||||
#pragma clang diagnostic ignored "-Wshadow"
|
||||
#endif
|
||||
#if (ACC_CC_GNUC >= 0x040200)
|
||||
#elif (ACC_CC_GNUC >= 0x040200)
|
||||
#pragma GCC diagnostic ignored "-Wshadow"
|
||||
#endif
|
||||
#if (ACC_CC_MSC)
|
||||
#elif (ACC_CC_MSC)
|
||||
#pragma warning(disable : 4456) // -Wno-shadow
|
||||
#endif
|
||||
#if (ACC_CC_MSC && (_MSC_VER < 1900))
|
||||
#pragma warning(disable : 4127) // warning C4127: conditional expression is constant
|
||||
#endif
|
||||
|
||||
void lzma_compress_config_t::reset() {
|
||||
void lzma_compress_config_t::reset() noexcept {
|
||||
pos_bits.reset();
|
||||
lit_pos_bits.reset();
|
||||
lit_context_bits.reset();
|
||||
@@ -53,41 +48,15 @@ void lzma_compress_config_t::reset() {
|
||||
max_num_probs = 0;
|
||||
}
|
||||
|
||||
// INFO: the LZMA SDK is covered by a permissive license which allows
|
||||
// using unmodified LZMA source code in UPX and the UPX stubs.
|
||||
// See SPECIAL EXCEPTION below.
|
||||
// INFO: LZMA SDK is placed in the public domain.
|
||||
//
|
||||
// Quoting from lzma-4.43/lzma.txt:
|
||||
// Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
// distribute the original LZMA SDK code, either in source code form
|
||||
// or as a compiled binary, for any purpose, commercial or non-commercial,
|
||||
// and by any means.
|
||||
//
|
||||
// LICENSE
|
||||
// -------
|
||||
//
|
||||
// LZMA SDK is available under any of the following licenses:
|
||||
//
|
||||
// 1) GNU Lesser General Public License (GNU LGPL)
|
||||
// 2) Common Public License (CPL)
|
||||
// 3) Simplified license for unmodified code (read SPECIAL EXCEPTION)
|
||||
// 4) Proprietary license
|
||||
//
|
||||
// It means that you can select one of these four options and follow rules
|
||||
// of that license.
|
||||
//
|
||||
// 1,2) GNU LGPL and CPL licenses are pretty similar and both these
|
||||
// licenses are classified as
|
||||
// - "Free software licenses" at http://www.gnu.org/
|
||||
// - "OSI-approved" at http://www.opensource.org/
|
||||
//
|
||||
// 3) SPECIAL EXCEPTION
|
||||
//
|
||||
// Igor Pavlov, as the author of this code, expressly permits you
|
||||
// to statically or dynamically link your code (or bind by name)
|
||||
// to the files from LZMA SDK without subjecting your linked
|
||||
// code to the terms of the CPL or GNU LGPL.
|
||||
// Any modifications or additions to files from LZMA SDK, however,
|
||||
// are subject to the GNU LGPL or CPL terms.
|
||||
//
|
||||
// SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code,
|
||||
// while you keep LZMA SDK code unmodified.
|
||||
// https://www.7-zip.org/sdk.html
|
||||
// https://sourceforge.net/p/sevenzip/discussion/45797/thread/685169cf/
|
||||
|
||||
/*************************************************************************
|
||||
// compress defaults
|
||||
@@ -116,7 +85,7 @@ static bool prepare_result(lzma_compress_result_t *res, unsigned src_len, int me
|
||||
res->lit_context_bits = (method >> 8) & 15;
|
||||
}
|
||||
#if 0
|
||||
// DEBUG - set sizes so that we use a maxmimum amount of stack.
|
||||
// DEBUG - set sizes so that we use a maximum amount of stack.
|
||||
// These settings cause res->num_probs == 3147574, i.e. we will
|
||||
// need about 6 MiB of stack during runtime decompression.
|
||||
res->lit_pos_bits = 4;
|
||||
@@ -158,11 +127,11 @@ static bool prepare_result(lzma_compress_result_t *res, unsigned src_len, int me
|
||||
|
||||
// cconf overrides
|
||||
if (lcconf) {
|
||||
oassign(res->pos_bits, lcconf->pos_bits);
|
||||
oassign(res->lit_pos_bits, lcconf->lit_pos_bits);
|
||||
oassign(res->lit_context_bits, lcconf->lit_context_bits);
|
||||
oassign(res->dict_size, lcconf->dict_size);
|
||||
oassign(res->num_fast_bytes, lcconf->num_fast_bytes);
|
||||
upx::oassign(res->pos_bits, lcconf->pos_bits);
|
||||
upx::oassign(res->lit_pos_bits, lcconf->lit_pos_bits);
|
||||
upx::oassign(res->lit_context_bits, lcconf->lit_context_bits);
|
||||
upx::oassign(res->dict_size, lcconf->dict_size);
|
||||
upx::oassign(res->num_fast_bytes, lcconf->num_fast_bytes);
|
||||
}
|
||||
|
||||
// limit dictionary size
|
||||
@@ -194,8 +163,8 @@ static bool prepare_result(lzma_compress_result_t *res, unsigned src_len, int me
|
||||
lzma_compress_config_t::num_fast_bytes_t::assertValue(res->num_fast_bytes);
|
||||
|
||||
res->num_probs = 1846 + (768u << (res->lit_context_bits + res->lit_pos_bits));
|
||||
// printf("\nlzma_compress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits,
|
||||
// res->lit_context_bits, res->dict_size, res->num_probs);
|
||||
NO_printf("\nlzma_compress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits,
|
||||
res->lit_context_bits, res->dict_size, res->num_probs);
|
||||
return true;
|
||||
|
||||
error:
|
||||
@@ -206,14 +175,20 @@ error:
|
||||
// compress - cruft because of pseudo-COM layer
|
||||
**************************************************************************/
|
||||
|
||||
#if (ACC_CC_CLANG >= 0x080000)
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#elif (ACC_CC_GNUC >= 0x040700)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#endif
|
||||
|
||||
#undef MSDOS
|
||||
#undef OS2
|
||||
#undef _WIN32
|
||||
#undef _WIN32_WCE
|
||||
#undef COMPRESS_MF_MT
|
||||
#undef _NO_EXCEPTIONS
|
||||
#undef NULL
|
||||
#define NULL nullptr
|
||||
#include <lzma-sdk/C/Common/MyInitGuid.h>
|
||||
// #include <lzma-sdk/C/7zip/Compress/LZMA/LZMADecoder.h>
|
||||
#include <lzma-sdk/C/7zip/Compress/LZMA/LZMAEncoder.h>
|
||||
@@ -284,7 +259,7 @@ struct ProgressInfo final : public ICompressProgressInfo, public CMyUnknownImp {
|
||||
virtual ~ProgressInfo() {}
|
||||
MY_UNKNOWN_IMP
|
||||
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) override;
|
||||
upx_callback_p cb = nullptr;
|
||||
upx_callback_t *cb = nullptr;
|
||||
};
|
||||
|
||||
STDMETHODIMP ProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) {
|
||||
@@ -307,8 +282,14 @@ STDMETHODIMP ProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outS
|
||||
#include <lzma-sdk/C/7zip/Compress/RangeCoder/RangeCoderBit.cpp>
|
||||
#undef RC_NORMALIZE
|
||||
|
||||
#if (ACC_CC_CLANG >= 0x080000)
|
||||
#pragma clang diagnostic pop
|
||||
#elif (ACC_CC_GNUC >= 0x040700)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb, int method, int level,
|
||||
upx_callback_t *cb, int method, int level,
|
||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||
assert(M_IS_LZMA(method));
|
||||
assert(level > 0);
|
||||
@@ -318,6 +299,7 @@ int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
HRESULT rh;
|
||||
const lzma_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_lzma : nullptr;
|
||||
lzma_compress_result_t *const res = &cresult->result_lzma;
|
||||
res->reset();
|
||||
|
||||
MyLzma::InStream is;
|
||||
is.AddRef();
|
||||
@@ -330,7 +312,8 @@ int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
progress.cb = cb; // progress.Init()
|
||||
|
||||
NCompress::NLZMA::CEncoder enc;
|
||||
const PROPID propIDs[8] = {
|
||||
constexpr unsigned NPROPS = 8;
|
||||
static const PROPID propIDs[NPROPS] = {
|
||||
NCoderPropID::kPosStateBits, // 0 pb _posStateBits(2)
|
||||
NCoderPropID::kLitPosBits, // 1 lp _numLiteralPosStateBits(0)
|
||||
NCoderPropID::kLitContextBits, // 2 lc _numLiteralContextBits(3)
|
||||
@@ -340,8 +323,7 @@ int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
NCoderPropID::kMatchFinderCycles, // 6 mfc _matchFinderCycles, _cutValue
|
||||
NCoderPropID::kMatchFinder // 7 mf
|
||||
};
|
||||
PROPVARIANT pr[8];
|
||||
const unsigned nprops = 8;
|
||||
PROPVARIANT pr[NPROPS];
|
||||
if (!prepare_result(res, src_len, method, level, lcconf))
|
||||
goto error;
|
||||
pr[0].vt = pr[1].vt = pr[2].vt = pr[3].vt = pr[4].vt = pr[5].vt = pr[6].vt = VT_UI4;
|
||||
@@ -358,7 +340,7 @@ int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
pr[7].bstrVal = ACC_PCAST(BSTR, ACC_UNCONST_CAST(wchar_t *, matchfinder));
|
||||
|
||||
try {
|
||||
if (enc.SetCoderProperties(propIDs, pr, nprops) != S_OK)
|
||||
if (enc.SetCoderProperties(propIDs, pr, NPROPS) != S_OK)
|
||||
goto error;
|
||||
// encode properties in LZMA-style (5 bytes)
|
||||
if (enc.WriteCoderProperties(&os) != S_OK)
|
||||
@@ -375,7 +357,7 @@ int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
// UPX extra stuff in first byte: 5 high bits convenience for stub decompressor
|
||||
unsigned t = res->lit_context_bits + res->lit_pos_bits;
|
||||
os.WriteByte(Byte((t << 3) | res->pos_bits));
|
||||
os.WriteByte(Byte((res->lit_pos_bits << 4) | (res->lit_context_bits)));
|
||||
os.WriteByte(Byte((res->lit_pos_bits << 4) | res->lit_context_bits));
|
||||
|
||||
// compress
|
||||
rh = enc.Code(&is, &os, nullptr, nullptr, &progress);
|
||||
@@ -399,10 +381,10 @@ int upx_lzma_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
|
||||
error:
|
||||
*dst_len = (unsigned) os.b_pos;
|
||||
// printf("\nlzma_compress: %d: %u %u %u %u %u, %u - > %u\n", r, res->pos_bits,
|
||||
// res->lit_pos_bits,
|
||||
// res->lit_context_bits, res->dict_size, res->num_probs, src_len, *dst_len);
|
||||
// printf("%u %u %u\n", is.__m_RefCount, os.__m_RefCount, progress.__m_RefCount);
|
||||
NO_printf("\nlzma_compress: %d: %u %u %u %u %u, %u - > %u\n", r, res->pos_bits,
|
||||
res->lit_pos_bits, res->lit_context_bits, res->dict_size, res->num_probs, src_len,
|
||||
*dst_len);
|
||||
NO_printf("%u %u %u\n", is.__m_RefCount, os.__m_RefCount, progress.__m_RefCount);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -426,7 +408,7 @@ int upx_lzma_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, un
|
||||
COMPILE_TIME_ASSERT(LZMA_LIT_SIZE == 768)
|
||||
|
||||
CLzmaDecoderState s;
|
||||
memset(&s, 0, sizeof(s));
|
||||
mem_clear(&s);
|
||||
SizeT src_out = 0, dst_out = 0;
|
||||
int r = UPX_E_ERROR;
|
||||
int rh;
|
||||
@@ -458,8 +440,8 @@ int upx_lzma_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, un
|
||||
assert(cresult->result_lzma.lit_context_bits == (unsigned) s.Properties.lc);
|
||||
assert(cresult->result_lzma.num_probs == (unsigned) LzmaGetNumProbs(&s.Properties));
|
||||
const lzma_compress_result_t *res = &cresult->result_lzma;
|
||||
// printf("\nlzma_decompress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits,
|
||||
// res->lit_context_bits, res->dict_size, res->num_probs);
|
||||
NO_printf("\nlzma_decompress config: %u %u %u %u %u\n", res->pos_bits, res->lit_pos_bits,
|
||||
res->lit_context_bits, res->dict_size, res->num_probs);
|
||||
UNUSED(res);
|
||||
}
|
||||
s.Probs = (CProb *) malloc(sizeof(CProb) * LzmaGetNumProbs(&s.Properties));
|
||||
@@ -524,13 +506,12 @@ const char *upx_lzma_version_string(void) { return "4.43"; }
|
||||
**************************************************************************/
|
||||
|
||||
TEST_CASE("upx_lzma_decompress") {
|
||||
typedef const upx_byte C;
|
||||
C *c_data;
|
||||
upx_byte d_buf[16];
|
||||
const byte *c_data;
|
||||
byte d_buf[16];
|
||||
unsigned d_len;
|
||||
int r;
|
||||
|
||||
c_data = (C *) "\x1a\x03\x00\x7f\xed\x3c\x00\x00\x00";
|
||||
c_data = (const byte *) "\x1a\x03\x00\x7f\xed\x3c\x00\x00\x00";
|
||||
d_len = 16;
|
||||
r = upx_lzma_decompress(c_data, 9, d_buf, &d_len, M_LZMA, nullptr);
|
||||
CHECK((r == 0 && d_len == 16));
|
||||
@@ -539,6 +520,7 @@ TEST_CASE("upx_lzma_decompress") {
|
||||
d_len = 15;
|
||||
r = upx_lzma_decompress(c_data, 9, d_buf, &d_len, M_LZMA, nullptr);
|
||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||
UNUSED(r);
|
||||
}
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -56,6 +56,8 @@ static int convert_errno_from_ucl(int r) {
|
||||
// UCL extra:
|
||||
case UCL_E_OVERLAP_OVERRUN:
|
||||
return UPX_E_ERROR;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return UPX_E_ERROR;
|
||||
}
|
||||
@@ -64,7 +66,7 @@ extern "C" {
|
||||
static void __UCL_CDECL wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, ucl_voidp user) {
|
||||
if (state != -1 && state != 3)
|
||||
return;
|
||||
upx_callback_p cb = (upx_callback_p) user;
|
||||
upx_callback_t *cb = (upx_callback_t *) user;
|
||||
if (cb && cb->nprogress)
|
||||
cb->nprogress(cb, a, b);
|
||||
}
|
||||
@@ -75,7 +77,7 @@ static void __UCL_CDECL wrap_nprogress_ucl(ucl_uint a, ucl_uint b, int state, uc
|
||||
**************************************************************************/
|
||||
|
||||
int upx_ucl_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb_parm, int method, int level,
|
||||
upx_callback_t *cb_parm, int method, int level,
|
||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||
int r;
|
||||
assert(level > 0);
|
||||
@@ -113,14 +115,14 @@ int upx_ucl_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsig
|
||||
cconf.bb_endian = 0;
|
||||
cconf.bb_size = 0;
|
||||
if (method >= M_NRV2B_LE32 && method <= M_NRV2E_LE16) {
|
||||
static const unsigned char sizes[3] = {32, 8, 16};
|
||||
static const upx_uint8_t sizes[3] = {32, 8, 16};
|
||||
cconf.bb_size = sizes[(method - M_NRV2B_LE32) % 3];
|
||||
} else {
|
||||
throwInternalError("unknown compression method");
|
||||
return UPX_E_ERROR;
|
||||
}
|
||||
|
||||
// optimize compression parms
|
||||
// optimize compression params
|
||||
if (level <= 3 && cconf.max_offset == UCL_UINT_MAX)
|
||||
cconf.max_offset = 8 * 1024 - 1;
|
||||
else if (level == 4 && cconf.max_offset == UCL_UINT_MAX)
|
||||
@@ -241,13 +243,18 @@ int upx_ucl_test_overlap(const upx_bytep buf, const upx_bytep tbuf, unsigned src
|
||||
**************************************************************************/
|
||||
|
||||
extern "C" {
|
||||
static ucl_voidp __UCL_CDECL my_malloc(ucl_uint n) { return calloc(1, n); }
|
||||
static ucl_voidp __UCL_CDECL my_malloc(ucl_uint n) { return upx_calloc(n, 1); }
|
||||
static void __UCL_CDECL my_free(ucl_voidp p) { free(p); }
|
||||
}
|
||||
} // extern "C"
|
||||
|
||||
int upx_ucl_init(void) {
|
||||
#if 1 && (ACC_CC_MSC && ACC_ARCH_I386) && (_MSC_VER >= 1940)
|
||||
// @COMPILER_BUG @MSVC_BUG
|
||||
(void) ucl_init();
|
||||
#else
|
||||
if (ucl_init() != UCL_E_OK)
|
||||
return -1;
|
||||
#endif
|
||||
if (UCL_VERSION != ucl_version() || strcmp(UCL_VERSION_STRING, ucl_version_string()) != 0)
|
||||
return -2;
|
||||
ucl_set_malloc_hooks(my_malloc, my_free);
|
||||
@@ -327,13 +334,12 @@ TEST_CASE("compress_ucl") {
|
||||
#endif // DEBUG
|
||||
|
||||
TEST_CASE("upx_ucl_decompress") {
|
||||
typedef const upx_byte C;
|
||||
C *c_data;
|
||||
upx_byte d_buf[16];
|
||||
const byte *c_data;
|
||||
byte d_buf[16];
|
||||
unsigned d_len;
|
||||
int r;
|
||||
|
||||
c_data = (C *) "\x92\xff\x10\x00\x00\x00\x00\x00\x48\xff";
|
||||
c_data = (const byte *) "\x92\xff\x10\x00\x00\x00\x00\x00\x48\xff";
|
||||
d_len = 16;
|
||||
r = upx_ucl_decompress(c_data, 10, d_buf, &d_len, M_NRV2B_8, nullptr);
|
||||
CHECK((r == 0 && d_len == 16));
|
||||
@@ -343,7 +349,7 @@ TEST_CASE("upx_ucl_decompress") {
|
||||
r = upx_ucl_decompress(c_data, 10, d_buf, &d_len, M_NRV2B_8, nullptr);
|
||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||
|
||||
c_data = (C *) "\x92\xff\x10\x92\x49\x24\x92\xa0\xff";
|
||||
c_data = (const byte *) "\x92\xff\x10\x92\x49\x24\x92\xa0\xff";
|
||||
d_len = 16;
|
||||
r = upx_ucl_decompress(c_data, 9, d_buf, &d_len, M_NRV2D_8, nullptr);
|
||||
CHECK((r == 0 && d_len == 16));
|
||||
@@ -353,7 +359,7 @@ TEST_CASE("upx_ucl_decompress") {
|
||||
r = upx_ucl_decompress(c_data, 9, d_buf, &d_len, M_NRV2D_8, nullptr);
|
||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||
|
||||
c_data = (C *) "\x90\xff\xb0\x92\x49\x24\x92\xa0\xff";
|
||||
c_data = (const byte *) "\x90\xff\xb0\x92\x49\x24\x92\xa0\xff";
|
||||
d_len = 16;
|
||||
r = upx_ucl_decompress(c_data, 9, d_buf, &d_len, M_NRV2E_8, nullptr);
|
||||
CHECK((r == 0 && d_len == 16));
|
||||
@@ -362,6 +368,7 @@ TEST_CASE("upx_ucl_decompress") {
|
||||
d_len = 15;
|
||||
r = upx_ucl_decompress(c_data, 9, d_buf, &d_len, M_NRV2E_8, nullptr);
|
||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||
UNUSED(r);
|
||||
}
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -25,19 +25,23 @@
|
||||
*/
|
||||
|
||||
#include "../conf.h"
|
||||
#include "compress.h"
|
||||
#include "../util/membuffer.h"
|
||||
#include <zlib/zlib.h>
|
||||
#include <zlib/deflate.h>
|
||||
|
||||
void zlib_compress_config_t::reset() {
|
||||
mem_clear(this, sizeof(*this));
|
||||
|
||||
void zlib_compress_config_t::reset() noexcept {
|
||||
mem_clear(this);
|
||||
mem_level.reset();
|
||||
window_bits.reset();
|
||||
strategy.reset();
|
||||
}
|
||||
|
||||
#if WITH_ZLIB
|
||||
#include "compress.h"
|
||||
#include "../util/membuffer.h"
|
||||
// NOLINTBEGIN(clang-analyzer-optin.performance.Padding)
|
||||
#define ZLIB_CONST 1
|
||||
#include <zlib/zlib.h>
|
||||
#include <zlib/deflate.h>
|
||||
// NOLINTEND(clang-analyzer-optin.performance.Padding)
|
||||
|
||||
static int convert_errno_from_zlib(int zr) {
|
||||
switch (zr) {
|
||||
case Z_OK:
|
||||
@@ -62,6 +66,8 @@ static int convert_errno_from_zlib(int zr) {
|
||||
return UPX_E_ERROR;
|
||||
case -7: // UPX extra
|
||||
return UPX_E_INPUT_OVERRUN;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return UPX_E_ERROR;
|
||||
}
|
||||
@@ -71,7 +77,7 @@ static int convert_errno_from_zlib(int zr) {
|
||||
**************************************************************************/
|
||||
|
||||
int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb_parm, int method, int level,
|
||||
upx_callback_t *cb_parm, int method, int level,
|
||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||
assert(method == M_DEFLATE);
|
||||
assert(level > 0);
|
||||
@@ -81,6 +87,7 @@ int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
int zr;
|
||||
const zlib_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_zlib : nullptr;
|
||||
zlib_compress_result_t *const res = &cresult->result_zlib;
|
||||
res->reset();
|
||||
|
||||
if (level == 10)
|
||||
level = 9;
|
||||
@@ -90,17 +97,15 @@ int upx_zlib_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
zlib_compress_config_t::strategy_t strategy;
|
||||
// cconf overrides
|
||||
if (lcconf) {
|
||||
oassign(mem_level, lcconf->mem_level);
|
||||
oassign(window_bits, lcconf->window_bits);
|
||||
oassign(strategy, lcconf->strategy);
|
||||
upx::oassign(mem_level, lcconf->mem_level);
|
||||
upx::oassign(window_bits, lcconf->window_bits);
|
||||
upx::oassign(strategy, lcconf->strategy);
|
||||
}
|
||||
|
||||
res->dummy = 0;
|
||||
|
||||
z_stream s;
|
||||
s.zalloc = (alloc_func) nullptr;
|
||||
s.zfree = (free_func) nullptr;
|
||||
s.next_in = ACC_UNCONST_CAST(upx_bytep, src);
|
||||
s.next_in = src;
|
||||
s.avail_in = src_len;
|
||||
s.next_out = dst;
|
||||
s.avail_out = *dst_len;
|
||||
@@ -149,7 +154,7 @@ int upx_zlib_decompress(const upx_bytep src, unsigned src_len, upx_bytep dst, un
|
||||
z_stream s;
|
||||
s.zalloc = (alloc_func) nullptr;
|
||||
s.zfree = (free_func) nullptr;
|
||||
s.next_in = ACC_UNCONST_CAST(upx_bytep, src);
|
||||
s.next_in = src;
|
||||
s.avail_in = src_len;
|
||||
s.next_out = dst;
|
||||
s.avail_out = *dst_len;
|
||||
@@ -287,13 +292,12 @@ TEST_CASE("compress_zlib") {
|
||||
#endif // DEBUG
|
||||
|
||||
TEST_CASE("upx_zlib_decompress") {
|
||||
typedef const upx_byte C;
|
||||
C *c_data;
|
||||
upx_byte d_buf[16];
|
||||
const byte *c_data;
|
||||
byte d_buf[16];
|
||||
unsigned d_len;
|
||||
int r;
|
||||
|
||||
c_data = (C *) "\xfb\xff\x1f\x15\x00\x00";
|
||||
c_data = (const byte *) "\xfb\xff\x1f\x15\x00\x00";
|
||||
d_len = 16;
|
||||
r = upx_zlib_decompress(c_data, 6, d_buf, &d_len, M_DEFLATE, nullptr);
|
||||
CHECK((r == 0 && d_len == 16));
|
||||
@@ -302,6 +306,9 @@ TEST_CASE("upx_zlib_decompress") {
|
||||
d_len = 15;
|
||||
r = upx_zlib_decompress(c_data, 6, d_buf, &d_len, M_DEFLATE, nullptr);
|
||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||
UNUSED(r);
|
||||
}
|
||||
|
||||
#endif // WITH_ZLIB
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -24,16 +24,19 @@
|
||||
<markus@oberhumer.com>
|
||||
*/
|
||||
|
||||
#include "../util/system_headers.h"
|
||||
#if WITH_ZSTD
|
||||
#include <zstd/lib/zstd.h>
|
||||
#include <zstd/lib/zstd_errors.h>
|
||||
#include <zstd/lib/compress/hist.h>
|
||||
#endif
|
||||
#include "../conf.h"
|
||||
|
||||
void zstd_compress_config_t::reset() { mem_clear(this, sizeof(*this)); }
|
||||
void zstd_compress_config_t::reset() noexcept { mem_clear(this); }
|
||||
|
||||
#if WITH_ZSTD
|
||||
#include "compress.h"
|
||||
#include "../util/membuffer.h"
|
||||
#include <zstd/lib/zstd.h>
|
||||
#include <zstd/lib/zstd_errors.h>
|
||||
#include <zstd/lib/compress/hist.h>
|
||||
|
||||
static int convert_errno_from_zstd(size_t zr) {
|
||||
const ZSTD_ErrorCode ze = ZSTD_getErrorCode(zr);
|
||||
@@ -55,7 +58,7 @@ static int convert_errno_from_zstd(size_t zr) {
|
||||
**************************************************************************/
|
||||
|
||||
int upx_zstd_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsigned *dst_len,
|
||||
upx_callback_p cb_parm, int method, int level,
|
||||
upx_callback_t *cb_parm, int method, int level,
|
||||
const upx_compress_config_t *cconf_parm, upx_compress_result_t *cresult) {
|
||||
assert(method == M_ZSTD);
|
||||
assert(level > 0);
|
||||
@@ -65,6 +68,7 @@ int upx_zstd_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
size_t zr;
|
||||
const zstd_compress_config_t *const lcconf = cconf_parm ? &cconf_parm->conf_zstd : nullptr;
|
||||
zstd_compress_result_t *const res = &cresult->result_zstd;
|
||||
res->reset();
|
||||
|
||||
// TODO later: map level 1..10 to zstd-level 1..22
|
||||
if (level == 10)
|
||||
@@ -75,8 +79,6 @@ int upx_zstd_compress(const upx_bytep src, unsigned src_len, upx_bytep dst, unsi
|
||||
UNUSED(lcconf);
|
||||
}
|
||||
|
||||
res->dummy = 0;
|
||||
|
||||
zr = ZSTD_compress(dst, *dst_len, src, src_len, level);
|
||||
if (ZSTD_isError(zr)) {
|
||||
*dst_len = 0; // TODO ???
|
||||
@@ -207,13 +209,12 @@ TEST_CASE("compress_zstd") {
|
||||
#endif // DEBUG
|
||||
|
||||
TEST_CASE("upx_zstd_decompress") {
|
||||
typedef const upx_byte C;
|
||||
C *c_data;
|
||||
upx_byte d_buf[32];
|
||||
const byte *c_data;
|
||||
byte d_buf[32];
|
||||
unsigned d_len;
|
||||
int r;
|
||||
|
||||
c_data = (C *) "\x28\xb5\x2f\xfd\x20\x20\x3d\x00\x00\x08\xff\x01\x00\x34\x4e\x08";
|
||||
c_data = (const byte *) "\x28\xb5\x2f\xfd\x20\x20\x3d\x00\x00\x08\xff\x01\x00\x34\x4e\x08";
|
||||
d_len = 32;
|
||||
r = upx_zstd_decompress(c_data, 16, d_buf, &d_len, M_ZSTD, nullptr);
|
||||
CHECK((r == 0 && d_len == 32));
|
||||
@@ -222,6 +223,7 @@ TEST_CASE("upx_zstd_decompress") {
|
||||
d_len = 31;
|
||||
r = upx_zstd_decompress(c_data, 16, d_buf, &d_len, M_ZSTD, nullptr);
|
||||
CHECK(r == UPX_E_OUTPUT_OVERRUN);
|
||||
UNUSED(r);
|
||||
}
|
||||
|
||||
#endif // WITH_ZSTD
|
||||
|
||||
+375
-393
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
|
||||
+27
-20
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -25,10 +25,19 @@
|
||||
<markus@oberhumer.com> <ezerotven+github@gmail.com>
|
||||
*/
|
||||
|
||||
#define WANT_WINDOWS_LEAN_H 1
|
||||
#include "../util/system_headers.h"
|
||||
#if (HAVE_CONIO_H)
|
||||
#include <conio.h>
|
||||
#endif
|
||||
#include "../conf.h"
|
||||
|
||||
#if (USE_SCREEN_WIN32)
|
||||
|
||||
/*************************************************************************
|
||||
// direct screen access
|
||||
**************************************************************************/
|
||||
|
||||
#include "screen.h"
|
||||
|
||||
#define this self
|
||||
@@ -36,24 +45,6 @@
|
||||
#define mask_fg 0x0f
|
||||
#define mask_bg 0xf0
|
||||
|
||||
/*************************************************************************
|
||||
// direct screen access
|
||||
**************************************************************************/
|
||||
|
||||
#if (ACC_CC_MSC && (_MSC_VER >= 1000 && _MSC_VER < 1200))
|
||||
/* avoid -W4 warnings in <conio.h> */
|
||||
#pragma warning(disable : 4032)
|
||||
/* avoid -W4 warnings in <windows.h> */
|
||||
#pragma warning(disable : 4201 4214 4514)
|
||||
#endif
|
||||
#if defined(__RSXNT__)
|
||||
#define timeval win32_timeval /* struct timeval already in <sys/time.h> */
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#if (HAVE_CONIO_H)
|
||||
#include <conio.h>
|
||||
#endif
|
||||
|
||||
struct screen_data_t {
|
||||
HANDLE hi;
|
||||
HANDLE ho;
|
||||
@@ -266,6 +257,22 @@ static int init(screen_t *this, int fd) {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
// check if we are running under Wine
|
||||
// (this rather direct Win32 screen driver maps poorly to Unix terminals)
|
||||
// ntdll.dll wine_get_version() was added in wine-0.9.59 (Apr 2008)
|
||||
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
|
||||
if (ntdll != nullptr) {
|
||||
typedef const char *(CDECL * wine_get_version_func_t)(void);
|
||||
wine_get_version_func_t wine_get_version;
|
||||
wine_get_version =
|
||||
(wine_get_version_func_t) (void *) GetProcAddress(ntdll, "wine_get_version");
|
||||
if (wine_get_version != nullptr) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
this->data->cursor_x = csbi->dwCursorPosition.X;
|
||||
this->data->cursor_y = csbi->dwCursorPosition.Y;
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -26,8 +26,6 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef UPX_SCREEN_H__
|
||||
#define UPX_SCREEN_H__ 1
|
||||
|
||||
#if (USE_SCREEN)
|
||||
|
||||
@@ -100,6 +98,4 @@ void screen_show_frames(screen_t *);
|
||||
|
||||
#endif /* USE_SCREEN */
|
||||
|
||||
#endif /* already included */
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
+75
-23
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -31,39 +31,41 @@
|
||||
//
|
||||
**************************************************************************/
|
||||
|
||||
unsigned long Throwable::counter = 0;
|
||||
/*static*/ Throwable::Stats Throwable::stats;
|
||||
|
||||
Throwable::Throwable(const char *m, int e, bool w) noexcept : super(),
|
||||
msg(nullptr),
|
||||
err(e),
|
||||
is_warning(w) {
|
||||
if (m)
|
||||
if (m != nullptr) {
|
||||
msg = strdup(m);
|
||||
#if 0
|
||||
fprintf(stderr, "construct exception: %s %lu\n", msg, counter);
|
||||
counter++;
|
||||
#endif
|
||||
assert_noexcept(msg != nullptr);
|
||||
}
|
||||
NO_fprintf(stderr, "construct exception: %zu %zu %s\n", size_t(stats.counter_current),
|
||||
size_t(stats.counter_total), (const char *) msg);
|
||||
stats.counter_current += 1;
|
||||
stats.counter_total += 1;
|
||||
}
|
||||
|
||||
Throwable::Throwable(const Throwable &other) noexcept : super(other),
|
||||
msg(nullptr),
|
||||
err(other.err),
|
||||
is_warning(other.is_warning) {
|
||||
if (other.msg)
|
||||
if (other.msg != nullptr) {
|
||||
msg = strdup(other.msg);
|
||||
#if 0
|
||||
fprintf(stderr, "copy exception: %s %lu\n", msg, counter);
|
||||
counter++;
|
||||
#endif
|
||||
assert_noexcept(msg != nullptr);
|
||||
}
|
||||
NO_fprintf(stderr, "copy construct exception: %zu %zu %s\n", size_t(stats.counter_current),
|
||||
size_t(stats.counter_total), (const char *) msg);
|
||||
stats.counter_current += 1;
|
||||
stats.counter_total += 1;
|
||||
}
|
||||
|
||||
Throwable::~Throwable() noexcept {
|
||||
#if 0
|
||||
counter--;
|
||||
fprintf(stderr, "destruct exception: %s %lu\n", msg, counter);
|
||||
#endif
|
||||
if (msg)
|
||||
free(msg);
|
||||
stats.counter_current -= 1;
|
||||
NO_fprintf(stderr, "destruct exception: %zu %zu %s\n", size_t(stats.counter_current),
|
||||
size_t(stats.counter_total), (const char *) msg);
|
||||
upx::owner_free(msg);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
@@ -72,7 +74,9 @@ Throwable::~Throwable() noexcept {
|
||||
|
||||
void throwCantPack(const char *msg) {
|
||||
// UGLY, but makes things easier
|
||||
if (opt->cmd == CMD_COMPRESS)
|
||||
if (opt->cmd == CMD_NONE)
|
||||
throw CantPackException(msg);
|
||||
else if (opt->cmd == CMD_COMPRESS)
|
||||
throw CantPackException(msg);
|
||||
else if (opt->cmd == CMD_FILEINFO)
|
||||
throw CantPackException(msg);
|
||||
@@ -140,10 +144,58 @@ void throwEOFException(const char *msg, int e) {
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
// varargs overloads
|
||||
**************************************************************************/
|
||||
|
||||
const char *prettyName(const char *n) noexcept {
|
||||
template <>
|
||||
void throwCantPack(const char *format, ...) {
|
||||
char msg[1024];
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||
va_end(ap);
|
||||
throwCantPack(msg);
|
||||
}
|
||||
|
||||
template <>
|
||||
void throwCantUnpack(const char *format, ...) {
|
||||
char msg[1024];
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||
va_end(ap);
|
||||
throwCantUnpack(msg);
|
||||
}
|
||||
|
||||
template <>
|
||||
void throwInternalError(const char *format, ...) {
|
||||
char msg[1024];
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
upx_safe_vsnprintf_noexcept(msg, sizeof(msg), format, ap);
|
||||
va_end(ap);
|
||||
throwInternalError(msg);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
// util
|
||||
**************************************************************************/
|
||||
|
||||
void assertFailed(const char *expr, const char *file, int line, const char *func) noexcept {
|
||||
fflush(stdout);
|
||||
fprintf(stderr, "Assertion failed: %s (%s: %s: %d)\n", expr, file, func, line);
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
void throwAssertFailed(const char *expr, const char *file, int line, const char *func) {
|
||||
if (opt->debug.debug_level >= 1) {
|
||||
throwCantPack("corrupted file; details: %s (%s: %s: %d)", expr, file, func, line);
|
||||
} else {
|
||||
throwCantPack("corrupted file; try '--debug' for more details");
|
||||
}
|
||||
}
|
||||
|
||||
const char *prettyExceptionName(const char *n) noexcept {
|
||||
if (n == nullptr)
|
||||
return "(null)";
|
||||
while (*n) {
|
||||
@@ -151,7 +203,7 @@ const char *prettyName(const char *n) noexcept {
|
||||
n++;
|
||||
else if (*n == ' ')
|
||||
n++;
|
||||
else if (strncmp(n, "class ", 6) == 0) // Visual C++
|
||||
else if (strncmp(n, "class ", 6) == 0) // Visual C++ (MSVC)
|
||||
n += 6;
|
||||
else
|
||||
break;
|
||||
|
||||
+61
-71
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -26,12 +26,6 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef UPX_EXCEPT_H__
|
||||
#define UPX_EXCEPT_H__ 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
const char *prettyName(const char *n) noexcept;
|
||||
|
||||
/*************************************************************************
|
||||
// exceptions
|
||||
@@ -44,33 +38,40 @@ protected:
|
||||
Throwable(const char *m = nullptr, int e = 0, bool w = false) noexcept;
|
||||
|
||||
public:
|
||||
Throwable(const Throwable &) noexcept;
|
||||
Throwable(const Throwable &) noexcept; // copy constructor
|
||||
virtual ~Throwable() noexcept;
|
||||
const char *getMsg() const noexcept { return msg; }
|
||||
int getErrno() const noexcept { return err; }
|
||||
bool isWarning() const noexcept { return is_warning; }
|
||||
|
||||
private:
|
||||
char *msg = nullptr;
|
||||
OwningPointer(char) msg = nullptr;
|
||||
int err = 0;
|
||||
|
||||
protected:
|
||||
bool is_warning = false; // can be set by subclasses
|
||||
|
||||
private:
|
||||
// disable assignment
|
||||
Throwable &operator=(const Throwable &) = delete;
|
||||
// disable copy assignment and move
|
||||
Throwable &operator=(const Throwable &) noexcept DELETED_FUNCTION; // copy assignment
|
||||
UPX_CXX_DISABLE_MOVE(Throwable)
|
||||
// disable dynamic allocation => force throwing by value
|
||||
ACC_CXX_DISABLE_NEW_DELETE
|
||||
UPX_CXX_DISABLE_NEW_DELETE(Throwable)
|
||||
// disable taking the address => force passing by reference
|
||||
// [I'm not too sure about this design decision, but we can always allow it if needed]
|
||||
UPX_CXX_DISABLE_ADDRESS(Throwable)
|
||||
|
||||
private:
|
||||
static unsigned long counter; // for debugging
|
||||
// static debug stats
|
||||
struct Stats {
|
||||
upx_std_atomic(size_t) counter_total;
|
||||
upx_std_atomic(size_t) counter_current;
|
||||
};
|
||||
static Stats stats;
|
||||
};
|
||||
|
||||
// Exceptions can/should be caught
|
||||
class Exception : public Throwable {
|
||||
typedef Throwable super;
|
||||
|
||||
public:
|
||||
Exception(const char *m = nullptr, int e = 0, bool w = false) noexcept : super(m, e, w) {}
|
||||
};
|
||||
@@ -78,46 +79,40 @@ public:
|
||||
// Errors should not be caught (or re-thrown)
|
||||
class Error : public Throwable {
|
||||
typedef Throwable super;
|
||||
|
||||
public:
|
||||
Error(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
// system exception
|
||||
// system exceptions
|
||||
**************************************************************************/
|
||||
|
||||
class OutOfMemoryException : public Exception {
|
||||
class OutOfMemoryException final : public Exception {
|
||||
typedef Exception super;
|
||||
|
||||
public:
|
||||
OutOfMemoryException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||
};
|
||||
|
||||
class IOException : public Exception {
|
||||
class IOException /*not_final*/ : public Exception {
|
||||
typedef Exception super;
|
||||
|
||||
public:
|
||||
IOException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||
};
|
||||
|
||||
class EOFException : public IOException {
|
||||
class EOFException final : public IOException {
|
||||
typedef IOException super;
|
||||
|
||||
public:
|
||||
EOFException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||
};
|
||||
|
||||
class FileNotFoundException : public IOException {
|
||||
class FileNotFoundException final : public IOException {
|
||||
typedef IOException super;
|
||||
|
||||
public:
|
||||
FileNotFoundException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||
};
|
||||
|
||||
class FileAlreadyExistsException : public IOException {
|
||||
class FileAlreadyExistsException final : public IOException {
|
||||
typedef IOException super;
|
||||
|
||||
public:
|
||||
FileAlreadyExistsException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||
};
|
||||
@@ -126,52 +121,45 @@ public:
|
||||
// application exceptions
|
||||
**************************************************************************/
|
||||
|
||||
class OverlayException : public Exception {
|
||||
class OverlayException final : public Exception {
|
||||
typedef Exception super;
|
||||
|
||||
public:
|
||||
OverlayException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
||||
};
|
||||
|
||||
class CantPackException : public Exception {
|
||||
class CantPackException /*not_final*/ : public Exception {
|
||||
typedef Exception super;
|
||||
|
||||
public:
|
||||
CantPackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
||||
};
|
||||
|
||||
class UnknownExecutableFormatException : public CantPackException {
|
||||
class UnknownExecutableFormatException final : public CantPackException {
|
||||
typedef CantPackException super;
|
||||
|
||||
public:
|
||||
UnknownExecutableFormatException(const char *m = nullptr, bool w = false) noexcept
|
||||
: super(m, w) {}
|
||||
};
|
||||
|
||||
class AlreadyPackedException : public CantPackException {
|
||||
class AlreadyPackedException final : public CantPackException {
|
||||
typedef CantPackException super;
|
||||
|
||||
public:
|
||||
AlreadyPackedException(const char *m = nullptr) noexcept : super(m) { is_warning = true; }
|
||||
};
|
||||
|
||||
class NotCompressibleException : public CantPackException {
|
||||
class NotCompressibleException final : public CantPackException {
|
||||
typedef CantPackException super;
|
||||
|
||||
public:
|
||||
NotCompressibleException(const char *m = nullptr) noexcept : super(m) {}
|
||||
};
|
||||
|
||||
class CantUnpackException : public Exception {
|
||||
class CantUnpackException /*not_final*/ : public Exception {
|
||||
typedef Exception super;
|
||||
|
||||
public:
|
||||
CantUnpackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
||||
};
|
||||
|
||||
class NotPackedException : public CantUnpackException {
|
||||
class NotPackedException final : public CantUnpackException {
|
||||
typedef CantUnpackException super;
|
||||
|
||||
public:
|
||||
NotPackedException(const char *m = nullptr) noexcept : super(m, true) {}
|
||||
};
|
||||
@@ -180,9 +168,8 @@ public:
|
||||
// errors
|
||||
**************************************************************************/
|
||||
|
||||
class InternalError : public Error {
|
||||
class InternalError final : public Error {
|
||||
typedef Error super;
|
||||
|
||||
public:
|
||||
InternalError(const char *m = nullptr) noexcept : super(m, 0) {}
|
||||
};
|
||||
@@ -191,34 +178,37 @@ public:
|
||||
// util
|
||||
**************************************************************************/
|
||||
|
||||
#undef NORET
|
||||
#if 1 && defined(__GNUC__)
|
||||
#define NORET __acc_noinline __attribute__((__noreturn__))
|
||||
#else
|
||||
#define NORET __acc_noinline
|
||||
#endif
|
||||
const char *prettyExceptionName(const char *n) noexcept;
|
||||
|
||||
NORET void throwCantPack(const char *msg);
|
||||
NORET void throwCantPackExact();
|
||||
NORET void throwUnknownExecutableFormat(const char *msg = nullptr, bool warn = false);
|
||||
NORET void throwNotCompressible(const char *msg = nullptr);
|
||||
NORET void throwAlreadyPacked(const char *msg = nullptr);
|
||||
NORET void throwAlreadyPackedByUPX(const char *msg = nullptr);
|
||||
NORET void throwCantUnpack(const char *msg);
|
||||
NORET void throwNotPacked(const char *msg = nullptr);
|
||||
NORET void throwFilterException();
|
||||
NORET void throwBadLoader();
|
||||
NORET void throwChecksumError();
|
||||
NORET void throwCompressedDataViolation();
|
||||
NORET void throwInternalError(const char *msg);
|
||||
NORET void throwOutOfMemoryException(const char *msg = nullptr);
|
||||
NORET void throwIOException(const char *msg = nullptr, int e = 0);
|
||||
NORET void throwEOFException(const char *msg = nullptr, int e = 0);
|
||||
noreturn void throwCantPack(const char *msg) may_throw;
|
||||
noreturn void throwCantPackExact() may_throw;
|
||||
noreturn void throwUnknownExecutableFormat(const char *msg = nullptr, bool warn = false) may_throw;
|
||||
noreturn void throwNotCompressible(const char *msg = nullptr) may_throw;
|
||||
noreturn void throwAlreadyPacked(const char *msg = nullptr) may_throw;
|
||||
noreturn void throwAlreadyPackedByUPX(const char *msg = nullptr) may_throw;
|
||||
noreturn void throwCantUnpack(const char *msg) may_throw;
|
||||
noreturn void throwNotPacked(const char *msg = nullptr) may_throw;
|
||||
noreturn void throwFilterException() may_throw;
|
||||
noreturn void throwBadLoader() may_throw;
|
||||
noreturn void throwChecksumError() may_throw;
|
||||
noreturn void throwCompressedDataViolation() may_throw;
|
||||
noreturn void throwInternalError(const char *msg) may_throw;
|
||||
noreturn void throwOutOfMemoryException(const char *msg = nullptr) may_throw;
|
||||
noreturn void throwIOException(const char *msg = nullptr, int e = 0) may_throw;
|
||||
noreturn void throwEOFException(const char *msg = nullptr, int e = 0) may_throw;
|
||||
|
||||
#undef NORET
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* already included */
|
||||
// some C++ template wizardry is needed to overload throwCantPack() for varargs
|
||||
template <class T>
|
||||
void throwCantPack(const T *, ...) DELETED_FUNCTION;
|
||||
template <class T>
|
||||
void throwCantUnpack(const T *, ...) DELETED_FUNCTION;
|
||||
template <class T>
|
||||
void throwInternalError(const T *, ...) DELETED_FUNCTION;
|
||||
template <>
|
||||
noreturn void throwCantPack(const char *format, ...) may_throw attribute_format(1, 2);
|
||||
template <>
|
||||
noreturn void throwCantUnpack(const char *format, ...) may_throw attribute_format(1, 2);
|
||||
template <>
|
||||
noreturn void throwInternalError(const char *format, ...) may_throw attribute_format(1, 2);
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
+109
-64
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -29,20 +29,22 @@
|
||||
#include "file.h"
|
||||
|
||||
/*************************************************************************
|
||||
// static functions
|
||||
// static file-related util functions; will throw on error
|
||||
**************************************************************************/
|
||||
|
||||
void FileBase::chmod(const char *name, int mode) {
|
||||
#if (HAVE_CHMOD)
|
||||
/*static*/ void FileBase::chmod(const char *name, int mode) {
|
||||
assert(name != nullptr && name[0] != 0);
|
||||
#if HAVE_CHMOD
|
||||
if (::chmod(name, mode) != 0)
|
||||
throwIOException(name, errno);
|
||||
#else
|
||||
UNUSED(name);
|
||||
UNUSED(mode);
|
||||
// no error
|
||||
#endif
|
||||
}
|
||||
|
||||
void FileBase::rename(const char *old_, const char *new_) {
|
||||
/*static*/ void FileBase::rename(const char *old_, const char *new_) {
|
||||
#if (ACC_OS_DOS32) && defined(__DJGPP__)
|
||||
if (::_rename(old_, new_) != 0)
|
||||
#else
|
||||
@@ -51,29 +53,34 @@ void FileBase::rename(const char *old_, const char *new_) {
|
||||
throwIOException("rename error", errno);
|
||||
}
|
||||
|
||||
void FileBase::unlink(const char *name) {
|
||||
if (::unlink(name) != 0)
|
||||
/*static*/ bool FileBase::unlink_noexcept(const char *name) noexcept {
|
||||
assert_noexcept(name != nullptr && name[0] != 0);
|
||||
bool success = ::unlink(name) == 0;
|
||||
#if HAVE_CHMOD
|
||||
if (!success)
|
||||
success = (::chmod(name, 0666) == 0 && ::unlink(name) == 0);
|
||||
#endif
|
||||
return success;
|
||||
}
|
||||
|
||||
/*static*/ void FileBase::unlink(const char *name) {
|
||||
if (!unlink_noexcept(name))
|
||||
throwIOException(name, errno);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
// FileBase
|
||||
**************************************************************************/
|
||||
|
||||
FileBase::FileBase()
|
||||
: _fd(-1), _flags(0), _shflags(0), _mode(0), _name(nullptr), _offset(0), _length(0) {
|
||||
memset(&st, 0, sizeof(st));
|
||||
}
|
||||
|
||||
FileBase::~FileBase() {
|
||||
FileBase::~FileBase() may_throw {
|
||||
#if 0 && defined(__GNUC__) // debug
|
||||
if (isOpen())
|
||||
fprintf(stderr, "%s: %s\n", _name, __PRETTY_FUNCTION__);
|
||||
#endif
|
||||
|
||||
// FIXME: we should use close() during exception unwinding but
|
||||
// closex() otherwise
|
||||
closex();
|
||||
if (std::uncaught_exceptions() == 0)
|
||||
closex(); // may_throw
|
||||
else
|
||||
close_noexcept(); // currently in exception unwinding, use noexcept variant
|
||||
}
|
||||
|
||||
bool FileBase::do_sopen() {
|
||||
@@ -82,7 +89,7 @@ bool FileBase::do_sopen() {
|
||||
else {
|
||||
#if (ACC_OS_DOS32) && defined(__DJGPP__)
|
||||
_fd = ::open(_name, _flags | _shflags, _mode);
|
||||
#elif defined(__MINT__)
|
||||
#elif (ACC_ARCH_M68K && ACC_OS_TOS && ACC_CC_GNUC) && defined(__MINT__)
|
||||
_fd = ::open(_name, _flags | (_shflags & O_SHMODE), _mode);
|
||||
#elif defined(SH_DENYRW)
|
||||
_fd = ::sopen(_name, _flags, _shflags, _mode);
|
||||
@@ -92,13 +99,14 @@ bool FileBase::do_sopen() {
|
||||
}
|
||||
if (_fd < 0)
|
||||
return false;
|
||||
st.st_size = 0;
|
||||
if (::fstat(_fd, &st) != 0)
|
||||
throwIOException(_name, errno);
|
||||
_length = st.st_size;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FileBase::close() {
|
||||
bool FileBase::close_noexcept() noexcept {
|
||||
bool ok = true;
|
||||
if (isOpen() && _fd != STDIN_FILENO && _fd != STDOUT_FILENO && _fd != STDERR_FILENO)
|
||||
if (::close(_fd) == -1)
|
||||
@@ -112,8 +120,8 @@ bool FileBase::close() {
|
||||
return ok;
|
||||
}
|
||||
|
||||
void FileBase::closex() {
|
||||
if (!close())
|
||||
void FileBase::closex() may_throw {
|
||||
if (!close_noexcept())
|
||||
throwIOException("close failed", errno);
|
||||
}
|
||||
|
||||
@@ -121,23 +129,24 @@ void FileBase::closex() {
|
||||
upx_off_t FileBase::seek(upx_off_t off, int whence) {
|
||||
if (!isOpen())
|
||||
throwIOException("bad seek 1");
|
||||
mem_size_assert(1, off >= 0 ? off : -off); // sanity check
|
||||
if (!mem_size_valid_bytes(off >= 0 ? off : -off)) // sanity check
|
||||
throwIOException("bad seek");
|
||||
if (whence == SEEK_SET) {
|
||||
if (off < 0)
|
||||
throwIOException("bad seek 2");
|
||||
off += _offset;
|
||||
}
|
||||
if (whence == SEEK_END) {
|
||||
} else if (whence == SEEK_END) {
|
||||
if (off > 0)
|
||||
throwIOException("bad seek 3");
|
||||
off += _offset + _length;
|
||||
whence = SEEK_SET;
|
||||
}
|
||||
// SEEK_CUR falls through to here
|
||||
upx_off_t rv = ::lseek(_fd, off, whence);
|
||||
if (rv < 0)
|
||||
} else if (whence == SEEK_CUR) {
|
||||
} else
|
||||
throwInternalError("bad seek: whence");
|
||||
upx_off_t l = ::lseek(_fd, off, whence);
|
||||
if (l < 0)
|
||||
throwIOException("seek error", errno);
|
||||
return rv - _offset;
|
||||
return l - _offset;
|
||||
}
|
||||
|
||||
upx_off_t FileBase::tell() const {
|
||||
@@ -157,13 +166,11 @@ void FileBase::set_extent(upx_off_t offset, upx_off_t length) {
|
||||
upx_off_t FileBase::st_size() const { return _length; }
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
// InputFile
|
||||
**************************************************************************/
|
||||
|
||||
InputFile::InputFile() {}
|
||||
|
||||
void InputFile::sopen(const char *name, int flags, int shflags) {
|
||||
close();
|
||||
closex();
|
||||
_name = name;
|
||||
_flags = flags;
|
||||
_shflags = shflags;
|
||||
@@ -181,10 +188,10 @@ void InputFile::sopen(const char *name, int flags, int shflags) {
|
||||
_length_orig = _length;
|
||||
}
|
||||
|
||||
int InputFile::read(SPAN_P(void) buf, int len) {
|
||||
if (!isOpen() || len < 0)
|
||||
int InputFile::read(SPAN_P(void) buf, upx_int64_t blen) {
|
||||
if (!isOpen() || blen < 0)
|
||||
throwIOException("bad read");
|
||||
mem_size_assert(1, len); // sanity check
|
||||
int len = (int) mem_size(1, blen); // sanity check
|
||||
errno = 0;
|
||||
long l = acc_safe_hread(_fd, raw_bytes(buf, len), len);
|
||||
if (errno)
|
||||
@@ -192,9 +199,9 @@ int InputFile::read(SPAN_P(void) buf, int len) {
|
||||
return (int) l;
|
||||
}
|
||||
|
||||
int InputFile::readx(SPAN_P(void) buf, int len) {
|
||||
int l = this->read(buf, len);
|
||||
if (l != len)
|
||||
int InputFile::readx(SPAN_P(void) buf, upx_int64_t blen) {
|
||||
int l = this->read(buf, blen);
|
||||
if (l != blen)
|
||||
throwEOFException();
|
||||
return l;
|
||||
}
|
||||
@@ -208,14 +215,26 @@ upx_off_t InputFile::seek(upx_off_t off, int whence) {
|
||||
|
||||
upx_off_t InputFile::st_size_orig() const { return _length_orig; }
|
||||
|
||||
int InputFile::dupFd() may_throw {
|
||||
if (!isOpen())
|
||||
throwIOException("bad dup");
|
||||
#if defined(HAVE_DUP) && (HAVE_DUP + 0 == 0)
|
||||
errno = ENOSYS;
|
||||
int r = -1;
|
||||
#else
|
||||
int r = ::dup(getFd());
|
||||
#endif
|
||||
if (r < 0)
|
||||
throwIOException("dup", errno);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
// OutputFile
|
||||
**************************************************************************/
|
||||
|
||||
OutputFile::OutputFile() : bytes_written(0) {}
|
||||
|
||||
void OutputFile::sopen(const char *name, int flags, int shflags, int mode) {
|
||||
close();
|
||||
closex();
|
||||
_name = name;
|
||||
_flags = flags;
|
||||
_shflags = shflags;
|
||||
@@ -237,7 +256,7 @@ void OutputFile::sopen(const char *name, int flags, int shflags, int mode) {
|
||||
}
|
||||
|
||||
bool OutputFile::openStdout(int flags, bool force) {
|
||||
close();
|
||||
closex();
|
||||
int fd = STDOUT_FILENO;
|
||||
if (!force && acc_isatty(fd))
|
||||
return false;
|
||||
@@ -253,22 +272,33 @@ bool OutputFile::openStdout(int flags, bool force) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void OutputFile::write(SPAN_0(const void) buf, int len) {
|
||||
if (!isOpen() || len < 0)
|
||||
void OutputFile::write(SPAN_0(const void) buf, upx_int64_t blen) {
|
||||
if (!isOpen() || blen < 0)
|
||||
throwIOException("bad write");
|
||||
// allow nullptr if len == 0
|
||||
if (len == 0)
|
||||
// allow nullptr if blen == 0
|
||||
if (blen == 0)
|
||||
return;
|
||||
mem_size_assert(1, len); // sanity check
|
||||
int len = (int) mem_size(1, blen); // sanity check
|
||||
errno = 0;
|
||||
#if 0
|
||||
fprintf(stderr, "write %p %zd (%p) %d\n", buf.raw_ptr(), buf.raw_size_in_bytes(),
|
||||
#if WITH_XSPAN >= 2
|
||||
NO_fprintf(stderr, "write %p %zd (%p) %d\n", buf.raw_ptr(), buf.raw_size_in_bytes(),
|
||||
buf.raw_base(), len);
|
||||
#endif
|
||||
long l = acc_safe_hwrite(_fd, raw_bytes(buf, len), len);
|
||||
if (l != len)
|
||||
throwIOException("write error", errno);
|
||||
bytes_written += len;
|
||||
#if TESTING && 0
|
||||
static upx_std_atomic(bool) dumping;
|
||||
if (!dumping) {
|
||||
dumping = true;
|
||||
char fn[64];
|
||||
static int part = 0;
|
||||
snprintf(fn, sizeof(fn), "upx-dump-%04d.data", part++);
|
||||
OutputFile::dump(fn, buf, len);
|
||||
dumping = false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
upx_off_t OutputFile::st_size() const {
|
||||
@@ -289,26 +319,25 @@ void OutputFile::rewrite(SPAN_P(const void) buf, int len) {
|
||||
}
|
||||
|
||||
upx_off_t OutputFile::seek(upx_off_t off, int whence) {
|
||||
mem_size_assert(1, off >= 0 ? off : -off); // sanity check
|
||||
if (!mem_size_valid_bytes(off >= 0 ? off : -off)) // sanity check
|
||||
throwIOException("bad seek");
|
||||
assert(!opt->to_stdout);
|
||||
switch (whence) {
|
||||
case SEEK_SET: {
|
||||
if (bytes_written < off) {
|
||||
case SEEK_SET:
|
||||
if (bytes_written < off)
|
||||
bytes_written = off;
|
||||
}
|
||||
_length = bytes_written; // cheap, lazy update; needed?
|
||||
} break;
|
||||
case SEEK_END: {
|
||||
break;
|
||||
case SEEK_END:
|
||||
_length = bytes_written; // necessary
|
||||
} break;
|
||||
break;
|
||||
}
|
||||
return super::seek(off, whence);
|
||||
}
|
||||
|
||||
// WARNING: fsync() does not exist in some Windows environments.
|
||||
// This trick works only on UNIX-like systems.
|
||||
// int OutputFile::read(void *buf, int len)
|
||||
//{
|
||||
// int OutputFile::read(void *buf, int len) {
|
||||
// fsync(_fd);
|
||||
// InputFile infile;
|
||||
// infile.open(this->getName(), O_RDONLY | O_BINARY);
|
||||
@@ -319,7 +348,8 @@ upx_off_t OutputFile::seek(upx_off_t off, int whence) {
|
||||
void OutputFile::set_extent(upx_off_t offset, upx_off_t length) {
|
||||
super::set_extent(offset, length);
|
||||
bytes_written = 0;
|
||||
if (0 == offset && (upx_off_t) ~0u == length) {
|
||||
if (0 == offset && 0xffffffffLL == length) { // TODO: check all callers of this method
|
||||
st.st_size = 0;
|
||||
if (::fstat(_fd, &st) != 0)
|
||||
throwIOException(_name, errno);
|
||||
_length = st.st_size - offset;
|
||||
@@ -336,7 +366,7 @@ upx_off_t OutputFile::unset_extent() {
|
||||
return _length;
|
||||
}
|
||||
|
||||
void OutputFile::dump(const char *name, SPAN_P(const void) buf, int len, int flags) {
|
||||
/*static*/ void OutputFile::dump(const char *name, SPAN_P(const void) buf, int len, int flags) {
|
||||
if (flags < 0)
|
||||
flags = O_CREAT | O_TRUNC;
|
||||
flags |= O_WRONLY | O_BINARY;
|
||||
@@ -346,4 +376,19 @@ void OutputFile::dump(const char *name, SPAN_P(const void) buf, int len, int fla
|
||||
f.closex();
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
**************************************************************************/
|
||||
|
||||
TEST_CASE("file") {
|
||||
InputFile fi;
|
||||
CHECK(!fi.isOpen());
|
||||
CHECK(fi.getFd() == -1);
|
||||
CHECK(fi.st_size() == 0);
|
||||
OutputFile fo;
|
||||
CHECK(!fo.isOpen());
|
||||
CHECK(fo.getFd() == -1);
|
||||
CHECK(fo.getBytesWritten() == 0);
|
||||
}
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
+23
-26
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -26,8 +26,6 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef UPX_FILE_H__
|
||||
#define UPX_FILE_H__ 1
|
||||
|
||||
/*************************************************************************
|
||||
//
|
||||
@@ -35,15 +33,15 @@
|
||||
|
||||
class FileBase {
|
||||
protected:
|
||||
FileBase();
|
||||
virtual ~FileBase();
|
||||
explicit FileBase() noexcept = default;
|
||||
virtual ~FileBase() may_throw;
|
||||
|
||||
public:
|
||||
bool close();
|
||||
void closex();
|
||||
bool isOpen() const { return _fd >= 0; }
|
||||
int getFd() const { return _fd; }
|
||||
const char *getName() const { return _name; }
|
||||
bool close_noexcept() noexcept;
|
||||
void closex() may_throw;
|
||||
bool isOpen() const noexcept { return _fd >= 0; }
|
||||
int getFd() const noexcept { return _fd; }
|
||||
const char *getName() const noexcept { return _name; }
|
||||
|
||||
virtual upx_off_t seek(upx_off_t off, int whence);
|
||||
upx_off_t tell() const;
|
||||
@@ -51,10 +49,11 @@ public:
|
||||
virtual void set_extent(upx_off_t offset, upx_off_t length);
|
||||
|
||||
public:
|
||||
// static file-related util functions
|
||||
static void chmod(const char *name, int mode);
|
||||
static void rename(const char *old_, const char *new_);
|
||||
static void unlink(const char *name);
|
||||
// static file-related util functions; will throw on error
|
||||
static void chmod(const char *name, int mode) may_throw;
|
||||
static void rename(const char *old_, const char *new_) may_throw;
|
||||
static void unlink(const char *name) may_throw;
|
||||
static bool unlink_noexcept(const char *name) noexcept;
|
||||
|
||||
protected:
|
||||
bool do_sopen();
|
||||
@@ -78,18 +77,19 @@ class InputFile final : public FileBase {
|
||||
typedef FileBase super;
|
||||
|
||||
public:
|
||||
InputFile();
|
||||
virtual ~InputFile() {}
|
||||
explicit InputFile() noexcept = default;
|
||||
|
||||
void sopen(const char *name, int flags, int shflags);
|
||||
void open(const char *name, int flags) { sopen(name, flags, -1); }
|
||||
|
||||
int read(SPAN_P(void) buf, int len);
|
||||
int readx(SPAN_P(void) buf, int len);
|
||||
int read(SPAN_P(void) buf, upx_int64_t blen);
|
||||
int readx(SPAN_P(void) buf, upx_int64_t blen);
|
||||
|
||||
virtual upx_off_t seek(upx_off_t off, int whence) override;
|
||||
upx_off_t st_size_orig() const;
|
||||
|
||||
noinline int dupFd() may_throw;
|
||||
|
||||
protected:
|
||||
upx_off_t _length_orig = 0;
|
||||
};
|
||||
@@ -102,15 +102,14 @@ class OutputFile final : public FileBase {
|
||||
typedef FileBase super;
|
||||
|
||||
public:
|
||||
OutputFile();
|
||||
virtual ~OutputFile() {}
|
||||
explicit OutputFile() noexcept = default;
|
||||
|
||||
void sopen(const char *name, int flags, int shflags, int mode);
|
||||
void open(const char *name, int flags, int mode) { sopen(name, flags, -1, mode); }
|
||||
bool openStdout(int flags = 0, bool force = false);
|
||||
|
||||
// info: allow nullptr if len == 0
|
||||
void write(SPAN_0(const void) buf, int len);
|
||||
// info: allow nullptr if blen == 0
|
||||
void write(SPAN_0(const void) buf, upx_int64_t blen);
|
||||
|
||||
virtual upx_off_t seek(upx_off_t off, int whence) override;
|
||||
virtual upx_off_t st_size() const override; // { return _length; }
|
||||
@@ -119,7 +118,7 @@ public:
|
||||
|
||||
upx_off_t getBytesWritten() const { return bytes_written; }
|
||||
|
||||
// FIXME - these won't work when using the '--stdout' option
|
||||
// FIXME - this won't work when using the '--stdout' option
|
||||
void rewrite(SPAN_P(const void) buf, int len);
|
||||
|
||||
// util
|
||||
@@ -129,6 +128,4 @@ protected:
|
||||
upx_off_t bytes_written = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
+26
-22
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -33,7 +33,7 @@
|
||||
// util
|
||||
**************************************************************************/
|
||||
|
||||
static void initFilter(Filter *f, upx_byte *buf, unsigned buf_len) {
|
||||
static void initFilter(Filter *f, byte *buf, unsigned buf_len) noexcept {
|
||||
f->buf = buf;
|
||||
f->buf_len = buf_len;
|
||||
// clear output parameters
|
||||
@@ -44,38 +44,37 @@ static void initFilter(Filter *f, upx_byte *buf, unsigned buf_len) {
|
||||
// get a FilterEntry
|
||||
**************************************************************************/
|
||||
|
||||
const FilterImpl::FilterEntry *FilterImpl::getFilter(int id) {
|
||||
static bool done = false;
|
||||
static unsigned char filter_map[256];
|
||||
/*static*/ const FilterImpl::FilterEntry *FilterImpl::getFilter(int id) {
|
||||
static upx_uint8_t filter_map[256];
|
||||
static upx_std_once_flag init_done;
|
||||
|
||||
if (!done) {
|
||||
// init the filter_map[]
|
||||
assert(n_filters <= 254); // as 0xff means "empty slot"
|
||||
upx_std_call_once(init_done, []() noexcept {
|
||||
// init the filter_map[] (using a lambda function)
|
||||
assert_noexcept(n_filters <= 254); // as 0xff means "empty slot"
|
||||
memset(filter_map, 0xff, sizeof(filter_map));
|
||||
for (int i = 0; i < n_filters; i++) {
|
||||
int filter_id = filters[i].id;
|
||||
assert(filter_id >= 0 && filter_id <= 255);
|
||||
assert(filter_map[filter_id] == 0xff);
|
||||
filter_map[filter_id] = (unsigned char) i;
|
||||
}
|
||||
done = true;
|
||||
assert_noexcept(filter_id >= 0 && filter_id <= 255);
|
||||
assert_noexcept(filter_map[filter_id] == 0xff);
|
||||
filter_map[filter_id] = (upx_uint8_t) i;
|
||||
}
|
||||
});
|
||||
|
||||
if (id < 0 || id > 255)
|
||||
return nullptr;
|
||||
unsigned index = filter_map[id];
|
||||
if (index == 0xff) // empty slot
|
||||
return nullptr;
|
||||
assert(filters[index].id == id);
|
||||
assert_noexcept(filters[index].id == id);
|
||||
return &filters[index];
|
||||
}
|
||||
|
||||
bool Filter::isValidFilter(int filter_id) {
|
||||
/*static*/ bool Filter::isValidFilter(int filter_id) {
|
||||
const FilterImpl::FilterEntry *const fe = FilterImpl::getFilter(filter_id);
|
||||
return fe != nullptr;
|
||||
}
|
||||
|
||||
bool Filter::isValidFilter(int filter_id, const int *allowed_filters) {
|
||||
/*static*/ bool Filter::isValidFilter(int filter_id, const int *allowed_filters) {
|
||||
if (!isValidFilter(filter_id))
|
||||
return false;
|
||||
if (filter_id == 0)
|
||||
@@ -92,7 +91,9 @@ bool Filter::isValidFilter(int filter_id, const int *allowed_filters) {
|
||||
// high level API
|
||||
**************************************************************************/
|
||||
|
||||
void Filter::init(int id_, unsigned addvalue_) {
|
||||
Filter::Filter(int level) noexcept : clevel(level) { init(); }
|
||||
|
||||
void Filter::init(int id_, unsigned addvalue_) noexcept {
|
||||
this->id = id_;
|
||||
initFilter(this, nullptr, 0);
|
||||
// clear input parameters
|
||||
@@ -103,7 +104,8 @@ void Filter::init(int id_, unsigned addvalue_) {
|
||||
this->n_mru = 0;
|
||||
}
|
||||
|
||||
bool Filter::filter(upx_byte *buf_, unsigned buf_len_) {
|
||||
bool Filter::filter(SPAN_0(byte) xbuf, unsigned buf_len_) {
|
||||
byte *const buf_ = raw_bytes(xbuf, buf_len_);
|
||||
initFilter(this, buf_, buf_len_);
|
||||
|
||||
const FilterImpl::FilterEntry *const fe = FilterImpl::getFilter(id);
|
||||
@@ -134,7 +136,8 @@ bool Filter::filter(upx_byte *buf_, unsigned buf_len_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void Filter::unfilter(upx_byte *buf_, unsigned buf_len_, bool verify_checksum) {
|
||||
void Filter::unfilter(SPAN_0(byte) xbuf, unsigned buf_len_, bool verify_checksum) {
|
||||
byte *const buf_ = raw_bytes(xbuf, buf_len_);
|
||||
initFilter(this, buf_, buf_len_);
|
||||
|
||||
const FilterImpl::FilterEntry *const fe = FilterImpl::getFilter(id);
|
||||
@@ -178,10 +181,11 @@ void Filter::verifyUnfilter() {
|
||||
unfilter(this->buf, this->buf_len, true);
|
||||
}
|
||||
|
||||
bool Filter::scan(const upx_byte *buf_, unsigned buf_len_) {
|
||||
bool Filter::scan(SPAN_0(const byte) xbuf, unsigned buf_len_) {
|
||||
const byte *const buf_ = raw_bytes(xbuf, buf_len_);
|
||||
// Note: must use const_cast here. This is fine as the scan
|
||||
// implementations (fe->do_scan) actually don't change the buffer.
|
||||
upx_byte *b = const_cast<upx_byte *>(buf_);
|
||||
byte *const b = const_cast<byte *>(buf_);
|
||||
initFilter(this, b, buf_len_);
|
||||
|
||||
const FilterImpl::FilterEntry *const fe = FilterImpl::getFilter(id);
|
||||
|
||||
+13
-18
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -26,8 +26,6 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef UPX_FILTER_H__
|
||||
#define UPX_FILTER_H__ 1
|
||||
|
||||
/*************************************************************************
|
||||
// A filter is a reversible operation that modifies a given
|
||||
@@ -46,18 +44,15 @@
|
||||
// to absolute addresses so that the buffer compresses better.
|
||||
**************************************************************************/
|
||||
|
||||
class Filter {
|
||||
class Filter final {
|
||||
public:
|
||||
Filter(int level) {
|
||||
clevel = level;
|
||||
init();
|
||||
}
|
||||
void init(int id = 0, unsigned addvalue = 0);
|
||||
explicit Filter(int level) noexcept;
|
||||
void init(int id = 0, unsigned addvalue = 0) noexcept;
|
||||
|
||||
bool filter(upx_byte *buf, unsigned buf_len);
|
||||
void unfilter(upx_byte *buf, unsigned buf_len, bool verify_checksum = false);
|
||||
bool filter(SPAN_0(byte) buf, unsigned buf_len);
|
||||
void unfilter(SPAN_0(byte) buf, unsigned buf_len, bool verify_checksum = false);
|
||||
void verifyUnfilter();
|
||||
bool scan(const upx_byte *buf, unsigned buf_len);
|
||||
bool scan(SPAN_0(const byte) buf, unsigned buf_len);
|
||||
|
||||
static bool isValidFilter(int filter_id);
|
||||
static bool isValidFilter(int filter_id, const int *allowed_filters);
|
||||
@@ -65,7 +60,7 @@ public:
|
||||
public:
|
||||
// Will be set by each call to filter()/unfilter().
|
||||
// Read-only afterwards.
|
||||
upx_byte *buf = nullptr;
|
||||
byte *buf = nullptr;
|
||||
unsigned buf_len = 0;
|
||||
|
||||
// Checksum of the buffer before applying the filter
|
||||
@@ -77,7 +72,7 @@ public:
|
||||
const int *preferred_ctos = nullptr;
|
||||
|
||||
// Input/output parameters used by various filters
|
||||
unsigned char cto; // call trick offset
|
||||
byte cto; // call trick offset
|
||||
|
||||
// Output used by various filters. Read only.
|
||||
unsigned calls;
|
||||
@@ -101,10 +96,12 @@ private:
|
||||
// This class is private to Filter - don't look.
|
||||
**************************************************************************/
|
||||
|
||||
class FilterImpl {
|
||||
class FilterImpl final {
|
||||
friend class Filter;
|
||||
|
||||
private:
|
||||
explicit FilterImpl() noexcept DELETED_FUNCTION;
|
||||
|
||||
struct FilterEntry {
|
||||
int id; // 0 .. 255
|
||||
unsigned min_buf_len;
|
||||
@@ -123,6 +120,4 @@ private:
|
||||
static const int n_filters; // number of filters[]
|
||||
};
|
||||
|
||||
#endif /* already included */
|
||||
|
||||
/* vim:set ts=4 sw=4 et: */
|
||||
|
||||
+134
-203
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -25,18 +25,15 @@
|
||||
<markus@oberhumer.com> <ezerotven+github@gmail.com>
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
// 16-bit calltrick ("naive")
|
||||
**************************************************************************/
|
||||
|
||||
#define CT16(f, cond, addvalue, get, set) \
|
||||
upx_byte *b = f->buf; \
|
||||
upx_byte *b_end = b + f->buf_len - 3; \
|
||||
byte *b = f->buf; \
|
||||
byte *b_end = b + f->buf_len - 3; \
|
||||
do { \
|
||||
if (cond) \
|
||||
{ \
|
||||
if (cond) { \
|
||||
b += 1; \
|
||||
unsigned a = (unsigned) (b - f->buf); \
|
||||
f->lastcall = a; \
|
||||
@@ -45,177 +42,126 @@
|
||||
b += 2 - 1; \
|
||||
} \
|
||||
} while (++b < b_end); \
|
||||
if (f->lastcall) f->lastcall += 2; \
|
||||
if (f->lastcall) \
|
||||
f->lastcall += 2; \
|
||||
return 0;
|
||||
|
||||
|
||||
|
||||
// filter: e8, e9, e8e9
|
||||
static int f_ct16_e8(Filter *f)
|
||||
{
|
||||
CT16(f, (*b == 0xe8), a + f->addvalue, get_le16, set_le16)
|
||||
}
|
||||
static int f_ct16_e8(Filter *f) { CT16(f, (*b == 0xe8), a + f->addvalue, get_le16, set_le16) }
|
||||
|
||||
static int f_ct16_e9(Filter *f)
|
||||
{
|
||||
CT16(f, (*b == 0xe9), a + f->addvalue, get_le16, set_le16)
|
||||
}
|
||||
static int f_ct16_e9(Filter *f) { CT16(f, (*b == 0xe9), a + f->addvalue, get_le16, set_le16) }
|
||||
|
||||
static int f_ct16_e8e9(Filter *f)
|
||||
{
|
||||
static int f_ct16_e8e9(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le16, set_le16)
|
||||
}
|
||||
|
||||
|
||||
// unfilter: e8, e9, e8e9
|
||||
static int u_ct16_e8(Filter *f)
|
||||
{
|
||||
CT16(f, (*b == 0xe8), 0 - a - f->addvalue, get_le16, set_le16)
|
||||
}
|
||||
static int u_ct16_e8(Filter *f) { CT16(f, (*b == 0xe8), 0 - a - f->addvalue, get_le16, set_le16) }
|
||||
|
||||
static int u_ct16_e9(Filter *f)
|
||||
{
|
||||
CT16(f, (*b == 0xe9), 0 - a - f->addvalue, get_le16, set_le16)
|
||||
}
|
||||
static int u_ct16_e9(Filter *f) { CT16(f, (*b == 0xe9), 0 - a - f->addvalue, get_le16, set_le16) }
|
||||
|
||||
static int u_ct16_e8e9(Filter *f)
|
||||
{
|
||||
static int u_ct16_e8e9(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), 0 - a - f->addvalue, get_le16, set_le16)
|
||||
}
|
||||
|
||||
|
||||
// scan: e8, e9, e8e9
|
||||
static int s_ct16_e8(Filter *f)
|
||||
{
|
||||
CT16(f, (*b == 0xe8), a + f->addvalue, get_le16, set_dummy)
|
||||
}
|
||||
static int s_ct16_e8(Filter *f) { CT16(f, (*b == 0xe8), a + f->addvalue, get_le16, set_dummy) }
|
||||
|
||||
static int s_ct16_e9(Filter *f)
|
||||
{
|
||||
CT16(f, (*b == 0xe9), a + f->addvalue, get_le16, set_dummy)
|
||||
}
|
||||
static int s_ct16_e9(Filter *f) { CT16(f, (*b == 0xe9), a + f->addvalue, get_le16, set_dummy) }
|
||||
|
||||
static int s_ct16_e8e9(Filter *f)
|
||||
{
|
||||
static int s_ct16_e8e9(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le16, set_dummy)
|
||||
}
|
||||
|
||||
|
||||
// filter: e8, e9, e8e9 with bswap le->be
|
||||
static int f_ct16_e8_bswap_le(Filter *f)
|
||||
{
|
||||
static int f_ct16_e8_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe8), a + f->addvalue, get_le16, set_be16)
|
||||
}
|
||||
|
||||
static int f_ct16_e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int f_ct16_e9_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe9), a + f->addvalue, get_le16, set_be16)
|
||||
}
|
||||
|
||||
static int f_ct16_e8e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int f_ct16_e8e9_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le16, set_be16)
|
||||
}
|
||||
|
||||
|
||||
// unfilter: e8, e9, e8e9 with bswap le->be
|
||||
static int u_ct16_e8_bswap_le(Filter *f)
|
||||
{
|
||||
static int u_ct16_e8_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe8), 0 - a - f->addvalue, get_be16, set_le16)
|
||||
}
|
||||
|
||||
static int u_ct16_e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int u_ct16_e9_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe9), 0 - a - f->addvalue, get_be16, set_le16)
|
||||
}
|
||||
|
||||
static int u_ct16_e8e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int u_ct16_e8e9_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), 0 - a - f->addvalue, get_be16, set_le16)
|
||||
}
|
||||
|
||||
|
||||
// scan: e8, e9, e8e9 with bswap le->be
|
||||
static int s_ct16_e8_bswap_le(Filter *f)
|
||||
{
|
||||
static int s_ct16_e8_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe8), a + f->addvalue, get_be16, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct16_e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int s_ct16_e9_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe9), a + f->addvalue, get_be16, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct16_e8e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int s_ct16_e8e9_bswap_le(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_be16, set_dummy)
|
||||
}
|
||||
|
||||
|
||||
// filter: e8, e9, e8e9 with bswap be->le
|
||||
static int f_ct16_e8_bswap_be(Filter *f)
|
||||
{
|
||||
static int f_ct16_e8_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe8), a + f->addvalue, get_be16, set_le16)
|
||||
}
|
||||
|
||||
static int f_ct16_e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int f_ct16_e9_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe9), a + f->addvalue, get_be16, set_le16)
|
||||
}
|
||||
|
||||
static int f_ct16_e8e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int f_ct16_e8e9_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_be16, set_le16)
|
||||
}
|
||||
|
||||
|
||||
// unfilter: e8, e9, e8e9 with bswap be->le
|
||||
static int u_ct16_e8_bswap_be(Filter *f)
|
||||
{
|
||||
static int u_ct16_e8_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe8), 0 - a - f->addvalue, get_le16, set_be16)
|
||||
}
|
||||
|
||||
static int u_ct16_e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int u_ct16_e9_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe9), 0 - a - f->addvalue, get_le16, set_be16)
|
||||
}
|
||||
|
||||
static int u_ct16_e8e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int u_ct16_e8e9_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), 0 - a - f->addvalue, get_le16, set_be16)
|
||||
}
|
||||
|
||||
|
||||
// scan: e8, e9, e8e9 with bswap be->le
|
||||
static int s_ct16_e8_bswap_be(Filter *f)
|
||||
{
|
||||
static int s_ct16_e8_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe8), a + f->addvalue, get_le16, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct16_e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int s_ct16_e9_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe9), a + f->addvalue, get_le16, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct16_e8e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int s_ct16_e8e9_bswap_be(Filter *f) {
|
||||
CT16(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le16, set_dummy)
|
||||
}
|
||||
|
||||
|
||||
#undef CT16
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
// 32-bit calltrick ("naive")
|
||||
**************************************************************************/
|
||||
|
||||
#define CT32(f, cond, addvalue, get, set) \
|
||||
upx_byte *b = f->buf; \
|
||||
upx_byte *b_end = b + f->buf_len - 5; \
|
||||
byte *b = f->buf; \
|
||||
byte *b_end = b + f->buf_len - 5; \
|
||||
do { \
|
||||
if (cond) \
|
||||
{ \
|
||||
if (cond) { \
|
||||
b += 1; \
|
||||
unsigned a = (unsigned) (b - f->buf); \
|
||||
f->lastcall = a; \
|
||||
@@ -224,163 +170,115 @@ static int s_ct16_e8e9_bswap_be(Filter *f)
|
||||
b += 4 - 1; \
|
||||
} \
|
||||
} while (++b < b_end); \
|
||||
if (f->lastcall) f->lastcall += 4; \
|
||||
if (f->lastcall) \
|
||||
f->lastcall += 4; \
|
||||
return 0;
|
||||
|
||||
|
||||
// filter: e8, e9, e8e9
|
||||
static int f_ct32_e8(Filter *f)
|
||||
{
|
||||
CT32(f, (*b == 0xe8), a + f->addvalue, get_le32, set_le32)
|
||||
}
|
||||
static int f_ct32_e8(Filter *f) { CT32(f, (*b == 0xe8), a + f->addvalue, get_le32, set_le32) }
|
||||
|
||||
static int f_ct32_e9(Filter *f)
|
||||
{
|
||||
CT32(f, (*b == 0xe9), a + f->addvalue, get_le32, set_le32)
|
||||
}
|
||||
static int f_ct32_e9(Filter *f) { CT32(f, (*b == 0xe9), a + f->addvalue, get_le32, set_le32) }
|
||||
|
||||
static int f_ct32_e8e9(Filter *f)
|
||||
{
|
||||
static int f_ct32_e8e9(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le32, set_le32)
|
||||
}
|
||||
|
||||
|
||||
// unfilter: e8, e9, e8e9
|
||||
static int u_ct32_e8(Filter *f)
|
||||
{
|
||||
CT32(f, (*b == 0xe8), 0 - a - f->addvalue, get_le32, set_le32)
|
||||
}
|
||||
static int u_ct32_e8(Filter *f) { CT32(f, (*b == 0xe8), 0 - a - f->addvalue, get_le32, set_le32) }
|
||||
|
||||
static int u_ct32_e9(Filter *f)
|
||||
{
|
||||
CT32(f, (*b == 0xe9), 0 - a - f->addvalue, get_le32, set_le32)
|
||||
}
|
||||
static int u_ct32_e9(Filter *f) { CT32(f, (*b == 0xe9), 0 - a - f->addvalue, get_le32, set_le32) }
|
||||
|
||||
static int u_ct32_e8e9(Filter *f)
|
||||
{
|
||||
static int u_ct32_e8e9(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), 0 - a - f->addvalue, get_le32, set_le32)
|
||||
}
|
||||
|
||||
|
||||
// scan: e8, e9, e8e9
|
||||
static int s_ct32_e8(Filter *f)
|
||||
{
|
||||
CT32(f, (*b == 0xe8), a + f->addvalue, get_le32, set_dummy)
|
||||
}
|
||||
static int s_ct32_e8(Filter *f) { CT32(f, (*b == 0xe8), a + f->addvalue, get_le32, set_dummy) }
|
||||
|
||||
static int s_ct32_e9(Filter *f)
|
||||
{
|
||||
CT32(f, (*b == 0xe9), a + f->addvalue, get_le32, set_dummy)
|
||||
}
|
||||
static int s_ct32_e9(Filter *f) { CT32(f, (*b == 0xe9), a + f->addvalue, get_le32, set_dummy) }
|
||||
|
||||
static int s_ct32_e8e9(Filter *f)
|
||||
{
|
||||
static int s_ct32_e8e9(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le32, set_dummy)
|
||||
}
|
||||
|
||||
|
||||
// filter: e8, e9, e8e9 with bswap le->be
|
||||
static int f_ct32_e8_bswap_le(Filter *f)
|
||||
{
|
||||
static int f_ct32_e8_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe8), a + f->addvalue, get_le32, set_be32)
|
||||
}
|
||||
|
||||
static int f_ct32_e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int f_ct32_e9_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe9), a + f->addvalue, get_le32, set_be32)
|
||||
}
|
||||
|
||||
static int f_ct32_e8e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int f_ct32_e8e9_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le32, set_be32)
|
||||
}
|
||||
|
||||
|
||||
// unfilter: e8, e9, e8e9 with bswap le->be
|
||||
static int u_ct32_e8_bswap_le(Filter *f)
|
||||
{
|
||||
static int u_ct32_e8_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe8), 0 - a - f->addvalue, get_be32, set_le32)
|
||||
}
|
||||
|
||||
static int u_ct32_e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int u_ct32_e9_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe9), 0 - a - f->addvalue, get_be32, set_le32)
|
||||
}
|
||||
|
||||
static int u_ct32_e8e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int u_ct32_e8e9_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), 0 - a - f->addvalue, get_be32, set_le32)
|
||||
}
|
||||
|
||||
|
||||
// scan: e8, e9, e8e9 with bswap le->be
|
||||
static int s_ct32_e8_bswap_le(Filter *f)
|
||||
{
|
||||
static int s_ct32_e8_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe8), a + f->addvalue, get_be32, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct32_e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int s_ct32_e9_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe9), a + f->addvalue, get_be32, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct32_e8e9_bswap_le(Filter *f)
|
||||
{
|
||||
static int s_ct32_e8e9_bswap_le(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_be32, set_dummy)
|
||||
}
|
||||
|
||||
|
||||
// filter: e8, e9, e8e9 with bswap be->le
|
||||
static int f_ct32_e8_bswap_be(Filter *f)
|
||||
{
|
||||
static int f_ct32_e8_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe8), a + f->addvalue, get_be32, set_le32)
|
||||
}
|
||||
|
||||
static int f_ct32_e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int f_ct32_e9_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe9), a + f->addvalue, get_be32, set_le32)
|
||||
}
|
||||
|
||||
static int f_ct32_e8e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int f_ct32_e8e9_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_be32, set_le32)
|
||||
}
|
||||
|
||||
|
||||
// unfilter: e8, e9, e8e9 with bswap be->le
|
||||
static int u_ct32_e8_bswap_be(Filter *f)
|
||||
{
|
||||
static int u_ct32_e8_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe8), 0 - a - f->addvalue, get_le32, set_be32)
|
||||
}
|
||||
|
||||
static int u_ct32_e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int u_ct32_e9_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe9), 0 - a - f->addvalue, get_le32, set_be32)
|
||||
}
|
||||
|
||||
static int u_ct32_e8e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int u_ct32_e8e9_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), 0 - a - f->addvalue, get_le32, set_be32)
|
||||
}
|
||||
|
||||
|
||||
// scan: e8, e9, e8e9 with bswap be->le
|
||||
static int s_ct32_e8_bswap_be(Filter *f)
|
||||
{
|
||||
static int s_ct32_e8_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe8), a + f->addvalue, get_le32, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct32_e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int s_ct32_e9_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe9), a + f->addvalue, get_le32, set_dummy)
|
||||
}
|
||||
|
||||
static int s_ct32_e8e9_bswap_be(Filter *f)
|
||||
{
|
||||
static int s_ct32_e8e9_bswap_be(Filter *f) {
|
||||
CT32(f, (*b == 0xe8 || *b == 0xe9), a + f->addvalue, get_le32, set_dummy)
|
||||
}
|
||||
|
||||
|
||||
#undef CT32
|
||||
|
||||
/*************************************************************************
|
||||
@@ -388,11 +286,10 @@ static int s_ct32_e8e9_bswap_be(Filter *f)
|
||||
**************************************************************************/
|
||||
|
||||
#define CT24ARM_LE(f, cond, addvalue, get, set) \
|
||||
upx_byte *b = f->buf; \
|
||||
upx_byte *b_end = b + f->buf_len - 4; \
|
||||
byte *b = f->buf; \
|
||||
byte *b_end = b + f->buf_len - 4; \
|
||||
do { \
|
||||
if (cond) \
|
||||
{ \
|
||||
if (cond) { \
|
||||
unsigned a = (unsigned) (b - f->buf); \
|
||||
f->lastcall = a; \
|
||||
set(b, get(b) + (addvalue)); \
|
||||
@@ -400,35 +297,31 @@ static int s_ct32_e8e9_bswap_be(Filter *f)
|
||||
} \
|
||||
b += 4; \
|
||||
} while (b < b_end); \
|
||||
if (f->lastcall) f->lastcall += 4; \
|
||||
if (f->lastcall) \
|
||||
f->lastcall += 4; \
|
||||
return 0;
|
||||
|
||||
|
||||
#define ARMCT_COND_le (((b[3] & 0x0f) == 0x0b))
|
||||
|
||||
static int f_ct24arm_le(Filter *f)
|
||||
{
|
||||
static int f_ct24arm_le(Filter *f) {
|
||||
CT24ARM_LE(f, ARMCT_COND_le, a / 4 + f->addvalue, get_le24, set_le24)
|
||||
}
|
||||
|
||||
static int u_ct24arm_le(Filter *f)
|
||||
{
|
||||
static int u_ct24arm_le(Filter *f) {
|
||||
CT24ARM_LE(f, ARMCT_COND_le, 0 - a / 4 - f->addvalue, get_le24, set_le24)
|
||||
}
|
||||
|
||||
static int s_ct24arm_le(Filter *f)
|
||||
{
|
||||
static int s_ct24arm_le(Filter *f) {
|
||||
CT24ARM_LE(f, ARMCT_COND_le, a + f->addvalue, get_le24, set_dummy)
|
||||
}
|
||||
|
||||
#undef CT24ARM_LE
|
||||
|
||||
#define CT24ARM_BE(f, cond, addvalue, get, set) \
|
||||
upx_byte *b = f->buf; \
|
||||
upx_byte *b_end = b + f->buf_len - 4; \
|
||||
byte *b = f->buf; \
|
||||
byte *b_end = b + f->buf_len - 4; \
|
||||
do { \
|
||||
if (cond) \
|
||||
{ \
|
||||
if (cond) { \
|
||||
unsigned a = (unsigned) (b - f->buf); \
|
||||
f->lastcall = a; \
|
||||
set(1 + b, get(1 + b) + (addvalue)); \
|
||||
@@ -436,23 +329,21 @@ static int s_ct24arm_le(Filter *f)
|
||||
} \
|
||||
b += 4; \
|
||||
} while (b < b_end); \
|
||||
if (f->lastcall) f->lastcall += 4; \
|
||||
if (f->lastcall) \
|
||||
f->lastcall += 4; \
|
||||
return 0;
|
||||
|
||||
#define ARMCT_COND_be (((b[0] & 0x0f) == 0x0b))
|
||||
|
||||
static int f_ct24arm_be(Filter *f)
|
||||
{
|
||||
static int f_ct24arm_be(Filter *f) {
|
||||
CT24ARM_BE(f, ARMCT_COND_be, a / 4 + f->addvalue, get_be24, set_be24)
|
||||
}
|
||||
|
||||
static int u_ct24arm_be(Filter *f)
|
||||
{
|
||||
static int u_ct24arm_be(Filter *f) {
|
||||
CT24ARM_BE(f, ARMCT_COND_be, 0 - a / 4 - f->addvalue, get_be24, set_be24)
|
||||
}
|
||||
|
||||
static int s_ct24arm_be(Filter *f)
|
||||
{
|
||||
static int s_ct24arm_be(Filter *f) {
|
||||
CT24ARM_BE(f, ARMCT_COND_be, a + f->addvalue, get_be24, set_dummy)
|
||||
}
|
||||
|
||||
@@ -463,12 +354,13 @@ static int s_ct24arm_be(Filter *f)
|
||||
// 26-bit ARM calltrick ("naive")
|
||||
**************************************************************************/
|
||||
|
||||
#if 1 //{ old reliable
|
||||
|
||||
#define CT26ARM_LE(f, cond, addvalue, get, set) \
|
||||
upx_byte *b = f->buf; \
|
||||
upx_byte *b_end = b + f->buf_len - 4; \
|
||||
byte *b = f->buf; \
|
||||
byte *b_end = b + f->buf_len - 4; \
|
||||
do { \
|
||||
if (cond) \
|
||||
{ \
|
||||
if (cond) { \
|
||||
unsigned a = (unsigned) (b - f->buf); \
|
||||
f->lastcall = a; \
|
||||
set(b, get(b) + (addvalue)); \
|
||||
@@ -476,27 +368,66 @@ static int s_ct24arm_be(Filter *f)
|
||||
} \
|
||||
b += 4; \
|
||||
} while (b < b_end); \
|
||||
if (f->lastcall) f->lastcall += 4; \
|
||||
if (f->lastcall) \
|
||||
f->lastcall += 4; \
|
||||
return 0;
|
||||
|
||||
|
||||
#define ARMCT_COND (((b[3] & 0x7C) == 0x14))
|
||||
|
||||
static int f_ct26arm_le(Filter *f)
|
||||
{
|
||||
static int f_ct26arm_le(Filter *f) {
|
||||
CT26ARM_LE(f, ARMCT_COND, a / 4 + f->addvalue, get_le26, set_le26)
|
||||
}
|
||||
|
||||
static int u_ct26arm_le(Filter *f)
|
||||
{
|
||||
static int u_ct26arm_le(Filter *f) {
|
||||
CT26ARM_LE(f, ARMCT_COND, 0 - a / 4 - f->addvalue, get_le26, set_le26)
|
||||
}
|
||||
|
||||
static int s_ct26arm_le(Filter *f)
|
||||
{
|
||||
static int s_ct26arm_le(Filter *f) {
|
||||
CT26ARM_LE(f, ARMCT_COND, a + f->addvalue, get_le26, set_dummy)
|
||||
}
|
||||
|
||||
#else //}{ new enhanced but DIFFERENT; need new filter type!
|
||||
|
||||
static int CTarm64(Filter *f, int dir) { // dir: 1, 0, -1
|
||||
byte *b = f->buf; // will be incremented
|
||||
byte *const b_end = b + f->buf_len - 4;
|
||||
do {
|
||||
unsigned const a = b - f->buf;
|
||||
int const d = dir * (f->addvalue + (a >> 2));
|
||||
unsigned const v = get_le32(f->buf); // the 32-bit instruction
|
||||
if (0x05 == (0x1f & (v >> 26))) { // b, bl
|
||||
f->lastcall = a;
|
||||
if (dir)
|
||||
set_le26(b, v + d);
|
||||
f->calls++;
|
||||
} else if ((0x54 == (v >> 24)) // b.cond
|
||||
|| (0x1a == ((v >> 25) & 0x3f)) // cb{z,nz}
|
||||
) {
|
||||
f->lastcall = a;
|
||||
if (dir)
|
||||
set_le19_5(b, (v >> 5) + d);
|
||||
f->calls++;
|
||||
} else if (0x1b == ((v >> 25) & 0x3f)) { // tb{z,nz}
|
||||
f->lastcall = a;
|
||||
if (dir)
|
||||
set_le14_5(b, (v >> 5) + d);
|
||||
f->calls++;
|
||||
}
|
||||
b += 4;
|
||||
} while (b < b_end);
|
||||
if (f->lastcall)
|
||||
f->lastcall += 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int f_CTarm64_le(Filter *f) { return CTarm64(f, 1); }
|
||||
|
||||
static int u_CTarm64_le(Filter *f) { return CTarm64(f, -1); }
|
||||
|
||||
static int s_CTarm64_le(Filter *f) { return CTarm64(f, 0); }
|
||||
|
||||
#endif //}
|
||||
|
||||
#undef CT26ARM_LE
|
||||
#undef ARMCT_COND
|
||||
|
||||
|
||||
+18
-36
@@ -2,8 +2,8 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -25,20 +25,17 @@
|
||||
<markus@oberhumer.com> <ezerotven+github@gmail.com>
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
// filter / scan
|
||||
**************************************************************************/
|
||||
|
||||
static int F(Filter *f)
|
||||
{
|
||||
static int F(Filter *f) {
|
||||
#ifdef U
|
||||
// filter
|
||||
upx_byte *b = f->buf;
|
||||
byte *b = f->buf;
|
||||
#else
|
||||
// scan
|
||||
const upx_byte *b = f->buf;
|
||||
const byte *b = f->buf;
|
||||
#endif
|
||||
const unsigned addvalue = f->addvalue;
|
||||
const unsigned size = f->buf_len;
|
||||
@@ -57,17 +54,14 @@ static int F(Filter *f)
|
||||
// So, a call to a destination that is outside the buffer
|
||||
// must not conflict with the mark.
|
||||
// Note that unsigned comparison checks both edges of buffer.
|
||||
for (ic = 0; ic < size - 5; ic++)
|
||||
{
|
||||
for (ic = 0; ic < size - 5; ic++) {
|
||||
if (!COND(b, ic))
|
||||
continue;
|
||||
jc = get_le32(b + ic + 1) + ic + 1;
|
||||
if (jc < size)
|
||||
{
|
||||
if (jc < size) {
|
||||
if (jc + addvalue >= (1u << 24)) // hi 8 bits won't be cto8
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
} else
|
||||
buf[b[ic + 1]] |= 1;
|
||||
}
|
||||
|
||||
@@ -79,26 +73,22 @@ static int F(Filter *f)
|
||||
const unsigned cto = (unsigned) f->cto << 24;
|
||||
#endif
|
||||
|
||||
for (ic = 0; ic < size - 5; ic++)
|
||||
{
|
||||
for (ic = 0; ic < size - 5; ic++) {
|
||||
if (!COND(b, ic))
|
||||
continue;
|
||||
jc = get_le32(b + ic + 1) + ic + 1;
|
||||
// try to detect 'real' calls only
|
||||
if (jc < size)
|
||||
{
|
||||
if (jc < size) {
|
||||
assert(jc + addvalue < (1u << 24)); // hi 8 bits won't be cto8
|
||||
#ifdef U
|
||||
set_be32(b + ic + 1, jc + addvalue + cto);
|
||||
#endif
|
||||
if (ic - lastnoncall < 5)
|
||||
{
|
||||
if (ic - lastnoncall < 5) {
|
||||
// check the last 4 bytes before this call
|
||||
for (kc = 4; kc; kc--)
|
||||
if (COND(b, ic - kc) && b[ic - kc + 1] == cto8)
|
||||
break;
|
||||
if (kc)
|
||||
{
|
||||
if (kc) {
|
||||
#ifdef U
|
||||
// restore original
|
||||
set_le32(b + ic + 1, jc - ic - 1);
|
||||
@@ -113,9 +103,7 @@ static int F(Filter *f)
|
||||
calls++;
|
||||
ic += 4;
|
||||
lastcall = ic + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
assert(b[ic + 1] != cto8); // this should not happen
|
||||
lastnoncall = ic;
|
||||
noncalls++;
|
||||
@@ -133,15 +121,13 @@ static int F(Filter *f)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
// unfilter
|
||||
**************************************************************************/
|
||||
|
||||
#ifdef U
|
||||
static int U(Filter *f)
|
||||
{
|
||||
upx_byte *b = f->buf;
|
||||
static int U(Filter *f) {
|
||||
byte *b = f->buf;
|
||||
const unsigned size5 = f->buf_len - 5;
|
||||
const unsigned addvalue = f->addvalue;
|
||||
const unsigned cto = (unsigned) f->cto << 24;
|
||||
@@ -149,24 +135,20 @@ static int U(Filter *f)
|
||||
unsigned ic, jc;
|
||||
|
||||
for (ic = 0; ic < size5; ic++)
|
||||
if (COND(b,ic))
|
||||
{
|
||||
if (COND(b, ic)) {
|
||||
jc = get_be32(b + ic + 1);
|
||||
if (b[ic+1] == f->cto)
|
||||
{
|
||||
if (b[ic + 1] == f->cto) {
|
||||
set_le32(b + ic + 1, jc - ic - 1 - addvalue - cto);
|
||||
f->calls++;
|
||||
ic += 4;
|
||||
f->lastcall = ic + 1;
|
||||
}
|
||||
else
|
||||
} else
|
||||
f->noncalls++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#undef F
|
||||
#undef U
|
||||
|
||||
|
||||
+19
-37
@@ -2,9 +2,9 @@
|
||||
|
||||
This file is part of the UPX executable compressor.
|
||||
|
||||
Copyright (C) 1996-2023 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2023 Laszlo Molnar
|
||||
Copyright (C) 2000-2023 John F. Reiser
|
||||
Copyright (C) 1996-2025 Markus Franz Xaver Johannes Oberhumer
|
||||
Copyright (C) 1996-2025 Laszlo Molnar
|
||||
Copyright (C) 2000-2025 John F. Reiser
|
||||
All Rights Reserved.
|
||||
|
||||
UPX and the UCL library are free software; you can redistribute them
|
||||
@@ -29,20 +29,17 @@
|
||||
<jreiser@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
// filter / scan
|
||||
**************************************************************************/
|
||||
|
||||
static int F(Filter *f)
|
||||
{
|
||||
static int F(Filter *f) {
|
||||
#ifdef U
|
||||
// filter
|
||||
upx_byte *b = f->buf;
|
||||
byte *b = f->buf;
|
||||
#else
|
||||
// scan
|
||||
const upx_byte *b = f->buf;
|
||||
const byte *b = f->buf;
|
||||
#endif
|
||||
const unsigned addvalue = f->addvalue;
|
||||
const unsigned size = f->buf_len;
|
||||
@@ -56,17 +53,14 @@ static int F(Filter *f)
|
||||
unsigned char buf[256];
|
||||
memset(buf, 0, 256);
|
||||
|
||||
for (ic = 0; ic < size - 5; ic++)
|
||||
{
|
||||
for (ic = 0; ic < size - 5; ic++) {
|
||||
if (!COND(b, ic, lastcall))
|
||||
continue;
|
||||
jc = get_le32(b + ic + 1) + ic + 1;
|
||||
if (jc < size)
|
||||
{
|
||||
if (jc < size) {
|
||||
if (jc + addvalue >= (1u << 24)) // hi 8 bits won't be cto8
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
} else
|
||||
buf[b[ic + 1]] |= 1;
|
||||
}
|
||||
|
||||
@@ -78,26 +72,22 @@ static int F(Filter *f)
|
||||
const unsigned cto = (unsigned) f->cto << 24;
|
||||
#endif
|
||||
|
||||
for (ic = 0; ic < size - 5; ic++)
|
||||
{
|
||||
for (ic = 0; ic < size - 5; ic++) {
|
||||
if (!COND(b, ic, lastcall))
|
||||
continue;
|
||||
jc = get_le32(b + ic + 1) + ic + 1;
|
||||
// try to detect 'real' calls only
|
||||
if (jc < size)
|
||||
{
|
||||
if (jc < size) {
|
||||
assert(jc + addvalue < (1u << 24)); // hi 8 bits won't be cto8
|
||||
#ifdef U
|
||||
set_be32(b + ic + 1, jc + addvalue + cto);
|
||||
#endif
|
||||
if (ic - lastnoncall < 5)
|
||||
{
|
||||
if (ic - lastnoncall < 5) {
|
||||
// check the last 4 bytes before this call
|
||||
for (kc = 4; kc; kc--)
|
||||
if (COND(b, ic - kc, lastcall) && b[ic - kc + 1] == cto8)
|
||||
break;
|
||||
if (kc)
|
||||
{
|
||||
if (kc) {
|
||||
#ifdef U
|
||||
// restore original
|
||||
set_le32(b + ic + 1, jc - ic - 1);
|
||||
@@ -112,9 +102,7 @@ static int F(Filter *f)
|
||||
calls++;
|
||||
ic += 4;
|
||||
lastcall = ic + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
assert(b[ic + 1] != cto8); // this should not happen
|
||||
lastnoncall = ic;
|
||||
noncalls++;
|
||||
@@ -132,15 +120,13 @@ static int F(Filter *f)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
// unfilter
|
||||
**************************************************************************/
|
||||
|
||||
#ifdef U
|
||||
static int U(Filter *f)
|
||||
{
|
||||
upx_byte *b = f->buf;
|
||||
static int U(Filter *f) {
|
||||
byte *b = f->buf;
|
||||
const unsigned size5 = f->buf_len - 5;
|
||||
const unsigned addvalue = f->addvalue;
|
||||
const unsigned cto = (unsigned) f->cto << 24;
|
||||
@@ -148,24 +134,20 @@ static int U(Filter *f)
|
||||
unsigned ic, jc;
|
||||
|
||||
for (ic = 0; ic < size5; ic++)
|
||||
if (COND(b,ic,lastcall))
|
||||
{
|
||||
if (COND(b, ic, lastcall)) {
|
||||
jc = get_be32(b + ic + 1);
|
||||
if (b[ic+1] == f->cto)
|
||||
{
|
||||
if (b[ic + 1] == f->cto) {
|
||||
set_le32(b + ic + 1, jc - ic - 1 - addvalue - cto);
|
||||
f->calls++;
|
||||
ic += 4;
|
||||
f->lastcall = ic + 1;
|
||||
}
|
||||
else
|
||||
} else
|
||||
f->noncalls++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#undef F
|
||||
#undef U
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user