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

56

Por que quase todas as bibliotecas compartilhadas em /usr/lib/ têm o bit de permissão executável definido? Não vejo nenhum caso de uso para executá-los. Alguns conseguem ligar alguma forma da função main para imprimir uma breve nota de copyright e versão, mas muitos não fazem nem isso e segfault após a execução.

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

    
por Tadeusz A. Kadłubowski 12.06.2012 / 12:43

2 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 o PROT_EXEC configurado - um recurso útil para evitar 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 mapeada que devem contê-lo: 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 memória.

    
por 18.09.2012 / 05:27
19

Objetos compartilhados não executáveis funcionam bem, mas as bibliotecas marcadas como executáveis podem ser também executadas como programas autônomos.

So, what's the point of setting this x?

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

Must all library packagers do that?

Não

What will happen if I dlopen() a shared library that has 0644 permissions?

Você receberá 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 podem ser usadas como executáveis independentes ainda têm o conjunto de bits exec: provavelmente é apenas um artefato do sistema de compilação ou script de link usado.

Exemplo de saída

, 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/>.
    
por 12.06.2012 / 12:56