低レベルプログラミングという本の勉強のため、M1 Mac上でIntel x64アーキテクチャのアセンブラを動かす環境構築をした時のメモ。
前提
- M1 Mac
Docker Desktopをインストールし、起動してから手順を行う。Dockerfileを使ったほうがいいかもしれないが、今回は手動で環境構築した後にイメージを作る手順とした。
イメージの作成手順
1. x86_64ベースのDockerコンテナを用意(ホスト)
一応ホストと共有ディレクトリを作るようにしている。これを共有したいディレクトリ上で実行する想定。
docker run --rm -it --platform linux/amd64 -v $(pwd):/workspace ubuntu bash
2. コンテナ内で必要なツールをインストール(ゲスト)
apt update
apt install -y nasm gcc locales
3. 動作確認用のコードを生成(ゲスト)
echo 'section .data
msg db "Hello, World!"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 13
syscall
mov rax, 60
xor rdi, rdi
syscall' > hello.asm
4. アセンブル(ゲスト)
nasm -f elf64 hello.asm -o hello.o
5. 実行ファイルを生成(ゲスト)
ld -o hello hello.o
6. 実行(ゲスト)
./hello
7. 日本語を扱えるようにロケールを設定(ゲスト)
sed -i 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
update-locale LANG=ja_JP.UTF-8
echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
echo 'export LANGUAGE=ja_JP:ja' >> ~/.bashrc
echo 'export LC_ALL=ja_JP.UTF-8' >> ~/.bashrc
8. Python2のインストール(ゲスト)
普通なら不要だが、前述の「低レベルプログラミング」の本でテストを実行するにはなんとPython2が必要なので、その場合はインストールが必要。
apt install
でインストールできないのでソースからビルドする。以下を参考にしたらうまくいった。
9. イメージを作るためのコンテナIDを調べる(ホスト)
docker ps
ここで出力されたCONTAINER IDをひかえる。
10. イメージを生成(ホスト)
<container_id>
は上でひかえたコンテナIDに置き換える。
docker commit <container_id> my_assembly_image
以降
前述の手順でイメージが作成できる。以降はイメージを使って実行する。(ホスト)
docker run --rm -it -v $(pwd):/workspace my_assembly_image bash
以下の警告が出るが無視しても問題ない。
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
警告が出てほしくなければ --platform linux/amd64
を指定すればいいはず。