]> git.donarmstrong.com Git - debian/debian-policy.git/blob - README.shlibdeps
[master]: Added changelog for bug 545548
[debian/debian-policy.git] / README.shlibdeps
1 In woody dpkg will use a different method to determine on which
2 libraries a package should depend. Until now dpkg-shlibdeps has
3 used the output of ldd to determine which libraries are needed.
4 This will be changed to using objdump. This however changes
5 will need a couple of changes in the way that packages are build.
6       
7 Let me first explain the differences between ldd and objdump.
8 A binary itself is linked against 0 or more dynamic libraries, depending
9 on how it is linked. Some of those libraries may need other libraries
10 to do their work, so the linker will need to load those as well when
11 the binary is executed. For example, to run xcdrgtk needs the following
12 libraries according to ldd:
13             
14         libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0x40019000)
15         libgdk-1.2.so.0 => /usr/lib/libgdk-1.2.so.0 (0x4013d000)
16         libImlib.so.1 => /usr/lib/libImlib.so.1 (0x40170000)
17         libgdk_imlib.so.1 => /usr/lib/libgdk_imlib.so.1 (0x401ab000)
18         libc.so.6 => /lib/libc.so.6 (0x401d9000)
19         libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0x402b5000)
20         libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0x402b8000)
21         libdl.so.2 => /lib/libdl.so.2 (0x402da000)
22         libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x402de000)
23         libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x402e6000)
24         libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x402f3000)
25         libm.so.6 => /lib/libm.so.6 (0x40392000)
26         libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x403af000)
27         libtiff.so.3 => /usr/lib/libtiff.so.3 (0x403cf000)
28         libungif.so.3 => /usr/lib/libungif.so.3 (0x40411000)
29         libpng.so.2 => /usr/lib/libpng.so.2 (0x4041a000)
30         libz.so.1 => /usr/lib/libz.so.1 (0x40442000)
31         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
32
33 Now if we leek a bit closed we see that xcdrgtk actually only links to
34 a couple of those libraries directly. The actual depencies are a tree
35 which looks something like this: (anyone interested in writing a tool
36 to make such a graph?)
37
38       xcdrgtk
39       +- libc
40       +- gtk
41       +- gdk
42       |  +- libXi
43       |  +- libXext
44       |  \- libX11
45       +- Imlib
46       |  +- libjpeg
47       |  +- libtiff
48       |  |  +- libjpeg
49       |  |  +- libm
50       |  |  \- libz
51       |  +- libungif
52       |  |  \- libX11
53       |  +- libpng
54       |  |  +- libz
55       |  |  \- libm
56       |  +- libz
57       |  \- libm
58       \- gdk_imlib
59          +- libgmodule-1.2
60          |   \- libdl
61          +- libglib-1.2
62          \- libdl
63             \- ld-linux
64
65 (I haven't listed libc in here, but all libraries are also linked to
66 libc).
67
68 What ldd does is give us a complete list of every library that is needed
69 to run the binary (in other words, if flattens this tree). objdump
70 however can tell us exactly what library something is linked with. For
71 the same xcdrgtk binary it will tell us:
72
73   NEEDED      libgtk-1.2.so.0
74   NEEDED      libgdk-1.2.so.0
75   NEEDED      libImlib.so.1
76   NEEDED      libgdk_imlib.so.1
77   NEEDED      libc.so.6
78
79 All the other libraries are automatically pulled in by the dynamic
80 loader.
81         
82 And now for the connection to package management: a package only
83 needs to depend on the libraries it is directly linked to, since the
84 dependencies for those libraries should automatically pull in the
85 other libraries.
86
87 This change does mean a change in the way packages are build though:
88 currently dpkg-shlibdeps is only run on binaries. But since we will
89 now depend on the libraries to depend on the libraries they need
90 the packages containing those libraries will need to run dpkg-shlibdeps
91 on the libraries. That may sound a bit strange, so here is an example:
92       
93 Generally a package does this in debian/rules:
94       
95         dpkg-shlibdeps debian/tmp/usr/bin/*
96       
97 This will need to be changes to:
98       
99         dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/lib/lib*.so.*
100
101 For lib* packages which don't generally contain libraries and didn't
102 run dpkg-shlibdeps a dpkg-shlibdeps call will need to be added as well.
103       
104 This gives us a lot more flexibility in the way libraries are packaged.
105       
106 A good example where this would help us is the current mess with
107 multiple version of the mesa library. With the ldd-based system
108 every package that uses mesa need to add a dependency on
109 svgalib|svgalib-dummy in order to handle the glide mesa variant.
110 With an objdump-based system this isn't necessary anymore and would
111 have saved everyone a lot of work.
112          
113 Another example: we could update libimlib with a new version that supports
114 a new graphics format called dgf. If we use the old ldd method every
115 package that uses libimlib would need to be recompiled so it would also
116 depend on libdgf or it wouldn't run due to missing symbols. However with
117 the new system packages using libimlib can depend on libimlib itself
118 having the dependency on libgdh and wouldn't need to be updated.