¿Por qué las bibliotecas compartidas en Linux son ejecutables?

8

Tengo curiosidad.

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

Todo parece funcionar bien solo con + r. Me di cuenta de que la mayoría de los .so en / usr / lib tienen conjunto + x ...

¿Por qué se supone que las bibliotecas compartidas tienen un conjunto de bits ejecutable? ¿Qué podría pasar si no lo configuro?

Tomo
fuente
2
Las bibliotecas definitivamente no necesitan + x para funcionar correctamente. ¿Quizás son enlaces sin embargo? Los enlaces necesitarían + x para ser seguidos.
Chris S
Sí, no necesitan + x, sin embargo, la mayoría de las bibliotecas lo tienen configurado.
Tomo
Esta pregunta también se ha hecho en Unix y Linux: unix.stackexchange.com/questions/40587/… (y obtuve la respuesta correcta allí)
Michał Górny

Respuestas:

3

En realidad depende de la lddimplementación. lddgeneralmente es un script, puede editarlo para ver dónde y por qué obtiene ese error.

En Ubuntu 10.04, solo lddbusca el readpermiso. Puede que el error no sea un ejecutable dinámico si el archivo no es un ELF ( formato ejecutable y enlazable ). Las librerías aquí son todas -rw-r--r--, por ejemplo

$ 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

No es sorprendente querer xtener acceso a una biblioteca compartida. El executablemodo es una convención que le da al sistema operativo otro nivel de control de derechos de acceso. El cargador ejecutable controla ese acceso, para garantizar que el usuario pueda ejecutarlo, pero también para evitar errores (algunas personas no deberían ejecutar algunos scripts o programas).

Esto podría extenderse a las bibliotecas compartidas por la misma razón, pero las bibliotecas compartidas no pueden ejecutarse por sí mismas y son menos propensas a ser utilizadas por accidente ). Por lo tanto, la necesidad es menos obvia (el racceso es suficiente).

e2-e4
fuente
3

En realidad, puede ejecutar muchas bibliotecas, vea, por ejemplo, lo que sucede cuando escribe /lib/libc.so.6en su shell en un sistema GNU / Linux reciente.

jaq
fuente
0

piense como tener un archivo ejecutable con -x. No podrás ejecutarlo. Considere estas bibliotecas como una colección de funciones generales, que están siendo llamadas por otro programa (digamos myProgra). Si no puede ejecutar las bibliotecas / funciones ... entonces no tiene nada

Un ejemplo

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

Ahora, si coloca function1 y function2 en otro archivo y lo incluye, entonces usted es una biblioteca. (Por supuesto, es algo más complicado. Esto es solo un ejemplo)

Pero en cualquier caso, como puede ver, debe ejecutar el código que se incluye en la biblioteca

Nikolaidis Fotis
fuente
Pero ejecutas ejecutables, no bibliotecas.
Ignacio Vazquez-Abrams
Vea la versión editada arriba
Nikolaidis Fotis
0

La clave es el formato de archivo, formato ejecutable y enlazable. Dado que se usa el mismo formato de archivo exacto para identificar tanto una biblioteca ejecutable como una compartida, ambas deben tener los permisos ejecutables apropiados para el cargador del sistema operativo. Esto permite que un solo cargador y los ejecutables se utilicen como DSO si incluyen una tabla de símbolos.

nzwulfin
fuente
Entonces, ¿el cargador usa bits de permiso, no el encabezado del archivo, para identificar cosas que cargar?
Tomo
El cargador utiliza el encabezado del archivo para identificar los contenidos como DYN o EXEC y hacer lo apropiado. El bit de ejecución es para el sistema operativo, no para el cargador. ELF es un formato ejecutable, sin el bit de ejecución, el sistema operativo no permitirá que el cargador ejecute el archivo para leer los encabezados. Consulte wikipedia para obtener más información sobre ELF en.wikipedia.org/wiki/Executable_and_Linkable_Format .
nzwulfin