https://www.altlinux.org/index.php?title=Shared_Library_Symbol_Versioning_HOWTO&feed=atom&action=historyShared Library Symbol Versioning HOWTO - История изменений2024-03-28T22:36:36ZИстория изменений этой страницы в викиMediaWiki 1.38.2https://www.altlinux.org/index.php?title=Shared_Library_Symbol_Versioning_HOWTO&diff=33389&oldid=prevPetr-akhlamov в 12:21, 19 июля 20152015-07-19T12:21:43Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Предыдущая версия</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Версия от 12:21, 19 июля 2015</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1">Строка 1:</td>
<td colspan="2" class="diff-lineno">Строка 1:</td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del style="font-weight: bold; text-decoration: none;">[[Категория:HOWTO]]</del></div></td><td colspan="2" class="diff-side-added"></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Stub}}</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{{Stub}}</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l19">Строка 19:</td>
<td colspan="2" class="diff-lineno">Строка 18:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Нужно собрать новую версию пакета в тестовом режиме (со старым version script или без него). Далее установить пакет <tt>qa-robot</tt> и запустить '<tt>rpmsodiff libстарый.rpm libновый.rpm</tt>'. Он покажет, какие символы убавились, а какие добавились, а также выдаст заготовку для version script’а. Эту заготовку нужно поместить в файл с названием <tt>lib%name.map</tt> (альтернативно <tt>lib%name.ver</tt>, <tt>lib%name.sym</tt> или <tt>lib%name.def</tt>), возможно, немножко поправив название секции (<tt>LIBNAME_1.2.3</tt> vs <tt>NAME_1.2.3</tt>). Этот файл далее нужно скормить в <tt>gcc</tt> или <tt>libtool</tt> с помощью <tt>-Wl,--version-script=lib%name.def</tt>. Убедиться, что у пакета появился provides вида <tt>lib%name*.so*(LIBNAME_1.2.3)</tt>.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Нужно собрать новую версию пакета в тестовом режиме (со старым version script или без него). Далее установить пакет <tt>qa-robot</tt> и запустить '<tt>rpmsodiff libстарый.rpm libновый.rpm</tt>'. Он покажет, какие символы убавились, а какие добавились, а также выдаст заготовку для version script’а. Эту заготовку нужно поместить в файл с названием <tt>lib%name.map</tt> (альтернативно <tt>lib%name.ver</tt>, <tt>lib%name.sym</tt> или <tt>lib%name.def</tt>), возможно, немножко поправив название секции (<tt>LIBNAME_1.2.3</tt> vs <tt>NAME_1.2.3</tt>). Этот файл далее нужно скормить в <tt>gcc</tt> или <tt>libtool</tt> с помощью <tt>-Wl,--version-script=lib%name.def</tt>. Убедиться, что у пакета появился provides вида <tt>lib%name*.so*(LIBNAME_1.2.3)</tt>.</div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{{Category navigation|title=HOWTO|category=HOWTO|sortkey={{SUBPAGENAME}}}}</ins></div></td></tr>
</table>Petr-akhlamovhttps://www.altlinux.org/index.php?title=Shared_Library_Symbol_Versioning_HOWTO&diff=5664&oldid=prevEnder: /* Поведение апстрима */2008-11-07T16:17:06Z<p><span dir="auto"><span class="autocomment">Поведение апстрима</span></span></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Предыдущая версия</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Версия от 16:17, 7 ноября 2008</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l6">Строка 6:</td>
<td colspan="2" class="diff-lineno">Строка 6:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Поведение апстрима ===</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Поведение апстрима ===</div></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div># '''Апстрим не отвечает за бинарную совместимость.''' Это особенно плохо вот в каком отношении: бинарная совместимость может обеспечивается не только названиями функций и переменных, но ещё и доступом к полям структур (например, структура может целиком создаваться на стеке). В Си доступ к полям структуры <del style="font-weight: bold; text-decoration: none;">заменятся </del>на доступ по смещению относительно начального адреса размещения структуры (то есть поля структуры на самом деле «пронумерованы» примерно как в массиве). Это означает, что (если API подразумевает доступ к полям структур) если просто переставить местами два поля в структуре, то вся бинарная совместимость накрывается медным тазом. При таком раскладе следить за бинарной совместимостью очень сложно. Version script может не помочь, нужно дополнительно изучать хедеры на предмет прототипов и структур. И тогда либо самому менять сонейм, если он вообще есть, либо, другой вариант — просто собирать библиотеку статически и линковаться с ней статически.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div># '''Апстрим не отвечает за бинарную совместимость.''' Это особенно плохо вот в каком отношении: бинарная совместимость может обеспечивается не только названиями функций и переменных, но ещё и доступом к полям структур (например, структура может целиком создаваться на стеке). В Си доступ к полям структуры <ins style="font-weight: bold; text-decoration: none;">заменяется </ins>на доступ по смещению относительно начального адреса размещения структуры (то есть поля структуры на самом деле «пронумерованы» примерно как в массиве). Это означает, что (если API подразумевает доступ к полям структур) если просто переставить местами два поля в структуре, то вся бинарная совместимость накрывается медным тазом. При таком раскладе следить за бинарной совместимостью очень сложно. Version script может не помочь, нужно дополнительно изучать хедеры на предмет прототипов и структур. И тогда либо самому менять сонейм, если он вообще есть, либо, другой вариант — просто собирать библиотеку статически и линковаться с ней статически.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div># '''Апстрим понимает, что такое бинарная совместимость, и не делает глупостей''' (по крайней мере, не меняет базовых определений и прототипов). К счастью, такой расклад имеет место быть с большей частью системных библиотек. Тогда достаточно убедиться, что:</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div># '''Апстрим понимает, что такое бинарная совместимость, и не делает глупостей''' (по крайней мере, не меняет базовых определений и прототипов). К счастью, такой расклад имеет место быть с большей частью системных библиотек. Тогда достаточно убедиться, что:</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## В новой версии библиотеки не исчезли никакие старые переменные, и, по крайней мере, функции. Если исчезли, тогда нужно проверить, что их никто не использует. Если их кто-то использует, тогда придётся восстанавливать.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## В новой версии библиотеки не исчезли никакие старые переменные, и, по крайней мере, функции. Если исчезли, тогда нужно проверить, что их никто не использует. Если их кто-то использует, тогда придётся восстанавливать.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## Если добавились новые переменные или функции, сделать version script (добавить новую секцию в version script, в которой перечислены все новые переменные и, по крайней мере, функции).</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## Если добавились новые переменные или функции, сделать version script (добавить новую секцию в version script, в которой перечислены все новые переменные и, по крайней мере, функции).</div></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del style="font-weight: bold; text-decoration: none;"></del></div></td><td colspan="2" class="diff-side-added"></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Как проверить, что убавившиеся функции никто не использует ===</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Как проверить, что убавившиеся функции никто не использует ===</div></td></tr>
</table>Enderhttps://www.altlinux.org/index.php?title=Shared_Library_Symbol_Versioning_HOWTO&diff=1401&oldid=prevVladimirKamarzin в 16:56, 1 августа 20082008-08-01T16:56:26Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Предыдущая версия</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Версия от 16:56, 1 августа 2008</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l12">Строка 12:</td>
<td colspan="2" class="diff-lineno">Строка 12:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>=== Как проверить что убавившиеся функции никто не использует ===</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>=== Как проверить<ins style="font-weight: bold; text-decoration: none;">, </ins>что убавившиеся функции никто не использует ===</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Нужно иметь копию Сизифа. Нужно установить пакет <tt>qa-robot</tt> и запустить '<tt>qa-robot bad_elf_symbols /ALT/Sisyphus/files/i586/RPMS</tt>'. Далее грепать файл <tt>~/.qa-robot/bad_elf_symbols/ref</tt> на предмет убавившихся символов.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Нужно иметь копию Сизифа. Нужно установить пакет <tt>qa-robot</tt> и запустить '<tt>qa-robot bad_elf_symbols /ALT/Sisyphus/files/i586/RPMS</tt>'. Далее грепать файл <tt>~/.qa-robot/bad_elf_symbols/ref</tt> на предмет убавившихся символов.</div></td></tr>
</table>VladimirKamarzinhttps://www.altlinux.org/index.php?title=Shared_Library_Symbol_Versioning_HOWTO&diff=1319&oldid=prevVladimirKamarzin в 08:37, 1 августа 20082008-08-01T08:37:56Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Предыдущая версия</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Версия от 08:37, 1 августа 2008</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l7">Строка 7:</td>
<td colspan="2" class="diff-lineno">Строка 7:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Поведение апстрима ===</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>=== Поведение апстрима ===</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div># '''Апстрим не отвечает за бинарную совместимость.''' Это особенно плохо вот в каком отношении: бинарная совместимость может обеспечивается не только названиями функций и переменных, но ещё и доступом к полям структур (например, структура может целиком создаваться на стеке). В Си доступ к полям структуры заменятся на доступ по смещению относительно начального адреса размещения структуры (то есть поля структуры на самом деле «пронумерованы» примерно как в массиве). Это означает, что (если API подразумевает доступ к полям структур) если просто переставить местами два поля в структуре, то вся бинарная совместимость накрывается медным тазом. При таком раскладе следить за бинарной совместимостью очень сложно. Version script может не помочь, нужно дополнительно изучать хедеры на предмет прототипов и структур. И тогда либо самому менять сонейм, если он вообще есть, либо, другой вариант — просто собирать библиотеку статически и линковаться с ней статически.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div># '''Апстрим не отвечает за бинарную совместимость.''' Это особенно плохо вот в каком отношении: бинарная совместимость может обеспечивается не только названиями функций и переменных, но ещё и доступом к полям структур (например, структура может целиком создаваться на стеке). В Си доступ к полям структуры заменятся на доступ по смещению относительно начального адреса размещения структуры (то есть поля структуры на самом деле «пронумерованы» примерно как в массиве). Это означает, что (если API подразумевает доступ к полям структур) если просто переставить местами два поля в структуре, то вся бинарная совместимость накрывается медным тазом. При таком раскладе следить за бинарной совместимостью очень сложно. Version script может не помочь, нужно дополнительно изучать хедеры на предмет прототипов и структур. И тогда либо самому менять сонейм, если он вообще есть, либо, другой вариант — просто собирать библиотеку статически и линковаться с ней статически.</div></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div># <del style="font-weight: bold; text-decoration: none;">Допустим, </del>'''<del style="font-weight: bold; text-decoration: none;">апстрим </del>понимает, что такое бинарная совместимость, и не делает глупостей''' (по крайней мере, не меняет базовых определений и прототипов). К счастью, такой расклад имеет место быть с большей частью системных библиотек. Тогда достаточно убедиться, что:</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div># '''<ins style="font-weight: bold; text-decoration: none;">Апстрим </ins>понимает, что такое бинарная совместимость, и не делает глупостей''' (по крайней мере, не меняет базовых определений и прототипов). К счастью, такой расклад имеет место быть с большей частью системных библиотек. Тогда достаточно убедиться, что:</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## В новой версии библиотеки не исчезли никакие старые переменные, и, по крайней мере, функции. Если исчезли, тогда нужно проверить, что их никто не использует. Если их кто-то использует, тогда придётся восстанавливать.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## В новой версии библиотеки не исчезли никакие старые переменные, и, по крайней мере, функции. Если исчезли, тогда нужно проверить, что их никто не использует. Если их кто-то использует, тогда придётся восстанавливать.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## Если добавились новые переменные или функции, сделать version script (добавить новую секцию в version script, в которой перечислены все новые переменные и, по крайней мере, функции).</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>## Если добавились новые переменные или функции, сделать version script (добавить новую секцию в version script, в которой перечислены все новые переменные и, по крайней мере, функции).</div></td></tr>
</table>VladimirKamarzinhttps://www.altlinux.org/index.php?title=Shared_Library_Symbol_Versioning_HOWTO&diff=1318&oldid=prevVladimirKamarzin в 08:34, 1 августа 20082008-08-01T08:34:51Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Предыдущая версия</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Версия от 08:34, 1 августа 2008</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1">Строка 1:</td>
<td colspan="2" class="diff-lineno">Строка 1:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>[[Категория:HOWTO]]</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>[[Категория:HOWTO]]</div></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>{{Stub<del style="font-weight: bold; text-decoration: none;">}}{{Викифицировать</del>}}</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>{{Stub}}</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>''рассказать что такое symbol versioning и зачем он нужен''</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>''рассказать что такое symbol versioning и зачем он нужен''</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del style="font-weight: bold; text-decoration: none;">Допустим, апстрим понимает, что такое бинарная совместимость, и не делает глупостей (по крайней мере, не меняет базовых определений и прототипов). К счастью, такой расклад имеет место быть с большей частью системных библиотек. Тогда достаточно убедиться, что:</del></div></td><td colspan="2" class="diff-side-added"></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div># В новой версии библиотеки не исчезли никакие старые переменные, и, по крайней мере, функции. <del style="font-weight: bold; text-decoration: none;"> </del>Если исчезли, тогда нужно проверить, что их никто не использует. <del style="font-weight: bold; text-decoration: none;"> </del>Если их кто-то использует, тогда придётся восстанавливать.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">=== Поведение апстрима ===</ins></div></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div># Если добавились новые переменные или функции, сделать version script (добавить новую секцию в version script, в которой перечислены все новые переменные и, по крайней мере, функции).</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># '''Апстрим не отвечает за бинарную совместимость.''' Это особенно плохо вот в каком отношении: бинарная совместимость может обеспечивается не только названиями функций и переменных, но ещё и доступом к полям структур (например, структура может целиком создаваться на стеке). В Си доступ к полям структуры заменятся на доступ по смещению относительно начального адреса размещения структуры (то есть поля структуры на самом деле «пронумерованы» примерно как в массиве). Это означает, что (если API подразумевает доступ к полям структур) если просто переставить местами два поля в структуре, то вся бинарная совместимость накрывается медным тазом. При таком раскладе следить за бинарной совместимостью очень сложно. Version script может не помочь, нужно дополнительно изучать хедеры на предмет прототипов и структур. И тогда либо самому менять сонейм, если он вообще есть, либо, другой вариант — просто собирать библиотеку статически и линковаться с ней статически.</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># Допустим, '''апстрим понимает, что такое бинарная совместимость, и не делает глупостей''' (по крайней мере, не меняет базовых определений и прототипов). К счастью, такой расклад имеет место быть с большей частью системных библиотек. Тогда достаточно убедиться, что:</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">#</ins># В новой версии библиотеки не исчезли никакие старые переменные, и, по крайней мере, функции. Если исчезли, тогда нужно проверить, что их никто не использует. Если их кто-то использует, тогда придётся восстанавливать.</div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">#</ins># Если добавились новые переменные или функции, сделать version script (добавить новую секцию в version script, в которой перечислены все новые переменные и, по крайней мере, функции).</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del style="font-weight: bold; text-decoration: none;">Развёрнутое пояснение:</del></div></td><td colspan="2" class="diff-side-added"></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del style="font-weight: bold; text-decoration: none;"># </del>Как проверить что убавившиеся функции никто не использует<del style="font-weight: bold; text-decoration: none;">. </del>Нужно иметь копию Сизифа. <del style="font-weight: bold; text-decoration: none;"> </del>Нужно установить пакет <tt>qa-robot</tt> и запустить '<tt>qa-robot bad_elf_symbols /ALT/Sisyphus/files/i586/RPMS</tt>'. <del style="font-weight: bold; text-decoration: none;"> </del>Далее грепать файл <tt>~/.qa-robot/bad_elf_symbols/ref</tt> на предмет убавившихся символов.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">=== </ins>Как проверить что убавившиеся функции никто не использует <ins style="font-weight: bold; text-decoration: none;">===</ins></div></td></tr>
<tr><td class="diff-marker" data-marker="−"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del style="font-weight: bold; text-decoration: none;"># </del>Как узнать, убавились ли или добавились новые символы<del style="font-weight: bold; text-decoration: none;">, </del>и как сделать version script<del style="font-weight: bold; text-decoration: none;">. </del>Нужно собрать новую версию пакета в тестовом режиме (со старым version script или без него). <del style="font-weight: bold; text-decoration: none;"> </del>Далее установить пакет <tt>qa-robot</tt> и запустить '<tt>rpmsodiff libстарый.rpm libновый.rpm</tt>'. <del style="font-weight: bold; text-decoration: none;"> </del>Он покажет, какие символы убавились, а какие добавились, а также выдаст заготовку для version <del style="font-weight: bold; text-decoration: none;">script'а</del>. <del style="font-weight: bold; text-decoration: none;"> </del>Эту заготовку нужно поместить в файл с названием <tt>lib%name.map</tt> (альтернативно <tt>lib%name.ver</tt>, <tt>lib%name.sym</tt> или <tt>lib%name.def</tt>), возможно, немножко поправив название секции (<tt>LIBNAME_1.2.3</tt> vs <tt>NAME_1.2.3</tt>). <del style="font-weight: bold; text-decoration: none;"> </del>Этот файл далее нужно скормить в <tt>gcc</tt> или <tt>libtool</tt> с помощью <tt>-Wl,--version-script=lib%name.def</tt>. <del style="font-weight: bold; text-decoration: none;"> </del>Убедиться, что у пакета появился provides вида <tt>lib%name*.so*(LIBNAME_1.2.3)</tt>.</div></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Нужно иметь копию Сизифа. Нужно установить пакет <tt>qa-robot</tt> и запустить '<tt>qa-robot bad_elf_symbols /ALT/Sisyphus/files/i586/RPMS</tt>'. Далее грепать файл <tt>~/.qa-robot/bad_elf_symbols/ref</tt> на предмет убавившихся символов.</div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">=== </ins>Как узнать, убавились ли или добавились новые символы и как сделать version script <ins style="font-weight: bold; text-decoration: none;">===</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Нужно собрать новую версию пакета в тестовом режиме (со старым version script или без него). Далее установить пакет <tt>qa-robot</tt> и запустить '<tt>rpmsodiff libстарый.rpm libновый.rpm</tt>'. Он покажет, какие символы убавились, а какие добавились, а также выдаст заготовку для version <ins style="font-weight: bold; text-decoration: none;">script’а</ins>. Эту заготовку нужно поместить в файл с названием <tt>lib%name.map</tt> (альтернативно <tt>lib%name.ver</tt>, <tt>lib%name.sym</tt> или <tt>lib%name.def</tt>), возможно, немножко поправив название секции (<tt>LIBNAME_1.2.3</tt> vs <tt>NAME_1.2.3</tt>). Этот файл далее нужно скормить в <tt>gcc</tt> или <tt>libtool</tt> с помощью <tt>-Wl,--version-script=lib%name.def</tt>. Убедиться, что у пакета появился provides вида <tt>lib%name*.so*(LIBNAME_1.2.3)</tt>.</div></td></tr>
</table>VladimirKamarzinhttps://www.altlinux.org/index.php?title=Shared_Library_Symbol_Versioning_HOWTO&diff=1306&oldid=prevSirRaorn: Новая: Категория:HOWTO {{Stub}}{{Викифицировать}} ''рассказать что такое symbol versioning и зачем он нужен'' Допустим, ап...2008-08-01T06:27:52Z<p>Новая: <a href="/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:HOWTO" title="Категория:HOWTO">Категория:HOWTO</a> {{Stub}}{{Викифицировать}} ''рассказать что такое symbol versioning и зачем он нужен'' Допустим, ап...</p>
<p><b>Новая страница</b></p><div>[[Категория:HOWTO]]<br />
{{Stub}}{{Викифицировать}}<br />
<br />
''рассказать что такое symbol versioning и зачем он нужен''<br />
<br />
Допустим, апстрим понимает, что такое бинарная совместимость, и не делает глупостей (по крайней мере, не меняет базовых определений и прототипов). К счастью, такой расклад имеет место быть с большей частью системных библиотек. Тогда достаточно убедиться, что:<br />
<br />
# В новой версии библиотеки не исчезли никакие старые переменные, и, по крайней мере, функции. Если исчезли, тогда нужно проверить, что их никто не использует. Если их кто-то использует, тогда придётся восстанавливать.<br />
# Если добавились новые переменные или функции, сделать version script (добавить новую секцию в version script, в которой перечислены все новые переменные и, по крайней мере, функции).<br />
<br />
Развёрнутое пояснение:<br />
<br />
# Как проверить что убавившиеся функции никто не использует. Нужно иметь копию Сизифа. Нужно установить пакет <tt>qa-robot</tt> и запустить '<tt>qa-robot bad_elf_symbols /ALT/Sisyphus/files/i586/RPMS</tt>'. Далее грепать файл <tt>~/.qa-robot/bad_elf_symbols/ref</tt> на предмет убавившихся символов.<br />
# Как узнать, убавились ли или добавились новые символы, и как сделать version script. Нужно собрать новую версию пакета в тестовом режиме (со старым version script или без него). Далее установить пакет <tt>qa-robot</tt> и запустить '<tt>rpmsodiff libстарый.rpm libновый.rpm</tt>'. Он покажет, какие символы убавились, а какие добавились, а также выдаст заготовку для version script'а. Эту заготовку нужно поместить в файл с названием <tt>lib%name.map</tt> (альтернативно <tt>lib%name.ver</tt>, <tt>lib%name.sym</tt> или <tt>lib%name.def</tt>), возможно, немножко поправив название секции (<tt>LIBNAME_1.2.3</tt> vs <tt>NAME_1.2.3</tt>). Этот файл далее нужно скормить в <tt>gcc</tt> или <tt>libtool</tt> с помощью <tt>-Wl,--version-script=lib%name.def</tt>. Убедиться, что у пакета появился provides вида <tt>lib%name*.so*(LIBNAME_1.2.3)</tt>.</div>SirRaorn