On Thu, Apr 18, 2013 at 10:41:26AM -0400, Kirill Shklovsky wrote: > > Could you pass -v and -Wl,--verbose to the link command line as well and > > show us the output? That'll tell us if avr-gcc passed the right VMA for > > .data, and will also print the linker script used, so we can see if > > you ran into the binutils bug JW mentioned. >
Yes, you ran into the binutils bug - the linker script is missing the KEEP directive for *.data. If your program does not have anything that goes into .data (non-zero initialized globals and static locals), then this bug gets exposed. This has already been fixed in binutils mainline, but if you're ok with tweaking the linker script, Johann's fix is just a single line change. .data : AT (ADDR (.text) + SIZEOF (.text)) { PROVIDE (__data_start = .) ; - *(.data) + KEEP(*(.data)) in the file /usr/local/avr/avr/bin/../lib/ldscripts/avr5.x. Or copy the original script over, make the change and pass it along to the linker. If you work with devices from other architectures, then all the linker scripts in that directory would need to be changed. Johann's fix is at http://sourceware.org/bugzilla/attachment.cgi?id=6417&action=diff for your reference. Regards Senthil > $ /usr/local/avr/bin/avr-gcc > -Wl,--gc-sections,-Map,obj/testVolatile.elf.map -mmcu=atmega328 > /usr/local/avr/avr/lib/libm.a -o obj/testVolatile.elf obj/main.o -v > -Wl,--verbose -lm > Using built-in specs. > COLLECT_GCC=/usr/local/avr/bin/avr-gcc > COLLECT_LTO_WRAPPER=/usr/local/avr/libexec/gcc/avr/4.7.3/lto-wrapper.exe > Target: avr > Configured with: ../configure --prefix=/usr/local/avr --target=avr > --enable-languages=c,c++ --disable-nls --disable-libssp --with-dwarf2 > Thread model: single > gcc version 4.7.3 (GCC) > COMPILER_PATH=/usr/local/avr/libexec/gcc/avr/4.7.3/:/usr/local/avr/libexec/gcc/avr/4.7.3/:/usr/local/avr/libexec/gcc/avr/:/usr/local/avr/lib/gcc/avr/4.7.3/:/usr/local/avr/lib/gcc/avr/:/usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/bin/ > LIBRARY_PATH=/usr/local/avr/lib/gcc/avr/4.7.3/avr5/:/usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/:/usr/local/avr/lib/gcc/avr/4.7.3/:/usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/ > COLLECT_GCC_OPTIONS='-mmcu=atmega328' '-o' 'obj/testVolatile.elf' '-v' > /usr/local/avr/libexec/gcc/avr/4.7.3/collect2.exe -m avr5 -Tdata > 0x800100 -o obj/testVolatile.elf > /usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/crtm328.o > -L/usr/local/avr/lib/gcc/avr/4.7.3/avr5 > -L/usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5 > -L/usr/local/avr/lib/gcc/avr/4.7.3 > -L/usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib --gc-sections > -Map obj/testVolatile.elf.map /usr/local/avr/avr/lib/libm.a obj/main.o > --verbose -lm -lgcc -lc -lgcc > GNU ld (GNU Binutils) 2.22 > Supported emulations: > avr2 > avr1 > avr25 > avr3 > avr31 > avr35 > avr4 > avr5 > avr51 > avr6 > avrxmega1 > avrxmega2 > avrxmega3 > avrxmega4 > avrxmega5 > avrxmega6 > avrxmega7 > opened script file /usr/local/avr/avr/bin/../lib/ldscripts/avr5.x > using external linker script: > ================================================== > /* Default linker script, for normal executables */ > OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") > OUTPUT_ARCH(avr:5) > MEMORY > { > text (rx) : ORIGIN = 0, LENGTH = 128K > data (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0 > eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 64K > fuse (rw!x) : ORIGIN = 0x820000, LENGTH = 1K > lock (rw!x) : ORIGIN = 0x830000, LENGTH = 1K > signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K > } > SECTIONS > { > /* Read-only sections, merged into text segment: */ > .hash : { *(.hash) } > .dynsym : { *(.dynsym) } > .dynstr : { *(.dynstr) } > .gnu.version : { *(.gnu.version) } > .gnu.version_d : { *(.gnu.version_d) } > .gnu.version_r : { *(.gnu.version_r) } > .rel.init : { *(.rel.init) } > .rela.init : { *(.rela.init) } > .rel.text : > { > *(.rel.text) > *(.rel.text.*) > *(.rel.gnu.linkonce.t*) > } > .rela.text : > { > *(.rela.text) > *(.rela.text.*) > *(.rela.gnu.linkonce.t*) > } > .rel.fini : { *(.rel.fini) } > .rela.fini : { *(.rela.fini) } > .rel.rodata : > { > *(.rel.rodata) > *(.rel.rodata.*) > *(.rel.gnu.linkonce.r*) > } > .rela.rodata : > { > *(.rela.rodata) > *(.rela.rodata.*) > *(.rela.gnu.linkonce.r*) > } > .rel.data : > { > *(.rel.data) > *(.rel.data.*) > *(.rel.gnu.linkonce.d*) > } > .rela.data : > { > *(.rela.data) > *(.rela.data.*) > *(.rela.gnu.linkonce.d*) > } > .rel.ctors : { *(.rel.ctors) } > .rela.ctors : { *(.rela.ctors) } > .rel.dtors : { *(.rel.dtors) } > .rela.dtors : { *(.rela.dtors) } > .rel.got : { *(.rel.got) } > .rela.got : { *(.rela.got) } > .rel.bss : { *(.rel.bss) } > .rela.bss : { *(.rela.bss) } > .rel.plt : { *(.rel.plt) } > .rela.plt : { *(.rela.plt) } > /* Internal text space or external memory. */ > .text : > { > *(.vectors) > KEEP(*(.vectors)) > /* For data that needs to reside in the lower 64k of progmem. */ > *(.progmem.gcc*) > *(.progmem*) > . = ALIGN(2); > __trampolines_start = . ; > /* The jump trampolines for the 16-bit limited relocs will reside here. > */ > *(.trampolines) > *(.trampolines*) > __trampolines_end = . ; > /* For future tablejump instruction arrays for 3 byte pc devices. > We don't relax jump/call instructions within these sections. */ > *(.jumptables) > *(.jumptables*) > /* For code that needs to reside in the lower 128k progmem. */ > *(.lowtext) > *(.lowtext*) > __ctors_start = . ; > *(.ctors) > __ctors_end = . ; > __dtors_start = . ; > *(.dtors) > __dtors_end = . ; > KEEP(SORT(*)(.ctors)) > KEEP(SORT(*)(.dtors)) > /* From this point on, we don't bother about wether the insns are > below or above the 16 bits boundary. */ > *(.init0) /* Start here after reset. */ > KEEP (*(.init0)) > *(.init1) > KEEP (*(.init1)) > *(.init2) /* Clear __zero_reg__, set up stack pointer. */ > KEEP (*(.init2)) > *(.init3) > KEEP (*(.init3)) > *(.init4) /* Initialize data and BSS. */ > KEEP (*(.init4)) > *(.init5) > KEEP (*(.init5)) > *(.init6) /* C++ constructors. */ > KEEP (*(.init6)) > *(.init7) > KEEP (*(.init7)) > *(.init8) > KEEP (*(.init8)) > *(.init9) /* Call main(). */ > KEEP (*(.init9)) > *(.text) > . = ALIGN(2); > *(.text.*) > . = ALIGN(2); > *(.fini9) /* _exit() starts here. */ > KEEP (*(.fini9)) > *(.fini8) > KEEP (*(.fini8)) > *(.fini7) > KEEP (*(.fini7)) > *(.fini6) /* C++ destructors. */ > KEEP (*(.fini6)) > *(.fini5) > KEEP (*(.fini5)) > *(.fini4) > KEEP (*(.fini4)) > *(.fini3) > KEEP (*(.fini3)) > *(.fini2) > KEEP (*(.fini2)) > *(.fini1) > KEEP (*(.fini1)) > *(.fini0) /* Infinite loop after program termination. */ > KEEP (*(.fini0)) > _etext = . ; > } > text > .data : AT (ADDR (.text) + SIZEOF (.text)) > { > PROVIDE (__data_start = .) ; > *(.data) > *(.data*) > *(.rodata) /* We need to include .rodata here if gcc is used */ > *(.rodata*) /* with -fdata-sections. */ > *(.gnu.linkonce.d*) > . = ALIGN(2); > _edata = . ; > PROVIDE (__data_end = .) ; > } > data > .bss : AT (ADDR (.bss)) > { > PROVIDE (__bss_start = .) ; > *(.bss) > *(.bss*) > *(COMMON) > PROVIDE (__bss_end = .) ; > } > data > __data_load_start = LOADADDR(.data); > __data_load_end = __data_load_start + SIZEOF(.data); > /* Global data not cleared after reset. */ > .noinit : > { > PROVIDE (__noinit_start = .) ; > *(.noinit*) > PROVIDE (__noinit_end = .) ; > _end = . ; > PROVIDE (__heap_start = .) ; > } > data > .eeprom : > { > *(.eeprom*) > __eeprom_end = . ; > } > eeprom > .fuse : > { > KEEP(*(.fuse)) > KEEP(*(.lfuse)) > KEEP(*(.hfuse)) > KEEP(*(.efuse)) > } > fuse > .lock : > { > KEEP(*(.lock*)) > } > lock > .signature : > { > KEEP(*(.signature*)) > } > signature > /* Stabs debugging sections. */ > .stab 0 : { *(.stab) } > .stabstr 0 : { *(.stabstr) } > .stab.excl 0 : { *(.stab.excl) } > .stab.exclstr 0 : { *(.stab.exclstr) } > .stab.index 0 : { *(.stab.index) } > .stab.indexstr 0 : { *(.stab.indexstr) } > .comment 0 : { *(.comment) } > /* DWARF debug sections. > Symbols in the DWARF debugging sections are relative to the beginning > of the section so we begin them at 0. */ > /* DWARF 1 */ > .debug 0 : { *(.debug) } > .line 0 : { *(.line) } > /* GNU DWARF 1 extensions */ > .debug_srcinfo 0 : { *(.debug_srcinfo) } > .debug_sfnames 0 : { *(.debug_sfnames) } > /* DWARF 1.1 and DWARF 2 */ > .debug_aranges 0 : { *(.debug_aranges) } > .debug_pubnames 0 : { *(.debug_pubnames) } > /* DWARF 2 */ > .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } > .debug_abbrev 0 : { *(.debug_abbrev) } > .debug_line 0 : { *(.debug_line) } > .debug_frame 0 : { *(.debug_frame) } > .debug_str 0 : { *(.debug_str) } > .debug_loc 0 : { *(.debug_loc) } > .debug_macinfo 0 : { *(.debug_macinfo) } > } > > ================================================== > attempt to open > /usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/crtm328.o > succeeded > /usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/crtm328.o > attempt to open /usr/local/avr/avr/lib/libm.a succeeded > attempt to open obj/main.o succeeded > obj/main.o > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libm.so failed > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libm.a failed > attempt to open > /usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/libm.so > failed > attempt to open > /usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/libm.a > succeeded > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libgcc.so failed > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libgcc.a succeeded > (/usr/local/avr/lib/gcc/avr/4.7.3/avr5/libgcc.a)_exit.o > (/usr/local/avr/lib/gcc/avr/4.7.3/avr5/libgcc.a)_clear_bss.o > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libc.so failed > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libc.a failed > attempt to open > /usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/libc.so > failed > attempt to open > /usr/local/avr/lib/gcc/avr/4.7.3/../../../../avr/lib/avr5/libc.a > succeeded > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libgcc.so failed > attempt to open /usr/local/avr/lib/gcc/avr/4.7.3/avr5/libgcc.a succeeded _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-gcc-list