Ошибка перемещения IAR

Есть проект, который успешно скомпилирован и работает на устройстве. Но после сообщения компоновщику, что он должен поместить часть кода приложения в память ПЗУ вместо SDRAM, я получаю следующую ошибку на этапе компоновки:

Ошибка [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

Я прочитал руководство по C/C++ от IAR. Но это не дает достаточно хороших объяснений относительно этой ошибки. Так что даже читая руководство, я не могу понять причину этой ошибки. Кто-нибудь может помочь решить эту проблему? На самом деле руководство разработчиков IAR C/C++ гласит:

Для каждой инструкции, которая не может быть правильно перемещена, ILINK выдаст ошибку перемещения. Это может произойти для инструкций, когда цель находится вне досягаемости или имеет несовместимый тип, или по многим другим причинам. Затем он приводит ошибку в качестве примера, который отличается от моего случая.

РЕДАКТИРОВАТЬ 1: я создал небольшой проект, который воспроизводит те же ошибки, и он состоит только из файлов fileOper.cpp и main.cpp.

Файл ICF, используемый для указания компоновщику, как поместить разделы в память:

определить символ intvec_start = 0x10000000;

/ -Регионы памяти-/

/-FLASH 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];

определить блок CSTACK с выравниванием = 8, size = size_stack { };

определить блок HEAP с выравниванием = 8, size = size_heap { };

инициализировать путем копирования с упаковкой = нули { readwrite };

не инициализировать { section .noinit };

разместить по адресу mem: intvec_start { section .intvec };

поместить в начало FLASH_region {раздел только для чтения.cstartup };

поместить в RAM_region {блок CSTACK };

поместить в SDRAM_region {только для чтения}

кроме {только для чтения раздел FILEOP };

поместить в SDRAM_region { readwrite };

поместить в SDRAM_region {блок HEAP};

поместить в 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;
}

1 ответ

Решение

Я решил проблему. При использовании IAR Embedded Workbench: Параметры проекта -> Компилятор C/C++ -> вкладка Язык 1. Там на "диалекте C++" был установлен флажок "с исключениями", при этом он был проверен. Ошибка на этапе компоновки возникает, когда установлен флажок "с исключениями". Весь код, который использует исключения, должен быть загружен в ПЗУ. В противном случае "с исключениями" следует снять.

Другие вопросы по тегам