/usr/share/doc/ubuntu-packaging-guide-html-es/libraries.html is in ubuntu-packaging-guide-html-es 0.3.5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>10. Bibliotecas compartidas — Ubuntu Packaging Guide</title>
<link rel="shortcut icon" href="./_static/images/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="./_static/reset.css" type="text/css" />
<link rel="stylesheet" href="./_static/960.css" type="text/css" />
<link rel="stylesheet" href="./_static/base.css" type="text/css" />
<link rel="stylesheet" href="./_static/home.css" type="text/css" />
<link rel="stylesheet" href="./_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="./_static/guide.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '0.3.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="./_static/jquery.js"></script>
<script type="text/javascript" src="./_static/underscore.js"></script>
<script type="text/javascript" src="./_static/doctools.js"></script>
<script type="text/javascript" src="./_static/translations.js"></script>
<script type="text/javascript" src="./_static/main.js"></script>
<link rel="top" title="Ubuntu Packaging Guide" href="./index.html" />
<link rel="next" title="11. Adaptar actualizaciones de software a versiones anteriores" href="backports.html" />
<link rel="prev" title="9. Corrección de paquetes que no compilan a partir del código fuente (FTBFS)" href="fixing-ftbfs.html" />
</head>
<body class="home">
<a name="top"></a>
<div class="header-navigation">
<div>
<nav role="navigation">
<ul>
<li class="page_item current_page_item"><a title="Contenidos" href="index.html">Contenidos</a>
<li>
<form id="form-search" method="get" action="search.html">
<fieldset>
<input id="input-search" type="text" name="q" value="Search" />
</fieldset>
</form>
</li>
</ul>
</nav>
<a class="logo-ubuntu" href="http://packaging.ubuntu.com/">
<img src="./_static/images/logo-ubuntu.png" width="119" height="27" alt="Ubuntu logo" />
</a>
<a href="http://packaging.ubuntu.com/"><h2>Packaging Guide</h2></a>
</div>
</div>
<div class="header-content">
<div class="clearfix">
<div class="header-navigation-secondary">
<div>
<nav role="navigation">
<ul class="clearfix">
<li class="page_item"><a style="margin-right: 10px"
href="backports.html" title="11. Adaptar actualizaciones de software a versiones anteriores"
accesskey="N">siguiente</a></li>
<li class="page_item"><a
href="fixing-ftbfs.html" title="9. Corrección de paquetes que no compilan a partir del código fuente (FTBFS)"
accesskey="P">anterior</a></li>
<li class="page_item"><a class="sub-nav-item" href="index.html">Ubuntu Packaging Guide »</a></li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="content" class="body container_12">
<div class="grid_12">
<!--<section id="main-section">-->
<div class="grid_9 alpha">
<div class="section" id="shared-libraries">
<h1>10. Bibliotecas compartidas<a class="headerlink" href="#shared-libraries" title="Enlazar permanentemente con este título">¶</a></h1>
<p>Las bibliotecas compartidas es código compilado que se supone que será compartido por diferentes programas. Se distribuyen como archivos <tt class="docutils literal"><span class="pre">.so</span></tt> en <tt class="docutils literal"><span class="pre">/usr/lib/</span></tt>.</p>
<p>Una biblioteca exporta símbolos que son versiones compiladas de funciones, clases y variables. Una biblioteca tiene un nombre denominado SONAME que incluye un número de versión. Esta versión de SONAME no tiene por qué coincidir con el número de versión de emisión pública. Un programa se compila contra una versión determinada de SONAME de la biblioteca. Si cualquiera de los símbolos es eliminado o modificado, entonces el número de versión debe ser cambiado lo que fuerza que que cualquier paquete que use la biblioteca sea recompilado contra la nueva versión. Los números de versiones normalmente son establecidos aguas arriba y los mantenemos en los nombres de los paquetes binarios, llamado número ABI, pero en ocasiones aguas arriba no usan números de versiones razonables y los empaquetadores tienen que mantener números de versiones separados.</p>
<p>Las bibliotecas se distribuyen normalmente aguas arriba como emisiones independientes. Algunas veces se distribuyen como partes de un programa. En este caso se pueden incluir en el paquete binario junto con el programa (esto se denomina «bundling», atado) si no espera que ningún otro programa use la biblioteca, pero lo más frecuente es que sean separadas en paquetes binarios independientes.</p>
<p>Las propias bibliotecas se meten en un paquete binario llamado <tt class="docutils literal"><span class="pre">libfoo1</span></tt> donde <tt class="docutils literal"><span class="pre">foo</span></tt> es el nombre de la biblioteca y <tt class="docutils literal"><span class="pre">1</span></tt> es la versión del SONAME. Los archivos de desarrollo del paquete, como los archivos de cabecera, necesitan compilar programas contra la biblioteca que se ha metido en el paquete llamado <tt class="docutils literal"><span class="pre">libfoo-dev</span></tt>.</p>
<div class="section" id="an-example">
<h2>10.1. Un ejemplo<a class="headerlink" href="#an-example" title="Enlazar permanentemente con este título">¶</a></h2>
<p>Usaremos libnova como un ejemplo:</p>
<div class="highlight-python"><div class="highlight"><pre>$ bzr branch ubuntu:trusty/libnova
$ sudo apt-get install libnova-dev
</pre></div>
</div>
<p>Para encontrar el SONAME de una biblioteca ejecute:</p>
<div class="highlight-python"><div class="highlight"><pre>$ readelf -a /usr/lib/libnova-0.12.so.2 | grep SONAME
</pre></div>
</div>
<p>El SONAME es <tt class="docutils literal"><span class="pre">libnova-0.12.so.2</span></tt>, lo que coincide con el nombre del archivo (es lo normal, pero no siempre ocurre). En este caso aguas arriba han puesto el número de versión como parte del SONAME y le han dado una versión ABI de <tt class="docutils literal"><span class="pre">2</span></tt>. Los nombres de paquetes de bibliotecas deberían seguir el SONAME de la biblioteca que contienen. El paquete binario de la biblioteca se llama <tt class="docutils literal"><span class="pre">libnova--0.12-2</span></tt>, donde <tt class="docutils literal"><span class="pre">libnova-0.12</span></tt> es el nombre de la biblioteca y <tt class="docutils literal"><span class="pre">2</span></tt> es nuestro número ABI.</p>
<p>SI aguas arriban hacen cambios incompatible a su biblioteca tendrá que revisionar su SONAME y nosotros tendremos que cambiar de nombre a nuestra biblioteca. Cualquier otro paquete que use nuestra biblioteca deberá ser recompilado contra la nueva versión, esto es lo que se llama una transición y puede suponer cierto esfuerzo. Afortunadamente nuestro número ABI seguirá coincidiendo con el SONAME de aguas arriba, pero en ocasiones se introducen incompatibilidades sin cambiar el número de versión lo que nos fuerza a hacer cambios en el nuestro.</p>
<p>Si miramos en debian/libnova-0.12-2.install vemos que incluye estos dos archivos:</p>
<div class="highlight-python"><div class="highlight"><pre>usr/lib/libnova-0.12.so.2
usr/lib/libnova-0.12.so.2.0.0
</pre></div>
</div>
<p>El último es la biblioteca en sí, completada con el número de menor de la versión y punto. El primero es un enlace simbólico que apunta a la biblioteca real. El enlace simbólico es lo que buscarán los programas que empleen la biblioteca, ya que los programas que se ejecutan no se preocupan por el número de menor de la versión.</p>
<p><tt class="docutils literal"><span class="pre">libnova-dev.install</span></tt> incluye todo los archivos necesarios para compilar un programa con esta biblioteca. Los archivo de cabeceras, una configuración binaria, el archivo <tt class="docutils literal"><span class="pre">.la</span></tt> de libtool y <tt class="docutils literal"><span class="pre">libnova.so</span></tt> que es otro enlace simbólico apuntando a la misma biblioteca, programas compilados contra la biblioteca no se preocupan del número mayor de la versión (aunque el binario en el que se compilarán sí lo hará).</p>
<p>Los archivos <tt class="docutils literal"><span class="pre">.la</span></tt> de libtool son necesarios en algunos sistemas no-Linux con soporte de bibliotecas pobre, pero en sistemas Debian normalmente causan más problemas que los que resuelven. Actualmente es un objetivo de Debian eliminar los archivos .la (<a class="reference external" href="http://wiki.debian.org/ReleaseGoals/LAFileRemoval">Debian goal to remove .la files</a>) y deberíamos ayudar a hacerlo.</p>
</div>
<div class="section" id="static-libraries">
<h2>10.2. Bibliotecas estáticas<a class="headerlink" href="#static-libraries" title="Enlazar permanentemente con este título">¶</a></h2>
<p>El paquete -dev también incluye <tt class="docutils literal"><span class="pre">usr/lib/libnova.a</span></tt>. Es una biblioteca estática, una alternativa a las librerías compartidas. Cualquier programa compilado contra una biblioteca estática incluya el directorio de código dentro de sí mismo. Esto evita tener que preocuparse sobre la compatibilidad binaria de la biblioteca. Sin embargo, también significa que cualquier error, incluyendo las incidencias de seguridad, no serán actualizados junto con la biblioteca hasta que se recompile el programa. Por esta razón se desaconseja el uso de programas que usen librerías estáticas.</p>
</div>
<div class="section" id="symbol-files">
<h2>10.3. Archivos de símbolos<a class="headerlink" href="#symbol-files" title="Enlazar permanentemente con este título">¶</a></h2>
<p>Cuando un paquete se compila contra una biblioteca el mecanismo de <tt class="docutils literal"><span class="pre">shlibs</span></tt> añadirá una dependencia del paquete a esa biblioteca. Este es el motivo de que la mayoría de los programas tengan <tt class="docutils literal"><span class="pre">Depends:</span> <span class="pre">${shlibs:Depends}</span></tt> en el archivo <tt class="docutils literal"><span class="pre">debian/control</span></tt>. Eso se sustituye por las dependencias de la biblioteca en tiempo de compilación. Sin embargo, shlibs solo puede hacerla depender del número mayor de versión ABI, <tt class="docutils literal"><span class="pre">2</span></tt> en el ejemplo, así que si se añaden nuevos símbolos a libnova 2.1 un programa que use estos símbolos podría todavía seguir instalado contra libnova ABI 2.0, lo que podría producir un fallo.</p>
<p>Para hacer más precisas las dependencias de las bibliotecas matenemos archivos <tt class="docutils literal"><span class="pre">.symbols</span></tt> que listan todos los símbolos de una librería y la versión en la que aparecen.</p>
<p>libnova no tiene archivo de símbolos así que podemos crear uno. Comience por compilar el paquete:</p>
<div class="highlight-python"><div class="highlight"><pre>$ bzr builddeb -- -nc
</pre></div>
</div>
<p>La opción <tt class="docutils literal"><span class="pre">-nc</span></tt> hará que se finalice al completar la compilación sin que se eliminen los archivos compilados. Cámbiese al directorio compilado y ejecute <tt class="docutils literal"><span class="pre">dpkg-gensymbols</span></tt> para el paquete de la biblioteca:</p>
<div class="highlight-python"><div class="highlight"><pre>$ cd ../build-area/libnova-0.12.2/
$ dpkg-gensymbols -plibnova-0.12-2 > symbols.diff
</pre></div>
</div>
<p>Esto genera un archivo de diferencias (diff) que puede aplicar:</p>
<div class="highlight-python"><div class="highlight"><pre>$ patch -p0 < symbols.diff
</pre></div>
</div>
<p>Lo que creará un archivo con un nombre similar a <tt class="docutils literal"><span class="pre">dpkg-gensymbolsnY_WWI</span></tt> que lista todos los símbolos. También lista la versión de paquete actual. Podemos eliminar la versión de empaquetado que se lista en el archivo de símbolos porque generalmente no se añaden nuevos símbolos por versiones más modernas de empaquetado, sino por los desarrolladores aguas arriba:</p>
<div class="highlight-python"><div class="highlight"><pre>$ sed -i s,-0ubuntu2,, dpkg-gensymbolsnY_WWI
</pre></div>
</div>
<p>Ahora mueva el archivo a su ubicación, confirme y haga una prueba de compilación:</p>
<div class="highlight-python"><div class="highlight"><pre>$ mv dpkg-gensymbolsnY_WWI ../../libnova/debian/libnova-0.12-2.symbols
$ cd ../../libnova
$ bzr add debian/libnova-0.12-2.symbols
$ bzr commit -m "add symbols file"
$ bzr builddeb
</pre></div>
</div>
<p>Si compila con éxito es que el archivo de símbolos es correcto. Con la siguiente versión aguas arriba de libnova podría ejecutar de nuevo dpkg-gensymbols y obtendrá un archivo de diferencias para actualizar el archivo de símbolos.</p>
</div>
<div class="section" id="c-library-symbols-files">
<h2>10.4. Archivos de símbolos de bibliotecas de C++<a class="headerlink" href="#c-library-symbols-files" title="Enlazar permanentemente con este título">¶</a></h2>
<p>C++ tiene estándares de compatibilidad binaria incluso más exigentes que C. El equipo Qt/KDE de Debian mantiene algunos scripts para gestionarlo. Véase su página <a class="reference external" href="http://pkg-kde.alioth.debian.org/symbolfiles.html">Working with symbols files</a> para saber cómo usarlos.</p>
</div>
<div class="section" id="further-reading">
<h2>10.5. Lecturas adicionales<a class="headerlink" href="#further-reading" title="Enlazar permanentemente con este título">¶</a></h2>
<p><a class="reference external" href="http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html">Debian Library Packaging Guide</a> (guía de empaquetado de bibliotecas Debian) de Junichi Uekawa profundiza en estos temas con más detalle.</p>
</div>
</div>
<div class="divide"></div>
</div>
<div id="sidebar" class="grid_3 omega">
<div class="container-tweet">
<h3>Tabla de Contenidos</h3>
<div class="toc">
<ul>
<li><a class="reference internal" href="#">10. Bibliotecas compartidas</a><ul>
<li><a class="reference internal" href="#an-example">10.1. Un ejemplo</a></li>
<li><a class="reference internal" href="#static-libraries">10.2. Bibliotecas estáticas</a></li>
<li><a class="reference internal" href="#symbol-files">10.3. Archivos de símbolos</a></li>
<li><a class="reference internal" href="#c-library-symbols-files">10.4. Archivos de símbolos de bibliotecas de C++</a></li>
<li><a class="reference internal" href="#further-reading">10.5. Lecturas adicionales</a></li>
</ul>
</li>
</ul>
</div>
<div class="browse-guide">
<h3>Browse The Guide:</h3>
<ul>
<li class="prev">
<a href="fixing-ftbfs.html"
title="Tema anterior: 9. Corrección de paquetes que no compilan a partir del código fuente (FTBFS)">Go Previous</a>
</li>
<li class="center">
<a title="Back to Index" href="index.html">Index Guide</a>
</li>
<li class="next">
<a href="backports.html"
title="Próximo tema: 11. Adaptar actualizaciones de software a versiones anteriores">Go Next</a>
</li>
</ul>
<span>Esta página:</span> <a href="./_sources/libraries.txt"
rel="nofollow">Mostrar el código</a>
</div>
</div>
<div id="back_top"><a href="#top">Back to Top</a></div>
</div>
<!--</section>-->
</div>
</div>
<div class="shadow"></div>
<footer>
<div>
Version: 0.3.5.
<a href="https://bugs.launchpad.net/ubuntu-packaging-guide">Report bugs</a> or
<a href="https://code.launchpad.net/~ubuntu-packaging-guide-team/ubuntu-packaging-guide/trunk">grab the source code</a> from Launchpad.
Creado con <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
<br />
© Copyright 2010-2014 , Ubuntu Developers, Creative Commons Attribution-ShareAlike 3.0.
<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">
Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.
<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">
<img alt="Creative Commons License" style="border-width:0"
src="./_static/images/cc-by-sa.png" /></a>
<br />
<a href="http://people.ubuntu.com/~mitya57/ubuntu-packaging-guide-readme.html#translating">Help translate</a> or
<a href="./_static/translators.html">view the list of translators</a>.
</div>
</footer>
</body>
</html>
|