GNU 어셈블러

개요
GNU 어셈블러(GNU Assembler, 약칭 gas)는 GNU 프로젝트에서 개발한 무료 어셈블리 언어 컴파일러이다. gas는 GNU Binutils 패키지의 구성 요소 중 하나이며, 다양한 마이크로프로세서와 운영체제용 바이너리 코드를 생성한다. 주된 목적은 어셈블리 소스 파일을 목적 파일(object file)로 변환하는 것으로, C 언어 컴파일러인 GCC와 연동하여 전체 빌드 체인의 일환으로 사용된다.

역사

  • 1991년 GNU 프로젝트는 자유·오픈소스 소프트웨어 환경을 구축하기 위해 GNU Binutils를 시작하였다.
  • 초기 버전은 AT&T AT&T AT&T AT&T AT&T 386 어셈블러와 호환성을 목표로 구현되었으며, 이후 다양한 아키텍처 지원을 확대하였다.
  • 현재 gas는 GNU Binutils의 핵심 구성 요소로 지속적인 유지·보수가 이루어지고 있다.

주요 특징

구분 내용
멀티아키텍처 지원 x86, x86‑64, ARM, AArch64, MIPS, PowerPC, RISC‑V, SPARC 등 다수의 CPU 아키텍처를 지원한다.
문법 AT&T 문법을 기본으로 하며, -masm=intel 옵션을 통해 Intel 문법도 사용할 수 있다.
전처리 기능 C 전처리기(cpp)와 연동하여 매크로, 조건부 어셈블리 등을 제공한다.
디버깅 정보 DWARF, STABS 등 표준 디버깅 포맷을 포함시킬 수 있다.
플러그인 확장 Binutils 플러그인 인터페이스를 이용해 사용자 정의 기능을 추가할 수 있다.
라이선스 GNU 일반 공중 라이선스(GPL) 버전 3(또는 그 이전 버전) 하에 배포된다.

구조와 동작

  1. 소스 입력: 어셈블리 파일(.s 또는 .asm)을 읽는다.
  2. 전처리: 필요 시 C 전처리 단계가 실행되어 매크로 치환 및 조건부 컴파일이 수행된다.
  3. 어셈블: 각 명령어를 해당 아키텍처의 기계어(Opcode)로 변환하고, 심볼 테이블을 구축한다.
  4. 목적 파일 생성: ELF, COFF, Mach-O 등 목표 포맷에 맞춰 목적 파일(.o)을 만든다.

사용 예시

# 기본 사용
as -o hello.o hello.s

# GCC와 연동
gcc -c hello.s -o hello.o

# Intel 문법 사용
as -masm=intel -o prog.o prog.asm

호환성

  • 운영체제: GNU/Linux, BSD 계열, macOS, Windows(가상 환경 또는 Cygwin/MSYS2) 등에서 동작한다.
  • 빌드 시스템: Autotools, CMake, Meson 등 주요 빌드 시스템에서 자동으로 gas를 호출하도록 설정할 수 있다.

관련 프로젝트

  • GNU Binutils: gas를 포함한 링커(ld), 오브젝트 덤프(objdump) 등 도구 모음.
  • GNU Compiler Collection(GCC): gas를 기본 어셈블러 백엔드로 사용한다.
  • LLVM: 자체 어셈블러(llvm-as)를 제공하지만, GNU 환경과의 상호 운용성을 위해 gas와 함께 사용되기도 한다.

참고 문서

  • GNU Binutils 공식 매뉴얼 (https://www.gnu.org/software/binutils/)
  • GNU Assembler 매뉴얼 (info as)
  • “The GNU Assembler” – GNU 프로젝트 문서

요약
GNU 어셈블러는 GNU Binutils의 핵심 구성 요소로, 다양한 아키텍처와 운영체제에 대해 자유롭게 사용할 수 있는 오픈소스 어셈블리 컴파일러이다. GPL 라이선스로 배포되며, GCC와의 긴밀한 연동을 통해 C·C++ 등 고급 언어의 빌드 파이프라인에서 필수적인 역할을 수행한다.

둘러보기

더 찾아볼 만한 주제