ビルド時に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

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

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

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

  • YSさん、こんにちは。NoMaYと申します。

    おそらく、以下のことなのだと思うのですが、ソースが見当たらないということで、RTOS:RI600V4のバイナリライブラリ内で発生していることでしょうけれども、ひとまず以下に記載されている回避策を試されてはどうでしょうか?(あるいは、もう既に参照されていた上での質問かも知れませんけれども。)

    初学者さんということで、自分では無理だと感じたら、ビルド環境一式(ソース込み)をルネサスさんに提出して、ルネサスさんに解決して貰うしか無いかな、と、私は思うのです。RI600V4を購入されて、お金を払っていれば、今回の件を解決してもらうぐらいの権利はあるのではないかな、と、私は思うのです。

    11.4 最適化リンケージエディタにおいて最適化有効時のE0562330エラー発生の回避
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.06.00/CS+.chm/Compiler-CCRX.chm/Output/ccrx11c0400y.html

    [追記]

    もうひとつこちらの可能性もあるかも知れません。

    FAQ 1011150 : CC-RX V2コンパイラを使用時、次のエラーが出力されます。回避方法を教えてください。
    E0562330:Relocation size overflow : "ファイル名.obj"-"セクション名"-"00000025"
    ja-support.renesas.com/knowledgeBase/17796702
     

  • NoMaYさん。こんにちは、YSです。

    アドバイスいただきありがとうございます。

    ご提供いただいた2件の情報を参照の上、分岐幅の変更や最適化リンケージエディタの最適化抑止を行ってみましたが、解決できていません。記載いただいているように、ルネサスさんにご相談して解決するようにしたいと思います。

  • NoMaY さんの示されたFAQが答えだと思います。

    リンクした結果、24bitの分岐命令では届かなくなってしまったから32bitの分岐命令で実装しなおしてください、がエラーの意味する所でしょう。
    コンパイルする時点では24bit命令になっているものを、リンクの段階で32bitに差し替えるのは難しいから現状そうなっているのでは。
    オプションを変えてコンパイルし直すか、セクションの配置を工夫して24bitのままで届くようにするか、どちらが良いかはケースバイケース。

  • YSさん

    こんにちは、シェルティです。ルネサスの中の人です。

    カーネルはライブラリ提供なので、ほやさんが提示された「セクションの配置を工夫して24bitのままで届くようにする」が実際の対処方法になります。

    RI600作った人に聞いてきました。以下回答でした。

    ---

    タスク/ハンドラ/ユーザ・オウン・コーディング部をカーネル(PRI_KERNEL)から24ビット相対の範囲内に配置してみてください。

    カーネルのアセンブラ・ソースではBSR命令などに分岐距離指定子(length)を使用していません。
    そのため、カーネルのライブラリを作成時に、下記のCC-RX仕様に従って"BSR"命令が"BSR.A"(24ビットPC相対)のコードにアセンブルされます。
    これにより、タスク/ハンドラ/ユーザ・オウン・コーディング部がカーネル(PRI_KERNEL)から24ビット以上離れているとリンク・エラーになります。

    CC-RXコンパイラ ユーザーズマニュアル
     https://www.renesas.com/document/mat/cc-rx-compiler-users-manual-rev110?language=ja&r=1169511
      5. アセンブラ言語仕様
      5.1.9 分岐命令の最適選択
       (2)相対サブルーチン分岐命令(BSR)の最適選択
        (b)最適選択
         - アセンブラでは相対サブルーチン分岐命令のオペランドが分岐最適化対象条件を満たす場合、最短の分岐距離を選択します。
          条件については、「5.1.4 (3) 分岐距離指定子」を参照してください。
         - 条件を満たさないものについては、24ビットPC相対(.A)を選択します。

    以上です

  • シェルティさん、こんにちは。YSです。

    アドバイスいただきありがとうございます。頂いた情報含め、マニュアル等を改めて確認したところ、RI600V4のユーザーズマニュアル コーディング編に

     2.6.2 ブート処理ファイルのコンパイラ・オプション

     「16.2.3 ブート処理ファイルのコンパイラオプション」に記載のように、ブート処理ファイル(サンプル・プロジェクトでは"resetprg.c")にはオプション"-nostuff"を設定する必要があります。そうでない場合、RI600V4は正常に動作しません。

    の記載があることを見落としていました。

  • (前投稿の編集がなぜかできないので分割投稿させていただきます)

    ブート処理ファイルにオプション"-nostuff"を設定することにより、ビルドエラーは発生しなくなりました。"-nostuff"によりブート処理関連の変数をアライメント数が4のセクションに配置する必要があったようです。

    マニュアル記載の手順通りに対応できておらず、非常に反省しています。皆様にお手数を掛けさせてしまい申し訳ございませんでした。

  • YSさん

    シェルティです。こんにちは。

    なるほど、そちらが原因でしたか。普遍的な課題なのですが "汎用的な" マイコン製品はそのマニュアルも汎用的であるべきでして、それ用のソフトウェアのマニュアルも汎用的であるべきでして、作り手として言うのもあれなのですがあらゆる事態を想定してマニュアル作りする故に、大辞典のようなマニュアルになりがちですね。

    なので初見ユーザさんの敷居がどうにも高くなりがちです。ここ数年でこれをツール(特にスマートコンフィグレータ)で解消しようという試みを続けておりまして、リアルタイムOSもスマートコンフィグレータを使って簡単に構成できるようにしてまいりました。RI600についても本件から何か改善事項がないか考えてみたいと思います。

    色々ご不便おかけすることもあるかもしれませんがまた不明点ありましたらご質問ください。シェルティが可能な範囲で関係者に聞きまわって回答を持ってきます。RXとRL78向けのソフトを古くから作っていますので回答を持ってこれる可能性が高いのはこの2ファミリですね。

    以上です

  • こんにちは。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さん

    シェルティです、こんにちは。

    すみません本件、NoMaYさんの推測であるところの「このオプションを指定したことによって、Relocation size overflow を起こしていた変数が、運よくエラーを起こさない範囲内のアドレスに配置し直された」が正しいように思います。前のシェルティの書き込みは推敲と検証が足りておらず、反射的に書き込んでしまいました。申し訳ありません。

    以上です

  • こんにちは。NoMaYです。

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

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

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

    [追記]

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

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

  • こんにちは。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関数を除いて全てリエントラントに実行できます。
    。。。


  • こんにちは。NoMaYです。

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

    今は  resetprg.c の下の方に以下の記述が追加されていたのですね。

    #if BSP_CFG_RTOS_USED == 4  /* Renesas RI600V4 & RI600PX */
    /* Definition of Kernel data section */
    #include "kernel_ram.h"     /* generated by cfg600 */
    #include "kernel_rom.h"     /* generated by cfg600 */
    #endif/* BSP_CFG_RTOS_USED */

     

  • こんにちは。NoMaYです。

    Trial版のプロジェクトを開いてresetprg.cの個別コンパイルオプションを解除してセクション設定を調整したところ以下の画面コピーの通り同じリンクエラーを発生させるところまで出来ました。


     

  • こんにちは。NoMaYです。

    調査の為に一旦resetprg.cの個別コンパイルオプションの-nostuffを戻してリンクエラーが出ないようにして、マップファイルを参照してリンクエラー時にE0562330:Relocation size overflowとなったと推測される箇所を推測してみました。以下の画面コピーの2枚目の赤枠箇所です。