Apéndice A. Técnicas avanzadas

Tabla de contenidos

A.1. Bibliotecas compartidas
A.2. Gestionando debian/package.symbols
A.3. Varias arquitecturas
A.4. Construcción de un paquete de biblioteca compartida
A.5. Native Debian package

Éstos son algunos consejos e indicaciones sobre aspectos avanzados del mantenimiento de paquetes que pueden ser útiles. Se recomienda encarecidamente que leas todas las referencias sugeridas aquí.

Antes de empaquetar bibliotecas compartidas, debes leer atentamente la siguientes referencias básicas.

Éstos son algunos consejos básicos para empezar.

  • Las bibliotecas compartidas son archivos objeto en formato ELF que contienen código compilado.

  • Las bibliotecas compartidas se distribuyen como ficheros *.so (no como ficheros *.a o *.la).

  • Las bibliotecas compartidas se utilizan principalmente para compartir código común entre varios ejecutables con la orden ld.

  • Las bibliotecas compartidas se utilizan, a veces, para proveer varios complementos («plugins») a un ejecutable mediante el procedimiento dlopen.

  • Las bibliotecas compartidas exportan símbolos que representan objetos compilados como variables, funciones y clases; y permite acceder a ellos desde los ejecutables enlazados.

  • El SONAME (el nombre lógico) de la biblioteca compartida libnombre_biblioteca.so.1: objdump -p libnombre_biblioteca.so.1 | grep SONAME [89]

  • El «SONAME» (el nombre lógico) de una biblioteca compartida generalmente coincide con el nombre del archivo de biblioteca (pero no siempre).

  • El «SONAME» (el nombre lógico) de las bibliotecas compartidas enlazadas a /usr/bin/foo: objdump -p /usr/bin/foo | grep NEEDED [90]

  • libfoo1: el paquete de biblioteca de la biblioteca compartida libfoo.so.1 con la versión ABI del nombre lógico («SONAME») 1.[91]

  • Los guiones de desarrollador de un paquete de biblioteca deben ejecutar ldconfig cuando sea necesario para generar los enlaces simbólicos para el «SONAME» (el nombre lógico).[92]

  • libfoo1-dbg: el paquete de símbolos de depuración que contiene los símbolos de depuración del paquete de la biblioteca compartida libfoo1.

  • libfoo-dev: el paquete de desarrollo que contiene los ficheros de cabeceras y otros de la biblioteca compartida libfoo.so.1.[93]

  • En general, los paquetes Debian no deben contener ficheros «Libtool» *.la.[94]

  • En general, en los paquetes Debian no debe utilizarse «RPATH».[95]

  • Aunque está un poco anticuado y es sólo una referencia secundaria, Debian Library Packaging Guide aún puede ser útil.

Cuando empaquetes bibliotecas compartidas, debes generar el fichero debian/nombre_del_paquete.symbols para gestionar la versión mínima asociada a cada símbolo para cambios ABI compatibles con versiones anteriores con el mismo «SONAME» (nombre lógico) de la biblioteca para el mismo nombre de paquete de biblioteca compartida.[96] Se aconseja la lectura de las siguientes referencias básicas.

Aquí hay un ejemplo para generar el paquete libfoo1 de la versión 1.3 del autor original con el fichero debian/libfoo1.symbols adecuado.

  • Preparar el esqueleto de directorios fuente Debian utilizando el fichero con las fuentes libfoo-1.3.tar.gz.

    • Si es la primera versión del paquete libfoo1, genera un fichero debian/libfoo1.symbols en blanco.

    • Si la versión anterior del autor (la 1.2) fue empaquetada en el paquete libfoo1 con el fichero debian/libfoo1.symbols adecuado en el paquete fuente, utilízalo otra vez.

    • Si la versión anterior del autor (la 1.2) no se empaquetó con el fichero debian/libfoo1.symbols, genera el fichero symbols a partir de todos los paquetes binarios disponibles con el mismo nombre de paquete de biblioteca compartida que compartan el mismo «SONAME» (el nombre lógico) de la biblioteca; por ejemplo las versiones 1.1-1 y 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
      
  • Ejecuta compilaciones de prueba del árbol de directorios de las fuentes con órdenes como debuild y pdebuild. Si fallan debido a símbolos perdidos u otras causas, busca cambios ABI incompatibles con versiones anteriores que requieran cambios en el nombre del paquete de biblioteca compartida a algo del tipo libnombrebiblioteca1a y vuelta a empezar.

    $ cd libfoo-1.3
    $ debuild
    ...
    dpkg-gensymbols: adevertencia: hay símbolos nuevos en el fichero de símbolos: ...
     mire las diferencias a continuación
    --- 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
    ...
    
  • Si miras el informe de cambios generado a continuación por la orden dpkg-gensymbols, lista el fichero symbols actualizado adecuadamente para el paquete binario generado de la biblioteca compartida. [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
    
  • Compilar paquetes para publicarlos con herramientas como debuild y pdebuild.

    $ cd libfoo-1.3
    $ debuild clean
    $ debuild
    ...
    

Además de los ejemplos anteriores, también debes comprobar la compatibilidad ABI con más atención y actualizar manualmente las versiones de los símbolos (si es necesario). [100]

Aunque es sólo una referencia secundaria, Debian wiki UsingSymbolsFiles y sus enlaces a otras páginas web puede ser útil.

La función de varias arquitecturas introducida en Debian «wheezy» integra la instalación en más de una arquitectura de los paquetes binarios (en particular i386<->amd64, pero también con otras combinaciones) en dpkg y apt. Se recomienda leer atentamente las siguientes referencias.

Se utilizan tripletes del tipo i386-linux-gnu y x86_64-linux-gnu para el directorio de instalación de bibliotecas compartidas. El triplete de trabajo se establece dinámicamente al valor $(DEB_HOST_MULTIARCH) por dpkg-architecture(1) para cada compilación. Por ejemplo, el directorio de instalación de bibliotecas para varias arquitecturas se cambia como sigue.[101]

Estos son algunos ejemplos típicos de casos posibles de paquetes para varias arquitecturas para los siguientes paquetes:

  • el código fuente de la biblioteca libfoo-1.tar.gz

  • el código fuente de una orden bar-1.tar.gz escrito en un lenguaje compilado

  • el código fuente de una orden baz-1.tar.gz escrito en un lenguaje interpretado

Hay que tener en cuenta que el paquete de desarrollo debe contener un enlace simbólico a la biblioteca compartida asociada sin el número de versión. P. ej.: /usr/lib/x86_64-linux-gnu/libfoo.so -> libfoo.so.1

Puedes construir un paquete de biblioteca Debian con la opción multi-arquitectura activada utilizando dh(1) como sigue.

Debes comprobar que el paquete de biblioteca compartida solo contiene los ficheros esperados y que el paquete «-dev» sigue funcionando correctamente.

Todos los ficheros instalados simultáneamente por el paquete multi-arquitectura en el mismo directorio deben contener los mismos ficheros. Debes tener cuidado en las diferencias generadas por el orden de los bits de datos y por el algoritmo de compresión.

If a package is maintained only for Debian or possibly only for local use, its source may contain all the debian/* files in it. There are 2 ways to package it.

You can make the upstream tarball by excluding the debian/* files and package it as the non-native Debian package as in Sección 2.1, “Plan de trabajo para la construcción de paquetes Debian”. This is the normal way which some people encourage to use.

The alternative is the workflow of the native Debian package.

  • Generaremos un paquete fuente Debian en el formato 3.0 (native), utilizando un archivo comprimido en formato «tar» que incluirá todos los archivos.

    • nombre_del_paquete_versión.tar.gz
    • nombre_del_paquete_versión.dsc
  • Construiremos un paquete binario Debian del paquete de fuentes nativo Debian.

    • nombre_del_paquete_versión_arquitectura.deb

For example, if you have source files in ~/mypackage-1.0 without the debian/* files, you can create a native Debian package for it by issuing the dh_make command as follows.

$ cd ~/mi_paquete-1.0
$ dh_make --native

Entonces el directorio debian y su contenido son generados como en Sección 2.8, “Paquete no nativo Debian inicial”. De esta manera no se genera un archivo «tarball» ya que este es un paquete Debian nativo. Pero esa es la única diferencia. El resto de las actividades de empaquetado son prácticamente las mismas.

After execution of the dpkg-buildpackage command, you will see the following files in the parent directory:

  • mi_paquete_1.0.tar.gz

    Este es el archivo del código fuente generado a partir del directorio mi_paquete-1.0 por la orden dpkg-source (su sufijo no es orig.tar.gz.).

  • mi_paquete_1.0.dsc

    Este es el sumario del contenido del código fuente en el caso de los paquetes Debian no nativos (no tiene código de revisión Debian).

  • mi_paquete_1.0_i386.deb

    Este es el paquete binario completo en el caso de los paquetes Debian no nativos (no tiene código de revisión Debian).

  • mi_paquete_1.0_i386.changes

    Este archivo describe todos los cambios realizados en el versión actual del paquete en el caso de los paquetes Debian no nativos (no tiene código de revisión Debian).



[89] Como alternativa: readelf -d libnombre_biblioteca.so.1 | grep SONAME

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

[96] Los cambios ABI incompatibles con versiones anteriores, normalmente requieren actualizar el «SONAME» (el nombre lógico) de la biblioteca y el de la biblioteca compartida a otros nuevos.

[97] Para bibliotecas C++ y otros casos en los que el seguimiento individual de símbolos es difícil, es mejor consultar Debian Policy Manual, 8.6.4 "The shlibs system".

[98] Las versiones previas de los paquetes Debian están disponibles en http://snapshot.debian.org/. La revisión Debian del paquete sigue a la versión para facilitar mantenimiento de versiones anteriores («backport») del paquete: 1.1 << 1.1-1~bpo70+1 << 1.1-1 y 1.2 << 1.2-1~bpo70+1 << 1.2-1

[99] La revisión de Debian se deriva de la versión para hacer más fácil el mantenimiento de versiones anteriores («backport») del paquete: 1.3 << 1.3-1~bpo70+1 << 1.3-1

[101] Viejas ubicaciones especiales para bibliotecas como /lib32/ y /lib64/ ya no se utilizaran más.

[102] Como alternativa, puedes añadir los argumentos --libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) y --libexecdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) en ./configure. Fíjate que --libexecdir especifica el directorio predeterminado para la instalación de programas ejecutables que son ejecutados por otros programas en lugar de por los usuarios. El valor predeterminado por «Autotools» es /usr/libexec/ pero en Debian es /usr/lib/.