A que se refere o intérprete relatado por 'file'?

3

Estou tentando executar o executável perl fornecido por uma biblioteca de depuração no Ubuntu 16.04, mas, por algum motivo, o arquivo "não é executável", embora pareça ser compatível com minha arquitetura.

O executável perl que vem com o Ubuntu 16.04 é retirado

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

O pacote perl-debug fornece perl abaixo de /usr/lib/debug que não é retirado.

$ 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 fornece uma mensagem legal:

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

Quando eu executo file nos dois perls, vejo que o debug perl está marcado como "tendo um interpretador vazio", onde o perl regular tem 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 é file me informando quando relata que o intérprete está vazio?

    
por Gregory Nisbet 11.02.2018 / 05:19

2 respostas

3

O perl-debug perl é para uso com (por exemplo) o GDB, contendo os símbolos para entender um processo em execução ou um dump do outro perl . Por exemplo, dado um processo em execução perl script.pl com pid $PID , você pode usar:

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

para anexar a ele e fazer todas as coisas comuns do GDB nesse ponto . Não é um executável executável por si só e não possui os elementos necessários para o lançamento.

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 serão úteis apenas se você estiver desenvolvendo extensões para vincular.

Eu não acho que configurar o bit executável é realmente necessário, mas o Debian não os remove de nenhum dos seus arquivos de símbolo de depuração que eu vejo, então pode haver alguma situação que precise dele. file está dizendo que o interpretador está vazio porque está, já que todo o arquivo não relacionado à informação de depuração está faltando.

    
por 11.02.2018 / 05:56
1

file está chamando ferramentas ELF depois de perceber que o arquivo está no formato ELF; o que o interpretador não está realmente bem documentado em elf(5)

PT_INTERP   The array element specifies the location and size of a
            null-terminated pathname to invoke as an  interpreter. 
            This segment type is meaningful only for executable files
...
.interp   This section holds the pathname of a program interpreter.

Dado interpreter /lib64/ld-linux-x86-64.so.2 para um arquivo com o interpretador, podemos procurar por documentos ...

$ man -k ld-linux
ld.so (8)            - enlazador/cargador dinámico
ld-linux (8)         - dynamic linker/loader
ld-linux.so (8)      - dynamic linker/loader

E a muito informativa ld.so(8) página nos diz:

   The  programs ld.so and ld-linux.so* find and load the shared libraries
   needed by a program, prepare the program to run, and then run it.

Além disso, você não precisa necessariamente da seção .interp , pois pode ser executada:

/lib/ld-linux.so.*  [OPTIONS] [PROGRAM [ARGUMENTS]]
    
por 11.02.2018 / 05:57