我注意到 /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.
编译二进制文件
这三个命令./configure
、make
和sudo 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。祝你好运!