Обычно этого можно достичь, изменив используемый скрипт компоновщика или предоставив определенные параметры командной строки для GNU ld.
Исходя из предоставленной вами информации, я предполагаю, что ваш код в настоящее времяначиная сразу после двух первых таблиц векторных записей, т. е. начального значения SP и значения сброса, и того, что ваша векторная таблица расположена в 0x00000000.
example1.s более или менее должен выглядеть как ваш текущий код:
.cpu cortex-m3
.thumb
.syntax unified
.global Reset_Handler
.equ StackTop, 0x1000
.word StackTop
.word Reset_Handler
Reset_Handler:
b .
.end
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example1.o -c example1.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler -Ttext-segment=0x00000000 -Map=example1.map -o example1.elf example1.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d example1.elf
example1.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <Reset_Handler-0x8>:
0: 00001000 .word 0x00001000
4: 00000008 .word 0x00000008
00000008 <Reset_Handler>:
8: e7fe b.n 8 <Reset_Handler>
Код будет расположен по адресу 0x00000008.example2.s определяет новый раздел компоновщика с именем .vectors.
Теперь мы будем использовать параметр командной строки GNU ld --section-start, чтобы раздел .vectors находился в 0x00000000, и по-прежнему использовать -Ttext-сегмент, чтобы заставить текстовый сегмент / текстовый сегмент находиться в 0x20002000.
example2.s:
.cpu cortex-m3
.thumb
.syntax unified
.global Reset_Handler
.equ StackTop, 0x1000
.section .vectors
.word StackTop
.word Reset_Handler
.section .text
Reset_Handler:
b.
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example2.o -c example2.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler --section-start=.vectors=0x00000000 -Ttext-segment=0x20002000 -Map=example2.map -o example2.elf example2.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld: warning: address of `text-segment' isn't multiple of maximum page size
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d -j .vectors -j .text -d example2.elf
example2.elf: file format elf32-littlearm
Disassembly of section .vectors:
00000000 <.vectors>:
0: 00001000 .word 0x00001000
4: 20002000 .word 0x20002000
Disassembly of section .text:
20002000 <Reset_Handler>:
20002000: e7fe b.n 20002000 <Reset_Handler>
.end
Таблица векторов по-прежнему расположена в правильном месте памяти, но код теперь находится по адресу 0x20002000.
Чтобы описать точные изменения, необходимые в используемом вами сценарии компоновщикадля достижения того же результата мне нужно будет увидеть его содержание.