Копирование содержимого исполняемого файла Unix из файла в файл
Я просто экспериментирую, но нашел феномен, который я был бы очень признателен, если бы кто-то мог попытаться объяснить.
Я пишу простую программу 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 ответа
Шестнадцатеричные коды представляют байты с этими значениями символов.
Ниже показаны действительные символы (обратите внимание, что не все печатаемые символы для копирования и вставки):
cat ./hello
Следующее перенаправит вывод ./hello
в ./test
cat ./hello > ./test
chmod +x ./test
./test
Примечание. Следующее явно копирует исполняемый файл:
cp ./hello ./test
Позвольте мне показать вам первую часть рабочей программы.
Первые 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.