When linking for the AVR ATMega88 the gcc driver adds an option -Tdata=0x800100 to ld that makes it impossible to move the .data section to a different location. For example, trying to reserve some SRAM for a bootloader with
avr-gcc -g -Wall -Os -mcall-prologues -mmcu=atmega88 -Wl,-Map,main.map,--section-start,.data=0x800200 -o main.elf main.o GCC calls ld as following: /usr/lib/gcc/avr/4.1.0/../../../../avr/bin/ld -m avr4 -Tdata 0x800100 -o main.elf /usr/lib/gcc/avr/4.1.0/../../../../avr/lib/avr4/crtm88.o -L/usr/lib/gcc/avr/4.1.0/avr4 -L/usr/lib/gcc/avr/4.1.0/avr4 -L/usr/lib/gcc/avr/4.1.0/../../../../avr/lib/avr4 -Map main.map --section-start .data=0x800200 main.o -lgcc -lc -lgcc and in main.map we see that .data is still at default location: .data 0x00800100 0x78 load address 0x00000802 When run with -mmcu=atmega8, ld is run correctly with /usr/lib/gcc/avr/4.1.0/../../../../avr/bin/ld -m avr4 -o main.elf /usr/lib/gcc/avr/4.1.0/../../../../avr/lib/avr4/crtm8.o -L/usr/lib/gcc/avr/4.1.0/avr4 -L/usr/lib/gcc/avr/4.1.0/avr4 -L/usr/lib/gcc/avr/4.1.0/../../../../avr/lib/avr4 -Map main.map --section-start .data=0x800200 main.o -lgcc -lc -lgcc -- Summary: Section .data cannot be moved with -mmcu=atmega88 Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: driver AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: e9fritte at etek dot chalmers dot se GCC build triplet: i486-linux-gnu GCC host triplet: i486-linux-gnu GCC target triplet: avr http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30417