¿Por qué las bibliotecas compartidas son ejecutables?

59

¿Por qué casi todas las bibliotecas compartidas /usr/lib/tienen establecido el bit de permiso ejecutable? No veo ningún caso de uso para ejecutarlos. Algunos logran conectar alguna forma de mainfunción para imprimir una breve nota de copyright y versión, pero muchos ni siquiera lo hacen y no cumplen con la ejecución.

Entonces, ¿cuál es el punto de establecer esto x? ¿Todos los empaquetadores de la biblioteca deben hacer eso? ¿Qué sucederá si tengo dlopen()una biblioteca compartida que tiene 0644permisos?

Tadeusz A. Kadłubowski
fuente
3
¿En qué sistema operativo (si Linux, qué distribución)? En Debian Squeeze, las únicas bibliotecas compartidas ejecutables en /liby /usr/libson libc y libpthread, y ambas imprimen un aviso de copyright cuando se ejecutan.
Gilles 'SO- deja de ser malvado'
Si se segfault, probablemente son errores menores. Los reportaría si te los encuentras. ¿Cuál es la distribución?
Faheem Mitha
@Faheem: No tener un main()símbolo como punto de entrada no es un error menor, sino una elección de diseño fundamental. Te perdiste mi punto.
Tadeusz A. Kadłubowski
2
@Gilles: He visto 755 como una opción de permiso predeterminada en los sistemas Linux de la familia RedHat (Fedora y Centos) y en Solaris.
Tadeusz A. Kadłubowski
La premisa de esta pregunta no es universalmente cierta. De hecho, es falso, como se señaló anteriormente, para Debian Linux; y también falso para FreeBSD y para OpenBSD.
JdeBP

Respuestas:

32

Bajo HP-UX, las bibliotecas compartidas se asignan a la memoria usando mmap (), y todas las páginas de memoria en el sistema tienen bits de protección que se acoplan con los mecanismos de protección de la página de memoria del kernel y el hardware del procesador. Para ejecutar el contenido de cualquier página de memoria en el sistema, esa página debe tener configurado PROT_EXEC, una característica útil para evitar ataques de ejecución de datos.

La llamada mmap () utiliza los bits de permiso en el archivo que está a punto de asignar para definir los bits de protección de las páginas de memoria asignadas que lo van a contener: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (de sys / mman.h). para que una biblioteca compartida pueda utilizarse en HP-UX, el archivo que contiene la biblioteca compartida debe tener permisos de ejecución para garantizar que la biblioteca asignada también tenga permiso de ejecución.

Una biblioteca compartida con modo 644 en un sistema HP-UX provocará volcados de núcleo.

Michael Pelletier
fuente
Posiblemente otras implementaciones de Unix también usen esta característica.
Tadeusz A. Kadłubowski
> HP-UX (de "Hewlett Packard Unix") es la implementación patentada de Hewlett Packard Enterprise del sistema operativo Unix, basada en UNIX System V
David 天宇 Wong
Otro ejemplo es que crear paquetes rpm con paquetes debuginfo separados requiere permisos de ejecución en bibliotecas compartidas; de lo contrario, find-debuginfo.sh omite procesarlos.
Domen Vrankar
20

Los objetos compartidos no ejecutables funcionan bien, pero las bibliotecas marcadas como ejecutables también pueden ejecutarse como programas independientes.

Entonces, ¿cuál es el punto de establecer esta x?

Ninguno, a menos que desee que emitan la versión u otra información

¿Todos los empaquetadores de la biblioteca deben hacer eso?

No

¿Qué sucederá si dlopen () una biblioteca compartida que tiene permisos 0644?

Obtendrá un nuevo identificador de objeto compartido (siempre que el archivo sea legible, etc.) ... el bit de ejecución no afecta esto


En cuanto a por qué las bibliotecas que no son utilizables como ejecutables independientes todavía tienen el conjunto de bits exec: esto es probablemente solo un artefacto del sistema de compilación o script de enlace utilizado.


ejemplo de salida, solo como referencia:

$ /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/>.
Inútil
fuente
11
La mayoría de las bibliotecas .so simplemente segfault porque no tienen nada parecido al main()punto de entrada normal . Libc es un caso atípico. Sus desarrolladores hicieron esta nota como una funcionalidad adicional. Simple chmod a+xde cualquier otra biblioteca no le dará esta funcionalidad. Todavía no veo el punto de configuración +xpara todas las bibliotecas.
Tadeusz A. Kadłubowski
De acuerdo, y probablemente solo aquellos .soque pueden ejecutarse deben marcarse como tales. Enmendaré mi respuesta para evitar implicar que todo con el conjunto de bits exec es realmente un ejecutable independiente.
Inútil
55
El comando "ldd" suele ser un script sh que invoca el enlazador dinámico, ld-linux-x86-64.so.2, o /lib/ld-linux.so.2 o algunos de estos. El vinculador dinámico siempre es un objeto compartido.
Bruce Ediger