Help us understand the problem. What is going on with this article?

書籍「低レベルプログラミング」アセンブリ実行 Docker 環境の構築

More than 1 year has passed since last update.

はじめに

  • 書籍「低レベルプログラミング」では 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
nirasan
フリーで開発者をしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away