Доброго дня.
Исходные данные:
- Кусок скрипта линкера
CODE
ENTRY(_exception_vectors)
MEMORY
{
ROM (rx) : ORIGIN = 0x00100000, LENGTH = 0x00040000
RAM (rwx) : ORIGIN = 0x00200000, LENGTH = 0x00008000
REMAPED (rwx) : ORIGIN = 0x00000000, LENGTH = LENGTH(RAM)
}
SECTIONS
{
.vectors : {
KEEP(*(.vectors))
. = ALIGN(64);
} > REMAPED AT > ROM
.text : {
_stext = .;
KEEP(*(.reset_handler)) /* Startup code from .init-section */
...
_etext = . ;
} > ROM
- кусок стартапа:
CODE
.section .vectors
.arm
_exception_vectors:
LDR PC, ResetAddr /* Reset */
LDR PC, UndefAddr /* Undefined instruction */
LDR PC, SWIAddr /* Software interrupt */
LDR PC, PAbortAddr /* Prefetch abort */
LDR PC, DAbortAddr /* Data abort */
NOP /* Reserved */
LDR PC, IRQAddr /* IRQ interrupt */
LDR PC, FIQAddr /* FIQ interrupt */
ResetAddr:
.word ResetHandler
UndefAddr:
.word UndefHandler
SWIAddr:
.word SWIHandler
PAbortAddr:
.word PAbortHandler
DAbortAddr:
.word DAbortHandler
NOP
IRQAddr:
.word IRQHandler
FIQAddr:
.word FIQHandler
/*------------------------------------------------------------------------------
*- Function : reset_handler
*------------------------------------------------------------------------------*/
.section .text
reset_handler:
ResetHandler:
ldr pc, =_low_level_init
...
Все это компилится и собирается.
по map и dump файлам все нормально. Вначале 64 байта для векторов прерывания, затем начиная с 0х100040 идет первая команда после метки ResetHandler (вызов _low_level_init).
Проблема в том, что в бинарнике отсутствует секция векторов (в elf файле секция есть, а здесь...)

. То есть сам бинарник начинается с кода команды "ldr pc, =_low_level_init".
Линковка командой: arm-elf-gcc -nostartfiles -Wl,--cref -T elf32-littlearm.lds -lc -lgcc -Wl,-Map=mapfile -Wl,--verbose -n -o _flash.elf cstartup.o lowlevel.o syscalls.o main.o
Бинарник получаю командой: arm-elf-objcopy _flash.elf -O binary _flash.bin
GCC 4.2.2 BinUtils 2.18
Подскажите из-за чего происходит такая фигня.