1

リンクされてデバイス上で正常にコンパイルされたプロジェクトがあります。しかし、アプリケーションコードの一部をSDRAMではなくROMメモリに配置するようにリンカに指示した後、リンク手順で次のエラーが発生します。

エラー[Lp002]:再配置に失敗しました:値が範囲外または不正です:0x60000545種類:R_ARM_PREL31 [0x2a]場所:0xa0000030モジュール:I:\ Project \ Debug \ Obj \ fileOper.oセクション:128(.ARM.exidx)オフセット: 0x0ターゲット:0x00000574 "SECTION_FILEOP_87"モジュール:I:\ Project \ Debug \ Obj \ fileOper.oセクション:104(SECTION_FILEOP)オフセット:0x4f4

IARのC/C++ガイドを読みました。ただし、このエラーに関する十分な説明はありません。そのため、マニュアルを読んでも、このエラーの理由を理解することはできません。誰かがこの問題を解決するのを手伝ってもらえますか?実際、IAR C /C++開発者ガイドには次のように書かれています。

正しく再配置できない命令ごとに、ILINKは再配置エラーを生成します。これは、ターゲットが到達不能であるか互換性のないタイプである命令、または他の多くの理由で発生する可能性があります。次に、私の場合とは異なる例としてエラーを提供します。

編集1:同じエラーを再現する小さなプロジェクトを作成しました。これはfileOper.cppファイルとmain.cppファイルのみで構成されています。

セクションをメモリに配置する方法をリンカに指示するために使用されるICFファイル:

シンボルintvec_start=0x10000000を定義します。

/ -メモリ領域- /

/ -フラッシュROM- /

シンボルFLASH_ROM_start=0x00000000を定義します。

シンボルFLASH_ROM_end=0x0007FFFFを定義します。

/*内部RAM */

シンボルRAM_start=0x10000000を定義します。

シンボルRAM_end=0x10017FFFを定義します。

/ * SDRAM * /

シンボルSDRAM_start=0xA0000000を定義します。

シンボルSDRAM_end=0xA1FFFFFFを定義します。

/ -サイズ- /

シンボルsize_stack=0x4000を定義します。

シンボルsize_heap=0x2000を定義します。

サイズ=4Gでメモリメモリを定義します。

リージョンの定義FLASH_region=mem:[FLASH_ROM_startからFLASH_ROM_endへ];

リージョンの定義RAM_region=mem:[RAM_startからRAM_endへ];

領域の定義SDRAM_region=mem:[SDRAM_startからSDRAM_endへ];

アライメント=8、サイズ=size_stack{}でブロックCSTACKを定義します。

アライメント=8、サイズ=size_heap{}でブロックHEAPを定義します。

パッキング=ゼロでコピーして初期化{読み取り/書き込み};

{section.noinit}を初期化しないでください。

アドレスmemに配置:intvec_start {section .intvec};

FLASH_region{読み取り専用セクション.cstartup}の先頭に配置します。

RAM_region{ブロックCSTACK}に配置します。

SDRAM_region{読み取り専用}に配置

{読み取り専用セクションFILEOP}を除く;

SDRAM_region{読み取り/書き込み}に配置します。

SDRAM_region{ブロックヒープ}に配置します。

FLASH_region{読み取り専用セクションFILEOP}に配置します。

fileOper.cpp:変更しましたが、同じエラーが再現されます。

#include "fileOperbug.h"
#include <string>

char *fgets( char *str, int num, std::string *stream ) {

  char *pointer = 0;
  return pointer;
}

std::string *fopen(const char *name, const char *mode) {
  std::string *str = new std::string();
  str->assign("");
  return str;
}
4

1 に答える 1

2

問題を解決しました。IAR Embeddedワークベンチを使用している場合:[プロジェクトオプション]-> [C /C++コンパイラ]->[言語1]タブ。「C++方言」には「例外あり」というチェックボックスがあり、チェックされていました。リンク段階でのエラーは、「例外あり」チェックボックスがチェックされている場合に発生します。例外を使用するすべてのコードは、ROMにロードする必要があります。それ以外の場合は、「例外あり」のチェックを外す必要があります。

于 2012-11-07T07:30:24.760 に答える