/bin 目录中的程序是如何被编译成不可读格式的?

/bin 目录中的程序是如何被编译成不可读格式的?

我注意到 /bin 目录中的大多数命令/程序都经过了编译。我希望自己复制这种不可读的代码格式。有人能告诉我为什么以及/或者这些程序是如何变成这样的吗?

[绿色印章奖励]:难道没有一个 bash 命令可以打印文件中的所有“人类可读”文本吗?

答案1

中的命令/程序/bin不是不可读,但它们是经过编译的,正如您所说。这意味着它们最初是用 C(或其他编程语言)编写的,并已编译为机器代码(二进制),以便处理器可以执行该代码。要执行相同操作,只需用 C 编写所需的程序并运行命令gcc即可生成可执行文件。

要打印文件中任何人可读的文本,请使用strings < /bin/file

答案2

介绍

当一个程序从 C 或 C++ 源代码编译而来时,编译器(如gcc(见下文))会将该代码翻译成 CPU 的本机二进制语言,以便可以执行该程序。因此人类可读的材料(源代码)变成了非人类可读的格式(机器可读的二进制代码)。

二进制文件和文件系统

如果您输入echo $PATH,您将看到系统上所有可执行文件的位置,包括编译的二进制文件和脚本:

/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

在文件系统层次结构中,关键系统工具(例如cat和)分别getty 位于/bin/sbin中,其他工具(例如dpkg和)chroot分别位于/usr/bin/usr/sbin中。如果您通过下载源代码、配置构建和安装来编译程序,则默认情况下,您的程序应进入层次结构/usr/local/bin中的和其其他文件/usr/local

编译器

可能最知名的编译二进制文件的工具之一是gcc,它被称为 GNU 编译器集合,以前称为 GNU C 编译器;Ubuntu 12.04 附带的版本是gcc 4.6.3。正如官方 GNU手动的

GCC is an integrated distribution of compilers for several major programming 
languages. These languages currently include C, C++, Objective-C, Objective-C++, 
Java, Fortran, Ada, and Go.

编译二进制文件

这三个命令./configuremakesudo make install(或sudo checkinstall)通常一起用于编译程序。

运行./configure,除其他事项外,检查已安装的版本gcc并准备构建环境。makefile是运行生成的最重要的内容之一,./configure因为它在运行时指导构建make。 GNU制作手册详细介绍了该过程。总而言之,中的规则makefile确定了主要目标(创建可执行文件),以便.c将源代码文件制作成编译文件(.o文件),从而生成目标可执行文件。

资源

Ubuntu 编译指南是两个很好的资源这里这里,其中包含一些对编译新手来说非常有用的建议和信息。其他资源,如 GNUgcc手册和make我已经提到的手册。有关 C 和创建简单的小型 C 程序的更多信息,请参阅第 22 章鲁特以及第 24 章Linux 命令行

答案3

要将 Bash 程序编译成二进制文件(我假设你问的是 Bash,因为你的问题被标记为 bash),你应该使用 Shc 程序。你可以从这里解压后,编译并安装韓國使用cd shc-3.8.9;make;sudo make install。现在,运行shc -f filename,其中文件名是要转换为不可读代码格式的文件的路径。Shc 将创建两个文件:文件名.xc文件名.x.你可以摆脱文件名.xc,filename 是不可读文件。

答案4

人有 10 种类型。我猜你属于第二种……:P

bin 目录中只有二进制文件(二进制文件 = 二进制代码中的程序,只有 1 和 0)

它们被编译为机器可读的。机器只知道 1 和 0、开和关、真或假,除此之外什么都不知道。

这是由编译器完成的。编译器不止一个。我能想到的是 Gnucc 编译器、Java 编译器或 Delphi 编译器……不同的编程语言有不同的编译器。

尝试 grep。祝你好运!

相关内容