Qual é a diferença entre um arquivo binário e uma biblioteca?

11

Estou tentando entender o padrão de hierarquia do sistema de arquivos. Procurei binários e bibliotecas e, como atualmente o entendo:

binários são arquivos de código legível por computador em formato binário, que controlam a CPU e o processador diretamente com bits.

bibliotecas são funções utilizáveis ​​por vários programas, por conveniência - como quando você precisa de um módulo em Javascript do PHP.

Esse entendimento está correto? Se for, por que ainda separamos bibliotecas e binários? Algumas bibliotecas são binárias, certo? E alguns binários (cat, less, date, rm, cp, etc) são usados ​​e reutilizados como se fossem bibliotecas ... Alguém pode ajudar a explicar a diferença e me ajudar a encontrar melhores definições para essas duas palavras? Obrigado.

houallet
fonte

Respostas:

10

Sua compreensão está correta, mas há algumas coisas a considerar:

  1. 'binário' refere-se a algo que não é legível por humanos. Isso geralmente se refere ao código da máquina, mas muitos outros arquivos também são arquivos binários nesse sentido, com a maioria dos formatos multimídia sendo um bom exemplo. A ESF, no entanto, tem um uso mais específico para o termo.
  2. Bibliotecas podem ser código binário. De fato, a maioria das coisas /libserão bibliotecas compiladas no código da máquina.
  3. Enquanto coisas como catsão usadas no shell script como chamadas ao código nas bibliotecas, elas não são bibliotecas no sentido da FHS porque podem ser executadas sozinhas.

Como resultado desses pontos, a terminologia mais comum entre as pessoas que não estão escrevendo documentos de normas é:

  • Arquivos de objeto: são códigos de máquina compilados nativamente, mas podem nem ser executados ou podem ser chamados. Eles normalmente têm uma .oextensão, a menos que se enquadram em uma das outras categorias e quase nunca são vistos na maioria dos sistemas, exceto na criação de software. Listei-os aqui porque são importantes para entender algumas coisas abaixo.

  • Arquivos executáveis: são arquivos compostos principalmente por código independente que podem ser executados diretamente. Eles podem ser arquivos de objeto especialmente formatados que podem ser carregados diretamente pelo kernel (coisas como cat, bashe pythonsão todo esse tipo de executável) ou são interpretados por algum programa intermediário que é ele próprio um executável (Minecraft pydoc, e cowsaysão exemplos) deste tipo de executável). Os executáveis ​​do primeiro tipo quase nunca têm uma extensão de arquivo nos sistemas UNIX, enquanto os executáveis ​​do segundo tipo podem ou não. É a isso que a ESF se refere como 'binários'. Eles podem ser executados a partir de outros executáveis, mas exigem a chamada de funções especiais para invocá-los ( fork()e exec()em C e C ++, coisas fora do diretóriosubprocess módulo em Python, etc) e execute como um processo separado.

  • Bibliotecas: são arquivos que contêm código reutilizável que pode ser chamado por outra biblioteca ou executável. O código nas bibliotecas é chamado (principalmente) diretamente por outro código, uma vez que a biblioteca é carregada (referida como 'vinculação' ao falar sobre código compilado) e é executada no mesmo processo que o código que a chama. Existem três tipos genéricos de bibliotecas:

    1. Bibliotecas estáticas: são a variedade original. Eles consistem em um arquivo morto (geralmente no formato AR) com um grande número de arquivos de objetos, um para cada função na biblioteca. Os arquivos de objeto são vinculados ao executável que os utiliza, portanto, um executável que usa apenas bibliotecas estáticas é essencialmente 100% independente de qualquer outro código. Nos sistemas UNIX, eles geralmente têm uma .aextensão. O conceito de bibliotecas estáticas realmente não existe fora das linguagens de programação compiladas.
    2. Bibliotecas dinâmicas: são o tipo mais comum de biblioteca usada atualmente. Uma biblioteca dinâmica é um arquivo de objeto especial, normalmente com uma .soextensão no UNIX ( .dllé o padrão no Windows), que é carregado em tempo de execução pelos executáveis ​​que o usam. Muito do que você encontrará nos /libsistemas de produção são bibliotecas dinâmicas.
    3. Módulos: é o equivalente a uma biblioteca dinâmica para uma linguagem interpretada. A manipulação é um pouco diferente da linguagem compilada e, diferentemente da linguagem compilada, é possível que um arquivo seja um módulo e um executável (veja http.serverum exemplo na biblioteca padrão do Python).
Austin Hemmelgarn
fonte
Para não esquecer os arquivos de script, que são um caso especial de executáveis, pois eles dependem de um executável binário ( bash, python) para ser executado. Além do mais, scripts em /libpodem ser usados ​​para outros scripts; compare os módulos Python.
Murphy
1
Isso se enquadra em 'interpretado por algum programa intermediário . Tow of the examples I listed for that (pydoc` e cowsay) são scripts.
Austin Hemmelgarn
Os esclarecimentos sobre os módulos 3 são bits carregáveis ​​de código usados ​​para estender a funcionalidade. Os módulos Apache / php são um bom exemplo para sua parte de scripts interpretados, mas os módulos do kernel também contam ... Eu também adicionaria um ponto para cobrir as linguagens interpretadas legíveis principalmente por humanos, como scripts para os diversos shells, php, perl, etc. por FHS iria em / bin ou / sbin diretório, uma vez que são programas executáveis
ivanivan
Módulos como extensões são mais frequentemente chamados de plugins. A escolha de nomes do Apache foi baseada no antigo padrão UNIX de chamar módulos de drivers do kernel, e que agora se tornou uma terminologia comum com servidores da Web (por causa do marketing), mas esse é um caso estranho comparado à maioria dos outros softwares, que usam universalmente qualquer um dos plug-ins. 'ou' extensão 'ao se referir a isso.
Austin Hemmelgarn