Inhaltsverzeichnis
Es folgen einige Tipps und Verweise für fortgeschrittene Paketierungsfragen, mit denen Sie wahrscheinlich zu tun bekommen werden. Es wird Ihnen nachdrücklich empfohlen, alle hier vorgeschlagenen Referenzen zu lesen.
Bevor Sie Laufzeit-Bibliotheken paketieren, sollten Sie die folgenden Referenzen im Detail lesen:
Es folgen einige stark vereinfachte Tipps für den Anfang.
Laufzeitbibliotheken (engl. »shared libraries«) sind ELF-Objektdateien, die übersetzten Code enthalten.
Laufzeitbibliotheken werden als *.so
-Dateien
vertrieben, d.h. weder als *.a
- noch als
*.la
-Dateien.
Laufzeitbibliotheken werden hauptsächlich benutzt, um gemeinsamen Programmcode aus mehreren Programmen mittels des ld-Mechanismus gemeinsam zu benutzen.
Laufzeitbibliotheken werden manchmal dazu benutzt, mehrere Erweiterungen eines Programms mittels des dlopen-Mechanismus bereitzustellen.
Laufzeitbibliotheken exportieren Symbole, die übersetzte Objekte wie Variablen, Funktionen und Klassen darstellen und darauf Zugriff von dem verlinkten Programm ermöglichen.
Der SONAME einer Laufzeitbibliothek
lib
.foo
.so1
:
objdump -p
lib
[89]
foo
.so.1
| grep
SONAME
Der SONAME einer Laufzeitbibliothek passt typischerweise (aber nicht immer) auf den Dateinamen der Bibliothek.
Der SONAME von Laufzeitbibliotheken, die nach
gelinkt sind:
/usr/bin/foo
objdump -p
[90]
/usr/bin/foo
| grep
NEEDED
lib
:
das Bibliothekspaket für die Laufzeitbibliothek
foo
1
lib
mit der SONAME-ABI-Version foo
.so.1
1
.[91]
Die Paketbetreuerskripte des Bibliothekspakets müssen ldconfig unter den bestimmten Randbedingungen aufrufen, um die notwendigen symbolischen Links für den SONAME zu erzeugen.[92]
lib
:
das Fehlersuch-Symbol-Paket, das die Debugging-Symbole für das Laufzeitpaket
foo
1
-dbglib
enthält.
foo
1
lib
: das
Entwicklungspaket, das die Header-Dateien usw. für die Laufzeitbibliothek
foo
-devlib
.[93]
foo
.so
enthält.1
Debian-Pakete sollten im Allgemeinen keine
*.la
-Libtool-Archive enthalten.[94]
Debian-Pakete sollten im Allgemeinen keinen RPATH enthalten.[95]
Obwohl sie etwas veraltet und nur Sekundärliteratur ist, könnte der Debian Library Packaging Guide noch nützlich sein.
Wenn Sie eine Laufzeitbibliothek paketieren, sollten Sie eine Datei
debian/
erstellen, um die minimale Version zu verwalten, die jedem Symbol für
rückwärts-kompatible ABI-Änderungen unter dem gleichen SONAME der Bibliothek
für den gleichen Laufzeitbibliotheksnamen zugeordnet ist.[96] Sie sollten die folgenden primären Referenzen im
Detail lesen:
Paket
.symbols
Debian Policy Manual, Kapitel 8.6.3 »The symbols system«[97]
dh_makeshlibs(1)
dpkg-gensymbols(1)
dpkg-shlibdeps(1)
deb-symbols(5)
Es folgt ein grobes Beispiel, um das Paket libfoo1
für die Version 1.3
der Originalautoren mit der korrekten Datei
debian/libfoo1.symbols
zu erstellen.
Bereiten Sie das Gerüst des debianisierten Quellbaums mit der Datei der
Originalautoren libfoo-1.3.tar.gz
vor.
Falls dies das erstmalige Paketieren des Pakets libfoo1
ist, erstellen Sie die Datei
debian/libfoo1.symbols
mit leerem Inhalt.
Falls die vorherige Version 1.2
der Originalautoren im
Paket libfoo1
mit der korrekten
debian/libfoo1.symbols
in seinem Quellpaket paketiert
war, verwenden sie diese wieder.
Falls die vorhergehende Version 1.2
der Originalautoren
nicht mit der debian/libfoo1.symbols
paketiert worden
war, erstellen Sie sie als Datei symbols
von allen
verfügbaren Binärpaketen des selben Laufzeitbibliotheknamens, der den
gleichen SONAME der Bibliothek enthält, beispielsweise Version
1.1-1
und 1.2-1
. [98]
$ dpkg-deb -x libfoo1_1.1-1.deb libfoo1_1.1-1 $ dpkg-deb -x libfoo1_1.2-1.deb libfoo1_1.2-1 $ : > symbols $ dpkg-gensymbols -v1.1 -plibfoo1 -Plibfoo1_1.1-1 -Osymbols $ dpkg-gensymbols -v1.2 -plibfoo1 -Plibfoo1_1.2-1 -Osymbols
Bauen Sie mit Werkzeugen wie debuild und
pdebuild versuchsweise den Quellbaum. (Falls das aufgrund
fehlender Symbole usw. fehlschlägt, gibt es einige rückwärtsinkompatible
ABI-Änderungen, die es notwendig machen, den Paketnamen der
Laufzeitbibliothek auf etwas wie libfoo1a
zu erhöhen. Sie sollten dann wieder von
vorne anfangen.)
$ cd libfoo-1.3 $ debuild ... dpkg-gensymbols: Warnung: einige neue Symbole sind in der Symboldatei aufgetaucht: … lesen Sie die folgende Diff-Ausgabe --- debian/libfoo1.symbols (libfoo1_1.3-1_amd64) +++ dpkg-gensymbolsFE5gzx 2012-11-11 02:24:53.609667389 +0900 @@ -127,6 +127,7 @@ foo_get_name@Base 1.1 foo_get_longname@Base 1.2 foo_get_type@Base 1.1 + foo_get_longtype@Base 1.3-1 foo_get_symbol@Base 1.1 foo_get_rank@Base 1.1 foo_new@Base 1.1 ...
Falls Sie wie oben den von dpkg-gensymbols ausgegebenen
Diff sehen, extrahieren Sie die korrekte symbols
-Datei
aus dem erstellten Binärpaket der Laufzeitbibliothek. [99]
$ cd .. $ dpkg-deb -R libfoo1_1.3_amd64.deb libfoo1-tmp $ sed -e 's/1\.3-1/1\.3/' libfoo1-tmp/DEBIAN/symbols \ >libfoo-1.3/debian/libfoo1.symbols
Bauen Sie mit Werkzeugen wie debuild und pdebuild Veröffentlichungspakete.
$ cd libfoo-1.3 $ debuild clean $ debuild …
Zusätzlich zu den obigen Beispielen müssen wir die ABI-Kompatibilität weiter prüfen und die Versionen für einige Symbole wo notwendig erhöhen. [100]
Although it is only a secondary reference, Debian wiki UsingSymbolsFiles and its linked web pages may be useful.
The multiarch feature introduced to Debian wheezy integrates support for
cross-architecture installation of binary packages (particularly
i386
<->amd64
, but also other
combinations) in dpkg
and
apt
. You should read the following
references in detail.
Ubuntu wiki MultiarchSpec (upstream)
Debian wiki Multiarch/Implementation (Debian situation)
It uses the triplet such as i386-linux-gnu
and
x86_64-linux-gnu
for the install path of shared
libraries. The actual triplet path is dynamically set into
$(DEB_HOST_MULTIARCH)
value by dpkg-architecture(1) for each build. For example, the path to install multiarch
libraries are changed as follows.[101]
Alter Pfad | i386 multiarch path | amd64 multiarch path |
---|---|---|
/lib/
|
/lib/i386-linux-gnu/
|
/lib/x86_64-linux-gnu/
|
/usr/lib/
|
/usr/lib/i386-linux-gnu/
|
/usr/lib/x86_64-linux-gnu/
|
Here are some typical multiarch package split scenario examples for the followings:
eine Bibliotheksquelle
lib
foo
-1.tar.gz
eine in einer übersetzten Sprache geschriebene Werkzeugquelle
bar
-1.tar.gz
eine in einer interpretierten Sprache geschriebene Werkzeugquelle
baz
-1.tar.gz
Paket | Architektur: | Multi-Arch: | Paketinhalt |
---|---|---|---|
lib
|
any | same | die Laufzeitbibliothek, koinstallierbar |
lib
|
any | same | the shared library debug symbols, co-installable |
lib
|
any | same | die Laufzeitbibliothek-Header-Dateien usw., koinstallierbar |
lib
|
any | foreign | die Laufzeitunterstützungsprogramme, nicht koinstallierbar |
lib
|
all | foreign | die Dokumentationsdateien der Laufzeitbibliothek |
|
any | foreign | die übersetzten Programmdateien, nicht koinstallierbar |
|
all | foreign | die Dokumentationsdateien für das Programm |
|
all | foreign | die interpretierten Programmdateien |
Beachten Sie, dass die Entwicklungspakete einen Symlink für die zugehörige
Laufzeitbibliothek ohne eine Versionsnummer
enthalten
sollten. Z.B. /usr/lib/x86_64-linux-gnu/libfoo.so
->
libfoo.so.1
You can build a Debian library package enabling the multiarch support using dh(1) as follows.
debian/control
aktualisieren
Build-Depends: debhelper (>=9)
für den
Quellpaketabschnitt hinzufügen
Pre-Depends: ${misc:Pre-Depends}
für jedes
Laufzeitbibliothekspaket hinzufügen
Add Multi-Arch:
stanza for each binary package section.
debian/compat
auf »9« setzen
Adjust the path from the normal /usr/lib/
to the
multiarch /usr/lib/$(DEB_HOST_MULTIARCH)/
for all
packaging scripts.
Zuerst DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture
-qDEB_HOST_MULTIARCH)
in debian/rules
aufrufen, um die Variable DEB_HOST_MULTIARCH
zu setzen.
Ersetzen Sie in debian/rules
/usr/lib/
durch
/usr/lib/$(DEB_HOST_MULTIARCH)/
.
If ./configure
is used in the part of
override_dh_auto_configure
target in
debian/rules
, make sure to replace it with
dh_auto_configure --
. [102]
Replace all occurrences of /usr/lib/
with
/usr/lib/*/
in
debian/
files.
foo
.install
Generate files like
debian/
from
foo
.linksdebian/
dynamically by adding a script to
foo
.links.inoverride_dh_auto_configure
target in
debian/rules
.
override_dh_auto_configure: dh_auto_configure sed 's/@DEB_HOST_MULTIARCH@/$(DEB_HOST_MULTIARCH)/g' \ debian/foo
.links.in > debian/foo
.links
Please make sure to verify that the shared library package contains only the expected files, and that your -dev package still works.
All files installed simultaneously as the multiarch package to the same file path should have exactly the same file content. You must be careful on differences generated by the data byte order and by the compression algorithm.
[89]
Alternativ: readelf -d
lib
foo
.so.1
| grep
SONAME
[90]
Alternativ: readelf -d
lib
foo
.so.1
| grep
NEEDED
[93] Siehe Debian Policy Manual, Kapitel 8.3 »Static libraries« und Debian Policy Manual, Kapitel 8.4 »Development files«.
[95] Siehe Debian-Wiki RpathIssue.
[96] Backward-incompatible ABI changes normally require you to update the SONAME of the library and the shared library package name to new ones.
[97] Für C++-Bibliotheken und anderen Fällen, bei denen das Nachverfolgen individueller Symbole zu schwierig ist, folgen Sie stattdessen dem Debian Policy Manual, Kapitel 8.6.4 »The shlibs system«.
[98]
Alle vorhergehenden Versionen eines Pakets sind von http://snapshot.debian.org/ erhältlich. Die
Debian-Revision wird von der Version entfernt, um das Rückportieren eines
Paketes zu erleichtern: 1.1
<<
1.1-1~bpo70+1
<< 1.1-1
and
1.2
<< 1.2-1~bpo70+1
<<
1.2-1
[99]
Die Debian-Revision wird von der Version entfernt, um das Rückportieren
eines Paketes zu erleichtern: 1.3
<<
1.3-1~bpo70+1
<< 1.3-1
[101] Old special purpose library paths such as /lib32/
and
/lib64/
are not used any more.
[102]
Alternatively, you can add
--libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
and
--libexecdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
arguments to ./configure
. Please note that
--libexecdir
specifies the default path to install
executable programs run by other programs rather than by users. Its
Autotools default is /usr/libexec/
but its Debian
default is /usr/lib/
.