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.