Noté algo mientras hacía find /bin -exec file {} \;
:
el file
comando informa algunas entradas en /bin
are 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 file
para /bin/echo
es:
/ 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 executable
archivos y shared object
archivos.
fuente
Respuestas:
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:
Hay ventajas / desventajas en el uso de cada uno de estos métodos, pero ese no es el punto de la pregunta;
/bin/ntfsck
y/usr/bin/gawk
son objetos compartidos: esto significa que un ejecutable podría compilarse y luego vincularse contra ellos para usar sus funcionalidades;/bin/echo
es un ejecutable: esto significa que un ejecutable podría no compilarse y luego vincularse contra él para usar sus funcionalidades;Así
/bin/ntfsck
y/usr/bin/gawk
bibliotecas 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
file
informes (para cada uno de ellos):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.
fuente
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.
fuente