Posted on December 10, 2017 by Stéphane Laurent

In another post, I give the command line to compile Haskell code to a DLL on Windows:

ghc -shared FloatExpansion2.hs StartEnd.c -o FloatExpansion2.dll

This can generate a huge DLL. It is possible to get a smaller one.

The above example is not too big: the size of FloatExpansion2.dll is 7.6 MB. But let’s take this example.

Strip

The GNU strip program can make the size of a DLL smaller. This program is included in the Haskell platform (if you are a R user, it is included in Rtools). The size of FloatExpansion2.dll decreases to 4.2 MB when I run this command:

strip -g -S --strip-unneeded -v FloatExpansion2.dll

The upx program considerably compresses the size of a DLL. However my Haskell DLLs do not work anymore when I compress them with upx.

Module definition file

To get a smaller DLL, you can list the functions you want to export with the help of a module definition file. For our example, we want to export the floatExpansion function and - don’t forget - the HsStart function. To export these functions only, it suffices to list them in a text file like this:

EXPORTS
HsStart
floatExpansion

and then, assuming this file is named exports.def, run the command

ghc -shared FloatExpansion2.hs StartEnd.c -o FloatExpansion2.dll exports.def

When I do that, the size of FloatExpansion2.dll is 7.0 MB. This is not a big reduction, but I got a considerable reduction for other DLLs.

After that, you can use strip. Doing so, the size of FloatExpansion2.dll reduces to 3.5 MB.