dwww Home | Manual pages | Find package

mono-shlib-cop(1)           General Commands Manual          mono-shlib-cop(1)

NAME
       mono-shlib-cop - Shared Library Usage Checker

SYNOPSIS
       mono-shlib-cop [OPTIONS]* [ASSEMBLY-FILE-NAME]*

OPTIONS
       -p, --prefixes=PREFIX
              Mono   installation   prefixes.    This   is   to   find   $pre-
              fix/etc/mono/config.  The default is based upon the location  of
              mscorlib.dll, and is normally correct.

DESCRIPTION
       mono-shlib-cop  is  a tool that inspects a managed assembly looking for
       erroneous or suspecious usage of shared libraries.

       The tool takes one or more assembly filenames, and inspects each assem-
       bly specified.

       The errors checked for include:

       *      Does the shared library exist?

       *      Does the requested symbol exist within the shared library?

       The warnings checked for include:

       *      Is  the  target  shared  library a versioned library?  (Relevant
              only on Unix systems, not Mac OS X or Windows.)

       In general, only versioned libraries such as libc.so.6 are  present  on
       the  user's  machine, and efforts to load libc.so will result in a Sys-
       tem.DllNotFoundException.  There are three solutions to this:

       1.     Require that the user install any -devel packages which  provide
              the  unversioned  library.   This usually requires that the user
              install a large number of additional packages, complicating  the
              installation process.

       2.     Use  a  fully versioned name in your DllImport statements.  This
              requires editing your source code and recompiling  whenever  you
              need to target a different version of the shared library.

       3.     Provide  an  assembly.config  file which contains <dllmap/> ele-
              ments to remap the shared library name used by your assembly  to
              the actual versioned shared library present on the users system.
              Mono provides a number of pre-existing  <dllmap/>  entries,  in-
              cluding ones for libc.so and libX11.so.

EXAMPLE
       The following code contains examples of the above errors and warnings:
            using System.Runtime.InteropServices; // for DllImport
            class Demo {
                 [DllImport ("bad-library-name")]
                 private static extern void BadLibraryName ();

                 [DllImport ("libc.so")]
                 private static extern void BadSymbolName ();

                 [DllImport ("libcap.so")]
                 private static extern int cap_clear (IntPtr cap_p);
            }

       Bad library name
              Assuming that the library bad-library-name doesn't exist on your
              machine, Demo.BadLibraryName will generate an error, as  it  re-
              quires a shared library which cannot be loaded.  This may be ig-
              norable; see BUGS

       Bad symbol name
              Demo.BadSymbolName will generate an error, as libc.so  (remapped
              to  libc.so.6  by  mono's  $prefix/etc/mono/config file) doesn't
              contain the function BadSymbolName

       Unversioned library dependency
              Assuming you have the file libcap.so , Demo.cap_clear will  gen-
              erate  a  warning because, while libcap.so could be loaded, lib-
              cap.so might not exist on the users machine (on  FC2,  /lib/lib-
              cap.so  is  provided by libcap-devel , and you can't assume that
              end users will have any -devel packages installed).

FIXING CODE
       The fix depends on the warning or error:

       Bad library names
              Use a valid library name in the DllImport attribute, or  provide
              a  <dllmap/>  entry to map your existing library name to a valid
              library name.

       Bad symbol names
              Reference a symbol that actually exists in the target library.

       Unversioned library dependency
              Provide a <dllmap/> entry to reference a properly versioned  li-
              brary, or ignore the warning (see BUGS ).

DLLMAP ENTRIES
       Mono looks for an ASSEMBLY-NAME mapping information.  For example, with
       mcs.exe , Mono would read mcs.exe.config ,  and  for  Mono.Posix.dll  ,
       Mono would read Mono.Posix.dll.config

       The  .config file is an XML document containing a top-level <configura-
       tion/> section with nested <dllmap/> entries, which  contains  dll  and
       target  attributes.   The  dll attribute should contain the same string
       used in your DllImport attribute value, and the target attribute speci-
       fies which shared library mono should actually load at runtime.

       A sample .config file is:
            <configuration>
                 <dllmap dll="gtkembedmoz" target="libgtkembedmoz.so" />
            </configuration>

BUGS
       *      Only  DllImport  entries  are checked; the surrounding IL is ig-
              nored.  Consequently, if a runtime check is performed to  choose
              which  shared  library to invoke, an error will be reported even
              though the specified library is never used.  Consider this code:
                   using System.Runtime.InteropServices; // for DllImport
                   class Beep {
                        [DllImport ("kernel32.dll")]
                        private static extern int Beep (int dwFreq, int dwDuration);

                        [DllImport ("libcurses.so")]
                        private static extern int beep ();

                        public static void Beep ()
                        {
                             if (System.IO.Path.DirectorySeparatorChar == '\\') {
                                  Beep (750, 300);
                             }
                             else {
                                  beep ();
                             }
                        }
                   }
              If mono-shlib-cop is run on this assembly, an error will be  re-
              ported  for  using  kernel32.dll , even though kernel32.dll will
              never be used on Unix platforms.

       *      mono-shlib-cop currently only examines the shared  library  file
              extension  to determine if a warning should be generated.  A .so
              extension will always generate a warning, even if the .so is not
              a  symlink,  isn't provided in a -devel package, and there is no
              versioned   shared   library   (possible   examples    including
              /usr/lib/libtcl8.4.so, /usr/lib/libubsec.so, etc.).

              Consequently,  warnings  for any such libraries are useless, and
              incorrect.

              Windows and Mac OS X will  never  generate  warnings,  as  these
              platforms use different shared library extensions.

MAILING LISTS
       Visit  http://lists.ximian.com/mailman/listinfo/mono-devel-list for de-
       tails.

WEB SITE
       Visit http://www.mono-project.com for details

                                                             mono-shlib-cop(1)

Generated by dwww version 1.15 on Sat Jun 29 02:33:25 CEST 2024.