Estou tentando executar perl
o executável fornecido por uma biblioteca de depuração no Ubuntu 16.04, mas por algum motivo o arquivo "não é executável", embora pareça corresponder à minha arquitetura.
O perl
executável que acompanha o Ubuntu 16.04 foi removido
$ nm /usr/bin/perl
nm: /usr/bin/perl: no symbols
A perl-debug
embalagem fornece um perl
under /usr/lib/debug
que não é despojado.
$ nm /usr/lib/debug/usr/bin/perl | head
U abort@@GLIBC_2.2.5
0000000000589020 r AboveLatin1_invlist
U accept@@GLIBC_2.2.5
U access@@GLIBC_2.2.5
000000000058e002 r a_hash.16944
U alarm@@GLIBC_2.2.5
000000000058e010 r an_array.16943
00000000005795c0 r ASCII_invlist
0000000000543430 T ASCII_TO_NEED
U atan2@@GLIBC_2.2.5
No entanto, quando você tenta executá-lo, exec*
falha e bash
dá uma bela mensagem:
$ /usr/lib/debug/usr/bin/perl
bash: /usr/lib/debug/usr/bin/perl: cannot execute binary file: Exec format error
Porém, quando executo file
os dois perls, vejo que o perl de depuração está marcado como "tendo um interpretador vazio", onde o perl regular possui algum objeto compartilhado ld. Provavelmente tem alguma relação com o linker ld
, mas não sei o que é.
$ 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
O que exatamente está file
me dizendo quando informa que o interpretador está vazio?
O perl-debug
perl
é para uso com (por exemplo) GDB, contendo os símbolos para entender um processo em execução ou dump do outroperl
. Por exemplo, dado um processo em execuçãoperl script.pl
com pid$PID
, você pode usar:para anexar a ele e fazer todas as coisas usuais do GDB nesse ponto . Não é um executável executável por conta própria e carece dos elementos necessários para iniciar.
Os símbolos são mantidos separadamente porque têm mais que o dobro do tamanho do executável principal e raramente são necessários. Nesse caso, os símbolos são úteis para depurar
perl
, em vez de depurar um script Perl e provavelmente úteis apenas se você estiver desenvolvendo extensões para vincular.Não acho que definir o bit executável seja realmente necessário, mas o Debian não os remove de nenhum de seus arquivos de símbolo de depuração que vejo, então pode haver alguma situação que precise disso.
file
está dizendo que o interpretador está vazio porque está, já que todo o arquivo não relacionado às informações de depuração está ausente.file
está chamando ferramentas ELF tendo notado que o arquivo está no formato ELF; o que é o intérprete não está muito bem documentado emelf(5)
Dado
interpreter /lib64/ld-linux-x86-64.so.2
um arquivo com o interpretador, podemos procurar documentos...E a
ld.so(8)
página muito informativa nos diz:Além disso, você não precisa necessariamente da
.interp
seção, pois, em vez disso, pode-se executar: