はじめに
- 書籍「低レベルプログラミング」では VMWare イメージで実行環境が提供されているが Docker を使いたかったので構築したメモ。
- 書籍内ではアセンブリの後に C もやるが、まだ最初なのでとりあえずアセンブラが動くところまで。
環境構築
- Dockerfile の作成
FROM debian:9
RUN apt-get update
RUN apt-get install -y binutils nasm gdb
RUN apt-get install -y vim
- Docker イメージの作成
docker build -t low-level-programming .
実行
- 公式リポジトリのクローン
git clone https://github.com/Apress/low-level-programming
- コードをマウントして Docker イメージの実行
cd /path/to/low-level-programming
docker run -it -v $(pwd)/listings:/listings low-level-programming bash
- hello.asm のコンパイルと実行
cd /tmp
nasm -felf64 /listings/chap2/hello/hello.asm -o hello.o
ld -o hello hello.o
./hello
デバッガの実行
- Docker コンテナ内でデバッガを有効にするために実行オプションを追加する
docker run -it --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" -v $(pwd)/listings:/listings low-level-programming bash
- gdb コマンドでデバッガを起動する
# コンパイルとデバッガの実行
nasm -felf64 /listings/chap2/hello/hello.asm -o hello.o
ld -o hello hello.o
gdb hello
# アセンブリ向けレイアウトの表示
(gdb) layout asm
# レジスタを表示するレイアウト
(gdb) layout regs
# ブレークポイントを設定する
(gdb) b _start
# 実行
(gdb) run
# 一ステップ実行
(gdb) si
# print $"レジスタ名" でレジスタの値を表示
(gdb) p $cl
# 終了
(gdb) quit