Over the weekend I checked into the repository a tool to easily create Mono bundles. A mono bundle allows you to ship your Mono application as a single binary: no runtime necessary: everything is "statically linked", there are no external dependencies on a Mono installation of any kind.
To use, just type:
mono$ mkbundle --deps sample.exe -o mcs Sources: 1 Auto-dependencies: True embedding: /home/cvs/mcs/mcs/mcs.exe embedding: /mono/lib/mono/1.0/mscorlib.dll embedding: /mono/lib/mono/1.0/System.dll embedding: /mono/lib/mono/1.0/System.Xml.dll Compiling: as -o /tmp/tmp7aa740ad.o temp.s cc -o demo -Wall temp.c `pkg-config --cflags --libs mono-static` /tmp/tmp7aa740ad.o Done mono$
In the example above the resulting binary is a healty 7.5 megabyte file, but it contains the Mono C# compiler and three of the system libraries as well as the Mono VM embedded into it:
mono$ ls -l demo -rwxr-xr-x 1 miguel users 7575630 2004-12-01 02:21 demo*
I then tuned the compilation to use a few shared libraries from the system, in this particular sample, I only want to avoid taking a Mono dependency:
mono$ mono$ ldd demo linux-gate.so.1 => (0xffffe000) libpthread.so.0 => /lib/tls/libpthread.so.0 (0x4002c000) libm.so.6 => /lib/tls/libm.so.6 (0x4003c000) libgmodule-2.0.so.0 => /opt/gnome/lib/libgmodule-2.0.so.0 (0x4005e000) libdl.so.2 => /lib/libdl.so.2 (0x40062000) libgthread-2.0.so.0 => /opt/gnome/lib/libgthread-2.0.so.0 (0x40066000) libglib-2.0.so.0 => /opt/gnome/lib/libglib-2.0.so.0 (0x4006b000) libc.so.6 => /lib/tls/libc.so.6 (0x409e6000) librt.so.1 => /lib/tls/librt.so.1 (0x40afa000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40c68000)
This is just a productification of a feature that Paolo had developed for Mono.
The next step is to write an assembly "linker", so that only the functions necessary to run mcs.exe are included as opposed to the whole three assemblies.
The main problem is that we need a good library for dealing with CIL images, the contenders:
Posted on 01 Dec 2004