/usr/share/doc/ubuntu-packaging-guide-html-de/libraries.html is in ubuntu-packaging-guide-html-de 0.3.9.
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 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | <!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. Gemeinsame Bibliotheken — 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.9',
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="search" title="Suche" href="./search.html" />
<link rel="top" title="Ubuntu Packaging Guide" href="./index.html" />
<link rel="next" title="11. Zurückportieren von Software-Aktualisierungen" href="backports.html" />
<link rel="prev" title="9. FTBFS-Pakete reparieren" 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="Inhalt" href="index.html">Inhalt</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. Zurückportieren von Software-Aktualisierungen"
accesskey="N">weiter</a></li>
<li class="page_item"><a
href="fixing-ftbfs.html" title="9. FTBFS-Pakete reparieren"
accesskey="P">zurück</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. Gemeinsame Bibliotheken<a class="headerlink" href="#shared-libraries" title="Link zu dieser Überschrift">¶</a></h1>
<p>Gemeinsame Bibliotheken sind kompilierter Code, der von vielen verschiedenen Programmen gemeinsam genutzt wird. Sie werden als <code class="docutils literal"><span class="pre">.so</span></code>-Dateien unter <code class="docutils literal"><span class="pre">/usr/lib/</span></code> zur Verfügung gestellt.</p>
<p>Eine Bibliothek exportiert Symbole, welche die kompilierten Versionen von Funktion, Klassen und Variablen sind. Eine Bibliothek wird als SONAME bezeichnet und beinhaltet eine Versionsnummer. Dieser SONAME entspricht nicht zwingend der öffentlichen Versionsbezeichnung. Ein Programm wird gegen eine gegebene SONAME-Version der Bibliothek kompiliert. Wenn eines der Symbole entfernt oder geändert wird, muss die Versionsnummer angepasst werden, was dazu führt, dass jedes Paket welches die Bibliothek benutzt, wieder gegen die neue Version kompiliert werden musss. Versionsnummern werden normalerweise vom Upstream festgelegt und wir folgen ihnen mit unseren Binärpaketnamen, auch ABI-Nummer genannt. Aber manchmal benutzt der Upstream keine vernünftigen Versionsnummern und die Paketierer müssen einer getrennten Nummerierung folgen.</p>
<p>Bibliotheken werden normalerweise von Upstream als Einzelreleases verteilt. Manchmal werden sie auch als Teil einen Programms herausgegeben. In diesem Fall können sie einfach mit in das Programm-Paket integriert werden (wenn zu erwarten ist, dass kein anderes Programm diese Bibliothek benutzt). Meistens sollten sie jedoch getrennt werden und in gesonderte Pakete gepackt werden.</p>
<p>Die Bibliotheken selbst werden in einem Binärpaket mit dem Namen <code class="docutils literal"><span class="pre">libfoo1</span></code> abgelegt, wobei <code class="docutils literal"><span class="pre">foo</span></code> der Name der Bibliothek und <code class="docutils literal"><span class="pre">1</span></code> die SONAME-Version ist. Entwicklungsdateien aus dem Paket, beispielsweise Kopfdateien, die benötigt werden, um Programme gegen die Bibliothek zu übersetzen, werden in einem Paket mit dem Namen <code class="docutils literal"><span class="pre">libfoo-dev</span></code> abgelegt.</p>
<div class="section" id="an-example">
<h2>10.1. Ein Beispiel<a class="headerlink" href="#an-example" title="Link zu dieser Überschrift">¶</a></h2>
<p>Wir werden libnova als Beispiel verwenden:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr branch ubuntu:trusty/libnova
$ sudo apt-get install libnova-dev
</pre></div>
</div>
<p>Um den SONAME der Bibliothek herauszufinden, starte:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ readelf -a /usr/lib/libnova-0.12.so.2 | grep SONAME
</pre></div>
</div>
<p>The SONAME is <code class="docutils literal"><span class="pre">libnova-0.12.so.2</span></code>, which matches the file name (usually the
case but not always). Here upstream has put the upstream version number as part
of the SONAME and given it an ABI version of <code class="docutils literal"><span class="pre">2</span></code>. Library package names
should follow the SONAME of the library they contain. The library binary package
is called <code class="docutils literal"><span class="pre">libnova-0.12-2</span></code> where <code class="docutils literal"><span class="pre">libnova-0.12</span></code> is the name of the library
and <code class="docutils literal"><span class="pre">2</span></code> is our ABI number.</p>
<p>Wenn im Upstream inkompatible Änderungen an den Bibliotheken durchgeführt werden, müssen sie eine neue Revision des SONAME erstellen und wir werden unsere Bibliothek umbenennen müssen. Jedes andere Paket welches unsere Bibliothek verwendet, muss dann wieder gegen die neue Version kompiliert werden; das nennt man Transition und kann einigen Aufwand verursachen. Im besten Fall bleibt unsere ABI-Nummer passend zu SONAME des Upstreams, aber manchmal führen sie Inkompatibilitäten ein ohne ihre Versionsnummer zu ändern und so müssen wir unsere anpassen.</p>
<p>Wenn wir uns debian/libnova-0.12-2.install ansehen, stellen wir fest, dass dort zwei Dateien eingebunden werden:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">libnova</span><span class="o">-</span><span class="mf">0.12</span><span class="o">.</span><span class="n">so</span><span class="o">.</span><span class="mi">2</span>
<span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">libnova</span><span class="o">-</span><span class="mf">0.12</span><span class="o">.</span><span class="n">so</span><span class="o">.</span><span class="mf">2.0</span><span class="o">.</span><span class="mi">0</span>
</pre></div>
</div>
<p>Das letzte is die eigentliche Bibliothek, komplett mit Unter- und Punkversionsnummer. Das erste ist ein Symlink welcher auf die eigentliche Bibliothek verweist. Der Symlink ist das, nach dem die Programme welche Bibliothek benutzen suchen, sie kümmern sich nicht um die Unterversionsnummern.</p>
<p><code class="docutils literal"><span class="pre">libnova-dev.install</span></code> beinhaltet alle benötigten Dateien um das Programm mit dieser Bibliothek zu kompilieren. Kopfdateien, eine Konfigurationsbinärdatei, die libtool Datei <code class="docutils literal"><span class="pre">.la</span></code> und <code class="docutils literal"><span class="pre">libnova.so</span></code>, welche als weiterer Symlink zu der Bibliothek führt; Programme die gegen die Bibliothek kompiliert werden kümmern sich nicht um die Hauptversionsnummer (jedoch wird das die Binärdatei in die sie kompilieren berücksichtigen).</p>
<p><code class="docutils literal"><span class="pre">.la</span></code> libtool files are needed on some non-Linux systems with poor library
support but usually cause more problems than they solve on Debian systems. It
is a current <a class="reference external" href="https://wiki.debian.org/ReleaseGoals/LAFileRemoval">Debian goal to remove .la files</a> and we should help with this.</p>
</div>
<div class="section" id="static-libraries">
<h2>10.2. Statische Bibliotheken<a class="headerlink" href="#static-libraries" title="Link zu dieser Überschrift">¶</a></h2>
<p>Das -dev Paket stellt außerdem <code class="docutils literal"><span class="pre">usr/lib/libnova.a</span></code> bereit. Dies ist eine statische Bibliothek, eine Alternative zu gemeinsamen Bibliotheken. Jedes gegen diese statische Bibliothek kompilierte Programm beinhaltet diesen Quelltext. Damit entfällt das Problem, die Bibliothek könnte als Binärdatei inkompatibel sein. Allerdings bedeutet dies auch, dass alle Fehler, die Sicherheitsprobleme inbegriffen, nicht behoben werden, solange das Programm nicht erneut kompiliert wird. Aus diesem Grund sind Programme, die statische Bibliotheken verwenden, zu vermeiden.</p>
</div>
<div class="section" id="symbol-files">
<h2>10.3. Symbol-Dateien<a class="headerlink" href="#symbol-files" title="Link zu dieser Überschrift">¶</a></h2>
<p>When a package builds against a library the <code class="docutils literal"><span class="pre">shlibs</span></code> mechanism will add a
package dependency on that library. This is why most programs will have
<code class="docutils literal"><span class="pre">Depends:</span> <span class="pre">${shlibs:Depends}</span></code> in <code class="docutils literal"><span class="pre">debian/control</span></code>. That gets replaced with
the library dependencies at build time. However shlibs can only make it depend
on the major ABI version number, <code class="docutils literal"><span class="pre">2</span></code> in our libnova example, so if new symbols
get added in libnova 2.1 a program using these symbols could still be
installed against libnova ABI 2.0 which would then crash.</p>
<p>Um die Bibliotheksabhängigkeiten präzise zu halten, verwenden wir <code class="docutils literal"><span class="pre">.symbols</span></code>-Dateien, die alle Symbole in einer Bibliothek auflisten und in welcher Version sie zuerst auftauchten.</p>
<p>libnova hat keine Symboldatei, also können wir eine erstellen. Beginne damit das Paket zu kompilieren:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr builddeb -- -nc
</pre></div>
</div>
<p>Die Option <code class="docutils literal"><span class="pre">-nc</span></code> sorgt dafür, dass nach dem Kompilieren die Dateien des Programms, die währenddessen erzeugten wurden, nicht entfernt werden. Wechseln Sie in das Verzeichnis des Kompilierungsprozesses und führen Sie <code class="docutils literal"><span class="pre">dpkg-gensymbols</span></code> für das Bibliothekspaket aus:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ cd ../build-area/libnova-0.12.2/
$ dpkg-gensymbols -plibnova-0.12-2 > symbols.diff
</pre></div>
</div>
<p>Dies erstellt eine Diff-Datei welche du selbst anwenden kannst:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ patch -p0 < symbols.diff
</pre></div>
</div>
<p>Which will create a file named similar to <code class="docutils literal"><span class="pre">dpkg-gensymbolsnY_WWI</span></code> that lists
all the symbols. It also lists the current package version. We can remove the
packaging version from that listed in the symbols file because new symbols are
not generally added by new packaging versions, but by the upstream developers:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ sed -i s,-0ubuntu2,, dpkg-gensymbolsnY_WWI
</pre></div>
</div>
<p>Nun verschiebe die Datei an ihren Ort, comitte und mache eine Testlauf:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ 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>Wenn es erfolgreich kompiliert ist die Symboldatei in Ordnung. Mit der nächsten Upstream-Version von libnova würdest du erneut dpkg-gensymbols ausführen und es liefert eine Auflistung der Unterschiede um die Symboldatei zu aktualisieren.</p>
</div>
<div class="section" id="c-library-symbols-files">
<h2>10.4. C++-Bibliothek-Symboldateien<a class="headerlink" href="#c-library-symbols-files" title="Link zu dieser Überschrift">¶</a></h2>
<p>C++ has even more exacting standards of binary compatibility than C. The
Debian Qt/KDE Team maintain some scripts to handle this, see their <a class="reference external" href="http://pkg-kde.alioth.debian.org/symbolfiles.html">Working with
symbols files</a> page for how to use them.</p>
</div>
<div class="section" id="further-reading">
<h2>10.5. Weiterführende Literatur<a class="headerlink" href="#further-reading" title="Link zu dieser Überschrift">¶</a></h2>
<p>Junichi Uekawa’s <a class="reference external" href="http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html">Debian Library Packaging Guide</a> goes into this topic in more
detail.</p>
</div>
</div>
<div class="divide"></div>
</div>
<div id="sidebar" class="grid_3 omega">
<div class="container-tweet">
<h3>Inhalt</h3>
<div class="toc">
<ul>
<li><a class="reference internal" href="#">10. Gemeinsame Bibliotheken</a><ul>
<li><a class="reference internal" href="#an-example">10.1. Ein Beispiel</a></li>
<li><a class="reference internal" href="#static-libraries">10.2. Statische Bibliotheken</a></li>
<li><a class="reference internal" href="#symbol-files">10.3. Symbol-Dateien</a></li>
<li><a class="reference internal" href="#c-library-symbols-files">10.4. C++-Bibliothek-Symboldateien</a></li>
<li><a class="reference internal" href="#further-reading">10.5. Weiterführende Literatur</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="Vorheriges Thema: 9. FTBFS-Pakete reparieren">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="Nächstes Thema: 11. Zurückportieren von Software-Aktualisierungen">Go Next</a>
</li>
</ul>
<span>Diese Seite:</span> <a href="./_sources/libraries.rst.txt"
rel="nofollow">Quellcode anzeigen</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.9.
<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.
Mit <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6 erstellt.
<br />
© Copyright 2010-2017, 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>
|