ビルド時にE0562330:Relocation size overflow 発生

はじめまして、YSと申します。初めて投稿させていただきます。

現在、e2studioにてターゲットデバイス:RX651、RTOS:RI600V4使用のプロジェクトを作成、コーディングを行っているのですが、

ビルド時に以下のエラーが発生して、対処方法がわからず苦慮しています。

  E0562330:Relocation size overflow : "dequeue"-"PRI_KERNEL"-"00000005"

プロジェクトフォルダ下に「dequeue」に関連するファイルを探してみましたが発見できておらず、アセンブリリストファイルが何なのかが確認できませんでした。

「PRI_KERNEL」の配置アドレスはmapファイルより

  PRI_KERNEL
              fff00400 fff04bbe 47bf 1

となっており、ソリューション実装ガイドに記載されているセクション配置内であり、配置自体には問題はないと考えています。

解決方法などわかる方がいらっしゃいましたら、ご助言いただけないでしょうか?

よろしくお願い致します。

Parents
  • こんにちは。NoMaYです。

    本件、ちょっと腑に落ちなかったので、ちょっと調べ始めます。どうも合点がいかないことは、以下の点です。(こんなことを気にして調べようとするので、さして私は出世しなかった(業務遂行効率が甚だ悪い為)、のですけれどもね、、、)

    (1) CC-RXの -nostuff オプションの有無と発生していたエラー E0562330:Relocation size overflow の因果関係
    (2) なぜ、resetprg.c のコンパイル時にCC-RXで -nostuff オプションを付けないとRI600が正常動作しないのか

    以下、合点がいかない理由です。

    (1) 詳細はHelpに譲りますが、このオプションは変数を一律4バイトアラインメントのセクションに配置するのですが、その仕様それ自体によって直接的にくだんの Relocation size overflow のリンクエラーを解消させたのだとは、このリンクエラーの仕様上の発生理由から考えると(推測すると)、とてもそうだとは思えない。

    私が思うに、このオプションを指定したことによって、Relocation size overflow を起こしていた変数が、運よくエラーを起こさない範囲内のアドレスに配置し直されたのだろう、ということだと思う(推測する)のです。

    ただ、調べようと思ってもRI600カーネルのバイナリライブラリの中なので、どうやったら良いものかなぁ、、、

    (2) FITのBSPモジュールの resetprg.c のソースは何度も見ているのですけれど、一体全体何がいけないのか、さっぱり理由が思い浮かびません。そもそも、(GNURX使用時にスタックを変数定義してますが)CC-RX使用時には変数なんて何も定義してなかったような、、、

    実は、こちらも、どうやって調べれば良いのかなぁ、という状態ではありますが、、、エヘヘ(てへぺろ)、、、

    [追記]

    しかし、よくよく考えてみると、リンカでの最適化を抑止してもくだんのエラーは解消されなかった、そうですので、何が起きていたのか藪の中ではありますけれども、、、

  • こんにちは。NoMaYです。

    > 本件、ちょっと腑に落ちなかったので、ちょっと調べ始めます。

    まだ未着手ですけれど、まずは以下のことをやろうと考えています。

    (A) RI600V4のユーザーズマニュアル コーディング編を読む(ソリューション実装ガイドというのもあるっぽい?)
    (B) お試し版があった筈なのでダウンロードしてビルドしてみる
    (C) マップファイルを見る
    (D) シミュレータにダウンロードして逆アセンブルウィンドウを見る(ここぞという場所に気付くことが出来ればですが。)

    [追記]

    今、別の可能性もひとつ頭に思い浮かんでいます。

    (*) RI600カーネルのアセンブラソースの中で、1バイト変数も2バイト変数も4バイト変数も、共通のベースレジスタからのオフセットでアクセスしていないだろうか?

Reply
  • こんにちは。NoMaYです。

    > 本件、ちょっと腑に落ちなかったので、ちょっと調べ始めます。

    まだ未着手ですけれど、まずは以下のことをやろうと考えています。

    (A) RI600V4のユーザーズマニュアル コーディング編を読む(ソリューション実装ガイドというのもあるっぽい?)
    (B) お試し版があった筈なのでダウンロードしてビルドしてみる
    (C) マップファイルを見る
    (D) シミュレータにダウンロードして逆アセンブルウィンドウを見る(ここぞという場所に気付くことが出来ればですが。)

    [追記]

    今、別の可能性もひとつ頭に思い浮かんでいます。

    (*) RI600カーネルのアセンブラソースの中で、1バイト変数も2バイト変数も4バイト変数も、共通のベースレジスタからのオフセットでアクセスしていないだろうか?

Children
  • こんにちは。NoMaYです。

    本件の-nostuffの他に、以下のソースファイルで推奨される-ri600_preinit_mrcというコンパイラのヘルプには未記載のコンパイラのオプションの件もあるのですね。

    RI600V4 リアルタイム・オペレーティング・システム ユーザーズマニュアル コーディング編

    2.6 ビルド・オプション

    ここでは,特に留意すべきビルド・オプションについて解説します。

    2.6.1 サービス・コール情報ファイルとコンパイラ・オプション“-ri600_preinit_mrc”

    。。。
    また,kernel.h をインクルードするファイルのコンパイル時には,オプション“-ri600_preinit_mrc” を指定してください。本オプションを指定しなくてもRI600V4 の動作に問題は生じませんが,アプリケーションで使用していないサービス・コール・モジュールがリンクされる場合があります。この場合,RI600V4 の動作に問題は生じませんが,コード・サイズが無駄に大きくなってしまうことになります。
    。。。


  • こんにちは。NoMaYです。

    あと、ライブラリジェネレータで-reentというオプションの件もあるのですね。

    ルネサス半導体セミナー RXリアルタイムOSコース テキスト (ルネサス半導体セミナー テキスト閲覧ページ)

    2.4 その他のオプション

    「リエントラント・ライブラリを生成する」オプション

    システムでC言語の標準ライブラリ関数を使用する場合、標準ライブラリ構築ツールに対して「リエントラント・ライブラリを生成」オプション(reent)を設定する必要があります。本オプションを設定して作成したライブラリは、rand関数、srand関数を除いて全てリエントラントに実行できます。
    。。。