MinGW for Windows: how to amazingly compress your .exe

Shotokan - martedì 3 Settembre

Vi piace il Cippiuppiu’ ma non vi piace codare con visual studio, troppo casino, per un cacchio di Hello, World! dovete creaare il progeetto, aggiungere il nuovo file, compilare, ed avete ottenuto l’eseguibile che e’ piccolissimo per carita’, ma ci mancano tutte le dipendenze quindi dovete installare sul pc dove volete “portare” questo .exe anche le altre dipendenze. (E che palle.)
Allora vi installate mingw per Windows, vi mettete zio sublime, mettete mingw/bin nella variabile d’ambiente PATH di windows e vi divertite a codare direttamente con Sublime. Ma.. un cacchio di Hello World! Pesa 1.08 MB!
Vediamo come ridurre di molto le dimensioni di questi exe senza fare sforzi particolari! 😉

“Luke, I’m your father.”
“Oh gosh, I knew I was adopted! Nobody loved me!”

Si, era un titolo senza senso because FU*K YOU.

Prendiamo in considerazione il seguente codice C++ per il test che stiamo per fare, molto semplice, due include “giusto per metterci qualcosa”.

(Io l’ho chiamato test.cpp, fate come volete.)

#include <iostream>
#include <stdio.h>
using namespace std;

int main(){
	cout<<"Hello, World!\n";
	getchar();
	return 0;
}

Salviamo (CTRL+S) e compiliamo (CTRL+B se avete messo mingw nella path)

…aand boom!

03/09/2013  14.36               131 test.cpp
03/09/2013  14.38         1.105.760 test.exe

Ecco che da 131 byte di C++ e’ uscito un mostro da 1MB.

“E come lo comprimo?”

Mi informo e sento molti che mi consigliano UPX.
Scarichiamo, proviamo.

Sposto upx nella directory di lavoro e lancio:

upx.exe -9 test.exe

e beh, il miglioramento sicuramente c’e’ stato, ma..

03/09/2013  14.36               131 test.cpp
03/09/2013  14.38           630.624 test.exe

Siamo ancora a 630KB per un cacchio di hello world! Neppure meta’ sono riuscito a comprimere..

Poteva anche andarmi bene a dire il vero, ma 630kb per l’hello world non mi andava bene per principio.

La soluzione mi e’ passata di mano lasciando perdere completamente la compressione.

“I am a hacker, and this is my manifesto. You may stop this individual, but you can’t stop us all… after all, we’re all alike.” Loyd Blankenship

Si, perdonate la banalita’ nel titolo, ma da come avrete capito, parliamo di file .manifest

“Ma cosa centrano i manifest?? Parlavamo di compressione!” Lettore, stai buono e prosegui con la lettura.

Ok, allora procediamo creando un manifest standard, che all’esecuzione non richiede privilegi particolari o nulla di che (potete tranquillamente cambiare il level, il metodo funziona ugualmente.)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Per il mio gaudio e grande fantasia ho chiamato questo manifest appunto: “manifest.manifest”.

Ora torniamo al progetto C++, ricompiliamolo in modo da riottenere l’eseguibile decompresso, o decomprimetelo con upx, come volete.

Scarichiamo MT.EXE (Cos’e’ MT.EXE?) (e si, l’ho riempito dei peggio troggian zirodei) e spostiamolo nella directory di lavoro.

Eseguiamo:

mt -manifest manifest.manifest -outputresource:test.exe;1

..per aggiungere al file il manifest precedentemente creato, ora osserviamo:

03/09/2013  14.36               131 test.cpp
03/09/2013  15.09           666.624 test.exe

Ma… E’ poco piu’ di quel che aveva compresso UPX! (SICSICSICS! SATAN LAICS VET FAIL)

Ed il file non e’ stato ancora compresso con UPX 😀

Proviamo allora a comprimere con UPX il file con il manifest gia’ incluso:

upx -9 test.exe

…E godiamoci il risultato:

03/09/2013  14.36               131 test.cpp
03/09/2013  15.09           191.488 test.exe

Quindi un buon 83% di compressione!

Lascio qui una ‘tabella riassuntiva’:

03/09/2013  14.36               131 test.cpp
03/09/2013  14.38         1.105.760 test.exe
03/09/2013  15.09           666.624 test_mt.exe
03/09/2013  14.38           630.624 test_upx.exe
03/09/2013  15.09           191.488 test_mt_upx.exe

Enjoy.

Theme made by Koala