Anhang A. Fortgeschrittene Paketierung

Inhaltsverzeichnis

A.1. Laufzeit-Bibliothek
A.2. debian/Paket.symbols verwalten
A.3. Multiarch
A.4. Erstellen eines Laufzeitbibliothekspakets

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 libfoo.so.1: objdump -p libfoo.so.1 | grep SONAME [89]

  • Der SONAME einer Laufzeitbibliothek passt typischerweise (aber nicht immer) auf den Dateinamen der Bibliothek.

  • Der SONAME von Laufzeitbibliotheken, die nach /usr/bin/foo gelinkt sind: objdump -p /usr/bin/foo | grep NEEDED [90]

  • libfoo1: das Bibliothekspaket für die Laufzeitbibliothek libfoo.so.1 mit der SONAME-ABI-Version 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]

  • libfoo1-dbg: das Fehlersuch-Symbol-Paket, das die Debugging-Symbole für das Laufzeitpaket libfoo1 enthält.

  • libfoo-dev: das Entwicklungspaket, das die Header-Dateien usw. für die Laufzeitbibliothek libfoo.so enthält.1.[93]

  • 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/Paket.symbols 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:

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.

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]

Here are some typical multiarch package split scenario examples for the followings:

  • eine Bibliotheksquelle libfoo-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

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.

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 libfoo.so.1 | grep SONAME

[90] Alternativ: readelf -d libfoo.so.1 | grep NEEDED

[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/.