No meu notebook:
$ cat /etc/issue
Ubuntu 18.04 LTS \n \l
Existem duas pastas diferentes para bibliotecas x86
e x86_64
:
~$ ls -1 /
bin
lib
lib64
sbin
...
Por que para binários existe apenas um diretório?
PS: também estou interessado no Android, mas espero que a resposta seja a mesma.
Primeiro, por que existem separados
/lib
e/lib64
:O Filesystem Hierarchy Standard menciona que separam
/lib
e/lib64
existem porque:No meu Slackware 14.2, por exemplo, existem diretórios
/lib
e/lib64
para bibliotecas de 32 bits e 64 bits, respectivamente, embora/lib
não seja um link simbólico como o trecho FHS sugere:Existem duas
libc.so.6
bibliotecas em/lib
e/lib64
.Cada binário ELF construído dinamicamente contém um caminho codificado para o interpretador, neste caso
/lib/ld-linux.so.2
ou/lib64/ld-linux-x86-64.so.2
:O trabalho do interpretador é carregar as bibliotecas compartilhadas necessárias. Você pode perguntar a um interpretador GNU quais bibliotecas ele carregaria sem nem mesmo executar um binário usando
LD_TRACE_LOADED_OBJECTS=1
ou umldd
wrapper:Como você pode ver, um determinado interpretador sabe exatamente onde procurar por bibliotecas - a versão de 32 bits procura por bibliotecas
/lib
e a versão de 64 bits procura por bibliotecas em/lib64
.O padrão FHS diz o seguinte sobre
/bin
:IMO, a razão pela qual não há separação é que
/bin
,/bin64
se tivéssemos o arquivo com o mesmo nome em ambos os diretórios, não poderíamos chamar um deles indiretamente porque teríamos que colocar/bin
ou/bin64
primeiro em$PATH
.No entanto, observe que o acima é apenas a convenção - o kernel do Linux realmente não se importa se você tiver
/bin
arquivos/bin64
. Se desejar, você pode criá-los e configurar seu sistema de acordo.Você também mencionou o Android - observe que, exceto por executar um kernel Linux modificado, não tem nada a ver com sistemas GNU, como o Ubuntu - sem glibc, sem bash (por padrão, é claro que você pode compilar e implantar manualmente) e também estrutura de diretório é completamente diferente.
A razão é que os diretórios lib/lib64 podem conter arquivos que possuem o mesmo nome porque são bibliotecas compartilhadas com diversos programas. Colocá-los em diretórios separados resolve o conflito. Não há (geralmente...) uma boa razão para distribuir executáveis com o mesmo nome no mesmo sistema que são de 32/64 bits, mas como pode haver uma mistura de executáveis, as bibliotecas compartilhadas devem ser fornecidas.