Перейти к содержанию
    

Помогите найти секцию

Доброго дня.

 

Исходные данные:

- Кусок скрипта линкера

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

 

Подскажите из-за чего происходит такая фигня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. на первый взгляд скрипты адекваты.

2. в elf файле как Вы говорите секция с векторами есть.

3. в бинарнике ее нет.

 

делаем предварительное заключение - скриптт линкера не виноват, еслиб он - то тогдабы и в elf'е косяг был

были у меня траблы с objcopy - выдавал бинать ровно 2Гб независимо от содержания elf.

попробуте так

objcopy -O elf32-littlearm -S _flash.elf flash.bin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробуте так

objcopy -O elf32-littlearm -S _flash.elf flash.bin

Опять фигня получается. Теперь в бинарнике в начале появилось 160 байт мусора. А затем с адреса 0х1000A0 идут коды команд ResetHandler.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а дайте мне cstartup.o lowlevel.o syscalls.o main.o, попробую руками .. поглядеть че происходит.

 

ну и как вариант взять мой пакет тулсов и ими собрать. посмотреть что выйдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а дайте мне cstartup.o lowlevel.o syscalls.o main.o, попробую руками .. поглядеть че происходит.

 

ну и как вариант взять мой пакет тулсов и ими собрать. посмотреть что выйдет.

Архив проекта.

LOADER.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Могу предложить такую модификацию:

.section .vectors, "ax"
.arm
.....
/*------------------------------------------------------------------------------
*- Function             : reset_handler
*------------------------------------------------------------------------------*/
.section .reset_handler, "ax"
reset_handler:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Могу предложить такую модификацию:
.section .vectors, "ax"

Так работает. Спасибо.

 

В целях повышения образованности, что означает параметр "ax"? И почему без него не работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В целях повышения образованности, что означает параметр "ax"?
allocatable, executable. Соответственно, выходные секции получают эти же атрибуты. А уже по этим атрибутам, видимо, objcopy решает, что включать в выходной hex. Секция .text и ее производные (.text.*) имеет такие атрибуты по умолчанию. Аналогично с .data, .bss

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...