пʼятниця, 19 січня 2018 р.

Прикрий баг в avt-gcc *** buffer overflow detected ***


 Якщо при компіляції проекту AVR avr-gcc видає подібну помилку, читайте далі, як її вирішити.

Linking: main.elf
avr-gcc -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=16000000UL  -DVARIANT= -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o uart/uart.o timer.o --output main.elf -Wl,-Map=main.map,--cref     -lm
*** buffer overflow detected ***: /usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fcf38d007e5]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x7fcf38da215c]
/lib/x86_64-linux-gnu/libc.so.6(+0x117160)[0x7fcf38da0160]
/lib/x86_64-linux-gnu/libc.so.6(+0x1166c9)[0x7fcf38d9f6c9]
/lib/x86_64-linux-gnu/libc.so.6(_IO_default_xsputn+0x80)[0x7fcf38d046b0]
/lib/x86_64-linux-gnu/libc.so.6(_IO_vfprintf+0xd1)[0x7fcf38cd6241]
/lib/x86_64-linux-gnu/libc.so.6(__vsprintf_chk+0x84)[0x7fcf38d9f754]
/lib/x86_64-linux-gnu/libc.so.6(__sprintf_chk+0x7d)[0x7fcf38d9f6ad]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x416c47]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x488174]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x411120]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x411ccf]
/usr/lib/gcc/avr/4.9.2/../../../avr/bin/ld[0x411b9f]

        ................................................

7fcf39475000-7fcf3947c000 r--s 00000000 08:06 1312076                    /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7fcf3947c000-7fcf3947d000 r--p 00025000 08:06 671634                     /lib/x86_64-linux-gnu/ld-2.23.so
7fcf3947d000-7fcf3947e000 rw-p 00026000 08:06 671634                     /lib/x86_64-linux-gnu/ld-2.23.so
7fcf3947e000-7fcf3947f000 rw-p 00000000 00:00 0
7ffeec276000-7ffeec298000 rw-p 00000000 00:00 0                          [stack]
7ffeec2a9000-7ffeec2ab000 r--p 00000000 00:00 0                          [vvar]
7ffeec2ab000-7ffeec2ad000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
collect2: error: ld terminated with signal 6 [Перервано], core dumped
Makefile:557: спроба виконання рецепта для мети «main.elf» зазнала невдачі
make: *** [main.elf] Помилка 1

Рішення я випадково знайшов і хочу поділитися, бо ніде не знайшов рішення. Потратив 2 дні, дійшов до компіляції всього avr-toolchain. Так і не добився нічого. Аж поки в одному з вікон терміналу тестовий проект скомпілювався. В іншому вікні цей же проект видавав цю помилку. І, як і всі подібні баги, все було до непристойного просто: в тому терміналі, де лінковка проходила успішно, я перед цим змінив мову середовища на англійську: LANG=en !!!

З-за цього прикрого бага я більше року мусив вести розробку на AVR в Windows, добре що була наклейка на ноутбуці, бо я проти піратського софту.

Може комусь знадобиться.

Баг цей, здається, з'явився починаючи з xUbuntu 16.04. Зараз в мене Mint Cinnamon 17.3,
avr-gcc 4.9.2+Atmel3.5.0-1
avr-libc 1.8.0+Atmel3.5.0-1
binutils-avr 2.25+Atmel3.5.0-2
gdb-avr 7.7-2build1

Навздогін: також можна скористатися рішенням, що я надибав вже після того як знайшов своє рішення, на якомусь болгарському форумі: http://www.linux-bg.org/forum/index.php?topic=47519.msg300845#msg300845

В файлі Makefile чи в відповідних налаштуваннях IDE видалити опцію -Map=$(TARGET).map, тобто наприклад рядок


#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref

замінити на:

#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file
LDFLAGS = -Wl,--cref