Положение независимый бинарный для Atmel SAM Cortex-M0 + - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь создать независимый от позиции двоичный файл для Cortex-M0 +, используя набор инструментов ARM GNU, включенный в Atmel Studio 7 (arm-none-eabi?). Я искал много мест для информации о том, как это сделать, но не увенчался успехом. Это облегчило бы создание изображений для пинг-понга в областях флэш-памяти с низким уровнем загрузки для обновлений OTA без необходимости знать или заботиться о том, было ли обновление изображением для пинг-понга для данного устройства.

У меня есть резидентный загрузчик 8 кБ в 0x0000, с которым я могу связаться через UART и который после сброса переместится на 0x6000 (24 кБ), если он обнаружит двоичный файл там (то есть не 0xFFFF, стертый Flash). Этот загрузчик SAM-BA позволяет мне выгружать память, стирать и программировать Flash файлами .bin по указанному адресу.

В проекте приложения (простое мигание светодиода) ничего не делая, кроме добавления -section-start = .text = 0x6000 в командную строку компоновщика, в результате чего код мигания светодиода работает после того, как он запрограммирован в 0x6000 загрузчиком. Я также вижу в шестнадцатеричном файле, что он начинается с 0x6000.

В моей попытке создать двоичный файл, независимый от позиции, я удалил вышеуказанный элемент компоновщика и добавил флаг -fPIC в командные строки для компилятора, компоновщика и ассемблера. Но, я думаю, я все еще вижу абсолютные адреса ветвления в разборке, такие как:

28e: d001 beq.n 294

И результат состоит в том, что бинарный светодиодный индикатор, который я загружаю в 0x6000, не будет работать, если я специально не скажу компоновщику установить его в 0x6000, что противоречит цели. Обратите внимание, что я также вижу, что выглядит как относительные ветви в других частях разборки:

21c: 4b03 ldr r3, [pc, # 12]; (22с)

21e: 58d3 ldr r3, [r2, r3]

220: 9301 str r3, [sp, # 4]

222: 4798 blx r3

SRAM всегда находится на одном и том же адресе (0x20000000), мне просто нужно переместить исполняемый файл. Я не изменил командный файл компоновщика, и в нем нет раздела для .got (например, (. Got) или аналогичный).

Может кто-нибудь объяснить мне конкретные изменения, которые мне нужно внести в флаги компилятора / ассемблера / компоновщика, чтобы создать независимый от позиции двоичный файл в этой установке? Большое спасибо заранее.

1 Ответ

0 голосов
/ 21 марта 2019

Вам нужно внимательнее присмотреться к вашей разборке.Для 0xd001 я получаю это:

 0x00000000:    d001        ..      BEQ      {pc}+0x6 ; 0x6

В вашем случае цепочка инструментов пыталась помочь.Ясно, что 16-битный код операции не может кодировать абсолютный адрес с 32-битным адресным пространством.Таким образом, вы ближе, чем вы думаете, к решению.

...