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
без проблем.