GNU/Linux >> Tutoriales Linux >  >> Linux

¿A qué se refiere el intérprete informado por `archivo`?

Estoy tratando de ejecutar perl ejecutable proporcionado por una biblioteca de depuración en Ubuntu 16.04, pero por alguna razón el archivo "no es ejecutable" aunque parece coincidir con mi arquitectura.

El perl el ejecutable que se envía con Ubuntu 16.04 se elimina

$ nm /usr/bin/perl
nm: /usr/bin/perl: no symbols

El perl-debug paquete proporciona un perl en /usr/lib/debug que no se pela.

$ nm /usr/lib/debug/usr/bin/perl | head
                 U [email protected]@GLIBC_2.2.5
0000000000589020 r AboveLatin1_invlist
                 U [email protected]@GLIBC_2.2.5
                 U [email protected]@GLIBC_2.2.5
000000000058e002 r a_hash.16944
                 U [email protected]@GLIBC_2.2.5
000000000058e010 r an_array.16943
00000000005795c0 r ASCII_invlist
0000000000543430 T ASCII_TO_NEED
                 U [email protected]@GLIBC_2.2.5

Sin embargo, cuando intenta ejecutarlo, exec* falla y bash te da un lindo mensaje:

$ /usr/lib/debug/usr/bin/perl
bash: /usr/lib/debug/usr/bin/perl: cannot execute binary file: Exec format error

Cuando ejecuto file sin embargo, en los dos perls, veo que el perl de depuración está marcado como "que tiene un intérprete vacío" donde el perl normal tiene algún objeto compartido ld. Probablemente tenga alguna relación con el enlazador ld , pero no sé qué es.

$ file /usr/bin/perl
/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, stripped
$ file /usr/lib/debug/usr/bin/perl
/usr/lib/debug/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter *empty*, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, not stripped

¿Qué es exactamente file? diciéndome cuando informa que el intérprete está vacío?

Respuesta aceptada:

El depurador de perl perl es para usar con (por ejemplo) GDB, que contiene los símbolos para comprender un proceso en ejecución o un volcado del otro perl . Por ejemplo, dado un proceso en ejecución perl script.pl con pid $PID , puedes usar:

$ gdb /usr/lib/debug/usr/bin/perl $PID

para adjuntarlo, y hacer todas las cosas habituales de GDB en ese punto. No es un ejecutable ejecutable por sí solo y carece de los elementos necesarios para su ejecución.

Los símbolos se guardan por separado porque tienen más del doble del tamaño del ejecutable principal y rara vez se necesitan. En este caso, los símbolos son útiles para depurar perl , en lugar de depurar un script de Perl, y probablemente solo sea útil si está desarrollando extensiones para vincularlas.

No creo que sea necesario configurar el bit ejecutable, pero Debian no los elimina de ninguno de sus archivos de símbolos de depuración que veo, por lo que puede haber alguna situación que lo necesite. file le dice que el intérprete está vacío porque lo está, ya que falta todo el archivo no relacionado con la información de depuración.

Relacionado:¿Cómo imprimir todas las líneas después de una coincidencia hasta el final del archivo?
Linux
  1. ¿Qué significa el atributo 's' en los permisos de archivo?

  2. ¿Qué hace Exec 3?

  3. El Punto De Uniq -u Y Que Hace??

  4. ¿Cuál es el propósito del archivo .bashrc en Linux?

  5. ¿Cuál es la forma correcta de usar inotify?

¿Tail lee todo el archivo?

¿Qué significa en la salida de Ps?

¿Qué hace Rackspace en la nube?

¿Qué es un archivo .pid y qué contiene?

¿Cómo funciona Rm? ¿Qué hace Rm?

¿Qué es `S_ISREG()` y qué hace?