【发布时间】:2020-06-08 10:07:42
【问题描述】:
我们知道机器级代码是 0,1(二进制)的形式。现在,在 c 编程中,如果 cmd 是 -
gcc -c ok.c
其中 ok.c 是一个在 c 中打印“hi”的简单程序。 现在,创建了一个文件 ok.o,它应该是机器级指令。ok.o 文件的内容类似于-
^@^L^@UH��H�=^@^@^@^@�^@^@^@^@�^@^@^@^@�]�hi^@^@GCC: (Debian 9.3.0-10) 9.3.0^@^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^AzR^@^Ax^P^A^[^L^G^H�^A^@^@^\^@^@^@^\^@^@^@^@^@^@^@^X^@^@^@^@A^N^P�^BC
^FS^L^G^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^D^@��^@^@^@^@^@^@^@^@^@^
等等很多这样的角色。这个输出是什么意思,如果这是机器级指令,那么为什么它不是二进制数字(0,1)的形式,即 1000110111111010101....(类似的东西)我怎么能看到二进制类型的代码?如果我在某处错了,请也纠正我。 谢谢
【问题讨论】:
-
是二进制码。记事本(或您正在使用的任何东西)正试图将其解读为文本。它可能会假设一些编码并尝试从二进制代码中生成符号。你基本上得到了垃圾。
-
.o 文件并不全是机器码。里面还有其他东西。总的来说,该文件是 ELF 格式(至少在 Linux 上)。机器代码不是最终形式,因为绝对地址还没有被解析。当 .o 文件链接到可执行文件时,这些问题就会得到解决。
-
您需要的是一个十六进制编辑器。我认为它不会给你太多,但至少它可以查看原始数据
-
objdump -s ok.o将以十六进制和可打印 ASCII 字符的可打印形式显示文件内容。 -
使用 objdump 来查看解码
标签: c gcc compilation compiler-optimization machine-code