Seu entendimento está correto, mas há algumas coisas extras a serem consideradas:
- '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 FHS, no entanto, tem um uso mais específico para o termo.
- Bibliotecas podem ser código binário. Na verdade, a maioria das coisas em
/lib
serão bibliotecas compiladas para código de máquina. - Embora coisas como
cat
sejam usadas no shell script, como chamadas para código em bibliotecas, elas não são bibliotecas no sentido do FHS, pois podem ser executadas por elas mesmas.
Como resultado desses dois fatos, a terminologia mais comum entre pessoas que não estão escrevendo documentos padrões é:
-
Arquivos de objeto: eles são código de máquina de compilação nativa, mas podem nem mesmo ser executados ou serem chamados. Eles normalmente têm uma extensão
.o
, a menos que se enquadrem em uma das outras categorias e quase nunca sejam vistos na maioria dos sistemas, exceto na criação de software. Eu os listei aqui porque eles são importantes para entender algumas coisas abaixo. -
Arquivos executáveis: são arquivos que consistem principalmente em códigos autocontidos que podem ser executados diretamente. Eles podem ser arquivos de objeto especialmente formatados que podem ser carregados diretamente pelo kernel (coisas como
cat
,bash
epython
são todos desse tipo de executável), ou são interpretados por algum programa intermediário que é em si um executável (Minecraft,pydoc
ecowsay
são todos exemplos desse tipo de executável). Os executáveis do primeiro tipo quase nunca possuem uma extensão de arquivo nos sistemas UNIX, enquanto os executáveis do segundo tipo podem ou não. É a isso que o FHS se refere como 'binários'. Eles podem ser executados a partir de outros executáveis, mas requerem a chamada de funções especiais para invocá-los (fork()
eexec()
em C e C ++, coisas do módulosubprocess
em Python, etc) e executados como um processo separado. / p> -
Bibliotecas: são arquivos que contêm código reutilizável que pode ser chamado por outra biblioteca ou por um executável. O código em bibliotecas é invocado (principalmente) diretamente por outro código, uma vez que a biblioteca é carregada (referida como 'linking' quando se fala de código compilado), e é executada no mesmo processo que o código que a chama. Existem três tipos genéricos de bibliotecas:
- Bibliotecas estáticas: são a variedade original. Eles consistem em um arquivo (geralmente formato AR) com um grande número de arquivos objeto dentro, um para cada função na biblioteca. Os arquivos 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 possuem uma extensão
.a
. O conceito de bibliotecas estáticas não existe realmente fora das linguagens de programação compiladas. - Bibliotecas dinâmicas: esse é o tipo mais comum de biblioteca usado atualmente. Uma biblioteca dinâmica é um arquivo de objeto especial, geralmente com uma extensão
.so
no UNIX (.dll
é o padrão no Windows), que é carregada em tempo de execução por executáveis que a utilizam. A maior parte do que você encontrará em/lib
em sistemas de produção são bibliotecas dinâmicas. - Módulos: é o equivalente de uma biblioteca dinâmica para um idioma interpretado. O tratamento é um pouco diferente do que para uma linguagem compilada e, ao contrário de uma linguagem compilada, é possível que um arquivo seja tanto um módulo quanto um executável (veja
http.server
na biblioteca padrão do Python para um exemplo).
- Bibliotecas estáticas: são a variedade original. Eles consistem em um arquivo (geralmente formato AR) com um grande número de arquivos objeto dentro, um para cada função na biblioteca. Os arquivos 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 possuem uma extensão