ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
15 мая
1457293
VVB (20.08.2024 11:16, просмотров: 582)
Не так давно изменилась политика линковки 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.


У кого какие идеи имеются по этому поводу?