web-dev-qa-db-ja.com

/ binディレクトリにあるプログラムは、どのようにして読み取り不能な形式にコンパイルされますか?

/ binディレクトリにあるコマンド/プログラムのほとんどがコンパイルされていることに気付きました。この読み取り不可能なコード形式を自分で複製したいと思います。これらのプログラムがこのようになった理由や方法を誰かに教えてもらえますか?

[グリーンスタンプボーナス]:ファイルからすべての「人間が読める」テキストを印刷するbashコマンドはありませんか?

7
surgemcgee

/binのコマンド/プログラムは読み取り不可ではありませんが、あなたが言うようにコンパイルされています。つまり、それらはもともとC(または他のプログラミング言語)で記述されており、プロセッサがコードを実行できるようにマシンコード(バイナリ)にコンパイルされています。同じことを行うには、必要なプログラムをCで記述し、gccコマンドを実行して実行可能ファイルを生成します。

ファイル内の人間が読めるテキストを印刷するには、strings < /bin/fileを使用します。

14
StarNamer

はじめに

プログラムが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階層の他のファイルに移動する必要があります。

コンパイラ

おそらく、バイナリのコンパイルに使用される最も有名なツールの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つのコマンド./configuremake、およびSudo make install(またはSudo checkinstall)がしばしば一緒に使用されます。

とりわけ./configureを実行すると、インストールされているgccのバージョンをチェックし、ビルド環境を準備します。 makefileは、makeの実行時にビルドを指示するため、./configureの実行から生成される最も重要なものの1つです。 GNU マニュアル作成 は、プロセスを非常に詳細に説明します。要するに、makefileの規則は、ターゲット実行可能ファイルを生成するためにソースコード.cファイルがコンパイル済みファイル(.oファイル)になるように(実行可能ファイルを作成するための)主な目標を決定しますファイル。

リソース

2つの優れたリソースは、これらのUbuntuコンパイルガイド herehere です。これらには、コンパイルの初心者向けの優れたアドバイスと情報が含まれています。すでに説明したGNU gccマニュアルやmakeマニュアルなど、他のリソース。 Cおよび単純な小さなCプログラムの作成の詳細については、 Rute の第22章および Linuxコマンドライン の第24章を参照してください。

12
user76204

1つのオプション:コンパイルされたプログラムの内容を確認するには、objdumpなどのツールを使用してオブジェクトコードをダンプします。次に例を示します。

objdump -d /bin/ls | less
1
Colin Ian King

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は読み取り不可能なファイルです。

1
Aaron Hill

10種類の人々がいます。あなたは2番目のグループに属していると思います...:P

Binディレクトリにはバイナリのみがあります(Binaries = Programms in Binary Code、ちょうど1と0)

それらは、機械で読み取り可能なようにコンパイルされます。マシンは、1と0またはオンとオフ、trueまたはfalseを認識し、それ以外は何も認識しません。

これはコンパイラーによって行われます。複数のコンパイラがあります。 Gnuccコンパイラー、Javaコンパイラー、またはDelphiコンパイラーについて考えることができます...プログラミング言語ごとに異なるコンパイラー。

Grepを試してください。幸運を!

0
mondjunge