Ich versuche, perl
auszuführen ausführbare Datei, die von einer Debug-Bibliothek unter Ubuntu 16.04 bereitgestellt wird, aber aus irgendeinem Grund „ist die Datei nicht ausführbar“, obwohl sie meiner Architektur zu entsprechen scheint.
Das perl
ausführbare Datei, die mit Ubuntu 16.04 ausgeliefert wird, entfernt
$ nm /usr/bin/perl
nm: /usr/bin/perl: no symbols
Der perl-debug
Paket stellt ein perl
bereit unter /usr/lib/debug
das ist nicht gestrippt.
$ 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
Wenn Sie jedoch versuchen, es auszuführen, wird exec*
schlägt fehl und bash
gibt Ihnen eine nette Nachricht:
$ /usr/lib/debug/usr/bin/perl
bash: /usr/lib/debug/usr/bin/perl: cannot execute binary file: Exec format error
Wenn ich file
ausführe Bei den beiden Perls sehe ich jedoch, dass das Debug-Perl als „mit einem leeren Interpreter“ gekennzeichnet ist, während das reguläre Perl ein ld-Shared-Object hat. Es hat wahrscheinlich eine Beziehung zum Linker ld
, aber ich weiß nicht, was es ist.
$ 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
Was genau ist file
sagt mir, wenn es meldet, dass der Interpreter leer ist?
Akzeptierte Antwort:
Das perl-debug perl
ist für die Verwendung mit (zum Beispiel) GDB und enthält die Symbole zum Verständnis eines laufenden Prozesses oder Dumps des anderen perl
. Zum Beispiel bei einem laufenden Prozess perl script.pl
mit pid $PID
, können Sie Folgendes verwenden:
$ gdb /usr/lib/debug/usr/bin/perl $PID
anhängen und an diesem Punkt alle üblichen GDB-Dinge ausführen. Es ist keine eigenständig ausführbare ausführbare Datei und es fehlen die notwendigen Elemente zum Starten.
Die Symbole werden separat aufbewahrt, da sie mehr als doppelt so groß sind wie die ausführbare Hauptdatei und sehr selten benötigt werden. In diesem Fall sind die Symbole nützlich, um perl
zu debuggen , anstatt ein Perl-Skript zu debuggen, und wahrscheinlich nur nützlich, wenn Sie Erweiterungen zum Einbinden entwickeln.
Ich glaube nicht, dass das Setzen des ausführbaren Bits tatsächlich erforderlich ist, aber Debian entfernt sie nicht aus seinen Debug-Symboldateien, die ich sehe, daher kann es eine Situation geben, in der es erforderlich ist. file
sagt Ihnen, dass der Interpreter leer ist, weil er leer ist, da alle Dateien, die nichts mit Debug-Informationen zu tun haben, fehlen.