[Mono-osx] Bundled mono console application on OS X throwing gthread errors.

silver83 silver83 at gmail.com
Wed Nov 12 14:29:11 EST 2008


I can't expose the source code but I'll try to recreate the exception using
some sample code and post it here later.

I have a mono console application (exe), that has assembly references to
several manages dll's and exe's.
Let's say the application directory looks like this :
AppDir/App.exe
AppDir/App.exe.config
AppDir/RefAssembly.dll
AppDir/Native/nativeLib1.dylib

Steps : 
1. Run "mkbundle2 -o App App.exe RefAssembly.dll". 
2. Run "macpack -a App.exe -m console -n BundledApp.app"
3. Move App (the result of mkbundle) and the Native folder 
    to "BundledApp.app/Contents/Resources"
4. Replace BundledApp.app/Contents/MacOS/BundledApp" with a bash script that
actually executes 
    "BundledApp.app/Contents/App"

5. Use otool -L on "BundledApp.app/Contents/App", find library references.
6. For each library reference 
6.1. copy it to "BundledApp.app/Contents/Libraries/". 
6.2. use install_name_tool to change the reference to
"@executable_path/../Libraries/libname". 
6.3. use install_name_tool to change the install name of the library itself
to same.
6.4. for this library reference, perform step 6 recursively on it (find it's
references, etc...)

Step 6 is a c# application which excludes everything non-mono, similar to
the one found here : 
http://code.google.com/p/cocoa-sharp-dev/wiki/RedistributableAppWithoutInstallingMono

This leaves me with the following directory structure :
BundledApp.app/Contents/Resources/App
BundledApp.app/Contents/Resources/Native/nativeLib1.dylib
BundledApp.app/Contents/Libraries/libglib-2.0.0.1800.1.dylib
BundledApp.app/Contents/Libraries/	libgthread-2.0.0.1800.1.dylib	
BundledApp.app/Contents/Libraries/libmono.0.0.0.dylib
BundledApp.app/Contents/Libraries/libglib-2.0.0.dylib
BundledApp.app/Contents/Libraries/libintl.8.0.2.dylib

Here is the tool -L result of all of them now :

./libglib-2.0.0.1800.1.dylib:
	@executable_path/../Libraries/libglib-2.0.0.1800.1.dylib (compatibility
version 1801.0.0, current version 1801.1.0)
	/usr/lib/libiconv.2.dylib (compatibility version 5.0.0, current version
5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
88.3.10)
	@executable_path/../Libraries/libintl.8.0.2.dylib (compatibility version
9.0.0, current version 9.2.0)
	/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
(compatibility version 2.0.0, current version 128.0.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version
1.0.0)
./libglib-2.0.0.dylib:
	@executable_path/../Libraries/libglib-2.0.0.dylib (compatibility version
1801.0.0, current version 1801.1.0)
	/usr/lib/libiconv.2.dylib (compatibility version 5.0.0, current version
5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
88.3.10)
	@executable_path/../Libraries/libintl.8.0.2.dylib (compatibility version
9.0.0, current version 9.2.0)
	/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
(compatibility version 2.0.0, current version 128.0.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version
1.0.0)
./libgthread-2.0.0.1800.1.dylib:
	@executable_path/../Libraries/libgthread-2.0.0.1800.1.dylib (compatibility
version 1801.0.0, current version 1801.1.0)
	@executable_path/../Libraries/libglib-2.0.0.dylib (compatibility version
1801.0.0, current version 1801.1.0)
	/usr/lib/libiconv.2.dylib (compatibility version 5.0.0, current version
5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
88.3.10)
	@executable_path/../Libraries/libintl.8.0.2.dylib (compatibility version
9.0.0, current version 9.2.0)
	/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
(compatibility version 2.0.0, current version 128.0.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version
1.0.0)
./libintl.8.0.2.dylib:
	@executable_path/../Libraries/libintl.8.0.2.dylib (compatibility version
9.0.0, current version 9.2.0)
	/usr/lib/libiconv.2.dylib (compatibility version 5.0.0, current version
5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
88.3.10)

/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
(compatibility version 150.0.0, current version 368.35.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version
1.0.0)
./libmono.0.0.0.dylib:
	@executable_path/../Libraries/libmono.0.0.0.dylib (compatibility version
1.0.0, current version 1.0.0)
	@executable_path/../Libraries/libgthread-2.0.0.1800.1.dylib (compatibility
version 1801.0.0, current version 1801.1.0)
	/usr/lib/libiconv.2.dylib (compatibility version 5.0.0, current version
5.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
88.3.10)
	@executable_path/../Libraries/libglib-2.0.0.1800.1.dylib (compatibility
version 1801.0.0, current version 1801.1.0)
	@executable_path/../Libraries/libintl.8.0.2.dylib (compatibility version
9.0.0, current version 9.2.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version
1.0.0)

/Resources/App:
	@executable_path/../Libraries/libmono.0.0.0.dylib (compatibility version
1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
111.1.1)
	@executable_path/../Libraries/libgthread-2.0.0.1800.1.dylib (compatibility
version 1801.0.0, current version 1801.1.0)
	@executable_path/../Libraries/libglib-2.0.0.1800.1.dylib (compatibility
version 1801.0.0, current version 1801.1.0)
	@executable_path/../Libraries/libintl.8.0.2.dylib (compatibility version
9.0.0, current version 9.2.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version
1.0.0)


And voila, from a working app, you got a bundled app that doesn't work and
throws the exception I stated in previous posts.

I'd digging into this, and I found that although all the file references are
processes correctly by dyld, there is a duplicate gthread init call which
causes the crash. I'll dtrace this tommorow and post the stack traces of
both calls.

Thanks for the help so far. 


duanew wrote:
> 
> It is too vague (to me anyway) what you are actually doing... you might
> try
> posting the code as well as the steps involving mkbundle,
> install_name_tool,
> etc.
> 
> On Wed, Nov 12, 2008 at 11:43 AM, silver83 <silver83 at gmail.com> wrote:
> 
>>
>> I still couldn't get it to work, using either @install_path or @rpath
>> techniques...
>> Still getting gthread error :
>> GThread-ERROR **: GThread system may only be initialized once.
>>
>> 0   libSystem.B.dylib                   0x95123b9e __kill + 10
>> 1   libSystem.B.dylib                   0x9519aec2 raise + 26
>> 2   libSystem.B.dylib                   0x951aa47f abort + 73
>> 3   libglib-2.0.0.dylib                 0x00e81ecc g_log + 0
>> 4   libglib-2.0.0.dylib                 0x00e81ef5 g_log + 41
>> 5   libgthread-2.0.0.1800.1.dylib       0x0000e3d7 g_thread_init + 521
>> 6   libmono.0.0.0.dylib                 0x0073233d mini_init + 2968
>> (mini.c:14091)
>> 7   libmono.0.0.0.dylib                 0x00778a63 mono_main + 454
>> (driver.c:1445)
>> 8   LiboxEngine                         0x00001fd0 main + 215
>> 9   LiboxEngine                         0x00001e7a start + 54
>>
>> Help ??
>>
>>
>>
>> duanew wrote:
>> >
>> > I had a similar need.  I wanted to fully embed mono within my
>> application
>> > so
>> > the end user did not need to install mono.  I posted here:
>> > http://lists.ximian.com/pipermail/mono-osx/2008-October/001616.html
>> >
>> > which describes the steps I went through.  Two differences in my post,
>> one
>> > is that I was using a DLL.  But now I use an EXE and have essentially
>> the
>> > same workflow.  Two, I embedded my mono app into a Cocoa application.
>> >
>> > I do not think you need that nant code referenced in the link in your
>> > post.
>> > You can download monobjc and look how their make system handles
>> mkbundle.
>> > I
>> > started there and was able to pull out the necessary steps.  Monobjc
>> has
>> a
>> > very ellegant build system that is a greating starting point.
>> >
>> > Best of luck,
>> > Duane
>> >
>> > On Tue, Nov 11, 2008 at 6:48 AM, silver83 <silver83 at gmail.com> wrote:
>> >
>> >>
>> >> I have bundled a mono console application using the following steps :
>> >> 1. use mkbundle to create the binary
>> >> 2. use macpack to create a dummy .app
>> >> 3. inject the bundled binary into the .app's resources folder
>> >> 4. rewire the execution script and the files under /Resources to
>> execute
>> >> the
>> >> binary
>> >>
>> >> I run the application and everything is fine, but now I want to rewire
>> >> library dependencies -
>> >> I'm using code from :
>> >>
>> >>
>> >>
>> http://code.google.com/p/cocoa-sharp-dev/wiki/RedistributableAppWithoutInstallingMono
>> >>
>> >> to inject mono libraries into Resources folder, rewire my app to use
>> >> them,
>> >> and rewire them to use themselves (using otool -L to see their
>> >> dependencies,
>> >> and install_name_tool to rewire them).
>> >>
>> >> During rewiring, I exclude things that I consider "non-mono" -
>> >> CoreFoundation, Carbon, libgcc, and libSystem.  I've tried several
>> >> mixtures
>> >> of which libraries to exclude, and I either end up with a
>> mono-dependent
>> >> application, or an application that crashed on :
>> >>
>> >> GThread-ERROR **: GThread system may only be initialized once.
>> >>
>> >> Some of the crash report :
>> >> Exception Type:  EXC_CRASH (SIGABRT)
>> >> Exception Codes: 0x0000000000000000, 0x0000000000000000
>> >> Crashed Thread:  0
>> >>
>> >> Thread 0 Crashed:
>> >> 0   libSystem.B.dylib                   0x95123b9e __kill + 10
>> >> 1   libSystem.B.dylib                   0x9519aec2 raise + 26
>> >> 2   libSystem.B.dylib                   0x951aa47f abort + 73
>> >> 3   libglib-2.0.0.dylib                 0x00c00ecc g_log + 0
>> >> 4   libglib-2.0.0.dylib                 0x00c00ef5 g_log + 41
>> >> 5   libgthread-2.0.0.1800.1.dylib       0x009ec3d7 g_thread_init + 521
>> >> 6   libmono.0.0.0.dylib                 0x002c933d mini_init + 2968
>> >> (mini.c:14091)
>> >> 7   libmono.0.0.0.dylib                 0x0030fa63 mono_main + 454
>> >> (driver.c:1445)
>> >> 8   MyApp                         0x00001f62 main + 215
>> >> 9   MyApp                         0x00001df2 start + 54
>> >>
>> >> Thread 0 crashed with X86 Thread State (32-bit):
>> >>  eax: 0x00000000  ebx: 0x951aa43f  ecx: 0xbffff47c  edx: 0x95123b9e
>> >>  edi: 0x00000002  esi: 0x00d08010  ebp: 0xbffff498  esp: 0xbffff47c
>> >>
>> >>
>> >> Any help (clues, hints, things I can do to debug this, maybe dtrace or
>> >> something) - would be much appreciated...
>> >>
>> >> Thanks in advance
>> >> Yoni.
>> >>
>> >>
>> >>
>> >>
>> >> --
>> >> View this message in context:
>> >>
>> http://www.nabble.com/Bundled-mono-console-application-on-OS-X-throwing-gthread-errors.-tp20437966p20437966.html
>> >> Sent from the Mono - OSX mailing list archive at Nabble.com.
>> >>
>> >> _______________________________________________
>> >> Mono-osx mailing list
>> >> Mono-osx at lists.ximian.com
>> >> http://lists.ximian.com/mailman/listinfo/mono-osx
>> >>
>> >
>> > _______________________________________________
>> > Mono-osx mailing list
>> > Mono-osx at lists.ximian.com
>> > http://lists.ximian.com/mailman/listinfo/mono-osx
>> >
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/Bundled-mono-console-application-on-OS-X-throwing-gthread-errors.-tp20437966p20464171.html
>> Sent from the Mono - OSX mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> Mono-osx mailing list
>> Mono-osx at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-osx
>>
> 
> _______________________________________________
> Mono-osx mailing list
> Mono-osx at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-osx
> 
> 

-- 
View this message in context: http://www.nabble.com/Bundled-mono-console-application-on-OS-X-throwing-gthread-errors.-tp20437966p20467528.html
Sent from the Mono - OSX mailing list archive at Nabble.com.



More information about the Mono-osx mailing list