GreenHills - переполнение небольшой области данных - PullRequest
4 голосов
/ 07 мая 2010

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

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

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

-auto_sda

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

Ответы [ 3 ]

5 голосов
/ 06 сентября 2012

Эта ошибка компоновщика обычно , не связанная с оптимизацией -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 10 000 байтов в каждом из 20 отдельных файлов, а затем компоновщик пожалуется, что вы передаете ему 200 000 байтов SDA. (Компоновщик достаточно умен, чтобы переписывать обычные ссылки на данные в ссылки SDA, но его никогда не учили, как переписывать вещи в обратном направлении.)

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

1 голос
/ 12 мая 2010

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

-Onolink
-no_auto_sda
-nothreshold

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

0 голосов
/ 02 ноября 2017

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

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

...