0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2024-05-15

実行ファイルの情報を表示させる

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

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というファイルによって得られる

出典

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

出典

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()関数の実現のために、実行ファイルは、プログラムのコードやデータに加えて、次のようなプログラムの起動に必要なデータを保持しています。

出典

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

コード領域、データ領域をどう見分けるのか?

セクション名: readelfの1行目第二フィールド(Name)

出典

Cソースプログラムに書かれた関数や変数・定数をROMとRAMに配置するために、Cコンパイラは複数のセクションというかたまりの中に、関数、const変数、初期化変数、非初期化変数を集め、アセンブリソースを作り出します。上図のRAM・ROMの箱をセクションに見立てて頂くと良いのですが、実際にはもっと細かいセクション分割を行っています。

出典

気づき

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

メモリマップとは

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

出典

感想

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?