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.