GNU/Linux >> Linux Esercitazione >  >> Linux

A cosa si riferisce l'interprete segnalato da `file`?

Sto cercando di eseguire perl eseguibile fornito da una libreria di debug su Ubuntu 16.04, ma per qualche motivo il file "non è eseguibile" anche se sembra corrispondere alla mia architettura.

Il perl l'eseguibile fornito con Ubuntu 16.04 è stato rimosso

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

Il perl-debug il pacchetto fornisce un perl sotto /usr/lib/debug che non è spogliato.

$ 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

Tuttavia, quando provi a eseguirlo, exec* fallisce e bash ti dà un bel messaggio:

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

Quando eseguo file sui due perl, però, vedo che il perl di debug è contrassegnato come "avente un interprete vuoto" mentre il perl normale ha qualche oggetto condiviso ld. Probabilmente ha qualche relazione con il linker ld , ma non so cosa sia.

$ 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

Che cos'è esattamente file dirmi quando segnala che l'interprete è vuoto?

Risposta accettata:

Il debug di perl perl è per l'uso con (ad esempio) GDB, contenente i simboli per comprendere un processo in esecuzione o un dump dell'altro perl . Ad esempio, dato un processo in esecuzione perl script.pl con pid $PID , puoi usare:

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

per allegarlo e fare tutte le solite cose GDB a quel punto. Non è un eseguibile eseguibile da solo e manca degli elementi necessari per avviarlo.

I simboli sono tenuti separati perché sono più del doppio delle dimensioni dell'eseguibile principale e molto raramente necessari. In questo caso, i simboli sono utili per il debug di perl , piuttosto che eseguire il debug di uno script Perl, e probabilmente utile solo se stai sviluppando estensioni a cui collegarti.

Non penso che l'impostazione del bit eseguibile sia effettivamente necessaria, ma Debian non li rimuove da nessuno dei suoi file di simboli di debug che vedo, quindi potrebbe esserci qualche situazione che ne ha bisogno. file ti dice che l'interprete è vuoto perché lo è, poiché mancano tutti i file non correlati alle informazioni di debug.

Correlati:come stampare tutte le righe dopo una corrispondenza fino alla fine del file?
Linux
  1. Linux:cosa significa un punto dopo i bit di autorizzazione del file?

  2. Tail legge l'intero file?

  3. Cosa significa nell'output di Ps?

  4. Qual è lo scopo del file .bashrc in Linux

  5. Cos'è un file .pid e cosa contiene?

Cosa significa l'attributo "s" nelle autorizzazioni dei file??

Cosa fa Exec 3?

Il punto di Uniq -u e cosa fa??

Cosa fa Rackspace nel cloud?

Qual è il modo corretto di usare inotify?

Cosa fa la chiamata di sistema brk()?