wakatonoの戯れメモ

はてなダイアリーから引っ越してきました。

Summon ARM Toolchainでハマったw

FSIJで取り組んでいるGnukを試してみようと、Summon ARM Toolchain(以下SAT)を入れてみるわけですが、見事にハマりましたw
SATとは、ARM環境上で動作するバイナリを作るためのクロスコンパイラ環境を構築するためのスクリプト
使ったものは以下のとおり

  • Debian GNU/Linux 6.0(Squeeze)
  • SATのアーカイブ
  • SATのアーカイブを展開&準備(展開された後に作成される summon-arm-toolchainスクリプトを読めばわかるけど、flex bison libgmp3-dev libmpfr-dev libncurses5-dev libmpc-dev autoconf texinfo build-essentialのパッケージを入れる)
  • summon-arm-toolchainスクリプトを実行

もし足りないものがあったとしても、エラーメッセージをもとにパッケージを足すことで対処出来る。
問題は出来た後のコンパイラを使ってコンパイルが通らないことw
具体的には、以下のようなエラーメッセージが出てくる。


arm-none-eabi-gcc -c -mcpu=cortex-m3 -O2 -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -Wall -Wextra -Wstrict-prototypes -Wa,-alms=../ChibiOS_2.0.8/os/ports/GCC/ARMCMx/chcore_v7m.lst -DCORTEX_USE_BASEPRI=TRUE -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -MD -MP -MF .dep/chcore_v7m.o.d -mthumb -DTHUMB -I . -I../polarssl-0.14.0/include -I../STM32_USB-FS-Device_Driver/inc -I../Virtual_COM_Port -I../ChibiOS_2.0.8/os/ports/GCC/ARMCMx -I../ChibiOS_2.0.8/os/ports/GCC/ARMCMx/STM32F10x -I../ChibiOS_2.0.8/os/ports/GCC/ARMCMx/cmsis -I../ChibiOS_2.0.8/os/kernel/include -I../ChibiOS_2.0.8/os/hal/include -I../ChibiOS_2.0.8/os/hal/platforms/STM32 -I../boards/common -I../boards/OLIMEX_STM32_H103 -I../ChibiOS_2.0.8/os/various ../ChibiOS_2.0.8/os/ports/GCC/ARMCMx/chcore_v7m.c -o ../ChibiOS_2.0.8/os/ports/GCC/ARMCMx/chcore_v7m.o
/tmp/ccKwcuL6.s: Assembler messages:
/tmp/ccKwcuL6.s:42: Error: SVC is not permitted on this architecture
make: *** [../ChibiOS_2.0.8/os/ports/GCC/ARMCMx/chcore_v7m.o] エラー 1

エラーの意味はわかるけど、コードが間違ってるというよりは「ARMの開発環境のほうがおかしい」と直感。で、エラーメッセージ(Assembler messages:という表記)から、アセンブラ(GAS)が怪しいと踏んで調査を開始したら、ほぼビンゴっぽい状態に。

詳細はリンク先を見て欲しいけど、要約すると以下のような感じ。

  • binutils 2.21のGASを使って、'svc 0'としか書かれてないアセンブリコードをアセンブルしても、"SVC is not permitted on this architecture"というエラーが出てくる
  • binutils 2.20.1のGASでは、問題なくアセンブルできる
  • バグだった。パッチは2011年4月11日にコミットされた

コンパイラアセンブラそのもののバグにぶちあたったのは久しぶりでした。