title: linker warning, changing start of section .stack by 4 bytes
body: <p>I use the arm-none-eabi gcc toolchain to compile code for an Atmel SAM4S microcontroller. The code works, but I get a few linker errors about changing start of section .stack and section .bss.</p>
  
  <p>This is the warnings I get:</p>
  
  <p><code>c:/program files (x86)/gnu tools arm embedded/4.9 2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .bss by 4 bytes
  c:/program files (x86)/gnu tools arm embedded/4.9 2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .stack by 4 bytes
  c:/program files (x86)/gnu tools arm embedded/4.9 2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .bss by 4 bytes
  c:/program files (x86)/gnu tools arm embedded/4.9 2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .stack by 4 bytes
  c:/program files (x86)/gnu tools arm embedded/4.9 2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .bss by 4 bytes
  c:/program files (x86)/gnu tools arm embedded/4.9 2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld.exe: warning: changing start of section .stack by 4 bytes</code></p>
  
  <p>After this, compilation completes successfully, and I can flash the code to the microcontroller and it works great.</p>
  
  <p>Should I worry about the warnings?</p>
  
  <p>Edit:
  This is my linker script. It is provided by Atmel, i.e., I don't fully understand everything. I tried to read up on the ALIGN command, but I'm still not quite sure what it does in this script. </p>
  
  <p>In my Makefile I have the LD flag <strong><em>--warn-section-align -Wl</em></strong>. If I remove it I don't get the warnings. Is this safe, provided the linker script?</p>
  
  <pre><code>OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  OUTPUT_ARCH(arm)
  SEARCH_DIR(.)
  
  /* Memory Spaces Definitions */
  MEMORY
  {
  rom (rx)  : ORIGIN = 0x00400000, LENGTH = 0x00080000 /* flash, 512K */
  ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 /* sram, 128K */
  }
  
  /* The stack size used by the application. NOTE: you need to adjust according to your application. */
  STACK_SIZE = 0x3000;
  
  /* Section Definitions */
  SECTIONS
  {
  .text :
  {
      . = ALIGN(4);
      _sfixed = .;
      KEEP(*(.vectors .vectors.*))
      *(.text .text.* .gnu.linkonce.t.*)
      *(.glue_7t) *(.glue_7)
      *(.rodata .rodata* .gnu.linkonce.r.*)
      *(.ARM.extab* .gnu.linkonce.armextab.*)
  
      /* Support C constructors, and C destructors in both user code
         and the C library. This also provides support for C++ code. */
      . = ALIGN(4);
      KEEP(*(.init))
      . = ALIGN(4);
      __preinit_array_start = .;
      KEEP (*(.preinit_array))
      __preinit_array_end = .;
  
      . = ALIGN(4);
      __init_array_start = .;
      KEEP (*(SORT(.init_array.*)))
      KEEP (*(.init_array))
      __init_array_end = .;
  
      . = ALIGN(0x4);
      KEEP (*crtbegin.o(.ctors))
      KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
      KEEP (*(SORT(.ctors.*)))
      KEEP (*crtend.o(.ctors))
  
      . = ALIGN(4);
      KEEP(*(.fini))
  
      . = ALIGN(4);
      __fini_array_start = .;
      KEEP (*(.fini_array))
      KEEP (*(SORT(.fini_array.*)))
      __fini_array_end = .;
  
      KEEP (*crtbegin.o(.dtors))
      KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
      KEEP (*(SORT(.dtors.*)))
      KEEP (*crtend.o(.dtors))
  
      . = ALIGN(4);
      _efixed = .;            /* End of text section */
  } &gt; rom
  
  /* .ARM.exidx is sorted, so has to go in its own output section.  */
  PROVIDE_HIDDEN (__exidx_start = .);
  .ARM.exidx :
  {
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
  } &gt; rom
  PROVIDE_HIDDEN (__exidx_end = .);
  
  . = ALIGN(4);
  _etext = .;
  
  .relocate : AT (_etext)
  {
      . = ALIGN(4);
      _srelocate = .;
      *(.ramfunc .ramfunc.*);
      *(.data .data.*);
      . = ALIGN(4);
      _erelocate = .;
  } &gt; ram
  
  /* .bss section which is used for uninitialized data */
  .bss (NOLOAD) :
  {
      . = ALIGN(4);
      _sbss = . ;
      _szero = .;
      *(.bss .bss.*)
      *(COMMON)
      . = ALIGN(4);
      _ebss = . ;
      _ezero = .;
  } &gt; ram
  
  /* stack section */
  .stack (NOLOAD):
  {
      . = ALIGN(8);
       _sstack = .;
      . = . + STACK_SIZE;
      . = ALIGN(8);
      _estack = .;
  } &gt; ram
  
  . = ALIGN(4);
  _end = . ;
  }
  </code></pre>