Не так давно изменилась политика линковки 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.
У кого какие идеи имеются по этому поводу?