[Mono-devel-list] Need help with DllImport.

Jonathan Pryor jonpryor at vt.edu
Fri Jun 3 18:22:30 EDT 2005


On Fri, 2005-06-03 at 09:56 -0400, Gary M. Smithrud wrote:
> The DLL containing the InitializeKnowledgeBase relies on other shared 
> libraries that are also part of the project and under Mono 1.1.4 I could 
> create a single library that reference the others and it would work then 
> (definitely not ideal).

Sounds like you're improperly linking your library.  When you link your
library, you should link against all other dependent libraries:

	$ gcc -shared -out libfoo.so foo.c -ldep1 -ldep2 -ldep3 # ...

A perfect prior example is creating a C++ shared library which uses
`std::cout` but using `gcc` instead of `g++` to link the .so.  This
results in libstdc++.so *not* being loaded at runtime, resulting in
strange library loading errors like you're describing.

The perfect test for this is a small program which dlopen(3)'s your
library with RTLD_NOW.  If it can be loaded, your library is fine,
otherwise you have a dependency problem.  (dlerror(3) can be used to
obtain an error message after a failed attempt loading the library.)

For example:

        /*
         * dlopen test program for libraries
         *
         * Compile as: gcc -o dltest dltest.c -ldl
         */
        #include <stdio.h>
        #include <dlfcn.h>
        
        int
        main (int argc, char **argv)
        {
                int i;
                for (i = 1; i < argc; ++i) {
                        void *h;
                        h = dlopen (argv [i], RTLD_NOW);
                        if (h == NULL)
                                printf ("error loading library `%s': %s", 
        				argv [i], dlerror ());
                        if (h != NULL)
                                dlclose (h);
                }
                return 0;
        }

The other thing to keep in mind is that mono translates SIGSEGV into a
System.NullReferenceException, so it's possible that you're getting a
null pointer in InitializeKnowledgeBase (perhaps bad structure
marshaling?), resulting in a SIGSEGV, and hence the
NullReferenceException.

 - Jon





More information about the Mono-devel-list mailing list