Ejecutables vs objetos compartidos

13

Noté algo mientras hacía find /bin -exec file {} \;:

el filecomando informa algunas entradas en /binare shared objects, mientras que otras como executables. Por ejemplo,

/ bin / ntfsck: objeto compartido
LSB ELF de 64 bits , x86-64, versión 1 (SYSV), vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00, despojado

Mismo informe para gawk

/ usr / bin / gawk: objeto compartido
LSB ELF de 64 bits , x86-64, versión 1 (SYSV), vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.6.24, BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9, despojado

En contraste filepara /bin/echoes:

/ bin / echo:
ELF ejecutable LSB de 64 bits , x86-64, versión 1 (SYSV),
vinculado dinámicamente (usa libs compartidas), para GNU / Linux 2.6.24,
BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c, despojado

Esencialmente, quiero saber cuál es la diferencia entre executablearchivos y shared objectarchivos.

Sergiy Kolodyazhnyy
fuente

Respuestas:

14

Tl; dr

No hay diferencia, aparte del hecho de que un ejecutable compilado podría estar vinculado a un objeto compartido pero no a un ejecutable.


En general, hay dos formas de compilar 1 un ejecutable:

  • Uso de la vinculación estática: las bibliotecas externas incluidas en el código fuente se compilan y la biblioteca compilada (u objeto en la perspectiva del vinculador) se agrega al ejecutable mismo;
  • Uso de la vinculación dinámica: las bibliotecas externas incluidas en el código fuente se compilan pero se agrega un enlace a la biblioteca compilada (u objeto en la perspectiva del vinculador) al ejecutable (y el vinculador carga las bibliotecas / objetos compilados en tiempo de ejecución si necesario);

Hay ventajas / desventajas en el uso de cada uno de estos métodos, pero ese no es el punto de la pregunta;

  • /bin/ntfscky /usr/bin/gawkson objetos compartidos: esto significa que un ejecutable podría compilarse y luego vincularse contra ellos para usar sus funcionalidades;
  • /bin/echoes un ejecutable: esto significa que un ejecutable podría no compilarse y luego vincularse contra él para usar sus funcionalidades;

Así /bin/ntfscky /usr/bin/gawkbibliotecas están compilados técnicamente (u objetos en perspectiva del enlazador), pero, como uno puede tener presentía, nada impide que un objeto compartido que se ejecuten como un ejecutable.

En una nota al margen, observe también que los fileinformes (para cada uno de ellos):

vinculado dinámicamente (usa bibliotecas compartidas)

Esto significa que cada uno de ellos está vinculado dinámicamente (y probablemente usa) otros objetos compartidos también.


1. "Compilar" en su aceptación más amplia, que incluye preprocesamiento, compilación y vinculación.

kos
fuente
1
vinculado dinámicamente a otros objetos compartidos , IN OS? o bibliotecas compartidas en sí mismo?
Dr.jacky
@ Mr.Hyde En el sistema operativo, más específicamente en ubicaciones que deben preconfigurarse en el vinculador, para que el vinculador pueda cargarlas en tiempo de ejecución si es necesario. Ver aquí , capítulo 3.2.
Kos
En realidad, se puede vincular contra un ejecutable usando dlopen: ejemplo
Adam Zahran el
6

Otra diferencia es que los ejecutables tienen un desplazamiento de dirección de punto de entrada definido, es decir, 0x08048000 para i386, 0x00400000 para x86 y 0x00010000 para arm.

Un archivo de objeto compartido puede ser una biblioteca, pero también un ejecutable. Cuando se trata de un ejecutable, no existe ese desplazamiento. Un ejecutable de objeto compartido , por así decirlo, es un ejecutable independiente de la posición (PIE) que utiliza la aleatorización del diseño del espacio de direcciones (ASLR). Por lo tanto, al mirar su archivo / proc / pid / maps, notará que la ubicación de los segmentos cargados varía en cada ejecución en contraste con los ejecutables estándar.

La idea detrás de esta característica es agregar seguridad a los ejecutables al impedir que los atacantes realicen ataques de programación orientados al retorno. Muchos mantenedores decidieron construir paquetes con PIE habilitado como predeterminado, por ejemplo, desde Fedora 23 o con Ubuntu 17.10.

florian
fuente
Interesante respuesta. Carece de algunas fuentes (sería bueno si agregara algunos enlaces, especialmente para la parte del punto de entrada), pero busqué algunas preguntas de stackoverflow sobre eso. Pero definitivamente es una buena respuesta.
Sergiy Kolodyazhnyy