Jump to content

    
Sign in to follow this  
dimka76

objcopy выдает ошибку

Recommended Posts

Здравствуйте.

Нашел инструкцию как использовать компилятор для MIPS от Imagination Technologies для микроконтроллеров PIC32.

Вот ссылка на инструкцию

https://evosyn.com/pic32img.html

Примеры взял с этого же сайте

Но при сборке проекта, точнее при создания выходного файла для прошивки МК

выдает следующую ошибку

f:/mips-mti-elf/2016.05-03/bin/mips-mti-elf-objcopy --change-section-lma .bootflash-0xa0000000 --change-section-lma .exception_vector-0x80000000 --change-section-lma .text-0x80000000 --change-section-lma .init-0x80000000 --change-section-lma .fini-0x80000000 --change-section-lma .eh_frame-0x80000000 --change-section-lma .jcr-0x80000000 --change-section-lma .ctors-0x80000000 --change-section-lma .dtors-0x80000000 --change-section-lma .rodata-0x80000000 --change-section-lma .data-0x80000000 --change-section-lma .bss-0x80000000 --change-section-lma .startdata-0x80000000 bin/led_flash.elf bin/led_flash_physical.elf
objcopy -O ihex bin/led_flash_physical.elf bin/led_flash_pickit.hex
BFD: bin/led_flash_pickit.hex: address 0xffffffff9d002be0 out of range for Intel Hex file
objcopy:bin/led_flash_pickit.hex: Bad value
make: *** [Makefile:75: all] Error 1

 

Также прикрепляю файлы скрипта линкера и собственно Makefile.

Помогите пожалуйста исправить ошибку.

Makefile

pic32mx2xx_uhi.ld

Share this post


Link to post
Share on other sites

Сравнительно недавно gcc стал 64-битным внутри. Во всяком случае с каких-то пор адреса в листингах стали 64-битными даже для 8- и 32-битных целевых платформ. Похоже, этот магическй  адрес получается вычитанием чего-то из нуля и пока числа были 32-битными, результат попадал в адресное пространство. Вам нужно заставить компоновщик (линкер) генерить .map, в этом файле найти получившийся адрес 0xffffffff9d002be0, посмотреть, при сборке какой секции он получается и уже дальше искать то самое вычитание и накладывать маску 0xFFFFFFFF на результат. Я бы делал так.

Share this post


Link to post
Share on other sites

В map фале адреса 0xffffffff9d002be0 нет. Но в нем все адреса действительно 64-ех битные. 

Quote

.MIPS.abiflags  0x000000009d002be0       0x18
                0x000000009d002be0                __MIPS_abiflags_start = .
 *(.MIPS.abiflags)
 .MIPS.abiflags
                0x000000009d002be0       0x18 f:/mips-mti-elf/2016.05-03/bin/../lib/gcc/mips-mti-elf/4.9.2/../../../../mips-mti-elf/lib/mipsel-r2-soft-newlib/lib\crt0.o
                0x000000009d002bf8                __MIPS_abiflags_end = .

Но после работы компоновщика производится еще и преобразование виртуальных адресов в физические, чтобы программатор мог правильно разместить прошивку во FLASH микроконтроллера.

Quote

If you are using a PICkit or similar Microchip inspired tool to upload object code to your MCU, you will need to convert the virtual addresses specified in the elf generated by the Codescape toolchain to physical ones. This can be done using objcpy.

 

Это производится следующим образом

objcpy --change-section-lma .lowerbootflashalias-0xA0000000 \
       --change-section-lma .bootflash1-0xA0000000 \
       --change-section-lma .bootflash2-0xA0000000 \
       --change-section-lma .exception_vector-0x80000000 \
       --change-section-lma .text-0x80000000 \
       --change-section-lma .init-0x80000000 \
       --change-section-lma .fini-0x80000000 \
       --change-section-lma .eh_frame-0x80000000 \
       --change-section-lma .jcr-0x80000000 \
       --change-section-lma .ctors-0x80000000 \
       --change-section-lma .dtors-0x80000000 \
       --change-section-lma .rodata-0x80000000 \
       --change-section-lma .data-0x80000000 \
       --change-section-lma .bss-0x80000000 \
       --change-section-lma .startdata-0x80000000 \
       your.elf your_physical.elf

 

Может быть утилита mips-mti-elf-objcopy как раз и портит адреса ?

Пробовал и x86 и х64 версии компилятора. Также пробовал одну из старых (трехлетней давности) версий компилятора.

Во всех случаях результат одинаково отрицательный.

Share this post


Link to post
Share on other sites

Я не нашел в скрипте компоновщика секций .lowerbootflashalias, .bootflash1, .bootflash2. Остальные вроде как должны иметь адреса больше 0x9D000000 и при вычитании 0x80000000 заема происходить не должно. Я бы убрал все --change-section-lma и добавлял по одной. На какой споткнется - ту секцию в .map и смотреть.

 

Share this post


Link to post
Share on other sites
objcpy --change-section-lma .lowerbootflashalias-0xA0000000 \
       --change-section-lma .bootflash1-0xA0000000 \
       --change-section-lma .bootflash2-0xA0000000 \
..............
.............

Это приведено лишь на сайте с описанием, ссылку на который я приводил в первом сообщении.

На самом деле, в Makefile из примера с того же сайта, эти строки отсутствуют.

Вот как выглядят эти строки в Makefile из примера.

OBJCOPY_TO_PHY := --change-section-lma .bootflash-0xa0000000
OBJCOPY_TO_PHY += --change-section-lma .exception_vector-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .text-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .init-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .fini-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .eh_frame-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .jcr-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .ctors-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .dtors-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .rodata-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .data-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .bss-0x80000000
OBJCOPY_TO_PHY += --change-section-lma .startdata-0x80000000  

 

Share this post


Link to post
Share on other sites

Убрал вообще все --change-section-lma. Закоментировал их

OBJCOPY_TO_PHY :=
#OBJCOPY_TO_PHY := --change-section-lma .bootflash-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .exception_vector-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .text-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .init-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .fini-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .eh_frame-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .jcr-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .ctors-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .dtors-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .rodata-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .data-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .bss-0x80000000
#OBJCOPY_TO_PHY += --change-section-lma .startdata-0x80000000

И все равно та же ошибка остается.

Share this post


Link to post
Share on other sites
13 минут назад, dimka76 сказал:

output.map

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

Share this post


Link to post
Share on other sites

Хочу заметить, что автор работал в Linux, я в Windows.

И компилятор должен быть mips-mti-elf, а не mips-img-elf.

Еще я провел такой эксперимент.

mips-mti-elf-objcopy заменил на objcopy из состава компилятора xc32 от Microchip. И ошибка пропала, все проходит успешно.

Share this post


Link to post
Share on other sites
1 час назад, dimka76 сказал:

И компилятор должен быть mips-mti-elf, а не mips-img-elf.

Блин, предупреждать надо было...

1 час назад, dimka76 сказал:

Еще я провел такой эксперимент.

Так что, не искать?

Share this post


Link to post
Share on other sites
22 minutes ago, Сергей Борщ said:

Так что, не искать?

Вообще, хорошо бы было разобраться. Если вас не затруднит конечно.

А то собирать компилятор по кускам из разных мест как-то не красиво.

 

https://codescape.mips.com/components/toolchain/2018.09-03/downloads.html

 

 

image.png.a6f64027c1ac1765d078300c02be4bd5.png

Share this post


Link to post
Share on other sites
19 минут назад, dimka76 сказал:

Вообще, хорошо бы было разобраться. 

Под линухом собралось без единого предупреждения. Может вам пора менять систему? :blush:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this