Por que as bibliotecas compartilhadas são executáveis?

59

Por que quase todas as bibliotecas compartilhadas /usr/lib/têm o bit de permissão executável definido? Não vejo nenhum caso de uso para executá-los. Alguns conseguem conectar alguma forma de mainfunção para imprimir uma pequena nota de direitos autorais e versão, mas muitos não fazem isso e se tornam falhas após a execução.

Então, qual é o objetivo de definir isso x? Todos os empacotadores de bibliotecas devem fazer isso? O que acontecerá se eu for dlopen()uma biblioteca compartilhada com 0644permissões?

Tadeusz A. Kadłubowski
fonte
3
Em qual SO (se Linux, qual distribuição)? No Debian squeeze, as únicas bibliotecas compartilhadas executáveis /libe /usr/libsão libc e libpthread, e ambas imprimem um aviso de direitos autorais quando executadas.
Gilles 'SO- stop be evil'
Se eles falharem, provavelmente são pequenos bugs. Eu os denunciaria se você os encontrar. Qual é a distribuição?
Faheem Mitha
@ Faaem: Não ter um main()símbolo como ponto de entrada não é um bug menor, mas uma escolha de design fundamental. Você perdeu o meu argumento.
Tadeusz A. Kadłubowski
2
@Gilles: Eu vi o 755 como uma opção de permissão padrão nos sistemas Linux da família RedHat (Fedora e Centos) e no Solaris.
Tadeusz A. Kadłubowski
A premissa desta pergunta não é universalmente verdadeira. De fato, é falso, como mencionado acima, para o Debian Linux; e também false para FreeBSD e OpenBSD.
JdeBP #

Respostas:

32

No HP-UX, as bibliotecas compartilhadas são mapeadas na memória usando mmap () e todas as páginas de memória no sistema possuem bits de proteção que são acoplados aos mecanismos de proteção de página de memória do hardware do kernel e do processador. Para executar o conteúdo de qualquer página de memória no sistema, essa página deve ter PROT_EXEC configurado - um recurso útil para impedir explorações de execução de dados.

A chamada mmap () usa os bits de permissão no arquivo que está prestes a mapear para definir os bits de proteção das páginas de memória mapeadas que devem conter: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (de sys / mman.h). portanto, para que uma biblioteca compartilhada possa ser usada no HP-UX, o arquivo que contém a biblioteca compartilhada deve ter permissões de execução para garantir que a biblioteca mapeada também tenha permissão de execução.

Uma biblioteca compartilhada com o modo 644 em um sistema HP-UX causará despejos de núcleo.

Michael Pelletier
fonte
Possivelmente outras implementações do Unix também usam esse recurso.
Tadeusz A. Kadłubowski
> HP-UX (de "Hewlett Packard Unix") é a implementação proprietária da Hewlett Packard Enterprise do sistema operacional Unix, com base no sistema UNIX V
David 天宇 Wong 22/16/16
Um outro exemplo é que a criação de pacotes rpm com pacotes debuginfo separados requer permissões de execução em bibliotecas compartilhadas, caso contrário, o find-debuginfo.sh ignora o processamento deles.
Domen Vrankar
20

Objetos compartilhados não executáveis ​​funcionam bem, mas as bibliotecas marcadas como executáveis também podem ser executáveis ​​como programas independentes.

Então, qual é o objetivo de definir esse x?

Nenhuma, a menos que você queira que eles emitam versão ou outras informações

Todos os empacotadores de bibliotecas devem fazer isso?

Não

O que acontecerá se eu dlopen () uma biblioteca compartilhada com permissões 0644?

Você obterá um novo identificador de objeto compartilhado (desde que o arquivo seja legível etc.) ... o bit exec não afeta isso


Por que as bibliotecas que não são utilizáveis ​​como executáveis ​​independentes ainda possuem o bit exec definido: esse é provavelmente apenas um artefato do sistema de construção ou script de link usado.


saída de exemplo, apenas para referência:

$ /lib/i386-linux-gnu/libc.so.6
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10) stable release version 2.15, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.3.
Compiled on a Linux 3.2.14 system on 2012-04-19.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.
Sem utilidade
fonte
11
A maioria das bibliotecas .so simplesmente se segfault porque elas não têm nada parecido com o main()ponto de entrada normal . Libc é um outlier. Seus desenvolvedores fizeram essa observação como uma funcionalidade extra. Simples chmod a+xde qualquer outra biblioteca não fornecerá essa funcionalidade. Ainda não vejo o ponto de configuração +xpara todas as bibliotecas.
Tadeusz A. Kadłubowski
Concordado e provavelmente apenas aqueles .soque podem ser executados devem ser marcados como tal. Vou alterar minha resposta para evitar sugerir que tudo com o conjunto de bits exec é realmente um executável independente.
Inútil
5
O comando "ldd" geralmente é um script sh que chama o vinculador dinâmico, ld-linux-x86-64.so.2, ou /lib/ld-linux.so.2 ou algo parecido. O vinculador dinâmico é sempre um objeto compartilhado.
precisa