ビルド時に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使用時には変数なんて何も定義してなかったような、、、

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

    [追記]

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

Reply
  • こんにちは。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使用時には変数なんて何も定義してなかったような、、、

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

    [追記]

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

Children
  • 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枚目の赤枠箇所です。



     

  • こんにちは。NoMaYです。

    原因の可能性が見えてきたので、試しに、先ほどリンクエラーとなった設定でセクションの配置順だけを変更して、それでもリンク出来るようにしてみました。以下、画面コピーです。





     

  • こんにちは。NoMaYです。

    今回の件は以下のようなことではないだろうかと私は推測しました。

    ■ RI600V4カーネルのアセンブラソース内に変数のアドレスの大小関係(並び順)を決め打ちして最適な命令を選んで記述している箇所があると推測される
    ⇒ その命令ではベースとなるレジスタからの正のオフセットでしか変数をアクセス出来ない(そういう命令を選んでいた)
    ⇒ resetprg.cに-nostuffを付けてコンパイルすると決め打ちした通りの変数のアドレスの大小関係(並び順)で変数が配置される
    ⇒ しかし-nostuffを付けないとリンカの-startの指定に従って変数が配置されて場合によってはくだんのオフセットが負になることもある
    ⇒ そのような場合に、くだんの命令では正のオフセットしか許されていないので、リンク時にE0562330:Relocation size overflowとなった



    以下、RXファミリ ユーザーズマニュアル ソフトウェア編の画面コピーです。

    www.renesas.com/jp/ja/support/document-search?doc_file_all_types%5BManual%5D=Manual&doc_file_all_types%5BManual+-+Software%5D=Manual+-+Software&doc_category_tier_1=467666&doc_category_tier_2=469296&doc_category_tier_3=&doc_category_tier_4=&doc_part_numbers=&title=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E7%B7%A8&sort_order=DESC&sort_by=field_document_revision_date#documentation-tools-results



    [関連リンク]

    ルネサス RXファミリ用リアルタイムOS [RI600V4] 製品ページ
    www.renesas.com/jp/ja/software-tool/ri600v4-real-time-os-rx-family

    ルネサス 半導体セミナー テキスト閲覧ページ
    www.renesas.com/jp/ja/support/training/seminar/document