mono-shlib-cop
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,
including 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 ();
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
library, 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
ignored. 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);
}
}
If mono-shlib-cop is run on this assembly, an error will be
reported 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
details.
WEB SITE
Visit http://www.mono-project.com for details
mono-shlib-cop(1)
Man Pages Copyright Respective Owners. Site Copyright (C) 1994 - 2012
Hurricane Electric.
All Rights Reserved.