From: Russ Allbery <rra@debian.org> Date: Thu, 1 Jul 2010 18:51:22 +0000 (-0700) Subject: Reformat and update the shlibs section X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=be3ace38f418075b9776e957f3e31073cd015fba;p=debian%2Fdebian-policy.git Reformat and update the shlibs section * Revise the footnote discussing shlibs creation to not talk about the switch to objdump as if it were a new innovation and to explicitly mention the NEEDED attribute as the source of dependency information. Also fix markup, formatting, indentation, and phrasing in multiple places. --- diff --git a/debian/changelog b/debian/changelog index 5ccc464..ae35d8c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,6 +19,9 @@ debian-policy (3.9.1.0) UNRELEASED; urgency=low allowed from main to contrib or non-free and mention that such relationships are okay if the non-free package is only an alternative. Thanks, Raphael Geissert. (Closes: #587279) + * Revise the footnote discussing shlibs creation to not talk about the + switch to objdump as if it were a new innovation and to explicitly + mention the NEEDED attribute as the source of dependency information. -- Russ Allbery <rra@debian.org> Mon, 28 Jun 2010 09:34:54 -0700 diff --git a/policy.sgml b/policy.sgml index 2635fa8..1e641e6 100644 --- a/policy.sgml +++ b/policy.sgml @@ -5398,59 +5398,49 @@ Replaces: mail-transport-agent </p> <p> - Thus, when a package is built which contains any shared - libraries, it must provide a <file>shlibs</file> file for other - packages to use, and when a package is built which contains - any shared libraries or compiled binaries, it must run + When a package is built which contains any shared libraries, it + must provide a <file>shlibs</file> file for other packages to + use. When a package is built which contains any shared + libraries or compiled binaries, it must run <qref id="pkg-dpkg-shlibdeps"><prgn>dpkg-shlibdeps</prgn></qref> on these to determine the libraries used and hence the dependencies needed by this package.<footnote> <p> - In the past, the shared libraries linked to were - determined by calling <prgn>ldd</prgn>, but now - <prgn>objdump</prgn> is used to do this. The only - change this makes to package building is that - <prgn>dpkg-shlibdeps</prgn> must also be run on shared - libraries, whereas in the past this was unnecessary. - The rest of this footnote explains the advantage that - this method gives. + <prgn>dpkg-shlibdeps</prgn> will use a program + like <prgn>objdump</prgn> or <prgn>readelf</prgn> to find + the libraries directly needed by the binaries or shared + libraries in the package. </p> <p> We say that a binary <tt>foo</tt> <em>directly</em> uses a library <tt>libbar</tt> if it is explicitly linked - with that library (that is, it uses the flag - <tt>-lbar</tt> during the linking stage). Other + with that library (that is, the library is listed in the ELF + <tt>NEEDED</tt> attribute, caused by adding <tt>-lbar</tt> + to the link line when the binary is created). Other libraries that are needed by <tt>libbar</tt> are linked <em>indirectly</em> to <tt>foo</tt>, and the dynamic linker will load them automatically when it loads - <tt>libbar</tt>. A package should depend on - the libraries it directly uses, and the dependencies for - those libraries should automatically pull in the other - libraries. - </p> - - <p> - Unfortunately, the <prgn>ldd</prgn> program shows both - the directly and indirectly used libraries, meaning that - the dependencies determined included both direct and - indirect dependencies. The use of <prgn>objdump</prgn> - avoids this problem by determining only the directly - used libraries. + <tt>libbar</tt>. A package should depend on the libraries + it directly uses, but not the libraries it indirectly uses. + The dependencies for those libraries will automatically pull + in the other libraries. </p> <p> A good example of where this helps is the following. We could update <tt>libimlib</tt> with a new version that - supports a new graphics format called dgf (but retaining - the same major version number). If we used the old - <prgn>ldd</prgn> method, every package that uses - <tt>libimlib</tt> would need to be recompiled so it - would also depend on <tt>libdgf</tt> or it wouldn't run - due to missing symbols. However with the new system, - packages using <tt>libimlib</tt> can rely on - <tt>libimlib</tt> itself having the dependency on - <tt>libdgf</tt> and so they would not need rebuilding. + supports a new graphics format called dgf (but retaining the + same major version number) and depends on <tt>libdgf</tt>. + If we used <prgn>ldd</prgn> to add dependencies for every + library directly or indirectly linked with a binary, every + package that uses <tt>libimlib</tt> would need to be + recompiled so it would also depend on <tt>libdgf</tt> or it + wouldn't run due to missing symbols. Since dependencies are + only added based on ELF <tt>NEEDED</tt> attribute, packages + using <tt>libimlib</tt> can rely on <tt>libimlib</tt> itself + having the dependency on <tt>libdgf</tt> and so they would + not need rebuilding. </p> </footnote> </p> @@ -5499,38 +5489,34 @@ Replaces: mail-transport-agent <p><file>DEBIAN/shlibs</file> files in the "build directory"</p> <p> - When packages are being built, any - <file>debian/shlibs</file> files are copied into the + When packages are being built, + any <file>debian/shlibs</file> files are copied into the control file area of the temporary build directory and given the name <file>shlibs</file>. These files give - details of any shared libraries included in the + details of any shared libraries included in the same package.<footnote> - An example may help here. Let us say that the - source package <tt>foo</tt> generates two binary - packages, <tt>libfoo2</tt> and - <tt>foo-runtime</tt>. When building the binary - packages, the two packages are created in the - directories <file>debian/libfoo2</file> and - <file>debian/foo-runtime</file> respectively. - (<file>debian/tmp</file> could be used instead of one - of these.) Since <tt>libfoo2</tt> provides the - <tt>libfoo</tt> shared library, it will require a - <tt>shlibs</tt> file, which will be installed in - <file>debian/libfoo2/DEBIAN/shlibs</file>, eventually - to become - <file>/var/lib/dpkg/info/libfoo2.shlibs</file>. Then - when <prgn>dpkg-shlibdeps</prgn> is run on the - executable - <file>debian/foo-runtime/usr/bin/foo-prog</file>, it - will examine the - <file>debian/libfoo2/DEBIAN/shlibs</file> file to - determine whether <tt>foo-prog</tt>'s library - dependencies are satisfied by any of the libraries - provided by <tt>libfoo2</tt>. For this reason, - <prgn>dpkg-shlibdeps</prgn> must only be run once - all of the individual binary packages' - <tt>shlibs</tt> files have been installed into the - build directory. + An example may help here. Let us say that the source + package <tt>foo</tt> generates two binary + packages, <tt>libfoo2</tt> and <tt>foo-runtime</tt>. + When building the binary packages, the two packages are + created in the directories <file>debian/libfoo2</file> + and <file>debian/foo-runtime</file> respectively. + (<file>debian/tmp</file> could be used instead of one of + these.) Since <tt>libfoo2</tt> provides the + <tt>libfoo</tt> shared library, it will require a + <tt>shlibs</tt> file, which will be installed in + <file>debian/libfoo2/DEBIAN/shlibs</file>, eventually to + become <file>/var/lib/dpkg/info/libfoo2.shlibs</file>. + When <prgn>dpkg-shlibdeps</prgn> is run on the + executable <file>debian/foo-runtime/usr/bin/foo-prog</file>, + it will examine + the <file>debian/libfoo2/DEBIAN/shlibs</file> file to + determine whether <tt>foo-prog</tt>'s library + dependencies are satisfied by any of the libraries + provided by <tt>libfoo2</tt>. For this reason, + <prgn>dpkg-shlibdeps</prgn> must only be run once all of + the individual binary packages' <tt>shlibs</tt> files + have been installed into the build directory. </footnote> </p> </item> @@ -5576,10 +5562,9 @@ dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/* \ </example> Otherwise, you will need to explicitly list the compiled binaries and libraries.<footnote> - If you are using <tt>debhelper</tt>, the - <prgn>dh_shlibdeps</prgn> program will do this work for - you. It will also correctly handle multi-binary - packages. + If you are using <tt>debhelper</tt>, the + <prgn>dh_shlibdeps</prgn> program will do this work for you. + It will also correctly handle multi-binary packages. </footnote> </p> @@ -5611,16 +5596,17 @@ dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/* \ you will need to specify that <prgn>dpkg-shlibdeps</prgn> should use the dependency line of type <tt>udeb</tt> by adding the <tt>-tudeb</tt> option<footnote> - <prgn>dh_shlibdeps</prgn> from the <tt>debhelper</tt> suite - will automatically add this option if it knows it is - processing a udeb. - </footnote>. If there is no dependency line of type <tt>udeb</tt> - in the <file>shlibs</file> file, <prgn>dpkg-shlibdeps</prgn> will - fall back to the regular dependency line. + <prgn>dh_shlibdeps</prgn> from the <tt>debhelper</tt> suite + will automatically add this option if it knows it is + processing a udeb. + </footnote>. If there is no dependency line of + type <tt>udeb</tt> in the <file>shlibs</file> + file, <prgn>dpkg-shlibdeps</prgn> will fall back to the regular + dependency line. </p> <p> - For more details on dpkg-shlibdeps, please see + For more details on <prgn>dpkg-shlibdeps</prgn>, please see <ref id="pkg-dpkg-shlibdeps"> and <manref name="dpkg-shlibdeps" section="1">. </p> @@ -5664,10 +5650,10 @@ dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/* \ usually of the form <tt><var>name</var>.so.<var>major-version</var></tt>, in our example, <tt>libz.so.1</tt>.<footnote> - This can be determined using the command - <example compact="compact"> + This can be determined using the command + <example compact="compact"> objdump -p /usr/lib/libz.so.1.1.3 | grep SONAME - </example> + </example> </footnote> The version part is the part which comes after <tt>.so.</tt>, so in our case, it is <tt>1</tt>. @@ -5724,11 +5710,12 @@ install -m644 debian/shlibs.<var>package</var> debian/<var>package</var>/DEBIAN/ <file>shlibs</file> file in the control area directly from <file>debian/rules</file> without using a <file>debian/shlibs</file> file at all,<footnote> - This is what <prgn>dh_makeshlibs</prgn> in the - <tt>debhelper</tt> suite does. If your package also has a udeb - that provides a shared library, <prgn>dh_makeshlibs</prgn> can - automatically generate the <tt>udeb:</tt> lines if you specify - the name of the udeb with the <tt>--add-udeb</tt> option. + This is what <prgn>dh_makeshlibs</prgn> in + the <package>debhelper</package> suite does. If your package + also has a udeb that provides a shared + library, <prgn>dh_makeshlibs</prgn> can automatically generate + the <tt>udeb:</tt> lines if you specify the name of the udeb + with the <tt>--add-udeb</tt> option. </footnote> since the <file>debian/shlibs</file> file itself is ignored by <prgn>dpkg-shlibdeps</prgn>.