Как решить проблему с "конфликтом типов разделов" и рекомендации по использованию атрибута section с gcc

Я использую Android NDKr8 и расширение gcc для компиляции некоторого библиотечного кода, который используется несколькими платформами, включая некоторые встроенные. Этот код использует сегменты для помещения нескольких элементов в непрерывное пространство памяти. Компиляция генерирует "ошибка: переменная_имя вызывает конфликт типа раздела".

Мы используем макрос для объявления атрибута сегмента:

# define DB_SEGMENT __attribute__ ((__section__ ("DBSegment")))

Вышеуказанное имя переменной объявлено следующим образом:

dbStruct const variable_name[] DB_SEGMENT = {
    {conststringvalue0, sizeof(conststringvalue0)},
    …more like this
};

dbStruct - это

typedef struct dbStruct
{
    const char * const  address;
    const UINT16        stringSize;
} dbStruct;

conststringvalue0 объявлено так:

const char conststringvalue0[] DB_SEGMENT = "some string value";

Этот же код компилируется в Xcode, используя его компилятор по умолчанию, с небольшими изменениями в объявлении макроса DB_SEGMENT. Это глубже, чем я привык, поэтому любая помощь будет оценена. У Google есть некоторые ссылки на ошибку, но ее исправление не ясно. Есть ли лучшая стратегия для установки определенного непрерывного раздела памяти?

В ответ на комментарий, единственное отличие от правильно скомпилированной версии в XCode:

#define DB_SEGMENT __attribute__ ((section ("DBSegment,DBSection")))

1 ответ

У меня та же проблема. И моя ситуация - я помещаю код и переменные в один и тот же раздел. После того, как я поместил переменную в другой раздел, проблема исчезла. Надеюсь это поможет.

"# определить атрибут DB_SEGMENT ((раздел ("DBSegment")))"

Я вижу пробел между # и определяю, что не правильно.

Удалите это место и попробуйте скомпилировать.

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