GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Worauf bezieht sich der von „file“ gemeldete Interpreter?

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.

Verwandte:Wie drucke ich alle Zeilen nach einer Übereinstimmung bis zum Ende der Datei?
Linux
  1. Linux – Was bedeutet ein Punkt nach den Dateiberechtigungsbits?

  2. Was bedeutet das Attribut „s“ in Dateiberechtigungen?

  3. Was bedeutet Exec 3?

  4. Der Sinn von Uniq -u und was macht es?

  5. Was ist der Zweck der .bashrc-Datei in Linux

Wie funktioniert Rm? Was macht Rm?

Was ist `S_ISREG()` und was macht es?

Was bedeutet das 'rc' in `.bashrc` usw.?

Was macht das -e in einem Bash-Shebang?

Was bedeutet die ep-Fähigkeit?

Was bedeutet ein + am Ende der Berechtigungen von ls -l?