This file is indexed.

/usr/share/doc/ubuntu-packaging-guide-html-ru/libraries.html is in ubuntu-packaging-guide-html-ru 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
<!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. Общие библиотеки &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.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="Поиск" href="./search.html" />
    <link rel="top" title="Ubuntu Packaging Guide" href="./index.html" />
    <link rel="next" title="11. Бэкпортирование обновлений программ" href="backports.html" />
    <link rel="prev" title="9. Исправление пакетов FTBFS (Fails To Build From Source)" 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="Содержание" href="index.html">Содержание</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. Бэкпортирование обновлений программ"
	        accesskey="N">вперёд</a></li>
	        <li class="page_item"><a  
	        href="fixing-ftbfs.html" title="9. Исправление пакетов FTBFS (Fails To Build From Source)"
	        accesskey="P">назад</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. Общие библиотеки<a class="headerlink" href="#shared-libraries" title="Ссылка на этот заголовок"></a></h1>
<p>Общие библиотеки — это скомпилированный код, предназначенный для совместного использования несколькими различными программами. Они распространяются в виде файлов <code class="docutils literal"><span class="pre">.so</span></code> в <code class="docutils literal"><span class="pre">/usr/lib/</span></code>.</p>
<p>Библиотеки экспортируют символы в скомпилированном виде: функции, классы и переменные. У каждой библиотеки также есть название SONAME, включающее номер её версии, но который не обязательно совпадает с официальным номером релиза.  Программы компилируются с конкретным SONAME библиотеки. Так, если какой-либо из символов библиотеки был удалён или изменён &#8211; небходимо изменить версию с тем, чтобы все зависящие от библиотеки пакеты были перекомпилированы с использованием новой версии. Обычно версии устанавливаются в источнике, и мы используем те же номера версий для двоичных пакетов, называемые &#8220;номер ABI&#8221;, но в случае, если источник не использует вменяемой версионности, создатели пакетов могут использовать отличную, более традиционную нумерацию.</p>
<p>Библиотеки обычно распространяются апстримом в виде отдельных выпусков. Иногда они распространяются, как часть программы. В последнем случае они могут быть включены в двоичный пакет вместе с программой (это называется bundling), если вы не предполагаете использование этих библиотек другими программами, но чаще их всё же следует выделять в отдельные двоичные пакеты.</p>
<p>Сами библиотеки помещаются в двоичный пакет с именем <code class="docutils literal"><span class="pre">libfoo1</span></code>, где <code class="docutils literal"><span class="pre">foo</span></code> — имя библиотеки, а <code class="docutils literal"><span class="pre">1</span></code> — версия из SONAME. Файлы разработки из пакета, такие как заголовочные файлы, необходимые для компиляции программ с библиотекой, помещаются в пакет с именем <code class="docutils literal"><span class="pre">libfoo-dev</span></code>.</p>
<div class="section" id="an-example">
<h2>10.1. Пример<a class="headerlink" href="#an-example" title="Ссылка на этот заголовок"></a></h2>
<p>В качестве примера мы используем libnova:</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>Чтобы найти SONAME библиотеки, выполните:</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>SONAME в данном случае <code class="docutils literal"><span class="pre">libnova-0.12.so.2</span></code>, что соответствует имени файла (как правило, но не всегда). Здесь апстрим поместил номер версии из апстрима, как часть SONAME, и задал ABI-версию <code class="docutils literal"><span class="pre">2</span></code>.  Имена библиотечных пакетов должны следовать SONAME библиотеки, которую они содержат. Двоичный библиотечный пакет называется <code class="docutils literal"><span class="pre">libnova-0.12-2</span></code>, где <code class="docutils literal"><span class="pre">libnova-0.12</span></code> — имя библиотеки, а <code class="docutils literal"><span class="pre">2</span></code> —  наш ABI-номер.</p>
<p>Если авторы из апстрима внесли несовместимые изменения в свою библиотеку, они должны изменить номер версии SONAME, а мы должны переименовать нашу библиотеку. Любые другие пакеты, использующие наш библиотечный пакет, нужно будет перекомпилировать с новой весрией, это называется переходом (transition) и требует некоторых усилий. Надо надеяться, наш ABI-номер продолжит соответствовать SONAME апстрима, но иногда они вносят несовместимости без изменения их номера версии, а нам нужно изменить наш.</p>
<p>Взглянув на debian/libnova-0.12-2.instal, мы увидим, что он включает в себя два файла:</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>Вторая строчка — настоящая библиотека, с полным номером версии. Первая — символическая ссылка, указывающая на настоящую библиотеку. Программы, использующие библиотеку, как правило, будут пользоваться символической ссылкой.</p>
<p><code class="docutils literal"><span class="pre">libnova-dev.install</span></code> содержит все файлы, необходимые для компиляции программы с данной библиотекой. Заголовочные файлы, бинарник конфигурации, файл libtool&#8217;a <code class="docutils literal"><span class="pre">.la</span></code>, а также <code class="docutils literal"><span class="pre">libnova.so</span></code> &#8211; ещё один симлинк на библиотеку, создаваемый с тем, чтобы программы могли компилироваться вне зависимости от старшего номера версии (при этом, скомпилированное приложение всё равно будет зависеть от версии).</p>
<p><code class="docutils literal"><span class="pre">.la</span></code>-файлы libtool&#8217;а требуются на некоторых не-Linux системах с ограниченной поддержкой библиотек, но на системах Debian зачастую создают больше проблем, чем решают. <a class="reference external" href="https://wiki.debian.org/ReleaseGoals/LAFileRemoval">Цель Debian отказаться от .la-файлов</a> сегодня весьма актуальна, и вы можете помочь с решением этой задачи.</p>
</div>
<div class="section" id="static-libraries">
<h2>10.2. Статические библиотеки<a class="headerlink" href="#static-libraries" title="Ссылка на этот заголовок"></a></h2>
<p>Пакет -dev также содержит <code class="docutils literal"><span class="pre">usr/lib/libnova.a</span></code>.  Это статическая библиотека, альтернатива общей библиотеке.  Любая программа, скомпилированная со статической библиотекой, содержит её код непосредственно в себе.  Это позволяет не беспокоиться о двоичной совместимости библиотеки.  Однако это также означает, что любые ошибки, в том числе уязвимости в безопасности, не будут исправлены за счёт обновления библиотеки, пока программа не будет перекомпилирована.  По этой причине использовать программы со статическими библиотеками не рекомендуется.</p>
</div>
<div class="section" id="symbol-files">
<h2>10.3. Символьные файлы<a class="headerlink" href="#symbol-files" title="Ссылка на этот заголовок"></a></h2>
<p>Когда приложение компилируется с библиотекой, механизм <code class="docutils literal"><span class="pre">shlibs</span></code> добавит к пакету зависимость от этой библиотеки. Именно поэтому большинство программ содержат <code class="docutils literal"><span class="pre">Depends:</span> <span class="pre">${shlibs:Depends}</span></code> в файле <code class="docutils literal"><span class="pre">debian/control</span></code>. Этот максов заменяется списком зависимых библиотек при билде. Однако shlibs может только указывать зависимость от старшей ABI-версии , <code class="docutils literal"><span class="pre">2</span></code> в нашем примере с libnova, так что если новые символы будут добавлены в будущей libnova 2.1 &#8211; приложение будет запускаться и с более старой версией libnova ABI 2.0, что приведёт к аварианому завершению.</p>
<p>Чтобы точнее указывать зависимости от библиотек, мы создали файл <code class="docutils literal"><span class="pre">.symbols</span></code>, который перечисляет все символы библиотеки и версии, в которых они появились.</p>
<p>libnova не имеет символьного файла, так что мы можем создать его. Начните с компиляции пакета:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ bzr builddeb -- -nc
</pre></div>
</div>
<p>Опция <code class="docutils literal"><span class="pre">-nc</span></code> указывает не удалять сборочные файлы после завершения компиляции.  Перейдите в каталог сборки и выполните  <code class="docutils literal"><span class="pre">dpkg-gensymbols</span></code> для пакета библиотеки:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ cd ../build-area/libnova-0.12.2/
$ dpkg-gensymbols -plibnova-0.12-2 &gt; symbols.diff
</pre></div>
</div>
<p>Это создаст diff-файл, который вы сможете применить самостоятельно:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ patch -p0 &lt; symbols.diff
</pre></div>
</div>
<p>Это создаст файл с именем вида <code class="docutils literal"><span class="pre">dpkg-gensymbolsnY_WWI</span></code>, в котором будут перечислены все символы. Он также указывает текущую версию пакета. Версию пакета можно убрать из файла, так как новые символы обычно добавляются не  с новой версией пакета, а разработчиками исходной библиотеки.</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>$ sed -i s,-0ubuntu2,, dpkg-gensymbolsnY_WWI
</pre></div>
</div>
<p>Теперь переместите файл туда, где он должен находиться, зафиксируйте изменения и выполните тестовую сборку:</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 &quot;add symbols file&quot;
$ bzr builddeb
</pre></div>
</div>
<p>Если компиляция выполняется успешно, значит символьный файл не содержит ошибок.  С выходом следующей апстрим-версии libnova вам придётся снова запустить dpkg-gensymbols, чтобы создать diff для обновления символьного файла.</p>
</div>
<div class="section" id="c-library-symbols-files">
<h2>10.4. Символьные файлы библиотек C++<a class="headerlink" href="#c-library-symbols-files" title="Ссылка на этот заголовок"></a></h2>
<p>У языка C++ более строгие стандарты на двоичную совместимость, чем у C. Команда Debian Qt/KDE поддерживает некоторые скрипты, которые помогут справиться с этим: страница <a class="reference external" href="http://pkg-kde.alioth.debian.org/symbolfiles.html">Работа с файлами symbols</a> описывает принципы их использования.</p>
</div>
<div class="section" id="further-reading">
<h2>10.5. Информация для дальнейшего чтения<a class="headerlink" href="#further-reading" title="Ссылка на этот заголовок"></a></h2>
<p>Статья Junichi Uekawa <a class="reference external" href="http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html">Пакетирование библиотек для Debian</a> рассматривает этот вопрос более детально.</p>
</div>
</div>


	<div class="divide"></div>

          </div>

  <div id="sidebar" class="grid_3 omega">
    <div class="container-tweet">
        <h3>Оглавление</h3>
        <div class="toc">
          <ul>
<li><a class="reference internal" href="#">10. Общие библиотеки</a><ul>
<li><a class="reference internal" href="#an-example">10.1. Пример</a></li>
<li><a class="reference internal" href="#static-libraries">10.2. Статические библиотеки</a></li>
<li><a class="reference internal" href="#symbol-files">10.3. Символьные файлы</a></li>
<li><a class="reference internal" href="#c-library-symbols-files">10.4. Символьные файлы библиотек C++</a></li>
<li><a class="reference internal" href="#further-reading">10.5. Информация для дальнейшего чтения</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="Предыдущий раздел: 9. Исправление пакетов FTBFS (Fails To Build From Source)">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="Следующий раздел: 11. Бэкпортирование обновлений программ">Go Next</a>
          </li>
        </ul>
        <span>Эта страница:</span> <a href="./_sources/libraries.rst.txt"
               rel="nofollow">Исходный текст</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.
      Создано с помощью <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
      <br />
        &copy; 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>