Я пытаюсь создать независимый от позиции двоичный файл для 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) или аналогичный).
Может кто-нибудь объяснить мне конкретные изменения, которые мне нужно внести в флаги компилятора / ассемблера / компоновщика, чтобы создать независимый от позиции двоичный файл в этой установке? Большое спасибо заранее.