Troll 0 5 мая, 2009 Опубликовано 5 мая, 2009 · Жалоба Доброго дня. Исходные данные: - Кусок скрипта линкера 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 - кусок стартапа: .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 файле секция есть, а здесь...) :unsure: . То есть сам бинарник начинается с кода команды "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 Подскажите из-за чего происходит такая фигня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 5 мая, 2009 Опубликовано 5 мая, 2009 · Жалоба 1. на первый взгляд скрипты адекваты. 2. в elf файле как Вы говорите секция с векторами есть. 3. в бинарнике ее нет. делаем предварительное заключение - скриптт линкера не виноват, еслиб он - то тогдабы и в elf'е косяг был были у меня траблы с objcopy - выдавал бинать ровно 2Гб независимо от содержания elf. попробуте так objcopy -O elf32-littlearm -S _flash.elf flash.bin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Troll 0 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба попробуте так objcopy -O elf32-littlearm -S _flash.elf flash.bin Опять фигня получается. Теперь в бинарнике в начале появилось 160 байт мусора. А затем с адреса 0х1000A0 идут коды команд ResetHandler. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба а дайте мне cstartup.o lowlevel.o syscalls.o main.o, попробую руками .. поглядеть че происходит. ну и как вариант взять мой пакет тулсов и ими собрать. посмотреть что выйдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Troll 0 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба а дайте мне cstartup.o lowlevel.o syscalls.o main.o, попробую руками .. поглядеть че происходит. ну и как вариант взять мой пакет тулсов и ими собрать. посмотреть что выйдет. Архив проекта. LOADER.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба Могу предложить такую модификацию: .section .vectors, "ax" .arm ..... /*------------------------------------------------------------------------------ *- Function : reset_handler *------------------------------------------------------------------------------*/ .section .reset_handler, "ax" reset_handler: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Troll 0 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба Могу предложить такую модификацию:.section .vectors, "ax" Так работает. Спасибо. В целях повышения образованности, что означает параметр "ax"? И почему без него не работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба В целях повышения образованности, что означает параметр "ax"? allocatable, executable. Соответственно, выходные секции получают эти же атрибуты. А уже по этим атрибутам, видимо, objcopy решает, что включать в выходной hex. Секция .text и ее производные (.text.*) имеет такие атрибуты по умолчанию. Аналогично с .data, .bss Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Troll 0 6 мая, 2009 Опубликовано 6 мая, 2009 · Жалоба Всем большое спасибо за помощь. :a14: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться