Sumari
Aquests són alguns consells i apunts d'aspectes avançats en la construcció de paquets que es probable que hagis de saber. Es recomana fermament llegir totes les referències suggerides aquí.
Abans de construir paquets de biblioteques compartides, has de llegir les següents referències bàsicques en detall.
Heus aquí alguns consells simplistes per a que pugis començar.
Les biblioteques compartides son fitxers objecte en format ELF que contenen codi compilat.
Les biblioteques compartides es distribueixen com a fitxers
*.so
(ni fitxers *.a
ni
*.la
).
Les biblioteques compartides s'utilitzen principalment per compartir codi comú entre diversos executables fent servir l'ordre ld.
Les biblioteques compartides, a vegades es fan servir per proporcionar complements («plugins») a un executable mitjançant el procediment dlopen.
Les biblioteques compartides exporten símbols que representen objectes compilats com a variables, funcions i classes, i permeten accedir-hi des dels executables enllaçats.
El SONAME (el nom lògic) de la biblioteca
compartida
lib
.nom_biblioteca
.so1
:
objdump -p
lib
[89]
nom_biblioteca
.so.1
| grep SONAME
El «SONAME» (nom lògic) d'una biblioteca compartida en general coincideix amb el nom del fitxer de la biblioteca (però no sempre).
El «SONAME» (nom lògic) de les biblioteques compartides enllaçades a
:
/usr/bin/foo
objdump -p
[90]
/usr/bin/foo
| grep
NEEDED
lib
:
el paquet de biblioteca de la biblioteca compartida
nom_biblioteca
1
lib
amb la versió ABI del nom lògic («SONAME»)
nom_biblioteca
.so.1
1
.[91]
Els guions del desenvolupador del paquet de la biblioteca han d'executar ldconfig en les circumstàncies específiques per generar els enllaços simbòlics necessaris per a «SONAME» (nom lògic).[92]
lib
:
el paquet de símbols de depuració que conté els símbols de depuració del
paquet de la biblioteca compartida foo
1
-dbglib
.
foo
1
lib
:
el paquet de desenvolupament amb els fitxers de capçalera i d'altres de la
biblioteca compartida
nom_biblioteca
-devlib
.[93]
nom_biblioteca
.so.1
En general, els paquets Debian no haurien de contenir fitxers «Libtool»
*.la
.[94]
En general, els paquets Debian no haurien de fer servir «RPATH».[95]
Encara que és una mica antiquat i és només una referència secundària, Debian Library Packaging Guide encara pot ésser útil.
Quan construeixes un paquet de biblioteca compartida, cal generar un fitxer
debian/
per gestionar la versió mínima associada a cada símbol pels canvis ABI
compatibles amb versions anteriors sota el mateix «SONAME» (nom lògic) de la
biblioteca per al mateix nom de paquet de biblioteca
compartida. [96] És recomanable que
llegeixis amb atenció les següents referències bàsiques.
nom_del_paquet
.symbols
dh_makeshlibs(1)
dpkg-gensymbols(1)
dpkg-shlibdeps(1)
deb-symbols(5)
Aquest és un exemple per generar el paquet libnom_biblioteca
per a la versió
1.3
de l'autor amb el fitxer
debian/libnom_biblioteca1.symbols
apropiat.
Prepara l'estructura de directoris Debian de les fonts fent servir el fitxer
original de l'autor libnom_biblioteca-1.3.tar.gz
Si és la primera vegada que es construeix un paquet de libnom_biblioteca1
, genera el fitxer
debian/libnom_biblioteca1.symbols
amb el contingut
buit.
Si la versió 1.2
anterior de l'autor es va empaquetar en
el paquet libnom_biblioteca1
amb el
fitxer debian/libnom_biblioteca1.symbols
apropiat en el
seu paquet font, fes-lo servir una altra vegada.
Si la versió 1.2
anterior de l'autor no s'ha empaquetat
amb el fitxer debian/libnom_biblioteca1.symbols
, genera
el fitxer symbols
a partir de tots els noms de paquets
binaris de la mateixa biblioteca compartida que tenguin el mateix «SONAME»
(nom lògic) de la biblioteca, per exemple, les versions
1.1-1
i 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
Executa compilacions de prova dels directoris de les fonts amb eines com
debuild i pdebuild. Si es produeixen
errors degut a símbols perduts o d'altres, busca canvis ABI incompatibles
amb versions anteriors que requereixin el canvi del nom del paquet de la
biblioteca compartida a alguna cosa com libnom_biblioteca1a
i torna a començar.
$ cd libfoo-1.3 $ debuild ... dpkg-gensymbols: warning: some new symbols appeared in the symbols file: ... see diff output below --- 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 llegeixes el informe de canvis generat a continuació per l'ordre
dpkg-gensymbols, llista el fitxer
symbols
actualitzat adequadament per al paquet binari
generat 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
Construir paquets per distribuir amb eines com debuild i pdebuild.
$ cd libfoo-1.3 $ debuild clean $ debuild ...
A més a més dels exemples anteriors, cal comprovar la compatibilitat ABI amb més atenció i actualitzar manualment les versions dels símbols (si és necessari). [100]
Encara que només és una referència secundària, Debian wiki UsingSymbolsFiles i els seus enllaços a altres pàgines web pot ésser d'utilitat.
La nova funció multi-arquitectura introduïda a la versió «wheezy» de Debian
integra el suport per a la instal·lació en més d'una arquitectura dels
paquets binaris (particularment a
i386
<->amd64
, però també amb
altres combinacions) en dpkg
i
apt
. És convenient que llegeixis les
següents referències detalladament.
Ubuntu wiki MultiarchSpec (original)
Debian wiki Multiarch/Implementation (estat a Debian)
S'utilitzen triplets com i386-linux-gnu
i
x86_64-linux-gnu
per als directoris d'instal·lació de les
biblioteques compartides. El triplet actual s'estableix de forma dinàmica al
valor $(DEB_HOST_MULTIARCH)
per dpkg-architecture(1) a cada compilació. Per exemple, el directori d'instal·lació
de les biblioteques multi-arquitectura es pot canviar de la següent
manera.[101]
Directori antic | directori multi-arquitectura i386 | directori multi-arquitectura amd64 |
---|---|---|
/lib/
|
/lib/i386-linux-gnu/
|
/lib/x86_64-linux-gnu/
|
/usr/lib/
|
/usr/lib/i386-linux-gnu/
|
/usr/lib/x86_64-linux-gnu/
|
A continuació tens alguns exemples típics de casos possibles de paquets per a vàries arquitectures per als següents paquets:
el codi font de la biblioteca
lib
nom_biblioteca
-1.tar.gz
el codi font d'una ordre
escrit en un
llenguatge compilat
bar
-1.tar.gz
el codi font d'una ordre
escrit en un
llenguatge interpretat
baz
-1.tar.gz
Paquet | Arquitectura | Multi-arquitectura: | Contingut del paquet |
---|---|---|---|
lib
|
any | same | la biblioteca compartida, és co-instal·lable |
lib
|
any | same | els símbols de depuració de la biblioteca compartida, són co-instal·lables |
lib
|
any | same | els fitxers de capçalera i d'altres d'un biblioteca compilada, co-instal·lable |
lib
|
any | foreign | els programes de suport en temps d'execució, no són co-instal·lables |
lib
|
all | foreign | els fitxers de documentació de la biblioteca compartida |
|
any | foreign | els fitxers del programa compilat, no són co-instal·lables |
|
all | foreign | els fitxers de documentació del programa |
|
all | foreign | els fitxers del programa interpretat |
Cal tenir en compte que el paquet de desenvolupament ha de tenir un enllaç
simbòlic a la biblioteca compartida associada sense
el número de versió. P. ex.:
/usr/lib/x86_64-linux-gnu/libfoo.so
->
libfoo.so.1
Pots construir un paquet de biblioteca Debian amb suport de multi-arquitectura activat fent servir dh(1) de la següent manera.
Actualitza debian/control
.
Afegeix Build-Depends: debhelper (>=9)
en la secció del
paquet font.
Afegeix Pre-Depends: ${misc:Pre-Depends}
per a cada
paquet binari de biblioteca compartida.
Afegeix el camp Multi-Arch:
per a cada secció de paquet
binari.
Posa debian/compat
a « 9 ».
Canvia el directori habitual /usr/lib/
al directori
multi-arquitectura /usr/lib/$(DEB_HOST_MULTIARCH)/
per a
tots els guions de la construcció del paquet.
Afegeix (primer) DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture
-qDEB_HOST_MULTIARCH)
a debian/rules
per
establir la variable DEB_HOST_MULTIARCH
Canvia /usr/lib/
per
/usr/lib/$(DEB_HOST_MULTIARCH)/
a
debian/rules
.
Si es fa servir ./configure
a l'objectiu
override_dh_auto_configure
del fitxer
debian/rules
, assegura't que ho canvies per
dh_auto_configure --
. [102]
Canvia cada repetició de /usr/lib/
per
/usr/lib/*/
als fitxers
debian/
nom_del_paquet
.install
Genera fitxers com
debian/
des de
nom_del_paquet
.linksdebian/
dinàmicament afegint un guió al objectiu
nom_del_paquet
.links.inoverride_dh_auto_configure
del fitxer
debian/rules
.
override_dh_auto_configure: dh_auto_configure sed 's/@DEB_HOST_MULTIARCH@/$(DEB_HOST_MULTIARCH)/g' \ debian/nom_del_paquet
.links.in > debian/nom_del_paquet
.links
Comprova que el paquet de biblioteca compartida conté només els fitxers que s'esperava i que el paquet «-dev» continua funcionant correctament.
Tots els fitxers instal·lats al mateix temps com el paquet de multi-arquitectura en el mateix directori ha de tenir exactament el mateix contingut de fitxer. Posa molta atenció en les diferències generades per l'ordre dels bits de dades i per l'algoritme de compressió.
[89]
Alternativament: readelf -d
lib
nom_biblioteca
.so.1
| grep SONAME
[90]
Alternativament: readelf -d
lib
nom_biblioteca
.so.1
| grep NEEDED
[92] Consulta Debian Policy Manual, 8.1.1 "ldconfig".
[93] Consulta Debian Policy Manual, 8.3 "Static libraries" i Debian Policy Manual, 8.4 "Development files".
[94] Consulta Debian wiki ReleaseGoals/LAFileRemoval.
[95] Consulta Debian wiki RpathIssue.
[96] Els canvis ABI incompatibles amb versions anteriors, normalment requereixen l'actualització del «SONAME» (nom lògic) de la biblioteca i del paquet de la biblioteca compartida a d'altres nous.
[97] Per a biblioteques C++ i altres casos pels quals el maneig individual de símbols és difícil, es millor guiar-se per Debian Policy Manual, 8.6.4 "The shlibs system".
[98]
Totes les versions anteriors dels paquets Debian estan disponibles a http://snapshot.debian.org/. La revisió Debian del
paquet segueix a la versió per facilitar el manteniment de versions
anteriors («backport») del paquet: 1.1
<<
1.1-1~bpo70+1
<< 1.1-1
i
1.2
<< 1.2-1~bpo70+1
<<
1.2-1
[99]
La revisió Debian es deriva de la versió per facilitar el manteniment de
versions anteriors («backport») del paquet: 1.3
<<
1.3-1~bpo70+1
<< 1.3-1
[101] Antics directoris de biblioteques de propòsit especial com
/lib32/
i /lib64/
ja no es faran
servir més.
[102]
Alternativament, pots afegir els arguments
--libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
and
--libexecdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)
a
./configure
. Fitxa't que --libexecdir
especifica el directori predeterminat per instal·lar programes executables
que són engegats per altres programes més que no pas pels usuaris. El valor
predeterminat per «Autotools» és /usr/libexec/
però a
Debian és /usr/lib/
.