Категория > Новости > Полная совместимость. Как работают статические исполняемые файлы в Linux - «Новости»
Полная совместимость. Как работают статические исполняемые файлы в Linux - «Новости»13-08-2020, 12:39. Автор: Зоя |
Многие пользователи Linux предпочитают устанавливать программы из репозиториев с помощью встроенного менеджера пакетов, а все прочие способы рассматривают как вынужденную меру. Однако разработчики дистрибутивов, очевидно, не могут включить в репозитории все программы в мире, а сами авторы программ тоже не всегда могут или хотят поддерживать пакеты под множество дистрибутивов и их версий. В последние годы независимые от дистрибутива решения для установки пакетов набирают популярность: к 0install с его давней историей прибавились более новые Flatpak и Snap, да и в Steam игр для Linux становится больше. Удобнее всего может быть обойтись без установки вообще — просто скачать файл, сделать его исполняемым с помощью Двоичная совместимость РІ системах РЅР° РѕСЃРЅРѕРІРµ LinuxЧасто РјРѕР¶РЅРѕ услышать, что РІ Linux плохо СЃ двоичной совместимостью. РџСЂРё этом люди имеют РІ РІРёРґСѓ, что пакет РёР· РѕРґРЅРѕР№ версии дистрибутива Linux РїРѕСЂРѕР№ невозможно поставить РЅР° РґСЂСѓРіСѓСЋ, — Рё РІ этом РѕРЅРё правы. Однако само утверждение Рѕ плохой двоичной совместимости версий Linux неверно. РќСѓР¶РЅРѕ вспомнить, что Linux — это только СЏРґСЂРѕ, Р° РІСЃСЏ операционная система состоит РёР· СЏРґСЂР°, разделяемых библиотек Рё программ. Библиотеки РјРѕР¶РЅРѕ разделить РЅР° стандартные библиотеки языков (например, libc, libstd++) Рё сторонние библиотеки (например, GTK, Qt). Так РІРѕС‚, причиной сломанной двоичной совместимости, как правило, оказываются именно сторонние библиотеки. Границы ABI, то есть места, РіРґРµ что-то может сломаться, зависят РѕС‚ метода РєРѕРјРїРѕРЅРѕРІРєРё (linking): статического или динамического. ![]() РџСЂРё динамической РєРѕРјРїРѕРЅРѕРІРєРµ стабильным должен оставаться ABI всех задействованных библиотек. РџСЂРё этом ABI СЏРґСЂР° может меняться, если библиотеки это компенсируют. РџСЂРё статической РєРѕРјРїРѕРЅРѕРІРєРµ важна только стабильность ABI СЏРґСЂР°. Рассмотрим, как СЃ этим РІ Linux. Совместимость библиотекABI библиотеки — это набор символов, которые РѕРЅР° экспортирует. Может ли РѕРЅ быть стабильным? Да, реализация формата ELF РІ Linux поддерживает версионирование символов. РЎ помощью этого механизма библиотеки РјРѕРіСѓС‚ предоставлять несколько версий РѕРґРЅРѕР№ Рё той Р¶Рµ функции СЃ разными сигнатурами Рё поведением. Очевидный недостаток этого РїРѕРґС…РѕРґР° — невозможно удалить РёР· библиотеки старый РєРѕРґ без СЂРёСЃРєР° сломать совместимость. Каждый раз, РєРѕРіРґР° сигнатура или поведение функции меняется, автор должен создать РєРѕРїРёСЋ старой функции. РљСЂРѕРјРµ того, указывать соответствие имен функций РІ РёСЃС…РѕРґРЅРѕРј РєРѕРґРµ Рё версий символов этих функций РІ двоичном — обязанность разработчика. РќРµ Сѓ каждого разработчика есть время Рё возможность поддерживать совместимость таким образом. РљСЂРѕРјРµ того, радикальные изменения РІРѕ внутренностях библиотеки РјРѕРіСѓС‚ сделать этот РїРѕРґС…РѕРґ совершенно непрактичным — придется, РїРѕ сути, собирать РѕРґРёРЅ двоичный файл РёР· нескольких версий РёСЃС…РѕРґРЅРѕРіРѕ РєРѕРґР°. Р?менно РёР·-Р·Р° идеи сделать как РјРѕР¶РЅРѕ больше библиотек общими для всех пакетов РјС‹ Рё РЅРµ можем поставить пакет РёР· Debian 9 РЅР° 10 или РёР· CentOS 6 РЅР° 8 — сторонние библиотеки РЅРµ РІС…РѕРґСЏС‚ РІ пакет, Р° РёС… ABI РЅРµ остается неизменным между версиями. Однако разработчики GNU libc серьезно относятся Рє совместимости Рё версионируют РІСЃРµ символы. Благодаря этому, если собрать программу РЅР° машине СЃРѕ старой версией glibc, РѕРЅР° будет работать СЃ более новыми (РЅРѕ РЅРµ наоборот). Совместимость версий СЏРґСЂР°ABI СЏРґСЂР° представляет СЃРѕР±РѕР№ соглашение Рѕ системных вызовах, Р° также номера Рё РїРѕСЂСЏРґРѕРє аргументов отдельных вызовов. Рљ примеру, чтобы попросить СЏРґСЂРѕ выполнить Самый низкий уровень стандартной библиотеки любого языка — набор оберток к системным вызовам. Если изменится ABI ядра, перестанут работать все библиотеки. К счастью, в Linux такого не происходит — интерфейс системных вызовов исключительно стабилен. Линус Торвальдс строго следит за соблюдением совместимости и ругается на всех, кто ее пытается случайно или намеренно сломать. Благодаря такой политике любая программа из времен ядра 2.6 будет нормально работать и на 5.x, если она не использует никакие разделяемые библиотеки. Более того, новые программы могут работать на старых ядрах, если используют только старые системные вызовы. А что в других системах?Из распространенных свободных Unix-подобных систем Linux — единственная с такими гарантиями совместимости ABI ядра. Именно поэтому для Linux существует множество альтернативных стандартных библиотек языка C (musl, dietlibc, uclibc, newlib...). По этой же причине FreeBSD реализует двоичную совместимость с Linux, но не наоборот — FreeBSD не дает гарантий стабильности ABI между релизами. Поддержка версионирования символов в GNU libc тоже нетипична для реализаций стандартной библиотеки. Таким образом, возможностей для двоичной совместимости в Linux больше, чем во многих других системах, — нужно только ими пользоваться. ВыводыИз всего сказанного видно, что статическая сборка — залог совместимости с любой системой на основе Linux, причем и с более новыми ядрами, и с более старыми. Альтернативный подход — AppImage тоже позволяет собрать все в один файл, но этот файл на деле представляет собой сжатый образ SquashFS с исполняемым файлом и динамическими библиотеками внутри. Увы, инструменты автоматического поиска и упаковки всех нужных библиотек капризны, и детальное рассмотрение этого подхода не поместится в рамки нашей статьи. Мы сосредоточимся на статической компоновке. ПрактикаДля примера мы используем несложную программу, которая проверяет соответствие строки регулярному выражению. Мы соберем ее несколькими разными способами и посмотрим, как убедиться, что файл вышел действительно статический. Перейти обратно к новости |