[Mono-list] OSX Class libraries
Benjamin Reed
ranger@befunk.com
Sat, 8 Feb 2003 12:30:48 -0500
On Saturday, February 8, 2003, at 11:45 AM, keith davey wrote:
> I've been testing this and seem to have it a problem.
> OSX has dynlib files, and I assume these are the same
> as
> .so files. However when I run a program which tries to
> load a dynlib I get this:
>
> ** (invoke.exe:507): WARNING **: Failed to load
> library libSystem.dylib (libSystem.dylib):
> libSystem.dylib is not a loadable module
> got wrong token: 0x00000001
>
> ** ERROR **: file loader.c: line 491
> (mono_get_method): assertion failed: (table ==
> MONO_TABLE_MEMBERREF)
> aborting...
> Abort
>
> Anyone know anything about dynLib files? I guess if we
> have a problem I could write a C so, that wraps the
> dynlib file and then call that from mono.
Libraries on MacOSX are not like most elf systems... MacOSX
differentiates between shared libraries and dynamically loadable
modules (plugin). It looks like it's trying to load libSystem.dylib as
a bundle (loadable module), but it's a shared library. That is bad. =)
MacOSX's dynamic loader is described in detail in
http://developer.apple.com/techpubs/macosx/DeveloperTools/MachORuntime/
MachORuntime.pdf
The short version is:
Dylibs are shared libraries. They are linked to another library or a
binary at build time, and can be linked against, but cannot be
dynamically loaded without some tricks (dlcompat, a dlopen/dlclose
emulation library for macosx does this). Even with tricks they can't
be dlclosed though.
Bundles are loadable modules (ie, plugins), and can be dlopened and
dlclosed (and the macosx equivalents, using the native dyld loader).
They cannot be linked against, though.
From what I understand this is all just a side-effect of the Mach-O
structure. On elf systems, shared libs and modules have the same
structure, and can be treated as either, in Mach-O this is not the case.