EmbeddedRelated.com
Forums

stack, srt0.S and *.ld files in WinARM

Started by Grzegorz Reszka March 1, 2006
Hello,
  I`m newbie in ARM uC and I wanted to write in WinARM a simple  (transition of
LED) programme on LPC2138. But during linking (when I  use RUN_MODE=ROM_RUN,
that means LPC2138-ROM.ld file) it returns  following error:
  
  Linking: LED.elf
  arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I. -gdwarf-2 
-DROM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit   -Wpointer-arith
-Wswitch -Wredundant-decls -Wreturn-type -Wshadow  -Wunused -Wa,-adhlns=crt0.lst
  -MD -MP -MF .dep/LED.elf.d  crt0.o    LED.o      --output  LED.elf
-nostartfiles -Wl,-Map=LED.map,--cref -lc  -lm -lc  -lgcc  -lstdc++
-TLPC2138-ROM.ld
  c:\winarm\bin\..\lib\gcc\arm-elf\4.0.2\..\..\..\..\arm-elf\bin\ld.exe: 
address 0x600 of LED.elf section .stack is not within region RAM
  make.exe: *** [LED.elf] Error 1
  
  > Process Exit Code: 2
  > Time Taken: 00:02
	  I don`t understand why it wants to use the 0x600 size stack whilst the  size
of this stack is declared in LPC2138-ROM.ld file as 0x400:
  STACK_SIZE = 0x400;
  
  And when I change in Makefile RUN_MODE to RAM_RUN (LPC2138-RAM.ld file) I
receive following message:
  
  Linking: LED.elf
  arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I. -gdwarf-2 
-DRAM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit   -Wpointer-arith
-Wswitch -Wredundant-decls -Wreturn-type -Wshadow  -Wunused -Wa,-adhlns=crt0.lst
  -MD -MP -MF .dep/LED.elf.d  crt0.o    LED.o      --output  LED.elf
-nostartfiles -Wl,-Map=LED.map,--cref -lc  -lm -lc  -lgcc  -lstdc++
-TLPC2138-RAM.ld
  crt0.o: In function `abort':D:\ARMprogramy\LED/crt0.S:215: undefined
reference to `__bss_start'
  :D:\ARMprogramy\LED/crt0.S:215: undefined reference to `__bss_end__'
  :D:\ARMprogramy\LED/crt0.S:215: undefined reference to `__ctors_start__'
  :D:\ARMprogramy\LED/crt0.S:215: undefined reference to `__ctors_end__'
  make: *** [LED.elf] Error 1
  
  And also I don`t understand it - in line 215 of crt0.S is only this:
      b      .                          // loop until reset
  and it returns error about undefined refrence to: `__bss_start` ,
`__bss_end__' , etc.
  
  What should I do in this case? What should I change in my files which I
attached to this message?
  
  More over: Could somebody explain me for what str0.S, RAM.ld and ROM.ld  files
are needed exactly in ARM projects? Which parts of these files  are important? 
When should I use RAM.ld and when ROM.ld files? By  the way could somebody give
me those files which will be suitable for  LPC2138 uC?
  
  Thanks for every advice and response.
  
  Regards
  GR
  
__________________________________________________
 


	

An Engineer's Guide to the LPC2100 Series

--- In lpc2000@lpc2..., Grzegorz Reszka <grzegorz.reszka@...>
wrote:
>
> Hello,
>   I`m newbie in ARM uC and I wanted to write in WinARM a simple 
(transition of LED) programme on LPC2138. But during linking (when I 
use RUN_MODE=ROM_RUN, that means LPC2138-ROM.ld file) it returns 
following error:
>   
>   Linking: LED.elf
>   arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I.
-gdwarf-2  -DROM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit  
-Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow 
-Wunused -Wa,-adhlns=crt0.lst   -MD -MP -MF .dep/LED.elf.d  crt0.o   
LED.o      --output  LED.elf -nostartfiles -Wl,-Map=LED.map,--cref -lc
 -lm -lc  -lgcc  -lstdc++ -TLPC2138-ROM.ld
>  
c:\winarm\bin\..\lib\gcc\arm-elf\4.0.2\..\..\..\..\arm-elf\bin\ld.exe:
 address 0x600 of LED.elf section .stack is not within region RAM
>   make.exe: *** [LED.elf] Error 1
>   
>   > Process Exit Code: 2
>   > Time Taken: 00:02
>   
>   
>   I don`t understand why it wants to use the 0x600 size stack whilst
the  size of this stack is declared in
LPC2138-ROM.ld file as 0x400:
>   STACK_SIZE = 0x400;
>   
>   And when I change in Makefile RUN_MODE to RAM_RUN (LPC2138-RAM.ld
file) I receive following message:
>   
>   Linking: LED.elf
>   arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I.
-gdwarf-2  -DRAM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit  
-Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow 
-Wunused -Wa,-adhlns=crt0.lst   -MD -MP -MF .dep/LED.elf.d  crt0.o   
LED.o      --output  LED.elf -nostartfiles -Wl,-Map=LED.map,--cref -lc
 -lm -lc  -lgcc  -lstdc++ -TLPC2138-RAM.ld
>   crt0.o: In function
`abort':D:\ARMprogramy\LED/crt0.S:215:
undefined reference to `__bss_start'
>   :D:\ARMprogramy\LED/crt0.S:215: undefined
reference to `__bss_end__'
>   :D:\ARMprogramy\LED/crt0.S:215: undefined reference to
`__ctors_start__'
>   :D:\ARMprogramy\LED/crt0.S:215: undefined
reference to `__ctors_end__'
>   make: *** [LED.elf] Error 1
>   
>   And also I don`t understand it - in line 215 of crt0.S is only this:
>       b      .                          // loop until reset
>   and it returns error about undefined refrence to: `__bss_start` ,
`__bss_end__' , etc.
>   
>   What should I do in this case? What should I change in my files
which I attached to this message?
>   
>   More over: Could somebody explain me for what str0.S, RAM.ld and
ROM.ld  files are needed exactly in ARM projects? Which parts of these
files  are important?  When should I use RAM.ld and when ROM.ld files?
By  the way could somebody give me those files which will be suitable
for  LPC2138 uC?
>   
>   Thanks for every advice and response.
>   
>   Regards
>   GR
>   
> __________________________________________________
>  
> 
> 
>

Well, I can make a start on the problem.  Others will have more insight.

First of all, you use the ROM version of the linker script (that's
what the .ld file is) when you want to run out of flash memory.  You
use the RAM version when you want to run out of RAM.  You might want
to run out of RAM during debugging.  Or not...

Second, both of your .ld files are hosed, or so it seems.  Where did
you get them?

Third, this tutorial is the absolute best reference available for
starting with the ARM.  Later in the document there is some info for
the 2138, I believe.  Anyway, here it is:
http://www.olimex.com/dev/pdf/ARM%20Cross%20Development%20with%20Eclipse%20version%203.pdf

Here it is tiny: http://tinyurl.com/camje

You could pick a configuration and post your .ld file.  Someone may be
able to spot the problem quickly.

You can also wander over to www.olimex.com and paw through the LPC
2000 ARM boards.  There are blinking LED samples for each.

Richard
	
So, I tried to find some information about *.ld and crt0.S files in  many
places and actually I don`t remeber exactly where do they come  from (probably
from some other forum). Anyway, I use following files:
  
  /***********************************************************************/
  /*  ROM.ld:  Linker Script  File                                         */
  /***********************************************************************/
  ENTRY(_boot)
  STACK_SIZE = 0x400;
  
  /* Memory Definitions */
  MEMORY
  {
    ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512k
    RAM (rw) : ORIGIN = 0x40000000, LENGTH = 32k
  }
  
  /* Section Definitions */
  SECTIONS
  {
    /* first section is .text which is used for code */
    .text :
   {
       *crt0.o (.text)            /* Startup code */
       KEEP(*(.init))              /* Startup code from .init-section */
      *(.text .text.*)           /* remaining code */
      *(.gnu.linkonce.t.*)
      *(.glue_7)
      *(.glue_7t)
      *(.gcc_except_table)
       *(.rodata)                  /* read-only data (constants) */
      *(.rodata*)
      *(.gnu.linkonce.r.*)
   } > ROM
  
    /***** old: 
    .text :
    {
      *crt0.o (.text)            
       *(.text)                    
      *(.rodata)                 
      *(.rodata*)
      *(.glue_7)
      *(.glue_7t)
    } > ROM 
    /*****/
    . = ALIGN(4);
    
      /* .ctors .dtors are used for c++ constructors/destructors */
      /* added by Martin Thomas 4/2005 based on Anglia Design example */
      .ctors :
      {
          PROVIDE(__ctors_start__ = .);
          KEEP(*(SORT(.ctors.*)))
          KEEP(*(.ctors))
          PROVIDE(__ctors_end__ = .);
      } >ROM
      
      .dtors :
      {
          PROVIDE(__dtors_start__ = .); 
          KEEP(*(SORT(.dtors.*)))
          KEEP(*(.dtors))
          PROVIDE(__dtors_end__ = .);
      } >ROM
    
      . = ALIGN(4);
      /* mthomas - end */
     
    _etext = . ;
    PROVIDE (etext = .);
  
    /* .data section which is used for initialized data */
    .data : AT (_etext)
    {
      _data = .;
      *(.data)
      *(.data.*)
      *(.gnu.linkonce.d*)
      SORT(CONSTRUCTORS) /* mt 4/2005 */
      . = ALIGN(4);
      *(.fastrun) /* !!!! "RAM-Function" example */
    } > RAM
   
    . = ALIGN(4);
    _edata = . ;
    PROVIDE (edata = .);
  
    /* .bss section which is used for uninitialized data */
    .bss (NOLOAD) :
    {
      __bss_start = . ;
      __bss_start__ = . ;
      *(.bss)
      *(.gnu.linkonce.b*)
      *(COMMON)
      . = ALIGN(4);
    } > RAM
  
    . = ALIGN(4);
    __bss_end__ = . ;
    PROVIDE (__bss_end = .);
  
    .stack ALIGN(256) :
    {
      . += STACK_SIZE;
      PROVIDE (_stack = .);
    } > RAM
  
    _end = . ;
    PROVIDE (end = .);
  
    /* 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) }
    /* SGI/MIPS DWARF 2 extensions */
    .debug_weaknames 0 : { *(.debug_weaknames) }
    .debug_funcnames 0 : { *(.debug_funcnames) }
    .debug_typenames 0 : { *(.debug_typenames) }
    .debug_varnames  0 : { *(.debug_varnames) }
  }
	  /***********************************************************************/
  /*                                                                      */
  /*  RAM.ld:  Linker Script  File                                         */
  /*                                                                      */
  /***********************************************************************/
  ENTRY(_start)
  STACK_SIZE = 0x400;
  
  RAM_LIMIT = 0x40008000;
	  /* Memory Definitions */
  MEMORY
  {
       FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x80000      /* 512Kb of internal
FLASH */
       SRAM (rwx) : ORIGIN = 0x40000000, LENGTH = 0x8000 /* 32Kb of internal
SRAM */
  }
  
  /* Section Definitions */
  SECTIONS
  {
         /* first section is .text which is used for code */
         .text :
         {
           *crt0.o (.text)
            *(EXCLUDE_FILE(*crt0.o).text)          /* remaining code */
            *(.rodata)                              /*  read-only data
(constants) */
           *(.rodata*)
           *(.glue_7)
           *(.glue_7t)
         } > FLASH
  
       . = ALIGN(4);
       _etext = . ;
  
     /* .data section which is used for initialized data */
     .data  : AT (_etext)
     {
       _data = .;
       *(.data)
       . = ALIGN(4);
       _edata = .;
     } > SRAM
  
     /* .bss section which is used for uninitialized data */
     .bss (NOLOAD) :
     {
       _bss = . ;
       *(.bss)
       *(COMMON)
       . = ALIGN(4);
       _ebss = .;
     } > SRAM
  
  /*  .heap ALIGN(4) :*/
  /*  { */
  /*   _heap_begin = .;*/
  /*   *(.data_heap)*/
  /*  } > SRAM**/
  
     /*. += 0x4000;*/
  /*  _heap_end = .;*/
  
     . = RAM_LIMIT - 8 - 4 - 4 - 4 - 1024 - 1024;
     .stack ALIGN(4) :
     {
         _stack = .;
         . += 4;
         _undefined_stack = .;
  
         . += 4;
         _abort_stack = .;
  
         . += 4;
       _fiq_stack = .;
  
       . += 4;
       _svc_stack = .;
  
       . += 1024;
       _usr_stack = .;
  
       . += 1024;
       _irq_stack = .;
       _estack = .;
     } > SRAM
  
     _end = . ;
     PROVIDE (end = .);
  
     /* 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) }
     /* SGI/MIPS DWARF 2 extensions */
     .debug_weaknames 0 : { *(.debug_weaknames) }
     .debug_funcnames 0 : { *(.debug_funcnames) }
     .debug_typenames 0 : { *(.debug_typenames) }
     .debug_varnames  0 : { *(.debug_varnames) }
  }
	  /************************************
crt0.S************************************/
  
  /* 
   crt0.S for LPC2xxx
   - based on examples from R O Software
   - based on examples from newlib-lpc
   - based on an example from Anglia Designs
  
   collected and modified by Martin Thomas
  */
  
          .global  _etext                   // -> .data initial values in ROM
          .global  _data                    // -> .data area in RAM
          .global  _edata                   // end of .data area
          .global  __bss_start              // -> .bss area in RAM
          .global  __bss_end__              // end of .bss area
          .global  _stack                   // top of stack
  
  // Stack Sizes
          .set  UND_STACK_SIZE, 0x00000004
          .set  ABT_STACK_SIZE, 0x00000004
          .set  FIQ_STACK_SIZE, 0x00000004
          .set  IRQ_STACK_SIZE, 0X00000080
          .set  SVC_STACK_SIZE, 0x00000004
  
  // Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
          .set  MODE_USR,  0x10             // User Mode
          .set  MODE_FIQ,  0x11             // FIQ Mode
          .set  MODE_IRQ,  0x12             // IRQ Mode
          .set  MODE_SVC,  0x13             // Supervisor Mode
          .set  MODE_ABT,  0x17             // Abort Mode
          .set  MODE_UND,  0x1B             // Undefined Mode
          .set  MODE_SYS,  0x1F             // System Mode
  
          .equ  I_BIT,  0x80                // when I bit is set, IRQ is
disabled
          .equ  F_BIT,  0x40                // when F bit is set, FIQ is
disabled
  
          .text
      .arm
      .section .init, "ax"
  
          .code 32
          .align 2
  
          .global _boot
          .func   _boot
  _boot:
  
  // Runtime Interrupt Vectors
  // -------------------------
  Vectors:
          b      _start                     // reset - _start
          ldr    pc,_undf                   // undefined - _undf
          ldr    pc,_swi                    // SWI - _swi
          ldr    pc,_pabt                   // program abort - _pabt
          ldr    pc,_dabt                   // data abort - _dabt
           nop                              // reserved
          ldr    pc,[pc,#-0xFF0]            // IRQ - read the VIC
          ldr    pc,_fiq                    // FIQ - _fiq
  
  #if 0
  // Use this group for production
  _undf:  .word  _reset                     // undefined - _reset
  _swi:   .word  _reset                     // SWI - _reset
  _pabt:  .word  _reset                     // program abort - _reset
  _dabt:  .word  _reset                     // data abort - _reset
  _irq:   .word  _reset                     // IRQ - _reset
  _fiq:   .word  _reset                     // FIQ - _reset
  
  #else
  // Use this group for development
  _undf:  .word  __undf                     // undefined
  _swi:   .word  __swi                      // SWI
  _pabt:  .word  __pabt                     // program abort
  _dabt:  .word  __dabt                     // data abort
  _irq:   .word  __irq                      // IRQ
  _fiq:   .word  __fiq                      // FIQ
  
  __undf: b      .                          // undefined
  __swi:  b      .                          // SWI
  __pabt: b      .                          // program abort
  __dabt: b      .                          // data abort
  __irq:  b      .                          // IRQ
  __fiq:  b      .                          // FIQ
  #endif
          .size _boot, . - _boot
          .endfunc
	  // Setup the operating mode & stack.
  // ---------------------------------
          .global _start, start, _mainCRTStartup
          .func   _start
  
  _start:
  start:
  _mainCRTStartup:
  
  // Initialize Interrupt System
  // - Set stack location for each mode
  // - Leave in System Mode with Interrupts Disabled
  // -----------
          ldr   r0,=_stack
          msr   CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
          mov   sp,r0
          sub   r0,r0,#UND_STACK_SIZE
          msr   CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
          mov   sp,r0
          sub   r0,r0,#ABT_STACK_SIZE
          msr   CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
          mov   sp,r0
          sub   r0,r0,#FIQ_STACK_SIZE
          msr   CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
          mov   sp,r0
          sub   r0,r0,#IRQ_STACK_SIZE
          msr   CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
          mov   sp,r0
          sub   r0,r0,#SVC_STACK_SIZE
          msr   CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
          mov   sp,r0
  
  // Copy initialized data to its execution address in RAM
  // -----------------
  #ifdef ROM_RUN
          ldr    r1,=_etext                 // -> ROM data start
          ldr    r2,=_data                  // -> data start
          ldr    r3,=_edata                 // -> end of data
  1:      cmp    r2,r3                      // check if data to move
          ldrlo  r0,[r1],#4                 // copy it
          strlo r0,[r2],#4
          blo    1b                         // loop until done
  #endif
  // Clear .bss
  // ----------
          mov    r0,#0                      // get a zero
          ldr    r1,=__bss_start            // -> bss start
          ldr    r2,=__bss_end__            // -> bss end
  2:      cmp    r1,r2                      // check if data to clear
          strlo  r0,[r1],#4                 // clear 4 bytes
          blo    2b                         // loop until done
          
  /*
     Call C++ constructors (for objects in "global scope")
     ctor loop added by Martin Thomas 4/2005 
     based on a Anglia Design example-application for ST ARM
  */
  
          LDR     r0, =__ctors_start__
          LDR     r1, =__ctors_end__
  ctor_loop:
          CMP     r0, r1
          BEQ     ctor_end
          LDR     r2, [r0], #4
          STMFD     sp!, {r0-r1}
          MOV     lr, pc
          MOV     pc, r2
          LDMFD     sp!, {r0-r1}
          B         ctor_loop
  ctor_end:
  
  // Call main program: main(0)
  // --------------------------
          mov    r0,#0                      // no arguments (argc = 0)
          mov   r1,r0
          mov   r2,r0
          mov    fp,r0                      // null frame pointer
          mov    r7,r0                      // null frame pointer for thumb
          ldr   r10,=main
          mov   lr,pc
  
  /* Enter the C code, use BX instruction so as to never return */
  /* use BLX (?) main if you want to use c++ destructors below */
  
          bx     r10                        // enter main()
  
  /* "global object"-dtors are never called and it should not be 
     needed since there is no OS to exit to. */
  /* Call destructors */
  #        LDR        r0, =__dtors_start__
  #        LDR        r1, =__dtors_end__
  dtor_loop:
  #        CMP        r0, r1
  #        BEQ        dtor_end
  #        LDR        r2, [r0], #4
  #        STMFD    sp!, {r0-r1}
  #        MOV        lr, pc
  #        MOV        pc, r2
  #        LDMFD    sp!, {r0-r1}
  #        B        dtor_loop
  dtor_end:
     
          .size   _start, . - _start
          .endfunc
  
          .global _reset, reset, exit, abort
          .func   _reset
  _reset:
  reset:
  exit:
  abort:
  #if 0
  // Disable interrupts, then force a hardware reset by driving P23 low
  // -------------------------------
          mrs    r0,cpsr                    // get PSR
          orr    r0,r0,#I_BIT|F_BIT        // disable  IRQ and FIQ
          msr    cpsr,r0                    // set up status register
  
          ldr    r1,=(PS_BASE)              // PS Base Address
          ldr    r0,=(PS_PIO)               // PIO Module
          str    r0,[r1,#PS_PCER_OFF]      // enable its clock
          ldr    r1,=(PIO_BASE)             // PIO Base Address
          ldr    r0,=(1<<23)                // P23
          str    r0,[r1,#PIO_PER_OFF]      // make sure pin is  contolled by PIO
          str   r0,[r1,#PIO_CODR_OFF]     // set the pin low
          str    r0,[r1,#PIO_OER_OFF]      // make it an output
  #endif
          b      .                          // loop until reset
  
          .size _reset, . - _reset
          .endfunc
  
          .end
	  /************************Makefile*******************************/
  And my Makefile (if it`s necessary to solve my problem):
	  # Hey Emacs, this is a -*- makefile -*-
  #
  # WinARM template makefile 
  # by Martin Thomas, Kaiserslautern, Germany 
  # <eversmith@ever...>
  #
  # based on the WinAVR makefile written by Eric B. Weddington, Jg Wunsch, et
al.
  # Released to the Public Domain
  # Please read the make user manual!
  #
  #
  # On command line:
  #
  # make all = Make software.
  #
  # make clean = Clean out built project files.
  #
  # make program = Download the hex file to the device, using lpc21isp
  #
  # (TODO: make filename.s = Just compile filename.c into the assembler code
only)
  #
  # To rebuild project do "make clean" then "make all".
  #
  # Changelog:
  # - 17. Feb. 2005  - added thumb-interwork support (mth)
  # - 28. Apr. 2005  - added C++ support (mth)
  # - 29. Arp. 2005  - changed handling for lst-Filename (mth)
  #
  
  # MCU name and submodel
  MCU    = arm7tdmi-s
  #MCU    = arm7tdmi
  SUBMDL = LPC2138
  THUMB    = -mthumb
  THUMB_IW = -mthumb-interwork
	  ## Create ROM-Image (final)
  #RUN_MODE=ROM_RUN
  ## Create RAM-Image (debugging)
  RUN_MODE=RAM_RUN
	  # Output format. (can be srec, ihex, binary)
  FORMAT = ihex
	  # Target file name (without extension).
  TARGET = LED
	  # List C source files here. (C dependencies are automatically generated.)
  # use file-extension c for "c-only"-files
  SRC = $(TARGET).c 
  #SRC   
  # List C source files here which must be compiled in ARM-Mode.
  # use file-extension c for "c-only"-files
  SRCARM   
  # List C++ source files here.
  # use file-extension cpp for C++-files
  CPPSRC   
  # List C++ source files here which must be compiled in ARM-Mode.
  # use file-extension cpp for C++-files
  #CPPSRCARM = $(TARGET).cpp
  CPPSRCARM   
  # List Assembler source files here.
  # Make them always end in a capital .S.  Files ending in a lowercase .s
  # will not be considered source files but generated files (assembler
  # output from the compiler), and will be deleted upon "make clean"!
  # Even though the DOS/Win* filesystem matches both .s and .S the same,
  # it will preserve the spelling of the filenames, and gcc itself does
  # care about how the name is spelled on its command-line.
  ASRC   
  # List Assembler source files here which must be assembled in ARM-Mode.
  ASRCARM = crt0.S 
  
  # Optimization level, can be [0, 1, 2, 3, s]. 
  # 0 = turn off optimization. s = optimize for size.
  # (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
  OPT = s
  #OPT = 0
  
  # Debugging format.
  # stabs  or dwarf-2,
  #DEBUG = stabs
  DEBUG = dwarf-2
  
  # List any extra directories to look for include files here.
  #     Each directory must be seperated by a space.
  #EXTRAINCDIRS = ./include
  EXTRAINCDIRS   
  # Compiler flag to set the C Standard level.
  # c89   - "ANSI" C
  # gnu89 - c89 plus GCC extensions
  # c99   - ISO C99 standard (not yet fully implemented)
  # gnu99 - c99 plus GCC extensions
  CSTANDARD = -std=gnu99
  
  # Place -D or -U options for C here
  CDEFS =  -D$(RUN_MODE)
  
  # Place -I options here
  CINCS   
  # Place -D or -U options for ASM here
  ADEFS =  -D$(RUN_MODE)
	  # Compiler flags.
  #  -g*:          generate debugging information
  #  -O*:          optimization level
  #  -f...:        tuning, see GCC manual and avr-libc documentation
  #  -Wall...:     warning level
  #  -Wa,...:      tell GCC to pass this to the assembler.
  #    -adhlns...: create assembler listing
  #
  # Flags for C and C++ (arm-elf-gcc/arm-elf-g++)
  CFLAGS = -g$(DEBUG)
  CFLAGS += $(CDEFS) $(CINCS)
  CFLAGS += -O$(OPT)
  CFLAGS += -Wall -Wcast-align -Wcast-qual -Wimplicit 
  CFLAGS += -Wpointer-arith -Wswitch
  CFLAGS += -Wredundant-decls -Wreturn-type -Wshadow -Wunused
  CFLAGS += -Wa,-adhlns=$(subst $(suffix $<),.lst,$<) 
  CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
  
  # flags only for C
  CONLYFLAGS  = -Wstrict-prototypes -Wmissing-declarations
  CONLYFLAGS += -Wmissing-prototypes -Wnested-externs 
  CONLYFLAGS += $(CSTANDARD)
  
  # flags only for C++ (arm-elf-g++)
  # CPPFLAGS = -fno-rtti -fno-exceptions
  CPPFLAGS   
  # Assembler flags.
  #  -Wa,...:   tell GCC to pass this to the assembler.
  #  -ahlms:    create listing
  #  -gstabs:   have the assembler create line number information; note that
  #              for use in COFF files, additional information about filenames
  #              and function names needs to be present in the assembler source
  #              files -- see avr-libc docs [FIXME: not yet described there]
  ##ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs 
  ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:.S=.lst),-g$(DEBUG)
  
  #Additional libraries.
  
  #Support for newlibc-lpc (file: libnewlibc-lpc.a)
  #NEWLIBLPC = -lnewlib-lpc
  
  MATH_LIB = -lm
  
  CPLUSPLUS_LIB = -lstdc++
  
  # Linker flags.
  #  -Wl,...:     tell GCC to pass this to linker.
  #    -Map:      create map file
  #    --cref:    add cross reference to  map file
  LDFLAGS = -nostartfiles -Wl,-Map=$(TARGET).map,--cref
  LDFLAGS += -lc
  LDFLAGS += $(NEWLIBLPC) $(MATH_LIB)
  LDFLAGS += -lc -lgcc 
  LDFLAGS += $(CPLUSPLUS_LIB)
  
  # Set Linker-Script Depending On Selected Memory
  ifeq ($(RUN_MODE),RAM_RUN)
  LDFLAGS +=-T$(SUBMDL)-RAM.ld
  else 
  LDFLAGS +=-T$(SUBMDL)-ROM.ld
  endif
	  # ---
  # Flash-Programming support using lpc21isp by Martin Maurer 
  
  # Settings and variables:
  #LPC21ISP = lpc21isp
  LPC21ISP = lpc21isp_beta
  LPC21ISP_PORT = com1
  LPC21ISP_BAUD = 115200
  LPC21ISP_XTAL = 14746
  LPC21ISP_FLASHFILE = $(TARGET).hex
  # verbose output:
  ## LPC21ISP_DEBUG = -debug
  # enter bootloader via RS232 DTR/RTS (only if hardware supports this
  # feature - see Philips AppNote):
  #LPC21ISP_CONTROL = -control
	  # ---
  
  # Define directories, if needed.
  ## DIRARM = c:/WinARM/
  ## DIRARMBIN = $(DIRAVR)/bin/
  ## DIRAVRUTILS = $(DIRAVR)/utils/bin/
  
  # Define programs and commands.
  SHELL = sh
  CC = arm-elf-gcc
  CPP = arm-elf-g++
  OBJCOPY = arm-elf-objcopy
  OBJDUMP = arm-elf-objdump
  SIZE = arm-elf-size
  NM = arm-elf-nm
  REMOVE = rm -f
  COPY = cp
	  # Define Messages
  # English
  MSG_ERRORS_NONE = Errors: none
  MSG_BEGIN = -------- begin --------
  MSG_END = --------  end  --------
  MSG_SIZE_BEFORE = Size before: 
  MSG_SIZE_AFTER = Size after:
  MSG_FLASH = Creating load file for Flash:
  MSG_EXTENDED_LISTING = Creating Extended Listing:
  MSG_SYMBOL_TABLE = Creating Symbol Table:
  MSG_LINKING = Linking:
  MSG_COMPILING = Compiling C:
  MSG_COMPILING_ARM = "Compiling C (ARM-only):"
  MSG_COMPILINGCPP = Compiling C++:
  MSG_COMPILINGCPP_ARM = "Compiling C++ (ARM-only):"
  MSG_ASSEMBLING = Assembling:
  MSG_ASSEMBLING_ARM = "Assembling (ARM-only):"
  MSG_CLEANING = Cleaning project:
  MSG_LPC21_RESETREMINDER = You may have to bring the target in bootloader-mode
now.
	  # Define all object files.
  COBJ      = $(SRC:.c=.o) 
  AOBJ      = $(ASRC:.S=.o)
  COBJARM   = $(SRCARM:.c=.o)
  AOBJARM   = $(ASRCARM:.S=.o)
  CPPOBJ    = $(CPPSRC:.cpp=.o) 
  CPPOBJARM = $(CPPSRCARM:.cpp=.o)
  
  # Define all listing files.
  LST = $(ASRC:.S=.lst) $(ASRCARM:.S=.lst) $(SRC:.c=.lst) $(SRCARM:.c=.lst)
  LST += $(CPPSRC:.cpp=.lst) $(CPPSRCARM:.cpp=.lst)
  
  # Compiler flags to generate dependency files.
  ### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d
  GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
  
  # Combine all necessary flags and optional flags.
  # Add target processor to flags.
  ALL_CFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. $(CFLAGS) $(GENDEPFLAGS)
  ALL_ASFLAGS = -mcpu=$(MCU) $(THUMB_IW) -I. -x assembler-with-cpp $(ASFLAGS)
	  # Default target.
  all: begin gccversion sizebefore build sizeafter finished end
  
  build: elf hex lss sym
  
  elf: $(TARGET).elf
  hex: $(TARGET).hex
  lss: $(TARGET).lss 
  sym: $(TARGET).sym
  
  # Eye candy.
  begin:
      @echo
      @echo $(MSG_BEGIN)
  
  finished:
      @echo $(MSG_ERRORS_NONE)
  
  end:
      @echo $(MSG_END)
      @echo
	  # Display size of file.
  HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
  ELFSIZE = $(SIZE) -A $(TARGET).elf
  sizebefore:
      @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE);
echo; fi
  
  sizeafter:
      @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE);
echo; fi
	  # Display compiler version information.
  gccversion : 
      @$(CC) --version
	  # Program the device.  
  program: $(TARGET).hex
      @echo
      @echo $(MSG_LPC21_RESETREMINDER)
      $(LPC21ISP) $(LPC21ISP_CONTROL) $(LPC21ISP_DEBUG)  $(LPC21ISP_FLASHFILE)
$(LPC21ISP_PORT) $(LPC21ISP_BAUD) $(LPC21ISP_XTAL)
	  # Create final output files (.hex, .eep) from ELF output file.
  # TODO: handling the .eeprom-section should be redundant
  %.hex: %.elf
      @echo
      @echo $(MSG_FLASH) $@
      $(OBJCOPY) -O $(FORMAT) $< $@
	  # Create extended listing file from ELF output file.
  # testing: option -C
  %.lss: %.elf
      @echo
      @echo $(MSG_EXTENDED_LISTING) $@
      $(OBJDUMP) -h -S -C $< > $@
	  # Create a symbol table from ELF output file.
  %.sym: %.elf
      @echo
      @echo $(MSG_SYMBOL_TABLE) $@
      $(NM) -n $< > $@
	  # Link: create ELF output file from object files.
  .SECONDARY : $(TARGET).elf
  .PRECIOUS : $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM)
  %.elf:  $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM)
      @echo
      @echo $(MSG_LINKING) $@
      $(CC) $(THUMB) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ)  $(COBJARM) $(COBJ)
$(CPPOBJ) $(CPPOBJARM) --output $@ $(LDFLAGS)
  #    $(CPP) $(THUMB) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ)  $(COBJARM) $(COBJ)
$(CPPOBJ) $(CPPOBJARM) --output $@ $(LDFLAGS)
  
  # Compile: create object files from C source files. ARM/Thumb
  $(COBJ) : %.o : %.c
      @echo
      @echo $(MSG_COMPILING) $<
      $(CC) -c $(THUMB) $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ 
  
  # Compile: create object files from C source files. ARM-only
  $(COBJARM) : %.o : %.c
      @echo
      @echo $(MSG_COMPILING_ARM) $<
      $(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ 
  
  # Compile: create object files from C++ source files. ARM/Thumb
  $(CPPOBJ) : %.o : %.cpp
      @echo
      @echo $(MSG_COMPILINGCPP) $<
      $(CPP) -c $(THUMB) $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@ 
  
  # Compile: create object files from C++ source files. ARM-only
  $(CPPOBJARM) : %.o : %.cpp
      @echo
      @echo $(MSG_COMPILINGCPP_ARM) $<
      $(CPP) -c $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@
	  # Compile: create assembler files from C source files. ARM/Thumb
  ## does not work - TODO - hints welcome
  ##$(COBJ) : %.s : %.c
  ##    $(CC) $(THUMB) -S $(ALL_CFLAGS) $< -o $@
	  # Assemble: create object files from assembler source files. ARM/Thumb
  $(AOBJ) : %.o : %.S
      @echo
      @echo $(MSG_ASSEMBLING) $<
      $(CC) -c $(THUMB) $(ALL_ASFLAGS) $< -o $@
	  # Assemble: create object files from assembler source files. ARM-only
  $(AOBJARM) : %.o : %.S
      @echo
      @echo $(MSG_ASSEMBLING_ARM) $<
      $(CC) -c $(ALL_ASFLAGS) $< -o $@
	  # Target: clean project.
  clean: begin clean_list finished end
	  clean_list :
      @echo
      @echo $(MSG_CLEANING)
      $(REMOVE) $(TARGET).hex
      $(REMOVE) $(TARGET).obj
      $(REMOVE) $(TARGET).elf
      $(REMOVE) $(TARGET).map
      $(REMOVE) $(TARGET).obj
      $(REMOVE) $(TARGET).a90
      $(REMOVE) $(TARGET).sym
      $(REMOVE) $(TARGET).lnk
      $(REMOVE) $(TARGET).lss
      $(REMOVE) $(COBJ)
      $(REMOVE) $(CPPOBJ)
      $(REMOVE) $(AOBJ)
      $(REMOVE) $(COBJARM)
      $(REMOVE) $(CPPOBJARM)
      $(REMOVE) $(AOBJARM)
      $(REMOVE) $(LST)
      $(REMOVE) $(SRC:.c=.s)
      $(REMOVE) $(SRC:.c=.d)
      $(REMOVE) $(SRCARM:.c=.s)
      $(REMOVE) $(SRCARM:.c=.d)
      $(REMOVE) $(CPPSRC:.cpp=.s) 
      $(REMOVE) $(CPPSRC:.cpp=.d)
      $(REMOVE) $(CPPSRCARM:.cpp=.s) 
      $(REMOVE) $(CPPSRCARM:.cpp=.d)
      $(REMOVE) .dep/*
	  # Include the dependency files.
  -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
	  # Listing of phony targets.
  .PHONY : all begin finish end sizebefore sizeafter gccversion \
  build elf hex lss sym clean clean_list program
	rtstofer <rstofer@rsto...> wrote:          --- In lpc2000@lpc2...,
Grzegorz Reszka <grzegorz.reszka@...>
  wrote:
  >
  > Hello,
  >   I`m newbie in ARM uC and I wanted to write in WinARM a simple 
  (transition of LED) programme on LPC2138. But during linking (when I 
  use RUN_MODE=ROM_RUN, that means LPC2138-ROM.ld file) it returns 
  following error:
  >   
  >   Linking: LED.elf
  >   arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I.
  -gdwarf-2  -DROM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit  
  -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow 
  -Wunused -Wa,-adhlns=crt0.lst   -MD -MP -MF .dep/LED.elf.d  crt0.o   
  LED.o      --output  LED.elf -nostartfiles -Wl,-Map=LED.map,--cref -lc
   -lm -lc  -lgcc  -lstdc++ -TLPC2138-ROM.ld
  >  
  c:\winarm\bin\..\lib\gcc\arm-elf\4.0.2\..\..\..\..\arm-elf\bin\ld.exe:
   address 0x600 of LED.elf section .stack is not within region RAM
  >   make.exe: *** [LED.elf] Error 1
  >   
  >   > Process Exit Code: 2
  >   > Time Taken: 00:02
  >   
  >   
  >   I don`t understand why it wants to use the 0x600 size stack whilst
  the  size of this stack is declared in LPC2138-ROM.ld file as 0x400:
  >   STACK_SIZE = 0x400;
  >   
  >   And when I change in Makefile RUN_MODE to RAM_RUN (LPC2138-RAM.ld
  file) I receive following message:
  >   
  >   Linking: LED.elf
  >   arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I.
  -gdwarf-2  -DRAM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit  
  -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow 
  -Wunused -Wa,-adhlns=crt0.lst   -MD -MP -MF .dep/LED.elf.d  crt0.o   
  LED.o      --output  LED.elf -nostartfiles -Wl,-Map=LED.map,--cref -lc
   -lm -lc  -lgcc  -lstdc++ -TLPC2138-RAM.ld
  >   crt0.o: In function `abort':D:\ARMprogramy\LED/crt0.S:215:
  undefined reference to `__bss_start'
  >   :D:\ARMprogramy\LED/crt0.S:215: undefined reference to
`__bss_end__'
  >   :D:\ARMprogramy\LED/crt0.S:215: undefined reference to
  `__ctors_start__'
  >   :D:\ARMprogramy\LED/crt0.S:215: undefined reference to
`__ctors_end__'
  >   make: *** [LED.elf] Error 1
  >   
  >   And also I don`t understand it - in line 215 of crt0.S is only this:
>        b       .                           // loop
until reset
  >   and it returns error about undefined refrence to: `__bss_start`
,
  `__bss_end__' , etc.
  >   
  >   What should I do in this case? What should I change in my files
  which I attached to this message?
  >   
  >   More over: Could somebody explain me for what str0.S, RAM.ld and
  ROM.ld  files are needed exactly in ARM projects? Which parts of these
  files  are important?  When should I use RAM.ld and when ROM.ld files?
  By  the way could somebody give me those files which will be suitable
  for  LPC2138 uC?
  >   
  >   Thanks for every advice and response.
  >   
  >   Regards
  >   GR
  >   
  > __________________________________________________
  >  
  > 
  > 
  >
  
  Well, I can make a start on the problem.  Others will have more insight.
  
  First of all, you use the ROM version of the linker script (that's
  what the .ld file is) when you want to run out of flash memory.  You
  use the RAM version when you want to run out of RAM.  You might want
  to run out of RAM during debugging.  Or not...
  
  Second, both of your .ld files are hosed, or so it seems.  Where did
  you get them?
  
  Third, this tutorial is the absolute best reference available for
  starting with the ARM.  Later in the document there is some info for
  the 2138, I believe.  Anyway, here it is:
 
http://www.olimex.com/dev/pdf/ARM%20Cross%20Development%20with%20Eclipse%20version%203.pdf
  
  Here it is tiny: http://tinyurl.com/camje
  
  You could pick a configuration and post your .ld file.  Someone may be
  able to spot the problem quickly.
  
  You can also wander over to www.olimex.com and paw through the LPC
  2000 ARM boards.  There are blinking LED samples for each.
  
  Richard
	          SPONSORED LINKS    
                                                        Microcontrollers        
                                 Microprocessor                                 
        Intel microprocessors                                                   
                      Pic microcontrollers                                      
                      
        
---------------------------------
    YAHOO! GROUPS LINKS
	---------------------------------
	__________________________________________________
 


	
Hello, Mr. Reszka,

Im a noob in ARM and GNUARM too, and I dont know a lot about LD and AS, but I
would like to help. Im so sorry if what I try to explain here is just basic
things, but Ill try to do my best.

When you compile your C code, all symbols are relative addressed, and is a task
of your OS to translate this symbols to real addresses. But when you dont have
a OS, you must use a locator to place all this symbols on their places. In
GNU-ARMs case, the location function is made by LD program, and it uses the LD
script to do this task.

I dont know why you have to run all over your RAM if you are on debug mode,
because Ive never used an in-system debugger. For my case, I always locate my
.text on ROM.

The crt0.s file is a initialization file. It prepares your environment so your C
code can run as expected. Its made up on assembly language because you have
total control over the output. See, for example, the 'Vectors' section
on your crt0.s file: these vectors are supposed to be (better: they must be) on
the first 64 bytes of your addressing space. The eight first words are
instructions called when you have an interruption or exception; the
'reserved' word is not used, but Phillips uses it to make a 2's
complement checksum of the other vectors so your system have a chance to suppose
the code inside is a valid code.

Following this words are the addresses where resides every ISRs for the eight
vector's positions. In your _mainCRTStartup section, 
all your stack pointers are configured by moving in the operation modes, setting
stack pointers and leaving the operation mode. Then, your initialized variables
are copied from ROM to RAM and the space for unitialized variables is reserved.

I have made my startup code and ld script based on uVisions examples, but I
couldnt make it work with GNU-ARM. Then, I have tried the lpc2106_gcc.zip
project, as suggested by mr. Maurer, and with a little bit of modifications, I
could make my project work well. For support material, I use the "The
Insiders Guide To The Philips ARM7-Based Microcontrollers' book
(http://www.cecs.csulb.edu/~brewer/347/lpc-ARM-book_srn.pdf) and the processor
User Manual. Of course I use the GNU Toolchain books too, you can find then on
www.gnuarm.org .

Im developing for LPC2144 and I believe our start codes should be slightly
different. Anyway, if you want I send you my startup codes... The only problem
with em is they are all portuguese commented, so I believe you will not be able
to understand then!

Regards,

Thiago Takehara
Computer Engineer
Engworks Industrial LTDA - R&D Division
	----- Original Message ----- 
  From: Grzegorz Reszka 
  To: lpc2000@lpc2... 
  Sent: Wednesday, March 01, 2006 9:27 PM
  Subject: [lpc2000] stack, srt0.S and *.ld files in WinARM
	  Hello,
    I`m newbie in ARM uC and I wanted to write in WinARM a simple  (transition
of LED) programme on LPC2138. But during linking (when I  use RUN_MODE=ROM_RUN,
that means LPC2138-ROM.ld file) it returns  following error:
    
    Linking: LED.elf
    arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I. -gdwarf-2 
-DROM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit   -Wpointer-arith
-Wswitch -Wredundant-decls -Wreturn-type -Wshadow  -Wunused -Wa,-adhlns=crt0.lst
  -MD -MP -MF .dep/LED.elf.d  crt0.o    LED.o      --output  LED.elf
-nostartfiles -Wl,-Map=LED.map,--cref -lc  -lm -lc  -lgcc  -lstdc++
-TLPC2138-ROM.ld
    c:\winarm\bin\..\lib\gcc\arm-elf\4.0.2\..\..\..\..\arm-elf\bin\ld.exe: 
address 0x600 of LED.elf section .stack is not within region RAM
    make.exe: *** [LED.elf] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:02
	    I don`t understand why it wants to use the 0x600 size stack whilst the 
size of this stack is declared in LPC2138-ROM.ld file as 0x400:
    STACK_SIZE = 0x400;
    
    And when I change in Makefile RUN_MODE to RAM_RUN (LPC2138-RAM.ld file) I
receive following message:
    
    Linking: LED.elf
    arm-elf-gcc -mthumb -mcpu=arm7tdmi-s -mthumb-interwork -I. -gdwarf-2 
-DRAM_RUN  -Os -Wall -Wcast-align -Wcast-qual -Wimplicit   -Wpointer-arith
-Wswitch -Wredundant-decls -Wreturn-type -Wshadow  -Wunused -Wa,-adhlns=crt0.lst
  -MD -MP -MF .dep/LED.elf.d  crt0.o    LED.o      --output  LED.elf
-nostartfiles -Wl,-Map=LED.map,--cref -lc  -lm -lc  -lgcc  -lstdc++
-TLPC2138-RAM.ld
    crt0.o: In function `abort':D:\ARMprogramy\LED/crt0.S:215: undefined
reference to `__bss_start'
    :D:\ARMprogramy\LED/crt0.S:215: undefined reference to `__bss_end__'
    :D:\ARMprogramy\LED/crt0.S:215: undefined reference to
`__ctors_start__'
    :D:\ARMprogramy\LED/crt0.S:215: undefined reference to `__ctors_end__'
    make: *** [LED.elf] Error 1
    
    And also I don`t understand it - in line 215 of crt0.S is only this:
        b      .                          // loop until reset
    and it returns error about undefined refrence to: `__bss_start` ,
`__bss_end__' , etc.
    
    What should I do in this case? What should I change in my files which I
attached to this message?
    
    More over: Could somebody explain me for what str0.S, RAM.ld and ROM.ld 
files are needed exactly in ARM projects? Which parts of these files  are
important?  When should I use RAM.ld and when ROM.ld files? By  the way could
somebody give me those files which will be suitable for  LPC2138 uC?
    
    Thanks for every advice and response.
    
    Regards
    GR
    
  __________________________________________________
   

  
	  SPONSORED LINKS Microcontrollers  Microprocessor  Intel microprocessors  
        Pic microcontrollers
	------
  YAHOO! GROUPS LINKS 

    a..
	------
	
	
Hello,
  
  Thanks for link to the lpc-ARM-book_srn.pdf. I read it and my knowledge  about
LPC uControllers now is better ;). Actually, I`m using startup.s  and linker.ld
from KEIL uVision. I was making some tests with WinARM  crt0.s and
LPC2138-ROM.ld files and using them is possible but only  when I change
STACK_SIZE from 0x400 to 0x000, So it is quite strange -  size of stack equals
zero???? What do you think about it?
  
  By the way, can you send me your *.s and *.ld files? It doesn`t matter  that
they are commented in portuguese. I will compare them with my  files and I wil
try to understand them. Eventually I will use to do it  some translator or
dictionary ;).
  
  Regards,
  Grzegorz Reszka
  
  grzegorz.reszka@grze...
	Thiago Takehara <thiago@thia...> wrote:          Hello, Mr. Reszka,
  
Im a noob in ARM and GNUARM too, and I dont know a lot about LD  and AS, but I
would like to help. Im so sorry if what I try to explain  here is just basic
things, but Ill try to do my best.
  
  When you compile your C code, all symbols are relative addressed, and  is a
task of your OS to translate this symbols to real addresses. But  when you dont
have a OS, you must use a locator to place all this  symbols on their places. In
GNU-ARMs case, the location function is  made by LD program, and it uses the LD
script to do this task.
  
  I dont know why you have to run all over your RAM if you are on debug  mode,
because Ive never used an in-system debugger. For my case, I  always locate my
.text on ROM.
  
  The crt0.s file is a initialization file. It prepares your environment  so
your C code can run as expected. Its made up on assembly language  because you
have total control over the output. See, for example, the  'Vectors'
section on your crt0.s file: these vectors are supposed to be  (better: they
must be) on the first 64 bytes of your addressing space.  The eight first words
are instructions called when you have an  interruption or exception; the
'reserved' word is not used, but  Phillips uses it to make a 2's
complement checksum of the other vectors  so your system have a chance to
suppose the code inside is a valid code.
  
  Following this words are the addresses where resides every ISRs for  the
eight vector's positions. In your _mainCRTStartup section, 
  all your stack pointers are configured by moving in the operation  modes,
setting stack pointers and leaving the operation mode. Then,  your initialized
variables are copied from ROM to RAM and the space for  unitialized variables is
reserved.
  
  I have made my startup code and ld script based on uVisions examples,  but I
couldnt make it work with GNU-ARM. Then, I have tried the  lpc2106_gcc.zip
project, as suggested by mr. Maurer, and with a little  bit of modifications, I
could make my project work well. For support  material, I use the "The
Insiders Guide To The Philips ARM7-Based  Microcontrollers' book
(http://www.cecs.csulb.edu/~brewer/347/lpc-ARM-book_srn.pdf) and the processor
User Manual. Of course I use the GNU Toolchain books too, you can find then on
www.gnuarm.org .
  
  Im developing for LPC2144 and I believe our start codes should be  slightly
different. Anyway, if you want I send you my startup codes...  The only problem
with em is they are all portuguese commented, so I  believe you will not be
able to understand then!
  
  Regards,
  
  Thiago Takehara
  Computer Engineer
  Engworks Industrial LTDA - R&D Division
	  ----- Original Message ----- 
    From: Grzegorz Reszka 
    To: lpc2000@lpc2... 
    Sent: Wednesday, March 01, 2006 9:27 PM
    Subject: [lpc2000] stack, srt0.S and *.ld files in WinARM
	    Hello,
      I`m newbie in ARM uC and I wanted to write in WinARM  a simple 
(transition of LED) programme on LPC2138. But during  linking (when I  use
RUN_MODE=ROM_RUN, that means LPC2138-ROM.ld  file) it returns  following error:
      
      Linking: LED.elf
      arm-elf-gcc -mthumb -mcpu=arm7tdmi-s  -mthumb-interwork -I. -gdwarf-2 
-DROM_RUN  -Os -Wall  -Wcast-align -Wcast-qual -Wimplicit   -Wpointer-arith 
-Wswitch -Wredundant-decls -Wreturn-type -Wshadow  -Wunused 
-Wa,-adhlns=crt0.lst   -MD -MP -MF .dep/LED.elf.d   crt0.o    LED.o      
--output  LED.elf -nostartfiles -Wl,-Map=LED.map,--cref -lc   -lm -lc  -lgcc 
-lstdc++ -TLPC2138-ROM.ld
       c:\winarm\bin\..\lib\gcc\arm-elf\4.0.2\..\..\..\..\arm-elf\bin\ld.exe:  
address 0x600 of LED.elf section .stack is not within region RAM
      make.exe: *** [LED.elf] Error 1
      
      > Process Exit Code: 2
      > Time Taken: 00:02
	      I don`t understand why it wants to use the 0x600  size stack whilst the 
size of this stack is declared in  LPC2138-ROM.ld file as 0x400:
      STACK_SIZE = 0x400;
      
      And when I change in Makefile RUN_MODE to RAM_RUN (LPC2138-RAM.ld file) I
receive following message:
      
      Linking: LED.elf
      arm-elf-gcc -mthumb -mcpu=arm7tdmi-s  -mthumb-interwork -I. -gdwarf-2 
-DRAM_RUN  -Os -Wall  -Wcast-align -Wcast-qual -Wimplicit   -Wpointer-arith 
-Wswitch -Wredundant-decls -Wreturn-type -Wshadow  -Wunused 
-Wa,-adhlns=crt0.lst   -MD -MP -MF .dep/LED.elf.d   crt0.o    LED.o      
--output  LED.elf -nostartfiles -Wl,-Map=LED.map,--cref -lc   -lm -lc  -lgcc 
-lstdc++ -TLPC2138-RAM.ld
      crt0.o: In function `abort':D:\ARMprogramy\LED/crt0.S:215: undefined
reference to `__bss_start'
      :D:\ARMprogramy\LED/crt0.S:215: undefined reference to `__bss_end__'
      :D:\ARMprogramy\LED/crt0.S:215: undefined reference to
`__ctors_start__'
      :D:\ARMprogramy\LED/crt0.S:215: undefined reference to
`__ctors_end__'
      make: *** [LED.elf] Error 1
      
      And also I don`t understand it - in line 215 of crt0.S is only this:
           b       .                           // loop until reset
      and it returns error about undefined refrence to: `__bss_start` ,
`__bss_end__' , etc.
      
      What should I do in this case? What should I change in my files which I
attached to this message?
      
      More over: Could somebody explain me for what  str0.S, RAM.ld and ROM.ld 
files are needed exactly in ARM  projects? Which parts of these files  are
important?  When  should I use RAM.ld and when ROM.ld files? By  the way could 
somebody give me those files which will be suitable for  LPC2138  uC?
      
      Thanks for every advice and response.
      
      Regards
      GR
      
    __________________________________________________
     
  
    
	    SPONSORED LINKS Microcontrollers  Microprocessor  Intel microprocessors  
          Pic microcontrollers
	  ------
    YAHOO! GROUPS LINKS 
  
      a..
	  ------
	  
	          SPONSORED LINKS    
                                                        Microcontrollers        
                                 Microprocessor                                 
        Intel microprocessors                                                   
                      Pic microcontrollers                                      
                      
        
---------------------------------
    YAHOO! GROUPS LINKS
	---------------------------------
	---------------------------------
Yahoo! Mail
Bring photos to life! New PhotoMail  makes sharing a breeze. 


	
Grzegorz Reszka wrote:

>Hello,
>  
>  Thanks for link to the lpc-ARM-book_srn.pdf. I read it and my knowledge 
about LPC uControllers now is better ;). Actually, I`m using startup.s  and
linker.ld from KEIL uVision. I was making some tests with WinARM  crt0.s and
LPC2138-ROM.ld files and using them is possible but only  when I change
STACK_SIZE from 0x400 to 0x000, So it is quite strange -  size of stack equals
zero???? What do you think about it?
>  
>  By the way, can you send me your *.s and *.ld files? It doesn`t matter 
that they are commented in portuguese. I will compare them with my  files and I
wil try to understand them. Eventually I will use to do it  some translator or
dictionary ;).
>  
>
Your linker script does look odd, this is mine from a gcc-4.0.2 Thumb 
dev environ (binutils-2.16.1, gcc-4.0.2):

=============== begin LPC2138ROM.ld
===================/***********************************************************************/
/*                                                                     */
/*  ROM.ld:  Linker Script File                                        */
/*                                                                     */
/***********************************************************************/
SEARCH_DIR( ../libs )
SEARCH_DIR( ./)

ENTRY(_boot)
STACK_SIZE = 0x800;

/* Memory Definitions */
MEMORY
{
  ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000
  RAM (rw) : ORIGIN = 0x40000000, LENGTH = 0x00008000
}

/* Section Definitions */
SECTIONS
{
  /* first section is .text which is used for code */
  .text :
  {
    *crt0.o (.text)            /* Startup code */
    *(.text)                   /* remaining code */
    *(.rodata)                 /* read-only data (constants) */
    *(.rodata*)
    *(.glue_7)
    *(.glue_7t)
  } > ROM

  . = ALIGN(4);
  _etext = . ;
  PROVIDE (etext = .);

  /* .data section which is used for initialized data */
  .data : AT (_etext)
  {
    _data = .;
    *(.data)
  } > RAM
 
  . = ALIGN(4);
  _edata = . ;
  PROVIDE (edata = .);

  /* .bss section which is used for uninitialized data */
  .bss (NOLOAD) :
  {
    __bss_start = . ;
    __bss_start__ = . ;
    *(.bss)
    *(COMMON)
    . = ALIGN(4);
  } > RAM

  . = ALIGN(4);
  __bss_end__ = . ;
  PROVIDE (__bss_end = .);

  .stack ALIGN(256) :
  {
    . += STACK_SIZE;
    PROVIDE (_stack = .);
  } > RAM

  _end = . ;
  PROVIDE (end = .);

  /* 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) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }
}
    /*  Libraries to link against.                    */
INPUT( -lc -lstdc -lgcc );

==================== snip =========================
I use the above script to create the elf image, then this image is then 
used to create the binary image that goes into flash.  If you are 
running cygwin, it would be a good idea to install the manpages and run 
an 'info ld' to see what is in these linker scripts.  The ld info
pages 
have a tutorial guiding you through just what is in these scripts.

Please note, the information regarding debugging information is strictly 
for where to place this into the elf file.  It is not used in the 
binary.  That debug info is used for Insight (gdb + gui).

I don't run cygwin (linux here) so I don't know what the details of 
getting the manpages installed would be.

Regards,

TomW
	-- 
Tom Walsh - WN3L - Embedded Systems Consultant
http://openhardware.net, http://cyberiansoftware.com
"Windows? No thanks, I have work to do..."
----------------