According to my blog, it's been 24 days that I've joined the
Mono Team at
Novell, and I haven't yet blogged about what I am doing there.
Appart from a week in Seattle with
Rodrigo and
Miguel, where we've been attending a Compiler Lab hosted by Microsoft, I've been mainly working on the
linker.
The linker is something Miguel wants to have since quite a bit of time, as one can find references to it on his blog in
posts that are almost three years old. Thanks to the Google Summer of Code 2006, I started working on it.
To make it short, here is a definition of what a linker is, here is the definition extracted from
its page on the Mono wiki:
The linker is a tool one can use to only ship the minimal possible set of functions that a set of programs might require to run as opposed to the full libraries.
Writing a linker is not very hard. It's basically a mark and sweep operation, but the mark operation have to be very intrusive, and you have to dig in every piece of metadata so you don't forget any type, or any methods. Plus, there is also a few types in the BCL that are used inside the runtime (like StackOverflowException for instance), and some of them with a field layout that is tied to an unmanaged representation in the runtime (AppDomain for instance). That makes it very easy to forget something.
But today, after much fighting, I managed to have a non-trivial application working after a complete linking of itself and the base class library. This application is now famous, and have been used by thousands of users to test if their own application could be run of Mono. You've recognized
MoMa. It maybe looks like a simple application, but it uses stuff like System.Windows.Forms, System.Web.WebServices or even Mono.Cecil to do its job. And all it all, it's not that simple, believe me.
So, here is a little table where I've gathered some data about the size of the assemblies referenced by MoMa, before, and after having ben linked:
before after assembly
---------------------------------------
9K 5.5K Accessibility.dll
129K 34K ICSharpCode.SharpZipLib.dll
40K 24K MoMA.Analyzer.dll
44K 33K MoMA.exe
350K 277K Mono.Cecil.dll
70K 5.0K Mono.Data.Tds.dll
172K 15K Mono.Posix.dll
282K 7.5K Mono.Security.dll
2.4M 1.9M mscorlib.dll
115K 75K System.Configuration.dll
778K 354K System.Data.dll
1.4M 679K System.dll
429K 201K System.Drawing.dll
45K 6.5K System.EnterpriseServices.dll
129K 7.5K System.Security.dll
26K 6.5K System.Transactions.dll
1.9M 676K System.Web.dll
342K 88K System.Web.Services.dll
2.9M 1.8M System.Windows.Forms.dll
1.2M 834K System.Xml.dll
----------
13M 7M
So for the MoMa case, it's almost a reduction of half the size of the binaries needed to run it. Pretty good heh?
That's really convenient for people who embed Mono for the sake of running their own application. By using the linker, they can ship with only what they need to run their application.
Next time, I'll tell you about some limitations of the linker, and the solution to get over them.