В чем разница между бинарным файлом и библиотекой?

11

Я пытаюсь понять стандарт иерархии файловой системы. Я посмотрел как двоичные файлы, так и библиотеки, и, как я сейчас понимаю, это:

двоичные файлы - это файлы машиночитаемого кода в двоичном формате, которые управляют процессором и процессором напрямую с помощью битов.

библиотеки - это функции, используемые различными программами, для удобства, например, когда вам нужен модуль в Javascript PHP.

Это понимание правильно? Если это так, почему мы все еще разделяем библиотеки и двоичные файлы? Некоторые библиотеки являются двоичными файлами, верно? И некоторые двоичные файлы (cat, less, date, rm, cp и т. Д.) Используются и используются повторно, как если бы они были библиотеками ... Может кто-нибудь помочь объяснить разницу и помочь мне найти более точные определения для этих двух слов? Спасибо.

houallet
источник

Ответы:

10

Ваше понимание в основном верно, но есть несколько дополнительных вещей, которые следует учитывать:

  1. «бинарный» относится к тому, что не читается человеком. Обычно это относится к машинному коду, но в этом смысле многие другие файлы также являются двоичными файлами, и хорошим примером является большинство мультимедийных форматов. FHS, однако, имеет более конкретное использование для этого термина.
  2. Библиотеки могут быть двоичным кодом. На самом деле, большая часть этого /libбудет библиотеками, скомпилированными в машинный код.
  3. Хотя такие вещи catиспользуются в сценарии оболочки, как вызовы кода в библиотеках, они не являются библиотеками в смысле FHS, потому что они могут запускаться сами по себе.

В результате этих пунктов, более распространенная терминология среди людей, которые не пишут стандартные документы:

  • Объектные файлы: это машинно-скомпилированный машинный код, но он может даже не запускаться и не вызываться. Как правило, они имеют .oрасширение, если они не попадают в одну из других категорий, и почти никогда не встречаются в большинстве систем, за исключением случаев создания программного обеспечения. Я перечислил их здесь, потому что они важны для понимания нескольких вещей ниже.

  • Исполняемые файлы: это файлы, состоящие в основном из автономного кода, который можно запускать напрямую. Они могут быть либо специально отформатированными объектными файлами, которые могут быть загружены непосредственно ядром (например cat, bashи pythonявляются исполняемыми файлами этого типа), либо интерпретируются некоторой программой-посредником, которая сама является исполняемым файлом (Minecraft pydoc, и cowsayявляются примерами) этого типа исполняемого файла). Исполняемые файлы первого типа почти никогда не имеют расширения файлов в системах UNIX, в то время как исполняемые файлы второго типа могут иметь или не иметь. Это то, что FHS называет «двоичными файлами». Они могут быть запущены из других исполняемых файлов, но требуют вызова специальных функций для их вызова ( fork()а exec()в C и C ++, вещи внеsubprocess модуль в Python и т. д.) и запускаться как отдельный процесс.

  • Библиотеки: это файлы, которые содержат повторно используемый код, который может быть вызван другой библиотекой или исполняемым файлом. Код в библиотеках вызывается (в основном) непосредственно другим кодом после загрузки библиотеки (называемой «связыванием», когда речь идет о скомпилированном коде) и выполняется в том же процессе, что и код, вызывающий ее. Существует три универсальных типа библиотек:

    1. Статические библиотеки: это оригинальная разновидность. Они состоят из архивного файла (обычно в формате AR) с большим количеством объектных файлов внутри, по одному для каждой функции в библиотеке. Объектные файлы связываются с исполняемым файлом, который их использует, поэтому исполняемый файл, использующий только статические библиотеки, практически не зависит от любого другого кода. В системах UNIX они обычно имеют .aрасширение. Концепция статических библиотек на самом деле не существует вне скомпилированных языков программирования.
    2. Динамические библиотеки: это наиболее распространенный тип библиотек, используемых сегодня. Динамическая библиотека - это специальный объектный файл, обычно с .soрасширением в UNIX ( .dllэто стандарт для Windows), который загружается во время выполнения исполняемыми файлами, которые его используют. В /libпродуктивных системах вы найдете в основном динамические библиотеки.
    3. Модули: это эквивалент динамической библиотеки для интерпретируемого языка. Обработка немного отличается от скомпилированного языка, и в отличие от скомпилированного языка, файл может быть и модулем, и исполняемым файлом (см. http.serverПример в стандартной библиотеке Python).
Остин Хеммелгарн
источник
Не забывайте файлы сценариев, которые являются особым случаем исполняемых файлов, так как они зависят от исполняемого двоичного файла ( bash, python), который нужно запустить. Более того, сценарии /libмогут использоваться другими сценариями; сравнить модули Python.
Мерфи
1
То, что подпадает под «интерпретацию некоторой посреднической программы . Tow of the examples I listed for that (pydoc» и cowsay), является скриптами.
Остин Хеммельгарн,
Пояснение к # 3 - модули - это загружаемые фрагменты кода, используемые для расширения функциональности. Модули Apache / php являются хорошим примером для вашей части интерпретируемых скриптов, но модули ядра тоже учитываются ... Я бы также добавил пункт, чтобы охватить в основном понятные человеку интерпретируемые языки, такие как скрипты для различных оболочек, php, perl и т. Д., Которые для каждого FHS будет идти в каталог / bin или / sbin, так как они являются исполняемыми программами
ivanivan
Модули как расширения чаще называются плагинами. Выбор имен в Apache был основан на старом стандарте UNIX для вызова модулей драйверов ядра, и теперь это стало общей терминологией с веб-серверами (из-за маркетинга), но это странный случай по сравнению с большинством других программ, которые довольно универсально используют любой плагин 'или' расширение 'при обращении к этому.
Остин Хеммельгарн