Всем привет,
Имеем Atmel Studio, AVR GCC 8-бит v4.8.4, оптимизация -Os (по размеру) и нужно «зарезервировать» место в некоей секции, например для переменной uint32_t. В коде приложения эта переменная нигде не используется. Просто некий внешний патчер, в готовый бинарь, в это место будет записывать некоторое 4-х байтное значение (например, CRC).
Так вот, при линковке, линкер выкидывает эту переменную как бы я ее не объявлял. Не помогает ни volatile, ни attribute(used), ни const, ни static. Вообще, ничего не помогает, компилер/линкер тупо игнорит все, пока где-нибудь в коде эта переменная не заиспользуется, например не инкрементируется.
Вот это все не работает:
static uint32_t x __attribute__ ((section (".NRWWENDCRC"))) = 0x43524331;
volatile static uint32_t x __attribute__ ((section (".NRWWENDCRC"))) = 0x43524331;
volatile uint32_t x __attribute__ ((section (".NRWWENDCRC"))) = 0x43524331;
const uint32_t x __attribute__ ((section (".NRWWENDCRC"))) = 0x43524331;
static uint32_t x __attribute__ ((section (".NRWWENDCRC"), used)) = 0x43524331;
volatile static uint32_t x __attribute__ ((section (".NRWWENDCRC"), used)) = 0x43524331;
volatile uint32_t x __attribute__ ((section (".NRWWENDCRC"), used)) = 0x43524331;
const uint32_t x __attribute__ ((section (".NRWWENDCRC"), used)) = 0x43524331;
Строка линковки примерно такая:
-Wl,-Map=«$(OutputFileName).map» -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -Wl, -section-start=.NRWWENDCRC=0x1ebfc -mmcu=at90can128 -Wl,--cref
Строка компилятора примерно такая:
-x c -funsigned-char -funsigned-bitfields -DNDEBUG -Os -fpack-struct -fshort-enums -Wall -Wextra -Wundef -mmcu=at90can128 -c -std=gnu89 -MD -MP -MF «$(@:%.o=%.d)» -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"
Как я понимаю, отдельного файла линкера нет.
Знатоки, кто-нибудь сталкивался с таким? Помогайте :)