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

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

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

Нашел инструкцию как использовать компилятор для 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

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


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

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

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


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

В 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 версии компилятора. Также пробовал одну из старых (трехлетней давности) версий компилятора.

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

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


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

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

 

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


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

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  

 

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


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

Убрал вообще все --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

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

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


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

Прикрепите к сообщению .map целиком. Попробуем разобраться.

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


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

output.map

 

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

 

PIC32MX2XX_memory map.pdf

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


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

13 минут назад, dimka76 сказал:

output.map

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

22 minutes ago, Сергей Борщ said:

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

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

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

 

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

 

 

image.png.a6f64027c1ac1765d078300c02be4bd5.png

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


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

19 минут назад, dimka76 сказал:

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

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

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


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

Хочется вместо платного MpLab от Microchip попытаться освоить бесплатный инструмент )))

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


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

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

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

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

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

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

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

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

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

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