Copiando o conteúdo do arquivo executável Unix de arquivo para arquivo

1

Estou simplesmente experimentando, mas encontrei um fenômeno que eu apreciaria muito se alguém tentasse explicar.

Eu escrevo um programa Hello World simples em C. Use gcc para compilar este programa em um arquivo executável hello Unix e pode executá-lo usando ./hello . Puro.

Eu abro esse arquivo hello , para ver uma série de segmentos de 4 caracteres (se alguém quiser incluir uma descrição técnica para o que estou vendo aqui também, eu não reclamarei).

A minha pergunta é: por que quando eu copio e colo todos esses segmentos hexadecimais em um arquivo separado, vamos chamar test e usar chmod +x test , eu não obtenho os mesmos resultados executando ./test como eu faço executando ./hello ?

Aqui está o meu programa em C:

#include <stdio.h>

int main(void)
{
    int a;
    a = 5;

    printf("Memory address: %p\n", (void*) &a);
    return 0;
}

então compilado para (somente 20 primeiras linhas ...)

cffa edfe 0700 0001 0300 0080 0200 0000
1000 0000 1005 0000 8500 2000 0000 0000
1900 0000 4800 0000 5f5f 5041 4745 5a45
524f 0000 0000 0000 0000 0000 0000 0000
0000 0000 0100 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 1900 0000 2802 0000
5f5f 5445 5854 0000 0000 0000 0000 0000
0000 0000 0100 0000 0010 0000 0000 0000
0000 0000 0000 0000 0010 0000 0000 0000
0700 0000 0500 0000 0600 0000 0000 0000
5f5f 7465 7874 0000 0000 0000 0000 0000
5f5f 5445 5854 0000 0000 0000 0000 0000
300f 0000 0100 0000 3800 0000 0000 0000
300f 0000 0400 0000 0000 0000 0000 0000
0004 0080 0000 0000 0000 0000 0000 0000
5f5f 7374 7562 7300 0000 0000 0000 0000
5f5f 5445 5854 0000 0000 0000 0000 0000
680f 0000 0100 0000 0600 0000 0000 0000
680f 0000 0100 0000 0000 0000 0000 0000

Eu copio este arquivo exatamente como está usando um editor de texto.

Olhando para ele usando diff , percebo que existe uma diferença binária?

executando ./test retorna: (primeiras 20 linhas novamente)

./test: line 1: cffa: command not found
./test: line 2: 1000: command not found
./test: line 3: 1900: command not found
./test: line 4: 524f: command not found
./test: line 5: 0000: command not found
./test: line 6: 0000: command not found
./test: line 7: 0000: command not found
./test: line 8: 5f5f: command not found
./test: line 9: 0000: command not found
./test: line 10: 0000: command not found
./test: line 11: 0700: command not found
./test: line 12: 5f5f: command not found
./test: line 13: 5f5f: command not found
./test: line 14: 300f: command not found
./test: line 15: 300f: command not found
./test: line 16: 0004: command not found
./test: line 17: 5f5f: command not found
./test: line 18: 5f5f: command not found
./test: line 19: 680f: command not found
./test: line 20: 680f: command not found
    
por a_real_hero 29.04.2015 / 21:01

2 respostas

3

Os códigos hexadecimais representam bytes com esses valores de caracteres.

O seguinte mostra os caracteres reais (note que nem todos são caracteres imprimíveis para copiar e colar):

cat ./hello

O seguinte redirecionará a saída de ./hello para ./test

cat ./hello > ./test
chmod +x ./test
./test

Observação: o seguinte copia o executável explicitamente:

cp ./hello ./test
    
por 29.04.2015 / 21:28
2

Deixe-me mostrar a primeira parte do programa de trabalho.

Os primeiros 16 valores no seu programa de trabalho são:

cffa edfe 0700 0001 0300 0080 0200 0000

cf é hexadecimal para o número 207.
fa é hexadecimal para o número 250

(Veja link para mais informações).

Se você simplesmente recortar e colar essa linha, então você está copiando uma representação disso e não os valores reais.

Se você recortá-los e colá-los em um novo arquivo, estará fazendo o equivalente a ter uma seta no código, traduzindo para as letras 'a r r o w' e copiando a tradução. No processo, as informações são alteradas e você não tem mais um programa em funcionamento.

O que você tem é nada mais que um arquivo de texto. E, aparentemente, seu sistema volta a tentar interpretá-lo como um script de shell quando o bit executável é definido, mas não o cabeçalho ELF ou O shebang intérprete está presente.

    
por 29.04.2015 / 21:32

Tags