実行ファイルの情報を見る

# 実行ファイルの情報を表示させる
readelfは、1つ以上のELFフォーマット・オブジェクト・ファイルに関する情報を表示する。ファイルに関する情報を表示します。 オプションは、表示する特定の情報を制御する。

https://qiita.com/masatom86650860/items/11190a21c9abb3aba67d#:~:text=readelf%E3%81%AF%E3%80%811%E3%81%A4%E4%BB%A5%E4%B8%8A%E3%81%AEELF%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%BB%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%83%85%E5%A0%B1%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%83%85%E5%A0%B1%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E3%80%81%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E7%89%B9%E5%AE%9A%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B%E3%80%82
```
root@*****************# readelf -h pause
ELF ヘッダ:
 ...
  エントリポイントアドレス:               0x401050
...
```
# 実行ファイルのセクションヘッダー情報を表示させる

### -S
Displays the infomation contained in the file's section headers, if it has any.
### 出典　
man readelf 
### 和訳
ファイルのセクションヘッダに情報があれば、それを表示する。
### 出典
deepl

```
root@********# readelf -S pause
There are 31 section headers, starting at offset 0x3938:

セクションヘッダ:
  [番] 名前              タイプ           アドレス          オフセット
       サイズ            EntSize          フラグ Link  情報  整列
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
 ....
  [15] .text             PROGBITS         0000000000401050  00001050
       0000000000000175  0000000000000000  AX       0     0     16
  
  ....
  [25] .data             PROGBITS         0000000000404020  00003020
       0000000000000010  0000000000000000  WA       0     0     8
  
  ....
```
### 気づき
エントリポイントの```0000000000401050```が書いてある
データのメモリマップ開始アドレス```0000000000404020```がある
# プロセスのメモリマップを表示させる
```proc/<pid>/maps```というファイルによって得られる
# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

「/proc」ディレクトリにあるファイルは、システムをコントロールするために使われます。そのため、システムのさまざまな情報がここに格納されており、/procにあるファイルを参照することによって、```システムの情報をリアルタイムで得る```ことができます。
### 出典
https://linuc.org/study/knowledge/526/

```
root@***************# ./pause &
[1] 3842
root@***************# cat /proc/3842/maps
00400000-00401000 r--p 00000000 08:05 262192                             *********************************
00401000-00402000 r-xp 00001000 08:05 262192                             *********************************
00402000-00403000 r--p 00002000 08:05 262192                             *********************************
00403000-00404000 r--p 00002000 08:05 262192                             *********************************
00404000-00405000 rw-p 00003000 08:05 262192                             *********************************
....
```
### 気づき
```00401000-00402000 r-xp 00001000 08:05 262192```メモリマップ範囲にコード領域が収まる

# 気づき
今更だがコード領域、データ領域ってなんだろう？
参考書を読み返す。

```execve()関数の実現のために、実行ファイルは、プログラムのコードやデータに加えて、次のようなプログラムの起動に必要なデータを保持しています。```
### 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

つまり
プログラムのコード読み出して上書きするデータが必要だからコード領域とデータ領域が必要なのか。

### コード領域、データ領域をどう見分けるのか？
セクション名: readelfの1行目第二フィールド（Name)
### 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

Cソースプログラムに書かれた関数や変数・定数をROMとRAMに配置するために、Cコンパイラは```複数のセクションというかたまりの中に、関数、const変数、初期化変数、非初期化変数を集め```、アセンブリソースを作り出します。上図のRAM・ROMの箱をセクションに見立てて頂くと良いのですが、実際にはもっと細かいセクション分割を行っています。
### 出典
https://www.gaio.co.jp/gaioclub/compiler_blog09/#:~:text=C%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E6%9B%B8%E3%81%8B%E3%82%8C%E3%81%9F%E9%96%A2%E6%95%B0%E3%82%84%E5%A4%89%E6%95%B0%E3%83%BB%E5%AE%9A%E6%95%B0%E3%82%92ROM%E3%81%A8RAM%E3%81%AB%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%80%81C%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%AF%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%84%E3%81%86%E3%81%8B%E3%81%9F%E3%81%BE%E3%82%8A%E3%81%AE%E4%B8%AD%E3%81%AB%E3%80%81%E9%96%A2%E6%95%B0%E3%80%81const%E5%A4%89%E6%95%B0%E3%80%81%E5%88%9D%E6%9C%9F%E5%8C%96%E5%A4%89%E6%95%B0%E3%80%81%E9%9D%9E%E5%88%9D%E6%9C%9F%E5%8C%96%E5%A4%89%E6%95%B0%E3%82%92%E9%9B%86%E3%82%81%E3%80%81%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E3%82%8A%E5%87%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%B8%8A%E5%9B%B3%E3%81%AERAM%E3%83%BBROM%E3%81%AE%E7%AE%B1%E3%82%92%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E8%A6%8B%E7%AB%8B%E3%81%A6%E3%81%A6%E9%A0%82%E3%81%8F%E3%81%A8%E8%89%AF%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%AF%E3%82%82%E3%81%A3%E3%81%A8%E7%B4%B0%E3%81%8B%E3%81%84%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%86%E5%89%B2%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

### 気づき
多分textはソースコード、dataは上書きするデータとして分けられるのだろう。

### メモリマップとは
プログラムは、これらの```メモリ状況（メモリマップ）```に合わせて配置しなければなりません。メモリマップはマイコンのハードウェアマニュアル等に記載されています。たとえば、こんな感じの図です

### 出典
https://www.gaio.co.jp/gaioclub/compiler_blog09/#:~:text=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%80%81%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E7%8A%B6%E6%B3%81%EF%BC%88%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%EF%BC%89%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E9%85%8D%E7%BD%AE%E3%81%97%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97%E3%81%AF%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB%E7%AD%89%E3%81%AB%E8%A8%98%E8%BC%89%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%E3%80%81%E3%81%93%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98%E3%81%AE%E5%9B%B3%E3%81%A7%E3%81%99%E3%80%82

# 感想
入る知識が多くて何を書いてるかわからなくなった。
ご容赦ください。