Эта ошибка компоновщика обычно , не связанная с оптимизацией -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
, что должно переопределить драйвер по умолчанию. Возможно, вы захотите передать эту опцию для каждого файла отдельно, начиная с самого холодного кода .