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を使用してくださいね。