avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x0


From: Senthil Kumar Selvaraj
Subject: Re: [avr-gcc-list] uint8_t SRAM variable for ATmega328p allocated at 0x060 (instead of 0x0100) in avr-gcc 4.6.2, 7.3.2
Date: Thu, 18 Apr 2013 20:36:16 +0530
User-agent: Mutt/1.5.21 (2010-09-15)

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]