bamboo’s blog

Bambooの気まぐれブログ

CTRPFを使わずに3gxプラグインをビルドしてみる

はじめに

 3gxtoolという、3ds向けのプラグインを作成するツールがあります。通常はCTRPFと呼ばれるフレームワークを用いて作成しますが、今回はCTRPFを使わずに0からプラグインを作成してみます。

コード

 とりあえず最小のプログラムを作成してみましょう。start.sという名前で以下のようなファイルを作成します。

.global _start @外部から参照できるようにする

_start:
    bx lr @ルーチン終了

リンカスクリプト

 作成したプログラムを適切なアドレス配置にするため、リンカスクリプトを記述します。以下のプログラムを3gx.ldで保存します。(ちなみに、コード内にある0x07000100は3gxのエントリポイントのアドレスです。)

/* エントリポイント */
ENTRY(_start)

/* ヘッダ情報 */
PHDRS { text PT_LOAD; }

/* セクション情報 */
SECTIONS { .text 0x07000100 : {start.o} : text }

Makefile

 最後にビルドの情報や手順を記述するMakefileを作成します。以下のようなMakefileを作成してみましょう。

#ビルドルール取り込み
include $(DEVKITARM)/3ds_rules

#ターゲット名
TARGET      := tiny.3gx

#ソース名
SRC         := start.s

#ビルドディレクトリ
BUILD       := build

#使用するリンカ
LD          := $(CC)

#buildディレクトリが現在のディレクトリでない場合
ifneq ($(BUILD),$(notdir $(CURDIR)))

#Makefile内で実行するmakeに変数を渡す場合はexportを付ける

#ソースディレクトリ
export VPATH  := $(CURDIR)

#依存関係ファイルのディレクトリ
export DEPSDIR    := $(CURDIR)/$(BUILD)

#オブジェクトファイル
export OFILES := $(SRC:.s=.o)

#リンカに渡すフラグ
export LDFLAGS    := -T $(CURDIR)/3gx.ld -Wl,--gc-sections

#デフォルトターゲット
all: $(BUILD)

#buildディレクトリに移動するターゲット
$(BUILD):
  #buildディレクトリが無ければ作成
   @[ -d $@ ] || mkdir -p $@
  
  #buildディレクトリに移動し再度make実行
   @$(MAKE) --no-print-directory -C $@ -f $(CURDIR)/Makefile

#ビルド時の生成ファイルを削除するターゲット
clean:
   @rm -rf $(BUILD) $(TARGET)

#リビルドするターゲット
re: clean all

#buildディレクトリが現在のディレクトリの場合
else

#オブジェクトファイルに依存してビルド
$(TARGET): $(OFILES)

#中間ファイルの削除を防止する(デバッグのため)
.PRECIOUS: %.elf

#elfに依存して3gxを生成
%.3gx: %.elf
   @echo creating $@
  
  #3gxへの変換処理(plgInfoを渡さない場合は/dev/nullを指定)
   @3gxtool -d -s $(word 1, $^) /dev/null ../$@

#依存関係ファイル
-include $(OFILES:.o=.d)

#条件分岐終了
endif

makeコマンドでビルドすると、、、最小の3gxプラグインの完成です。

最後に

 今回作成した3gxプラグイン、サイズはなんと328 Byteでした。かなり小さいですが、ちゃんと動作します。もちろんですが、実用には程遠いので、普段は素直にCTRPFを使用してくださいね。