Будет ли мой бинарный Linux работать на всех дистрибутивах?

24

Я нашел хорошую замену IDE для Delphi под названием Lazarus. Но у меня нет вопросов к программистам.

Будет ли статически связанный бинарный файл Linux работать во всех дистрибутивах Linux? Т.е. неважно, на каком дистрибутиве Linux я его построил, и он будет работать на Debian / ArchLinux / Ubuntu / OpenSUSE / ... что угодно?

В результате моих выводов, действительно ли имеет значение только 32-битный против 64-битного? Я хочу быть уверен, прежде чем публиковать.

LinuxSecurityFreak
источник
Смутно , связанные: Linux Системные вызовы в C на OS X .
G-Man говорит: «Восстановите Монику»
Можете ли вы более конкретно рассказать о том, с какими библиотеками вы планируете связать свою программу? Некоторые библиотеки имеют скрытые зависимости (файлы данных, динамические подсистемы) или иные неявные предположения о системе, в которой они работают.
Томас Эркер

Ответы:

29

Этот ответ был впервые написан для более общего вопроса «Будет ли мой бинарный файл работать на всех дистрибутивах», но он касается статически связанных двоичных файлов во второй половине.


Для всего, что является более сложным, чем статически связанный мир приветствия, ответ, вероятно, нет .
Не проверяя его на дистрибутиве X, предположим, что ответ X - нет.

Если вы хотите отправить свое программное обеспечение в двоичном виде, ограничьте себя

  • несколько популярных дистрибутивов для области использования вашего программного обеспечения (рабочий стол, сервер, встроенный, ...)

  • последние одну или две версии каждого

В противном случае вы получите хаундредов дистрибутивов всех размеров, версий и возрастов (десятилетний дистрибутив все еще используется и поддерживается).

Тест для тех. Просто несколько указателей на то, что может (и будет) пойти не так, как надо:

  • Пакет необходимого вам инструмента / библиотеки называется по-разному в разных дистрибутивах и даже в версиях одного и того же дистрибутива.

  • Нужные вам библиотеки слишком новые или слишком старые (неправильная версия). Не думайте, что ваша программа может ссылаться, она связывается с нужной библиотекой.

  • Одна и та же библиотека (файл на диске) по-разному называется в разных дистрибутивах, что делает невозможным связывание

  • 32-разрядная на 64-разрядной: 32-разрядная среда может быть не установлена, или какая-то второстепенная 32-разрядная библиотека перемещена в дополнительный пакет помимо среды 32on64, поэтому у вас есть дополнительная зависимость только для этого случая.

  • Shell: не принимайте вашу версию Bash. Не думай, что даже Баш.

  • Инструменты: не предполагайте, что какой-либо инструмент командной строки не POSIX существует где-либо.

  • Инструменты: не думайте, что инструмент распознает опцию только потому, что это делает версия вашего дистрибутива GNU.

  • Интерфейсы ядра: не предполагайте существование или структуру файлов /procтолько потому, что они существуют / имеют структуру на вашем компьютере

  • Java: вы действительно уверены, что ваша программа работает на IBM JRE, поставляемой вместе с SLES, без ее тестирования?

Бонус:

  • Наборы инструкций: двоичный файл, скомпилированный на вашем компьютере, не работает на старом оборудовании.

Является ли статическое связывание (или: объединение всех необходимых библиотек с вашим программным обеспечением) решением? Даже если это работает технически, связанные с этим расходы могут быть слишком высокими. Так что, к сожалению, ответ, вероятно, тоже нет.

  • Безопасность: вы перекладываете ответственность за обновление библиотек с пользователя вашего программного обеспечения на себя.

  • Размер и сложность: просто для удовольствия попробуйте создать статически связанную программу с графическим интерфейсом.

  • Функциональная совместимость: если ваше программное обеспечение является «плагином» любого рода, вы зависите от программного обеспечения, которое вам звонит.

  • Дизайн библиотеки: если вы статически связываете свою программу с GNU libc и используете службы имен ( getpwnam()и т. Д.), Вы в конечном итоге будете динамически связаны с NSS libc (переключатель службы имен).

  • Дизайн библиотеки: библиотека, с которой вы статически связываете свою программу, использует файлы данных или другие ресурсы (например, часовые пояса или локали).


По всем причинам, указанным выше, тестирование необходимо.

  • Ознакомьтесь с KVM или другими методами виртуализации и получите виртуальную машину для каждого дистрибутива, который вы планируете поддерживать. Протестируйте свое программное обеспечение на каждой виртуальной машине.

  • Используйте минимальные установки этих дистрибутивов.

  • Создайте виртуальную машину с ограниченным набором команд (например, без SSE 4).

  • Только статически связанные или связанные: проверьте ваши двоичные файлы, lddчтобы увидеть, действительно ли они статически связаны / используют только ваши связанные библиотеки.

  • Только статически связанные или связанные: создайте пустой каталог и скопируйте в него свое программное обеспечение. chrootв этот каталог и запустите свое программное обеспечение.

Томас Эркер
источник
Это довольно полный ответ +1
sirlark
2
Shell: В частности, Debian не использует bash , и, поскольку это значительно снизило уязвимость Shellshock в системах Debian, я не могу представить, что она изменится в ближайшем будущем.
Кевин
1
Кроме того, если вы хотите отправить двоичные файлы, связывайте их статически .
user253751
Почему «набор инструкций» называется «бонусом»? Если вы распространяете в двоичном виде, вам действительно нужно подумать, для каких ISA вы будете компилировать. Возможно, вы не заботитесь о пользователях m68k, но по крайней мере сложно игнорировать ARM, IA32 и X86_64.
Тоби Спейт
@TobySpeight Подумайте о SSE4 и подобных. Могу только укусить вас, если вы используете ассемблер.
Томас Эркер
9

Ответ зависит. , но в большинстве случаев да, если в ОС установлены необходимые библиотеки.

Как правило, большинство основных дистрибутивов, таких как упомянутые вами, имеют свои инструменты управления пакетами, которые устанавливают поддерживаемую сообществом версию приложения. Это заботится о любых обязательных пакетах, которые понадобятся приложению. Если вы устанавливаете его без менеджера пакетов, вы должны убедиться, что все необходимые пакеты и библиотеки установлены в ОС. Это хорошая идея, чтобы включить список этих обязательных приложений в документацию.

AlexJerez
источник
2

Сначала дерьмовый ответ: это зависит

Если вы выпускаете двоичные файлы, принимайте ответ «нет», если только вы не распространяете все библиотеки, которые он когда-либо связывает с ним (с нуля, что раздражает, если вы не предоставляете действительно огромную систему, которая в любом случае стоит сама по себе) ) или статически связывают эквивалент.

... но волшебники и деньги, и деньги волшебники ...

У IBM есть несколько «общих Unixish» инсталляторов, которые потрясли меня, работая везде, где я их пробовал: несколько Linuces из нескольких поколений ядра, OpenSolaris (или как его сейчас называют), Solaris и BSD. Но они огромны. И вещи, которые они предоставляют, одинаково огромны. Таким образом, не будет опубликовано ни одной маленькой гоночной программы, только то, что вы ожидаете от IBM.

Что касается только того, чтобы оставаться в Linux, но хорошо работать в большинстве Linuxdom, то это представляется возможным в двоичной форме, о чем свидетельствует разнообразие бинарных установщиков типа «для Linux (общего)», которые вы увидите у некоторых поставщиков. Несколько чатов, браузеров, игр, метаинсталляторов и т. Д. Публикуются таким образом, но всегда огромными поставщиками, которые могут потратить время, чтобы сделать это правильно. Удивительно, что они могут сказать «для Linux» и быть в целом уверены, что это сработает, но, похоже, это так.

Но...

Я распространяю свое программное обеспечение как источник с утилитой сборки. Я делаю это на C, Erlang, Python, Guile и т. Д. Это дает мне гораздо больше гибкости в отношении того, будет ли он работать или нет, и гораздо проще написать сценарий сборки, который гарантирует, что правильные вещи существуют во время сборки, чем убедитесь, что все на месте во время выполнения. Когда это существует, написать автообновление для вашей программы тривиально, если вы распространяете источник: источник обычно намного меньше двоичного файла, который включает в себя все deps и другие помехи. Используя этот метод, у меня не было особых проблем с надежным развертыванием в Unices (и иногда в Windows, но это немного сложнее).

Достаточно детской игры, вооружись!

Когда вы серьезно, как и srsly srs, серьезно относитесь к тому, чтобы гармонично вписаться в мир Linux, вы распространяете исходные тексты на C или обращаетесь к полностью управляемой среде для хакерско-восхитительного языка, который уже готов. Например, если вы пишете код на Python, вы можете проверить версии и узнать, с какой вашей версией CPython вы работаете, и, как правило, ожидать, что какая-то совместимая версия будет существовать в данном Linux (и это гораздо проще проверить, чем широкий обзор C libs). / версии, которые вы могли бы использовать). Erlang, Guile, Python, Perl, CL и т. Д. Очень простые цели для такого рода развертываний, и многие из них имеют центральный репозиторий, такой как CPAN или pip (или любой другой), где пользователи могут запускать команду для извлечения подписанного источника самостоятельно, когда они этого хотят, и знать, что в целом все будет работать так, как вы предполагали ,

[Приложение: 1. Даже Haskell может вообще осуществить это через Cabal - хотя я буду осторожен с этим в производственной среде. 2. В Erlang есть совершенно разные стратегии развертывания «релиза», которые гарантируют, что ваш код будет содержать в себе полную среду. 3. Python делает шаг вперед с виртуальными средами; не все среды выполнения помогают вам так сильно.]

Этот последний кусочек об управляемых средах в Linux чертовски крут . И, в качестве бонуса, он позволяет вам определять гораздо более общие зависимости, автоматически разрешать их без дополнительных усилий с вашей стороны, не требует написания пакета для каждого дистрибутива, и вы можете перестать заботиться о том, является ли система 32 или 64 немного (как правило, в любом случае).

zxq9
источник