バイナリファイルの謎

バイナリファイルの謎

-oこれは、g ++や(outfile)フラグなど、コンパイラから直接インポートされたファイルに関するものです。

バイナリならば、ただ0と1の束でなければなりませんか?

キャプチャすると理解できない出力が出ますが、完全な単語も出てきます。

ファイルにまとめると、すぐに答えを得ることができます。計算が必要ないようです。バイナリに実際にそのような情報を含むヘッダーはありますか?

私はバイナリ実行ファイルをコンパイルされたばかりのプログラム、つまりCPUが即座に明確に理解できる機械命令の形で考えています。それでは、命令セットは単なるビットパターンではないでしょうか?しかし、バイナリには何がありますか?このビットをどのように表示しますか?

また、どういうわけかプロセッサマニュアルを入手したら、一度に1つのマシン命令でバイナリを手書きできますか?非常に非効率的だろうが、非常に「Hello World!」も動作させると面白いです。デモ。

答え1

スーパーユーザーの質問:テキストエディタでバイナリファイルを開くときにバイナリコードが表示されないのはなぜですか?最初のポイントをとてもよく解決しました。

バイナリとテキストデータは分離されておらず、単なるデータです。それはそれらを2つのうちの1つにする解釈に依存します。テキストエディタでバイナリデータ(画像ファイルなど)を開くと、選択した解釈(テキスト)に従わないため、多くのデータが意味をなさなくなります。

ファイルは0と1として保存されます(たとえば、メモリの電圧/電圧なし、ハードドライブの磁化/磁化なし)。 0/1 シーケンスは人にとってあまり役に立たないため、ファイルを読み取ると 0 と 1 を見ることはできません。cat文字がより意味があり、16進ダンプがほとんどの目的に適しています(hexdumpファイルを試してください)。

実行可能ファイルタイトルありビルドされたプログラムのアーキテクチャ、ファイルのどの部分がコードとデータであるかなどのパラメータを説明します。これはfile、バイナリファイルの特性を識別するために使用されます。

最後に:はい。 CPU opcode を直接使用して、アセンブリ言語でプログラムを作成できます。見てUNIXアセンブリプログラミングの紹介そしてインテルx86ドキュメント出発点へ。

答え2

すべてのファイルは1と0として保存されます。 catは各BYTE(8ビット)を文字として解釈しようとするので、理解できない文字が表示されます。

答え3

すべてのファイルは内部的にバイナリです。つまり、一連のファイルとして保存されます。少し

ファイルのビットは実際には次のようにグループ化されます。バイト。各ファイルは整数バイトで構成されます。すべてのUNIXシステム、そして実際にはほとんどすべてのコンピュータに8ビット(と呼ばれる)で構成されるバイトがあります。八重奏ネットワーキング側から)。バイトを0から2 8 -1 = 255の間の8ビット数として解釈する自然な方法があります。

これをバイナリとして扱うには、バイナリ表現で書くためのツールが必要です。人間はバイナリ表現には適していません。何でも書くには時間がかかります。より一般的に使用されるもの16進数16 の異なる数字で構成される記号です。たとえば、41(16進数65)は01000001(2進数65)よりも読みやすくなります。次のようなものを使用できますod(「8進数ダンプ」)または各バイトの8進数または16進数表現でファイルを一覧表示しますhexdump(16進数に切り替えます)。hdod -t x1

バイトは文字を表すことができます。いくつかあります。文字エンコーディングUNIXの世界で使用されています。それらはすべて以下に基づいています。ASCIIコード0 ~ 127 のバイト解釈を定義します。これは、可能なバイト値の半分の意味のみを定義することに注意してください。たとえば、65は大文字A、97は小文字a、30は数字0などを表します。たとえば、一部の文字エンコーディングは、1バイトを使用して各文字を表します。ラテン語1コーディング、163 は£、241 はñを表します。この方法で最大256文字を表現できますが、これはあまりありません。したがって、文字ごとに複数のバイトを使用する別のエンコーディングがあります。今日、Unixの世界の事実上の標準的なエンコーディングは次のとおりです。UTF-8、これは可変長エンコードです(他の文字は異なるバイト数を占めます)。統合文字セット

テキストファイルは、理解できるテキストを含むバイナリファイルです。実際、UNIXプログラムの場合、2つの条件が満たされている限り、ファイルはテキストファイルです。

  • テキストファイルにはnullバイト(値が0のバイト)を含めることはできません。このバイトは何の文字も表さず、多くのテキスト操作プログラムによって内部的に特別な表示として使用されます。
  • テキストファイルは一連の行で構成され、各行は新しいチーム文字(値は10)です。

マシン実行ファイルは特別な種類のバイナリファイルです。コマンドを実行すると、cat時にはテキストを含むゴミが表示されます。これらのファイルには、端末へのコマンドを含めることもできます。このプログラムを使用すると、strings印刷できない文字を無視し、バイナリファイルのすべてのテキストを表示できます。

マシン実行ファイルはまさに一連のマシン命令ではありません。これには、オペレーティングシステムにファイルをメモリにロードする方法を知らせるいくつかの追加情報、多くの場合、プログラムで使用されるいくつかのデータ、およびオプションのデバッグ情報が含まれています。ほとんどのUNIXシステムでは非常に低い周波数マシン実行可能ファイルの形式です。この形式は、機械語コードを含むファイルを機械アーキテクチャとは独立した部分に分割する方法を指定します。一部の部分は、特定の機械アーキテクチャに固有の意味を有するコードを含む。

このコマンドを使用すると、objdump -D /path/to/machine-executable人間が読める形式で実行可能ファイルのリストを表示できます。アセンブリ語。まあ、訓練を受けた人なら誰でも読むことができます。アセンブリ言語はプロセッサアーキテクチャに依存し、機械命令に直接マップされます。

アセンブリ言語で完全なプログラムを作成することは可能ですが、時間がかかるため、重要なプログラムではほとんど実行されません。本当にクレイジーな場合は、プログラムをバイナリとして直接書くこともできます。一部の人々はプロポーズをしようとしています。印刷できる最短プログラムHello world; Ryan Henszeyが書く方法を説明します。PCプロセッサ用の142バイトELF実行可能;ブライアンライターELF形式を分析して45バイトプログラムを提案するLinuxは実行しようとしています(プログラムは何も印刷しません)。

バイナリではなく実行可能ファイルもあります。スクリプト。一方、画像、ビデオ、圧縮ファイル、ワードプロセッシング文書、実行ファイルがないコードライブラリなど、実行できないバイナリファイルがたくさんあります。エントリポイント、他のプロセッサアーキテクチャ用の実行可能ファイル、...

関連情報