/ 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
ファイルシステム階層では、cat
やgetty
などのキーシステムツールがそれぞれ/bin
および/sbin
に存在し、dpkg
やchroot
などの他のツールが/usr/bin
および/usr/sbin
に存在しますそれぞれ。ソースコードをダウンロードしてビルドを構成し、インストールすることでプログラムをコンパイルする場合、プログラムはデフォルトで/usr/local/bin
および/usr/local
階層の他のファイルに移動する必要があります。
コンパイラ
おそらく、バイナリのコンパイルに使用される最も有名なツールの1つはgcc
で、これはGNU Compiler Collectionおよび以前のGNU Cコンパイラとして知られています。 Ubuntu 12.04に同梱されているバージョンはgcc 4.6.3
です。公式のGNU manual にあるように、
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.
バイナリのコンパイル
プログラムをコンパイルするために、3つのコマンド./configure
、make
、およびSudo make install
(またはSudo checkinstall
)がしばしば一緒に使用されます。
とりわけ./configure
を実行すると、インストールされているgcc
のバージョンをチェックし、ビルド環境を準備します。 makefile
は、make
の実行時にビルドを指示するため、./configure
の実行から生成される最も重要なものの1つです。 GNU マニュアル作成 は、プロセスを非常に詳細に説明します。要するに、makefile
の規則は、ターゲット実行可能ファイルを生成するためにソースコード.c
ファイルがコンパイル済みファイル(.o
ファイル)になるように(実行可能ファイルを作成するための)主な目標を決定しますファイル。
リソース
2つの優れたリソースは、これらのUbuntuコンパイルガイド here と here です。これらには、コンパイルの初心者向けの優れたアドバイスと情報が含まれています。すでに説明したGNU gcc
マニュアルやmake
マニュアルなど、他のリソース。 Cおよび単純な小さなCプログラムの作成の詳細については、 Rute の第22章および Linuxコマンドライン の第24章を参照してください。
1つのオプション:コンパイルされたプログラムの内容を確認するには、objdumpなどのツールを使用してオブジェクトコードをダンプします。次に例を示します。
objdump -d /bin/ls | less
Bashプログラムをバイナリにコンパイルするには(質問にbashというタグが付いているため、Bashについて質問していると仮定しています)、Shcプログラムを使用する必要があります。 here からダウンロードできます。アーカイブを解凍したら、cd shc-3.8.9;make;Sudo make install
を使用してshcをコンパイルしてインストールします。次に、shc -f filename
を実行します。ここで、filenameは、読み取り不可能なコード形式にしたいファイルへのパスです。 Shcは2つのファイルを作成します:filename.x.cおよびfilename.xfilename.x.cを取り除くことができます。filenameは読み取り不可能なファイルです。
10種類の人々がいます。あなたは2番目のグループに属していると思います...:P
Binディレクトリにはバイナリのみがあります(Binaries = Programms in Binary Code、ちょうど1と0)
それらは、機械で読み取り可能なようにコンパイルされます。マシンは、1と0またはオンとオフ、trueまたはfalseを認識し、それ以外は何も認識しません。
これはコンパイラーによって行われます。複数のコンパイラがあります。 Gnuccコンパイラー、Javaコンパイラー、またはDelphiコンパイラーについて考えることができます...プログラミング言語ごとに異なるコンパイラー。
Grepを試してください。幸運を!