読者です 読者をやめる 読者になる 読者になる

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

x86_64上のLinux上で、x86(32bit)のビルド環境を整えた

linux nasm cmake

数日前から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

動いた!

【広告】