关于C编译的疑问?
写了一个C程序,一直没有看过编译后的代码,认为他是 01代码,理论上编译就是让计算机可识别的01代码。
问题:
为什么打开后却是这个样子的?(用的GCC编译)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
写了一个C程序,一直没有看过编译后的代码,认为他是 01代码,理论上编译就是让计算机可识别的01代码。
问题:
为什么打开后却是这个样子的?(用的GCC编译)
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
首先,你用gcc编译出的文件是ELF可执行文件。
你用file命令查看一下你编译出的文件,就能发现这一点,比如说我这里随便编译了一个,file了一下:
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=de67fcb2b39d98dfea1f5b9d7377ed6f29d6172e, not stripped
既然是ELF文件,我们就用ELF工具来稍微分析一下它,关于ELF文件格式的详细分析,如果你有兴趣的话,可以去看一下这里
我们用
readelf
命令:readelf -h a.out
,可以得到如下的结果:所以你可以看到,ELF文件是有固定格式的,而且除了可执行的部分以外,还包含了其他信息。
明确了上面这一点,我们从十六进制角度来分析一下这个文件,首先你要明确一点,计算机内没有文件是不用二进制表示的(这里是换算成了十六进制)
比方说,你用
echo 01 > q
这条命令,向q写入了0、1两个ASCII字符我们用hexdump(一个十六进制查看工具)来看一下q的内容:
你可以看到ASCII中0是用0011 0000表示的,而1是用0011 0001表示的,对应十六进制正好是30、31。
而最后的0a对应二进制0000 1010,是ASCII中的换行符。
所以,计算机中所有文件都是用二进制表示的,包括文本文件,只是你查看文本文件的时候会用编码来解释二进制。
同样地,你用hexdump来查看一下刚才gcc编译生成的a.out,内容如下:
这些用ASCII解释结果就是:
另外,由于ELF文件有固定格式,所以你编译生成的不同ELF文件可能看起来有一部分相同。