1

実行可能ファイルを取得するために組み立ててリンクした次のコードがあります。

.data

hello: .ascii "Hello World" .text

.global _start

_start: movl $4,%eax movl $1,%ebx movl $hello,%ecx movl $11,%edx int $0x80

movl $1,%eax
movl $0,%ebx
int $0x80

学習プロセスとして、プロセスのメモリ マップ (上記の実行可能ファイルによる) を見たいと思います。pmap と cat /proc/PID/maps の両方にプロセス ID が必要です。gcc でコンパイルされた C プログラムの場合、gdb を使用してブレークポイントを設定し、別の端末で pid を取得できます。

上記の場合、実行可能ファイルに利用可能なデバッガー シンボル テーブルがないため、ブレークポイントを設定できません。pid を使用せずにプロセスのメモリ構造を確認する方法はありますか? 実行可能ファイルをロードしてメモリ構造をダンプするある種のプログラムを意味します。

助けてくれてありがとう。

4

2 に答える 2

1

GNU binutils から使用readelfして、ELF ヘッダーのエントリ ポイントを見つけ、gdbそこにブレークポイントを配置するように指示します。

$ readelf -h /bin/true
...
  Entry point address:               0x10000c5c
...
$ gdb /bin/true
...
(gdb) break *0x10000c5c
Breakpoint 1 at 0x10000c5c
(gdb) run
Starting program: /bin/true
...
Breakpoint 1, 0x10000c5c in ?? ()
(gdb) ^Z
[1]+  Stopped                 gdb /bin/true
$ ps
...
  744 tty1     00:00:00 true
...
$ less /proc/744/maps

これは、予測できないエントリ ポイントに再配置されるため、位置に依存しない実行可能ファイル (PIE) では機能しません。Type:からの行を見てくださいreadelf -h。と表示されている場合はDYN (Shared object file)、PIE です。と表示されていればEXEC (Executable file)PIE ではありません。

于 2016-09-24T22:02:10.470 に答える