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

8

Estou apenas curioso.

bash-3.00$  ldd libmylibrary.so
ldd: warning: you do not have execution permission for 'libmylibrary.so'

Tudo parece funcionar bem apenas com + r. Eu notei que a maioria do .so em / usr / lib tem + x set ...

Por que as bibliotecas compartilhadas devem ter o bit executável configurado? O que poderia acontecer se eu não definir isso?

    
por Tomo 24.08.2010 / 13:18

4 respostas

3

Na verdade, depende da implementação de ldd . ldd geralmente é um script, você pode editá-lo para ver onde e por que você recebeu esse erro.

No Ubuntu 10.04, ldd verifica apenas a permissão read . Ele pode dar o erro não um executável dinâmico se o arquivo não for um ELF ( Formato Executável e Linkable ). As libs aqui são todas -rw-r--r-- , por exemplo

$ find /usr/lib -type f -name "libm*.so*" -ls
(...)
-rw-r--r--   1 root     root       216800 Feb 26 22:20 /usr/lib/libmp.so.3.1.16
-rw-r--r--   1 root     root        76728 Mar 14 04:23 /usr/lib/libmjpegutils-1.9.so.0.0.0
-rw-r--r--   1 root     root       134464 Jan 29  2010 /usr/lib/libm17n-core.so.0.3.0
-rw-r--r--   1 root     root       290480 Feb 17  2010 /usr/lib/libmtp.so.8.3.2

Não é chocante querer um x de acesso para uma biblioteca compartilhada. O modo executable é uma convenção que fornece ao SO outro nível de controle de direitos de acesso. O carregador executável controla esse acesso, para garantir que o usuário possa executá-lo, mas também para evitar erros (alguns scripts ou programas não devem ser executados por algumas pessoas).

Isso pode ser estendido para as bibliotecas compartilhadas pela mesma razão - mas as bibliotecas compartilhadas não podem executar por si mesmas, e são menos propensas a erros por acidente ). Assim, a necessidade é menos óbvia (o acesso r é suficiente).

    
por 24.08.2010 / 19:48
2

Você pode realmente executar muitas bibliotecas, veja por exemplo o que acontece quando você digita /lib/libc.so.6 em seu shell em um sistema GNU / Linux recente.

    
por 25.08.2010 / 02:35
0

pense em ter um arquivo executável com -x. Você não poderá executá-lo. Considere estas bibliotecas como uma coleção de funções gerais, que estão sendo chamadas por outro programa (digamos myProgra). Se você não pode executar as bibliotecas / função ... então você não tem nada

Um exemplo

function1() {} 
function2() {} 
int main() { 
printf("Let's call func1"); 
function1(); 
printf("Let's call func2"); 
function2(); 
} 

Agora, se você colocar function1 e function2 em outro arquivo e incluí-lo, então você terá uma biblioteca. (Claro que é algo mais complicado. Este é apenas um exemplo)

Mas em qualquer caso, como você pode ver, você tem que executar o código que está sendo incluído na biblioteca

    
por 24.08.2010 / 14:13
0

A chave é o formato de arquivo, Executável e Formato Linkable. Como o mesmo formato de arquivo exato é usado para identificar tanto um executável quanto uma biblioteca compartilhada, ambos devem ter as permissões executáveis apropriadas para o carregador do sistema operacional. Isso permite que um único carregador e executáveis sejam usados como um DSO, se incluírem uma tabela de símbolos.

    
por 24.08.2010 / 20:07

Tags