| .TH dpkg\-shlibdeps 1 "2011-08-14" "Debian Project" "dpkg utilities" |
| .SH NAME |
| dpkg\-shlibdeps \- generate shared library substvar dependencies |
| . |
| .SH SYNOPSIS |
| .B dpkg\-shlibdeps |
| .RI [ option "...] [" \fB\-e\fP ] executable " [" option ...] |
| . |
| .SH DESCRIPTION |
| .B dpkg\-shlibdeps |
| calculates shared library dependencies for executables named in its |
| arguments. The dependencies are added to the substitution |
| variables file |
| .B debian/substvars |
| as variable names |
| .BI shlibs: dependencyfield |
| where |
| .I dependencyfield |
| is a dependency field name. Any other variables starting with |
| .B shlibs: |
| are removed from the file. |
| .P |
| .B dpkg\-shlibdeps |
| has two possible sources of information to generate dependency |
| information. Either |
| .I symbols |
| files or |
| .I shlibs |
| files. For each binary that |
| .B dpkg\-shlibdeps |
| analyzes, it finds out the list of libraries that it's linked with. |
| Then, for each library, it looks up either the |
| .I symbols |
| file, or the |
| .I shlibs |
| file (if the former doesn't exist or if debian/shlibs.local contains |
| the relevant dependency). Both files are supposed to be provided |
| by the library package and should thus be available as |
| /var/lib/dpkg/info/\fIpackage\fR.\fIsymbols\fR |
| or /var/lib/dpkg/info/\fIpackage\fR.\fIshlibs\fR. The package name is |
| identified in two steps: find the library file on the system (looking in |
| the same directories that \fBld.so\fR would use), then use |
| .BI "dpkg \-S " library-file |
| to lookup the package providing the library. |
| .SS Symbols files |
| Symbols files contain finer-grained dependency information by providing |
| the minimum dependency for each symbol that the library exports. The |
| script tries to find a symbols file associated to a library package |
| in the following places (first match is used): |
| .IP debian/*/DEBIAN/symbols |
| Shared library information generated by the current build process that also invoked |
| .BR dpkg\-shlibdeps . |
| They are generated by |
| .BR dpkg\-gensymbols (1). |
| They are only used if the library is found in a package's build tree. The |
| symbols file in that build tree takes precedence over symbols files from |
| other binary packages. |
| .IP /etc/dpkg/symbols/\fIpackage\fR.symbols.\fIarch\fR |
| .IP /etc/dpkg/symbols/\fIpackage\fR.symbols |
| Per-system overriding shared library dependency information. |
| \fIarch\fR is the architecture of the current system (obtained by |
| .BR "dpkg\-architecture \-qDEB_HOST_ARCH" ). |
| .IP "Output from \(lq\fBdpkg\-query \-\-control\-path\fR \fIpackage\fR symbols\(rq" |
| Package-provided shared library dependency information. |
| Unless overridden by \-\-admindir, those files are located in /var/lib/dpkg. |
| .P |
| While scanning the symbols used by all binaries, |
| .B dpkg\-shlibdeps |
| remembers the (biggest) minimal version needed for each library. At the end |
| of the process, it is able to write out the minimal dependency for every |
| library used (provided that the information of the \fIsymbols\fR files are |
| accurate). |
| .P |
| As a safe-guard measure, a symbols file can provide a |
| \fIBuild\-Depends\-Package\fR meta-information field and |
| .B dpkg\-shlibdeps |
| will extract the minimal version required by the corresponding package in |
| the Build\-Depends field and use this version if it's higher than the |
| minimal version computed by scanning symbols. |
| .SS Shlibs files |
| Shlibs files associate directly a library to a dependency (without looking |
| at the symbols). It's thus often stronger than really needed but very safe |
| and easy to handle. |
| .P |
| The dependencies for a library are looked up in several places. The first |
| file providing information for the library of interest is used: |
| .IP debian/shlibs.local |
| Package-local overriding shared library dependency information. |
| .IP /etc/dpkg/shlibs.override |
| Per-system overriding shared library dependency information. |
| .IP debian/*/DEBIAN/shlibs |
| Shared library information generated by the current build process that also invoked |
| .BR dpkg\-shlibdeps . |
| They are only used if the library is found in a package's build tree. The |
| shlibs file in that build tree takes precedence over shlibs files from |
| other binary packages. |
| .IP "Output from \(lq\fBdpkg\-query \-\-control\-path\fP \fIpackage\fR shlibs\(rq" |
| Package-provided shared library dependency information. |
| Unless overridden by \-\-admindir, those files are located in /var/lib/dpkg. |
| .IP /etc/dpkg/shlibs.default |
| Per-system default shared library dependency information. |
| .P |
| The extracted dependencies are then directly used (except if they are |
| filtered out because they have been identified as duplicate, or as weaker |
| than another dependency). |
| .SH OPTIONS |
| .B dpkg\-shlibdeps |
| interprets non-option arguments as executable names, just as if they'd |
| been supplied as |
| .BI \-e executable\fR. |
| .TP |
| .BI \-e executable |
| Include dependencies appropriate for the shared libraries required by |
| .IR executable . |
| .TP |
| .BI \-d dependencyfield |
| Add dependencies to be added to the control file dependency field |
| .IR dependencyfield . |
| (The dependencies for this field are placed in the variable |
| .BI shlibs: dependencyfield\fR.) |
| |
| The |
| .BI \-d dependencyfield |
| option takes effect for all executables after the option, until the |
| next |
| .BI \-d dependencyfield\fR. |
| The default |
| .I dependencyfield |
| is |
| .BR Depends . |
| |
| If the same dependency entry (or set of alternatives) appears in more |
| than one of the recognised dependency field names |
| .BR Pre\-Depends ", " Depends ", " Recommends ", " Enhances " or " Suggests |
| then |
| .B dpkg\-shlibdeps |
| will automatically remove the dependency from all fields except the |
| one representing the most important dependencies. |
| .TP |
| .BI \-p varnameprefix |
| Start substitution variables with |
| .IB varnameprefix : |
| instead of |
| .BR shlibs: . |
| Likewise, any existing substitution variables starting with |
| .IB varnameprefix : |
| (rather than |
| .BR shlibs: ) |
| are removed from the the substitution variables file. |
| .TP |
| .B \-O |
| Print substitution variable settings to standard output, rather than being |
| added to the substitution variables file |
| .RB ( debian/substvars |
| by default). |
| .TP |
| .BI \-t type |
| Prefer shared library dependency information tagged for the given |
| package type. If no tagged information is available, falls back to untagged |
| information. The default package type is "deb". Shared library dependency |
| information is tagged for a given type by prefixing it with the name of the |
| type, a colon, and whitespace. |
| .TP |
| .BI \-L localshlibsfile |
| Read overriding shared library dependency information from |
| .I localshlibsfile |
| instead of |
| .BR debian/shlibs.local . |
| .TP |
| .BI \-T substvarsfile |
| Write substitution variables in |
| .IR substvarsfile ; |
| the default is |
| .BR debian/substvars . |
| .TP |
| .BI \-v |
| Enable verbose mode. Numerous messages are displayed to explain what |
| .B dpkg\-shlibdeps |
| does. |
| .TP |
| .BI \-x package |
| Exclude the package from the generated dependencies. This is useful to |
| avoid self-dependencies for packages which provide ELF binaries |
| (executables or library plugins) using a library contained in the same |
| package. This option can be used multiple times to exclude several |
| packages. |
| .TP |
| .BI \-S pkgbuilddir |
| Look into \fIpkgbuilddir\fP first when trying to find a library. This is |
| useful when the source package builds multiple flavors of the same library |
| and you want to ensure that you get the dependency from a given binary |
| package. You can use this option multiple times: directories will be |
| tried in the same order before directories of other binary packages. |
| .TP |
| .BI \-\-ignore\-missing\-info |
| Do not fail if dependency information can't be found for a shared library. |
| Usage of this option is discouraged, all libraries should provide |
| dependency information (either with shlibs files, or with symbols files) |
| even if they are not yet used by other packages. |
| .TP |
| .BI \-\-warnings= value |
| \fIvalue\fP is a bit field defining the set of warnings that |
| can be emitted by \fBdpkg\-shlibdeps\fP. |
| Bit 0 (value=1) enables the warning "symbol \fIsym\fP used by \fIbinary\fP |
| found in none of the libraries", bit 1 (value=2) enables the warning |
| "dependency on \fIlibrary\fP could be avoided" and bit 2 (value=4) |
| enables the warning "\fIbinary\fP shouldn't be linked with \fIlibrary\fP". |
| The default \fIvalue\fP is 3: the first two warnings are active by |
| default, the last one is not. Set \fIvalue\fP to 7 if you want all |
| warnings to be active. |
| .TP |
| .BI \-\-admindir= dir |
| Change the location of the \fBdpkg\fR database. The default location is |
| \fI/var/lib/dpkg\fP. |
| .TP |
| .BR \-h ", " \-\-help |
| Show the usage message and exit. |
| .TP |
| .BR \-\-version |
| Show the version and exit. |
| . |
| .SH WARNINGS |
| Since |
| .B dpkg\-shlibdeps |
| analyzes the set of symbols used by each binary of the generated package, |
| it is able to emit warnings in several cases. They inform you of things |
| that can be improved in the package. In most cases, those improvements |
| concern the upstream sources directly. By order of decreasing importance, |
| here are the various warnings that you can encounter: |
| .TP |
| .BI symbol " sym" " used by " binary " found in none of the libraries." |
| The indicated symbol has not been found in the libraries linked with the |
| binary. The \fIbinary\fR is most likely a library and it needs to be linked |
| with an additional library during the build process (option |
| \fB\-l\fR\fIlibrary\fR of the linker). |
| .TP |
| .IB binary " contains an unresolvable reference to symbol " sym ": it's probably a plugin |
| The indicated symbol has not been found in the libraries linked with the |
| binary. The \fIbinary\fR is most likely a plugin and the symbol is |
| probably provided by the program that loads this plugin. In theory a |
| plugin doesn't have any SONAME but this binary does have one and as such |
| it could not be clearly identified as such. However the fact that the |
| binary is stored in a non-public directory is a strong indication |
| that's it's not a normal shared library. If the binary is really a |
| plugin, then disregard this warning. But there's always the possibility |
| that it's a real library and that programs linking to it are using an |
| RPATH so that the dynamic loader finds it. In that case, the library is |
| broken and needs to be fixed. |
| .TP |
| .BI "dependency on " library " could be avoided if " binaries " were not uselessly linked against it (they use none of its symbols)." |
| None of the \fIbinaries\fP that are linked with \fPlibrary\fP use any of the |
| symbols provided by the library. By fixing all the binaries, you would avoid |
| the dependency associated to this library (unless the same dependency is |
| also generated by another library that is really used). |
| .TP |
| .IB binary " shouldn't be linked with " library " (it uses none of its symbols)." |
| The \fIbinary\fR is linked to a library that it doesn't need. It's not a |
| problem but some small performance improvements in binary load time can be |
| obtained by not linking this library to this binary. This warning checks |
| the same information than the previous one but does it for each binary |
| instead of doing the check globally on all binaries analyzed. |
| .SH ERRORS |
| .B dpkg\-shlibdeps |
| will fail if it can't find a public library used by a binary or if this |
| library has no associated dependency information (either shlibs file or |
| symbols file). A public library has a SONAME and is versioned |
| (libsomething.so.\fIX\fR). A private library (like a plugin) should not |
| have a SONAME and doesn't need to be versioned. |
| .TP |
| .BI "couldn't find library " library-soname " needed by " binary " (its RPATH is '" rpath "')" |
| The \fIbinary\fR uses a library called \fIlibrary-soname\fR but |
| .B dpkg\-shlibdeps |
| has been unable to find the library. |
| .B dpkg\-shlibdeps |
| creates a list of directories to check as following: directories listed in |
| the RPATH of the binary, directories listed in /etc/ld.so.conf, |
| directories listed in the LD_LIBRARY_PATH environment variable, and |
| standard public directories (/lib, /usr/lib, /lib32, /usr/lib32, /lib64, |
| /usr/lib64). Then it checks those directories in the package's build tree |
| of the binary being analyzed, in the packages' build trees indicated with |
| the \-S command-line option, in other packages' build trees that contains |
| a DEBIAN/shlibs or DEBIAN/symbols file and finally in the root directory. |
| If the library is not found in any of those directories, then you get this |
| error. |
| |
| If the library not found is in a private directory of the same package, |
| then you want to add the directory to LD_LIBRARY_PATH. If it's in another |
| binary package being built, you want to make sure that the shlibs/symbols |
| file of this package is already created and that LD_LIBRARY_PATH |
| contains the appropriate directory if it also is in a private directory. |
| .TP |
| .BI "no dependency information found for " library-file " (used by " binary ")." |
| The library needed by \fIbinary\fR has been found by |
| .B dpkg\-shlibdeps |
| in \fIlibrary-file\fR but |
| .B dpkg\-shlibdeps |
| has been unable to find any dependency information for that library. To |
| find out the dependency, it has tried to map the library to a Debian |
| package with the help of |
| .BI "dpkg \-S " library-file\fR. |
| Then it checked the corresponding shlibs and symbols files in |
| /var/lib/dpkg/info/, and in the various package's build trees |
| (debian/*/DEBIAN/). |
| |
| This failure can be caused by a bad or missing shlibs or symbols file |
| in the package of the library. It might also happen if the library is |
| built within the same source package and if the shlibs files has not yet |
| been created (in which case you must fix debian/rules to create |
| the shlibs before calling \fBdpkg\-shlibdeps\fR). Bad RPATH can also |
| lead to the library being found under a non-canonical name (example: |
| /usr/lib/openoffice.org/../lib/libssl.so.0.9.8 instead of |
| /usr/lib/libssl.so.0.9.8) that's not associated to any package, |
| .B dpkg\-shlibdeps |
| tries to work around this by trying to fallback on a canonical name (using |
| .BR realpath (3)) |
| but it might not always work. It's always best to clean up the RPATH |
| of the binary to avoid problems. |
| |
| Calling |
| .B dpkg\-shlibdeps |
| in verbose mode (\-v) will provide much more information about where it |
| tried to find the dependency information. This might be useful if you |
| don't understand why it's giving you this error. |
| .SH "SEE ALSO" |
| .BR deb\-shlibs (5), |
| .BR deb\-symbols (5), |
| .BR dpkg\-gensymbols (1). |
| . |
| .SH AUTHORS |
| Copyright \(co 1995-1996 Ian Jackson |
| .br |
| Copyright \(co 2000 Wichert Akkerman |
| .br |
| Copyright \(co 2006 Frank Lichtenheld |
| .br |
| Copyright \(co 2007-2008 Rapha\[:e]l Hertzog |
| .sp |
| This is free software; see the GNU General Public Licence version 2 or later |
| for copying conditions. There is NO WARRANTY. |