GreenHills - переполнение небольшой области данных

Я надеюсь, что, может быть, у кого-то есть быстрый ответ на этот вопрос, но, по сути, когда я включаю оптимизацию, я получаю следующую ошибку:

[elxr] (ошибка) переполнение небольшой области данных: 0xfff9f6fc (подписано) не помещается в 16 битов при выполнении перемещения в файле test_main.o в местоположении __sti___13_test_main_cpp_252229d3+0xc, к символу ссылки oe_init_intconn

Аналогичная ошибка возникает, когда я добавляю и эту директиву компоновщика:

-auto_sda

Их руководство не упоминает об этой ошибке компоновщика. Я использую Integrity 5.10

3 ответа

Решение

Эта ошибка компоновщика обычно не связана с -Olink оптимизация -auto_sda, Компоновщик видит всю вашу программу и постарается не испортить ее из-за автоматической отправки более 64 КБ ваших данных. (Это может быть ошибка компоновщика, но это маловероятно.)

Эта ошибка обычно возникает из-за того, что тот, кто не настолько проницателен, как компоновщик, уже вложил более 64 Кбайт в разделы SDA, прежде чем компоновщик даже получит шанс попробовать его. Непонимающим человеком может быть вы, если вы сделали что-то вроде

#pragma startsda
int small_data[10000];  // 40Kbytes
int small_data_also[10000];  // another 40Kbytes
#pragma endsda

(возможно, разделить на несколько файлов; на самом деле, я думаю, вы получите диагностику компилятора или ассемблера, если попытаетесь создать более 64 КБ SDA в одном файле).

Но неопытный человек также может быть компилятором, если вы передаете такие параметры, как -sda=4 (который действует так, как будто вы бросили #pragma startsda вокруг каждой глобальной переменной (4 байта или меньше во всем файле), и у вас есть тонна глобальных переменных. Компилятор будет рад SDAize 10000 байтов в каждом из 20 отдельных файлов, а затем компоновщик пожалуется, что вы передаете ему 200000 байтов SDA. (Компоновщик достаточно умен, чтобы переписывать обычные ссылки на данные в ссылки SDA, но его никогда не учили, как переписывать вещи в обратном направлении.)

Наконец, даже если вы думаете, что не проходите мимо -sda=Вы можете быть удивлены. Запустите драйвер с -# или же -v вариант. IIRC, ccintppc тайно проходит -sda=4 по умолчанию. Вы можете заставить водителя перестать "помогать" вам; просто пройдите -sda=none или же -sda=0, который должен переопределить драйвер по умолчанию. Возможно, вы захотите передать эту опцию для каждого файла отдельно, начиная с самого холодного кода.

После некоторых исследований, возможно, что конфликтующие библиотеки, которые не используют опцию SDA, могут столкнуться с этим конфликтом. Поскольку я не контролирую, как создаются эти библиотеки, на данный момент я применил следующие флаги к своему GPJ, которые, казалось, решили проблему:

-Onolink
-no_auto_sda
-nothreshold

Обратите внимание, что эти параметры отключают все оптимизации компоновщика и полностью отключают параметр SDA.

У меня была та же проблема, это должно исправить это и для вас:

Опция компилятора -large_sda позволит 23-битные перемещения SDA вместо 16 бит. Тогда вы также должны быть в состоянии использовать -sda=all без проблем.

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