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

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

[绿色邮票奖励]:是否没有bash命令打印文件中的所有“人类可读”文本?

/bin中的命令/程序不是不可读的 ,但正如你所说,它们是编译的。 这意味着它们最初是用C(或其他一些编程语言)编写的,并且已经编译成机器代码(二进制),因此处理器可以执行代码。 要做到这一点,只需在C中编写所需的程序并运行gcc命令即可生成可执行文件。

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

介绍

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

二进制文件和文件系统

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

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

在文件系统层次结构中,密钥系统工具(如catgetty分别存在于/bin/sbin ,而其他工具(如dpkgchroot分别存在于/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. 

编译二进制文件

三个命令./configuresudo make install (或sudo checkinstall )经常一起使用以编译程序。

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

资源

这里和这里有两个很棒的资源是这些Ubuntu编译指南,其中包含一些很好的建议和信息,供新编译者使用。 其他资源,如GNU gcc手册和我已经提到的make手册。 有关C和创建简单的小C程序的更多信息,请参阅Rute的第22章和Linux命令行的第24章。

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

一个选项 :如果要查看已编译程序中的内容,请使用objdump等工具转储目标代码,例如:

 objdump -d /bin/ls | less 

有10种不同的人。 猜猜你属于第二组…:P

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

它们被编译为机器可读的。 机器知道1和0或开关,真或假,没有别的。

这是由编译器完成的。 有多个编译器。 我可以想到Gnucc编译器,Java编译器或Delphi编译器……不同编程语言的不同编译器。

试试grep。 祝好运!