-
x86-64 Assembly Language 2 초기 환경 세팅Linux Development/Kernel 2021. 7. 21. 05:24
1. Assembly Language를 위한 세팅
리눅스에서 가장 많이 사용되는 어셈블러는 Intel문법의 NASM과 AT&T문법의 GAS이다. 이를 위한 세팅을 해보자.
가장 먼저 컴파일러가 필요하다. GAS는 리눅스 고유의 C 컴파일러 패키지인 GCC에 포함되어 있는 어셈블리 컴파일러다, NASM도 역시 독립적인 어셈블리 컴파일러라서 따로 설치해 줄 필요가 있다. 난 리눅스 Ubuntu 21.04 버전에서 작업할 것이다.
VMware로 우분투를 설치하는 방법은 아래 내 블로그 링크에 나와있다.
VMware에서 Ubuntu 설치
VMware란? 현재 시중에 나와있는 버츄얼 머신 프로그램 중 가장 안정적인 성능을 가지고 있는 프로그램이다. 단지 유료제품이라는 단점이 있다. 2021년 7월 현재 16 버전까지 나와 있고 프로그램
acknowledge.tistory.com
리눅스는 기본적으로 터미널 환경에서 시작했다. Windows의 GUI 환경처럼 리눅스의 GUI 환경도 많이 발전했지만 UNIX로부터 넘어온 리눅스의 터미널과 shell 환경은 사용자이자 개발자인 리눅스 유저들에겐 버릴 수 없는 환경이다. (이젠 좀 버릴 때도 되긴 했다..)
우분투 바탕화면에서 오른 클릭 -> Open in Terminal
우분투의 패키지(애플리케이션) 관리는 주로 apt로 이루어지며 종종 dpkg가 함께 사용된다.
- apt: 다른 패키지들을 apt 서버로부터 다운로드나 업데이트해주는 패키지. (apt-get, apt-cache 등도 있다)
- sudo apt install {패키지 명}: apt 명령의 install 옵션을 이용해 이름에 해당하는 패키지를 찾아 설치한다.
- dpkg: 내 로컬 환경의 패키지들을 관리해주는 프로그램(이자 패키지)
- sudo: 관리자 모드로 실행함을 의미한다.
처음 시작하면 지금 설치되어있는 패키지들부터 재정비해주자.
sudo apt update - 내 로컬 환경에서 받을 수 있는 패키지 목록과 버전 정보를 서버로부터 업데이트받는다.
sudo apt upgrade - 로컬 환경에 설치된 패키지들을 최신 버전으로 업그레이드한다.
sudo apt install build-essential
- 우분투에서 관리하는 기본 개발 패키지, gcc 컴파일러도 들어있다.
- 설치 후 gcc --version 명령으로 확인해보면 사용 유무를 알 수 있다.
sudo apt install nasm
- nasm 어셈블러 패키지 설치
- nasm --version 명령으로 확인해보면 실행 유무를 알 수 있다.
sudo apt install vim
- Windows의 notepad 정도로 보면 된다.
- 우분투에 기본으로 설치되어 있는 vi에디터의 다음 버전
- vim 설치 이후 vi를 실행시키면 vim이 실행된다. (예전엔 직접 하던 설정인데 지금은 자동으로 해준다)
- vim test.txt - test.txt라는 파일을 만들면서 편집 모드로 들어간다
- "i"를 누르면 편집이 시작되며 ESC -> ":" -> wq를 누르면 저장하고 종료된다 그냥 q를 누르면 저장 없이 종료된다.
- ESC키를 눌러서 편집 모드에서 커맨드 모드가 되었을 때 다시 "i"를 누르면 편집 모드로 들어간다.
2. GAS에서의 Hello world
vim helloWorld.asm이라는 명령어로 파일을 만들자. 그 안의 내용은 아래와 같이 편집한다.
코드에 대한 내용은 다음 설명에서 하겠다.
as -o hw1.o helloWorld.asm - gas를 이용해 어셈블리어를 기계어(오브젝트 파일)로 번역한다.
ld -o hw1 hw1.o - 기계어를 가상 주소 공간에 배치하여(링킹) 실행파일 형식(elf 파일)으로 만들어준다.
3. NASM에서의 Hello world
vim helloWorld2.asm 명령으로 NASM용 파일을 아래와 같이 만들어 보자.
nasm -f elf32 -o hw2.o helloWorld2.asm - nasm으로 어셈블러를 기계어로 번역
ld -m elf_i386 -o hw2 hw2.o - gcc의 링커(ld)를 써서 실행파일(elf)을 만든다. 때문에 32비트 아키텍처의 elf 형식으로 만들라는 옵션을 명확히 지정해주지 않으면 링커(ld)가 실행 파일을 만들지 않는다.
- 리눅스 커널이나 부트로더의 부팅 과정에선 AT&T문법이 쓰인다.
- nasm의 intel문법이 그나마 더 널리 쓰인다.
- nasm은 특히 windows에서 리버싱 엔지니어링을 하는데 쓰인다.
- 리눅스에서도 nasm이 선호되는 추세다.
앞으로 이 커리큘럼에선 gas를 중심으로 설명하겠다. 앞으로 리눅스 시스템의 부팅 과정을 설명하기 위해서 필요하기 때문이다. 하지만 중요도로 치면 nasm이 더 중요하다. 따라서 nasm 역시 다른 커리큘럼을 통해 설명을 이어가게 될 것이다. 다음 설명에서는 코드를 설명하면서 두 문법에 대한 차이 정도를 간략히 설명하도록 하겠다.