Bem-vindo ao Unix & Linux SE!
Um arquivo ELF tem um cabeçalho binário ou dois e várias seções nomeadas. A Wikipedia tem uma descrição da estrutura de um arquivo ELF, se você estiver interessado.
Seu comando objcopy -O binary -j .interp /bin/ls /dev/stdout
exibe apenas o conteúdo da seção .interp
do arquivo /bin/ls
exatamente como está ( -O binary
) para "file" /dev/stdout
.
/dev/stdout
deve ser um link simbólico para o descritor de arquivo # 1 do processo atual, ou seja, seu fluxo de saída padrão. Basicamente, é apenas uma maneira de dizer a um programa que espera gravar sua saída em um arquivo nomeado para usar a saída padrão. Alguns programas podem fazer isso se você especificar o nome do arquivo de saída como apenas -
, mas aparentemente objcopy
não segue essa convenção.
Se você estiver vendo "algum tipo de informação de log" ao abrir /dev/stdout
, isso pode significar que esse link simbólico foi acidentalmente substituído por algum programa ou script que foi executado como root. Deve ficar assim:
$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 Nov 17 23:25 /dev/stdout -> /proc/self/fd/1
Em um sistema x86 de 64 bits, o comando objcopy
deve exibir algo como /lib64/ld-linux-x86-64.so.2
. Como a saída não inclui um caractere de alimentação de linha no final, ele pode aparecer na mesma linha do próximo prompt de comando, dificultando a localização:
[my command prompt]$ objcopy -O binary -j .interp /bin/ls /dev/stdout
/lib64/ld-linux-x86-64.so.2[my command prompt]$
Em um binário x86 de 32 bits, a saída seria algo como /lib/ld-linux.so.2
.
A saída é o nome do arquivo do interpretador de programas também conhecido como o linker / loader dinâmico que deve ser usado com o binário examinado. Você pode obter mais informações sobre isso usando os comandos man ld.so
ou man ld-linux
em seu sistema.