我只是在进行实验,但发现了一种现象,如果有人能尝试解释,我将非常感激。
我用 C 编写了一个简单的 Hello World 程序。使用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
答案1
十六进制代码表示具有这些字符值的字节。
以下显示实际字符(请注意,并非所有字符都是可复制和粘贴的可打印字符):
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'
并复制翻译。在此过程中,信息会发生变化,你不再拥有一个可以运行的程序。
你拥有的只不过是一个文本文件。显然,当设置了可执行位但没有设置时,你的系统会尝试将其解释为 shell 脚本极低频标题或舍邦有翻译在场。