This file is indexed.

/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 &mdash; 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  &raquo;</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 &gt; 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 &lt; 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 &quot;add symbols file&quot;
$ 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 />
        &copy; 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>