Search code examples
monogarbage-collectionsgenmkbundle

Using Mono mkbundle To Target SGEN Garbage Collector


Is it possible to bundle a Mono executable using mkbundle that uses the sgen GC?

I assume that because the produced bundle requires the libmono-2.0.so.1 instead of the libmonosgen-2.0.so that it is using the standard boehm GC. I have tried using $MONO_OPTIONS=--gc=sgen but the resulting bundle still requires the non-sgen lib.

Am I misunderstanding the use of the libmono and libmonsgen libs?

Thank you for any assistance or guidance


Solution

  • This is a bit tricky, because Mono actually has two separate executables and two separate libraries, one for each garbage collector. For example, if you run mono --gc=sgen ... then mono will actually do an execvp() of mono-sgen ... to switch to a different executable.

    Similarly, mkbundle will use pkg-config to select the library and link one or the other (i.e. whichever is the system default). To get the other library, there are two options:

    One is to rebuild Mono with sgen being the default. Obviously, that may not be a viable solution.

    The alternative is to use pkg-config to override the selection. You'd create a copy of mono-2.pc, replace -lmono-2.0 with -lmonosgen-2.0, update prefix and exec_prefix and use the PKG_CONFIG_PATH environment variable to pick that version.

    Note that I've never actually tried the latter, but there is no reason why it shouldn't work, since pkg-config is where mkbundle gets the library path from.