Используя GNU ld, как я могу автоматически распределить свой код по нескольким регионам? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть ситуация, когда мой ПЗУ может занимать только определенные области памяти, которые не пересекаются. Например, предположим, что я определил следующие области памяти в своем скрипте компоновщика:

MEMORY
{
  lowrom (rx)           : ORIGIN = 0x5000,  LENGTH = 0x2000
  midrom (rx)           : ORIGIN = 0xD000,  LENGTH = 0x1000
  hirom  (rx)           : ORIGIN = 0xF000,  LENGTH = 0x1000
}

Я хотел бы, чтобы код входил в lowrom, пока он не был заполнен, а затем чтобы код входил в midrom, пока он не был заполнен, а затем чтобы оставшийся код входил в hirom.

Документация GNU ld гласит: Компоновщик не будет перетасовывать разделы, чтобы вписаться в доступные области. Так что, похоже, то, что я хочу сделать, невозможно.

Есть ли какое-то решение? Я хочу избежать ручного выбора того, что входит в какую область памяти.

(Или есть еще один перенаправляемый компоновщик с открытым исходным кодом, который поддерживает эту функцию?)

1 Ответ

0 голосов
/ 26 апреля 2019

Не думаю, что есть прямой путь.

На мой взгляд, есть обходной путь.

Позвольте мне объяснить, используя примеры.

a) Предположим, что размер кода <0x2000 байт, затем в сценарии компоновщика просто добавьте lowrom, как показано ниже. </p>

ПАМЯТЬ

{

lowrom (rx): ORIGIN = 0x5000, LENGTH = 0x2000

}

b) Предположим, что размер кода составляет 0x2050 байт, затем в сценарии компоновщика добавьте lowrom и midrom.

Обратите внимание, что для midrom выделяется только необходимое количество байтов

ПАМЯТЬ

{

lowrom (rx): ORIGIN = 0x5000, LENGTH = 0x2000

midrom (rx): ORIGIN = 0xD000, LENGTH = 0x0050

}

Таким образом, вы можете идти вперед.

...