閉じる

コードの肥大化

ガリガリとコードを書いていくとある時点でリンク時に以下のようなエラーが出る。

/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
どうも、他に原因があって落ちていたような感じね。
あちこちいじっていたら落ちなくなった。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)