x86_64上のLinux上で、x86(32bit)のビルド環境を整えた
数日前からx86のアセンブリ言語の勉強を始めてみた。とりあえず、x86_64は面倒臭いのでx86からはじめることにして、開発環境を整える。アセンブラはnasm、ビルド管理にはCMakeを使う。
環境
OSはUbuntu Linux 12.04
$ nasm -v NASM version 2.09.10 compiled on Oct 17 2011 $ cmake --version cmake version 2.8.7
ビルド
まず、最初のプログラムとして helloworld.asm を準備。
;;; Borrowed from http://cs.lmu.edu/~ray/notes/nasmexamples/ ;;; helloworld.asm global main extern printf section .text message: db 'Hello, World', 10, 0 main: ;; call libc printf() push message call printf add esp, 4 ;; call exit(0) mov eax, 1 mov ebx, 0 int 80h
最初にlibc
の中のprintf()
関数を呼び出し、次にシステムコールのexit()
関数を呼び出している。
さて、次に、これをアセンブル・リンクするためのCMakeLists.txtを準備する。あまりまとまった説明が無いので、インストールされたCMakeのファイルを読んだりして調べるハメになった。
# CMakeLists.txt cmake_minimum_required(VERSION 2.8) include (CheckFunctionExists) include (CheckIncludeFiles) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH}) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(CMAKE_ASM_NASM_OBJECT_FORMAT "elf32") else() message(ERROR "This CMakeLists.txt works only on Linux") endif() set(CMAKE_ASM_NASM_LINK_EXECUTABLE "gcc -m32 <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") enable_language(ASM_NASM) add_executable(helloworld helloworld.asm)
とりあえずLinux上でgccを使ってリンクすることを前提にしている。というか上記のプログラム自体、Linuxじゃないと動かないし(externで宣言している関数の名前にアンダースコアが無い点およびシステムコールを呼んでいる点)。
最後に、32ビット版libcをインストールしておく必要がある。
$ sudo apt-get install libc6-i386 libc6-dev-i386
これで準備が整ったはず。ビルドディレクトリを別に作成し、ビルドしてみる。
$ mkdir /tmp/nasm-build $ cd /tmp/nasm-build $ cmake <ソースディレクトリ> -- The C compiler identification is GNU -- The CXX compiler identification is GNU -- Check for working C compiler: /usr/bin/gcc -- Check for working C compiler: /usr/bin/gcc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- The ASM_NASM compiler identification is unknown -- Found assembler: /usr/bin/nasm -- Configuring done -- Generating done -- Build files have been written to: /tmp/nasm-build $ make Scanning dependencies of target helloworld [100%] Building ASM_NASM object CMakeFiles/helloworld.dir/helloworld.asm.o Linking ASM_NASM executable helloworld [100%] Built target helloworld $ ./helloworld Hello, World
動いた!