Не так давно изменилась политика линковки gcc arm embedded в части
повышения безопасности кода. Есть вопрос, может быть, кто-нибудь
знает ответ. Вкратце: сейчас сильно не рекомендуется размещать код и данные в одной области памяти (не стоит использовать атрибут RWX). Если линкер видит атрибут RWX для области памяти, он ругается, пока без мата.
То есть ранее в скрипте линкера я мог сделать так:
SDRAM_START = 0x00000000
SDRAM_END = 0x03FFFFFF
MEMORY
{
  SDRAM      (rwx) : ORIGIN = SDRAM_START,      LENGTH = SDRAM_END      - SDRAM_START      + 1
}
Ну и далее всё разместить в области памяти SDRAM (.text, .rodata, .data, .bss). Последовательно. Без дыр. Заканчивается read-only .rodata, сразу же начинается read-write .data, за ней сразу же следует .bss.
На такой скрипт текущий arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi ругается: нельзя размещать исполняемые данные в области памяти, которая read-write.
Приходится менять скрипт линкера:
SDRAM_RX_START = 0x00000000
SDRAM_RX_END = 0x000FFFFF
SDRAM_RW_START = 0x00100000
SDRAM_RW_END = 0x03FFFFFF
MEMORY
{
  SDRAM_RX      (rx) : ORIGIN = SDRAM_RX_START,      LENGTH = SDRAM_RX_END      - SDRAM_RX_START      + 1
  SDRAM_RW       (rw) : ORIGIN = SDRAM_RW_START,       LENGTH = SDRAM_RW_END       - SDRAM_RW_START       + 1
}
И далее размещать .text, .rodata в секции SDRAM_RX, а .data и .bss в секции SDRAM_RW. 
Появляется "дырка" между областями памяти SDRAM_RX и SDRAM_RW.
У меня никак не получилось добиться того, чтобы область памяти SDRAM_RW начиналась сразу же после области памяти SDRAM_RX.
У кого какие идеи имеются по этому поводу?