This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RedBoot? (ARM newlib build)


Toralf:


Actually, arm-elf newlib assumes ARM's toolchain (esp. the Angel monitor/debugger), which works using SWIs. The following procedure, which I excerpted from one of my training manuals (and I think it's on my website somewhere), rebuilds newlib without SWIs. Please pardon the reformatting, it looks much better in PDF. :^)


As to your second question, don't port anything you don't need.


Regards,



b.g.


--
Bill Gatliff
It said Windows 95/98/NT/XP/2000 or better, so I installed Linux.
bgat@billgatliff.com



--------------

The startup code that interacts with RDP and RDI is in newlib/libc/sys/arm/crt0.S. The SWI opcode is plainly visible within a
conditional code block.


To rebuild Newlib without RDP or RDI, edit the definition of newlib_cflags in newlib/configure.host. Remove the definitions for -DARM_RDI_MONITOR and -DARM_RDP_MONITOR. Then run the configure script as usual.

After configuring the source tree, edit the topmost Makefile. Replace the -O2 in CFLAGS_FOR_TARGET with -O0, and add a -g if necessary, so that the library will support debugging (all optional).

Make and install as usual.

The resulting library is nearly functional. Applications built with the non-RDI, non-RDP library will crash, usually in the __do_global_ctors_aux() function. The reason is because the initial stack pointer gets improperly set, the stack overwrites __CTOR_LIST__, and a formerly null list terminator becomes an invalid function pointer.

The problem, found in crt0.S, is here:

...
#else
   /*  Set up the stack pointer to a fixed value */
   ldr    r3, .LC0
   mov     sp, r3
...
.LC0:
#ifdef ARM_RDI_MONITOR
   .word    HeapBase
#else
#ifndef ARM_RDP_MONITOR
#ifdef __pe__
   .word    0x800000
#else
/*    .word    0x80000    */        /* Top of RAM on the PIE board.  */
#endif
#endif
#endif
.LC1:
   .word    __bss_start__

Without RDP and RDI, the value of .LC0, the initial stack pointer, becomes the start of the .bss section. Which, it turns out, is immediately after the .ctors section.

The fix is to uncomment the 0x80000, or better still, assign .LC0 to _stack:

#ifndef ARM_RDP_MONITOR
#ifdef __pe__
   .word    0x800000
#else
   .word    _stack
#endif
#endif






Toralf Lund wrote:


I think part of the answer to the question I asked yesterday, is that the default arm build of newlib assumes RedBoot routines to be present. Related questions:

  1. Is there a simple way to build without it?
  2. (Somewhat off-topic.) Should I port RedBoot to my platform? Do you
     think it would be worth the effort, or would it be simpler to
     write a custom loader + my own versions of the low-level I/O
     routines (using existing sourcecode when possible)? Note that I
     don't expect to need gdb support or a command line interface, as
     I'll be using a BDI2000 for debug support etc.. What I do need is
     some kind of a loader that will move my application from flash to
     memory and execute it. I might also want native flash update
     support in the future, although I can use the BDI2000 for that
     purpose, too.

- Toralf



------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com





------ Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/ Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]