Поиск эффективного цикла разработки для написания языка ассемблера

Часть II

Это вторая часть серии. Часть первую найдите здесь.

Теперь, когда GDB хорошо работает с Docker, следующим шагом будет поиск цикла разработки, который позволит вам быстро запускать код и при необходимости отлаживать.

Я предпочитаю разрабатывать в рамках VS Code, а не разрабатывать непосредственно в контейнере Docker с vim. Вопрос в том, как разрабатывать VS Code, а затем быстро компилировать, связывать, запускать и отлаживать код в уже настроенном контейнере докеров?

Ответ пришел из этого полезного сообщения в блоге. Это сообщение в блоге представляет собой полезную отправную точку о том, как использовать изображение для создания исполняемого файла, а затем запустить другой контейнер для запуска исполняемого файла. Хотя он не распространяется на язык ассемблера, это именно тот рабочий процесс, который нам нужен.

Сообщение в блоге предлагает такую ​​команду для обработки этапа сборки или компиляции.

docker run --rm -v "$(pwd)":/app -w /app iron/node:dev sh -c 'npm install'

Но в сообщении не описывается, что делает каждый из этих вариантов, поэтому давайте разберем его для тех, кто использует Docker. Обратите внимание, что это всего лишь пример команды, демонстрирующий, как можно использовать Docker для запуска этапа сборки.

Разбор аргументов командной строки Docker

Очистить

--rm

Это всего лишь этап сборки. Контейнер не нужно запускать и запускать после того, как он был использован для подготовки исполняемого файла. Этот флаг сообщает Docker о необходимости разорвать контейнер после его завершения. См. Документацию Docker здесь.

ОБЪЕМ (общие файловые системы)

-v “$(pwd)”:/app

Артефакт с этапа сборки следует сохранить. Этот параметр создает том Docker, который сохраняется в локальном каталоге после разрушения контейнера Docker. См. Документацию Docker здесь.

WORKDIR

-w /app

Заменить рабочий каталог, определенный в базовом образе. См. Документацию Docker здесь.

Базовый образ Docker

iron/node:dev 

Базовый образ Docker для использования при сборке. Найдите изображение железа / узла здесь. Этот образ был создан iron.io и по сути представляет собой небольшой образ с установленным узлом.

Команда для запуска в Docker

sh -c ‘npm install’ 

Переопределить команду из образа Docker. Это этап сборки, который мы хотим запустить.

Компиляция, компоновка и отладка в Docker

Теперь, когда мы понимаем эти части, давайте применим их к нашей программе на языке ассемблера. После создания образа с именем linux-assembly, запустив следующее из каталога, содержащего Dockerfile:

docker build -t linux-assembly .

Код сборки можно скомпилировать и связать с помощью следующей команды, используя те же аргументы, которые описаны выше.

docker run --rm -v "$(pwd)":/app -w /app linux-assembly sh -c "nasm -f elf64 -F dwarf -g hellow.asm && ld -m elf_x86_64 -o hw hellow.o"

Это создает исполняемый файл (hw) в локальном каталоге. Обратите внимание, что этот исполняемый файл имеет формат elf64, который не работает в операционной системе Mac. Однако его можно запустить в том же образе Docker с помощью команды:

docker run --rm -v "$(pwd)":/app -w /app linux-assembly sh -c "./hw"

Наконец, отладку можно выполнить непосредственно в контейнере Docker с помощью команды:

docker run --rm -it --cap-add=SYS_PTRACE -v "$(pwd)":/app -w /app linux-assembly sh -c "gdb hw"

Теперь вы можете разрабатывать локально с помощью VSCode и быстро запускать программу в контейнере Docker или при необходимости отлаживать с помощью GDB в Docker.

Спасибо за прочтение! Ознакомьтесь с инструкциями по настройке именно этого рабочего процесса в следующем посте здесь.