Miguel de Icaza's web log

« Mono Security Stack | Main | Developing OpenOffice »

Bundles in Mono

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:

blog comments powered by Disqus

This is a personal web page. Things said here do not represent the position of my employer.