avr-ld: архитектура avr:51 входного файла `main.o' несовместима с выводом avr

Я пытался использовать этот код/руководство< /a> на ATmega1284p.

Проблема, с которой я сталкиваюсь, заключается в том, что компоновщик не работает, и после выполнения я получаю следующее сообщение об ошибке (код хорошо строится для ATmega88):

avr-ld  -o main.elf main.o  -g

avr-ld: avr:51 architecture of input file `main.o' is incompatible with avr output

Для информации

avr-gcc -v    
Using built-in specs.
    COLLECT_GCC=avr-gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.8.2/lto-wrapper
    Target: avr
    Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-libssp --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=avr
    Thread model: single

Полные инструкции по сборке

avr-gcc -std=c99 -g -Os -mmcu=atmega1284p -DF_CPU=8000000 -I. -DUART_BAUDRATE=57600 -Wstrict-prototypes -Wextra -ffunction-sections -fdata-sections -Wl,-gc-sections -o main.o -o main.o *.c 
avr-ld  -o main.elf main.o  -g
avr-objcopy -j .text -j .data -O ihex main.o main.hex
avr-size -C --mcu=atmega1284p main.elf

Вывод avr-objdump файла main.o

avr-objdump -f main.o

main.o:     Dateiformat elf32-avr
Architektur: avr:51, Flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
Startadresse 0x00000000

person Ragonz    schedule 24.07.2018    source источник


Ответы (1)


Существует обходной путь, позволяющий заставить avr-ld использовать скрипт компоновщика.

Обходной путь

Если avr-ld выдает ошибку:

avr-ld: avr:51 architecture of input file 'main.o' is incompatible with avr output

Необходимо добавить нужную архитектуру с опцией -m, например:

avr-ld  -o main.elf main.o  -g -mavr51

Если это не сработает, вы получите следующую ошибку:

avr-ld: cannot open linker script file ldscripts/avr51.xn: No such file or directory

Вы должны принудительно использовать правильный линкерскрипт с опцией -T:

avr-ld  -o main.elf main.o  -g -mavr51 -T /usr/lib/avr/ldscripts/avr51.xn

И линкер должен работать.

person Ragonz    schedule 25.07.2018