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

8

Eu só estou 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. Notei que a maioria dos arquivos .so em / usr / lib possui + x set ...

Por que as bibliotecas compartilhadas deveriam ter um conjunto de bits executável? O que poderia acontecer se eu não o definir?

Tomo
fonte
2
Definitivamente, as bibliotecas não precisam de + x para funcionar corretamente. Talvez eles sejam links no entanto? Os links precisariam de + x para serem seguidos.
Chris S
Sim, eles não precisam de + x, mas a maioria das bibliotecas o definiu.
Tomo
Esta questão também foi perguntado sobre Unix e Linux: unix.stackexchange.com/questions/40587/... (e obteve a resposta correta lá)
Michał Górny

Respostas:

3

Na verdade, depende da lddimplementação. lddgeralmente é um script, você pode editá-lo para ver onde e por que esse erro ocorre.

No Ubuntu 10.04, lddverifica readapenas a permissão. Pode dar ao erro um executável dinâmico se o arquivo não for um ELF (formato executável e vinculável ). As bibliotecas 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 xacesso para uma biblioteca compartilhada. O executablemodo é uma convenção que fornece ao sistema operacional 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 às bibliotecas compartilhadas pelo mesmo motivo - mas as bibliotecas compartilhadas não podem ser executadas sozinhas e são menos propensas a serem usadas por acidente ). Assim, a necessidade é menos óbvia (o racesso é suficiente).

e2-e4
fonte
3

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

jaq
fonte
0

pense como ter um arquivo executável com -x. Você não poderá executá-lo. Considere essas 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, terá uma biblioteca. (Claro que é algo mais complicado. Este é apenas um exemplo)

Mas, de qualquer forma, como você pode ver, é necessário executar o código que está sendo incluído na biblioteca

Nikolaidis Fotis
fonte
Mas você executa executáveis, não bibliotecas.
Ignacio Vazquez-Abrams
Veja a versão editada acima
Nikolaidis Fotis
0

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

nzwulfin
fonte
Então, o carregador usa bits de permissão, não o cabeçalho do arquivo, para identificar o que deve ser carregado?
Tomo
O carregador usa o cabeçalho do arquivo para identificar o conteúdo como DYN ou EXEC e fazer a coisa apropriada. O bit de execução é para o sistema operacional, não para o carregador. ELF é um formato executável, sem o bit de execução, o sistema operacional não permitirá que o carregador execute o arquivo para ler os cabeçalhos. Confira a wikipedia para mais informações sobre o ELF en.wikipedia.org/wiki/Executable_and_Linkable_Format .
Nzwulfin