Disassembly of section .text:
00000000 <__ctors_end>:
0: 12 c0 rjmp .+36 ; 0x26 <__init>
// Тут идет таблица прерываний...
00000026 <__init>:
26: 11 24 eor r1, r1
28: 1f be out 0x3f, r1 ; 63
2a: cf e5 ldi r28, 0x5F ; 95
2c: d4 e0 ldi r29, 0x04 ; 4
2e: de bf out 0x3e, r29 ; 62
30: cd bf out 0x3d, r28 ; 61
32: 02 d0 rcall .+4 ; 0x38 <main>
avr-gcc -mmcu=atmega8 -Xassembler -ggdb -o bin\Test.o test.S
avr-gcc -g -mmcu=avr4 -o bin\Test.elf bin\Test.o
avr-objcopy -j .text -j .data -O ihex bin\Test.elf bin\Test.hex
avrdude -p atmega8 -c usbasp -U flash:w:bin\Test.hex
#include <avr/io.h>
// ================= Секция SRAM =================
.section .data
variable: .byte 0xff
// ================= Секция FLASH ================
.section .text
.global main
main: // Устанавливаем PORTD на вывод.
ldi r16, 0xff
out _SFR_IO_ADDR(DDRD), r16
// Все выводы PORTD устанавливаем в ноль.
clr r16
out _SFR_IO_ADDR(PORTD), r16
// Загружаем из SRAM значение, лежащее по адресу variable.
// Ожидаем, что все выводы порта D примут значение 1...
lds r16, variable
out _SFR_IO_ADDR(PORTD), r16
// ... но этого не происходит.
rjmp while
// Бесконечный цикл.
while: rjmp while
38: 0f ef ldi r16, 0xFF ; 255
3a: 01 bb out 0x11, r16 ; 17
3c: 00 27 eor r16, r16
3e: 02 bb out 0x12, r16 ; 18
40: 00 91 60 00 lds r16, 0x0060 ; 0x800060 <__EEPROM_REGION_LENGTH__+0x7f0060>
44: 02 bb out 0x12, r16 ; 18
46: 00 c0 rjmp .+0 ; 0x48 <while>
Возможно, gcc так компилирует код на Си.
С этим все впорядке - это архитектура процессора. Я заменил на atmega8, и добавил -c при создании файла .o - результат не изменился. В map файле это хорошо видно - все библиотеки подгружаются из /lib/gcc/avr/5.4.0/../../../../avr/lib/avr4/. В том числе и библиотека libgcc.a, которая, если верить документации, и должна в секции .init4 подгружать данные в SRAM.
Спасибо за Ваши ответы, благодаря им смог докопаться до истины. Для того, чтобы компилятор добавил процедуру __do_copy_data, ее надо явно объявить:
.global __do_copy_data
Тогда компилятор добавит код заполнения данных в SRAM из Flash, о котором Вы писали ранее.