ガリガリとコードを書いていくとある時点でリンク時に以下のようなエラーが出る。
/home/USER/local/palm/m68k-palmos/bin/ld: region coderes is full (decop section .text) /home/USER/local/palm/m68k-palmos/lib/crt0.o(.text+0x5a): In function `start': crt0.c:67: relocation truncated to fit: DISP16 __do_ctors /home/USER/local/palm/m68k-palmos/lib/crt0.o(.text+0x70):crt0.c:72: relocation truncated to fit: DISP16 __do_dtors
どうも、コードサイズ 32k制限ってのに引っかかった模様。
確かに C++でテンプレート使うと肥大化するからなぁ
調べてみると、セクションを分割して対応するらしい。<Using PRC-Tools – Multiple code resources
8086向けのコードを書いているようだ。
C++のコードに適用できるのか不安だったけど大丈夫のようだ。
- コードセクションを指定する。
// ヘッダ class HOGE{ void cpp_func() __attribute__ ((section ("editfns"))); }; void c_func() __attribute__ ((section ("editfns"))); // ソース void HOGE::cpp_func() { } void c_func() { }
- .defファイルにマルチセクションについて記述を追加。
multiple code { "editfns" }
- スタブファイルとリンカスクリプトとを生成するルールを Makefileへ追加する。
SRCTIONS =$(EXEC_FILE)-sections $(SRCTIONS).o: $(SRCTIONS).s $(CC) -c $(SRCTIONS).s $(SRCTIONS).s $(SRCTIONS).ld: $(DEF_FILE) $(MULTIGEN) $(DEF_FILE)
- スタブをリンクし、追加のコードセクションを適切に配置するようにリンカスクリプトを使用。
OBJS=$(OBJS) $(SRCTIONS).o $(EXEC_FILE): $(OBJ_FILES) $(SRCTIONS).ld $(CC) $(OBJ_FILES) $(CCFLAGS) -lm -o $(EXEC_FILE) $(SRCTIONS).ld
で、リンカは通るようになった…が、エミュレータで動かすとイリーガルインストラクションで落ちる…_no
どうも、他に原因があって落ちていたような感じね。
あちこちいじっていたら落ちなくなった。