1

Я просто экспериментирую, но нашел феномен, который я был бы очень признателен, если бы кто-то мог попытаться объяснить.

Я пишу простую программу Hello World на C. Используйте gcc чтобы скомпилировать эту программу в hello исполняемый файл Unix и запустить ее с помощью ./hello . Ухоженная.

Я открываю этот hello файл, чтобы увидеть серию из 4-х символьных сегментов (если кто-то захочет добавить техническое описание того, что я здесь вижу, я бы не стал жаловаться).

У меня вопрос: почему, когда я копирую и вставляю все эти шестнадцатеричные сегменты в отдельный файл, давайте назовем test и использую chmod +x test , я не получаю те же результаты при запуске ./test как при запуске ./hello?

Вот моя C программа:

#include <stdio.h>

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

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

затем компилируется в (только первые 20 строк ...)

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

Я копирую этот файл точно так же, как использую текстовый редактор.

Глядя на это с помощью diff , я понимаю, что есть двоичная разница?

выполняется ./test возвращает: (снова первые 20 строк)

./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

2 ответа2

3

Шестнадцатеричные коды представляют байты с этими значениями символов.

Ниже показаны действительные символы (обратите внимание, что не все печатаемые символы для копирования и вставки):

cat ./hello

Следующее перенаправит вывод ./hello на ./test

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

Примечание. Следующее явно копирует исполняемый файл:

cp ./hello ./test
2

Позвольте мне показать вам первую часть рабочей программы.

Первые 16 значений в вашей рабочей программе:

cffa edfe 0700 0001 0300 0080 0200 0000

cf шестнадцатеричный для числа 207.
fa - шестнадцатеричное число 250

(См. Http://en.wikipedia.org/wiki/Hexadecimal для получения дополнительной информации).

Если вы просто вырезаете и вставляете эту строку, то вы копируете представление этого, а не фактические значения.

Если вы вырезаете и вставляете их в новый файл, вы делаете то же самое, что и стрелка в коде, перевод ее в буквы 'a r r o w' и копирование перевода. В процессе информация меняется, и у вас больше нет рабочей программы.

То, что у вас есть, это не более чем текстовый файл. И, очевидно, ваша система снова пытается интерпретировать это как сценарий оболочки, когда установлен исполняемый бит, но нет заголовка ELF или интерпретатора shebang .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .