Contents|Index|Previous|Next
The C run-time environment
(crt0)
To link and run C or C++ programs, you need to
define a small module (usually written in assembler as crt0.s)
to ensure that the hardware initializes for C conventions before calling
main.
There are some examples available in the sources of GNUPro
Toolkit for crt0.s code (along with examples of system calls
with sub-routines).
Look in the following path.
installdir/gnupro-99r1/src/newlib/libc/sys
installdir refers to your installation
directory, by default /usr/cygnus.
For example, look in .../sys/h8300hms for
Hitachi H8/300 bare boards, or in .../sys/sparclite for the
Fujitsu SPARClite board.
More examples are in the following directory.
installdir/gnupro-98r2/src/newlib/stub
To write your own crt0.s module, you need the following
information about your target.
-
A memory map, showing the size of available memory and memory
location
-
Which way the stack grows
-
Which output format is in use
At a minimum, your crt0.s module must do the following
processes.
-
Define the symbol, start (_start in assembler
code). Execution begins at this symbol.
-
Set up the stack pointer, sp. It is largely up to
you to choose where to store your stack within the constraints of your
targets memory map. Perhaps the simplest choice is to choose a fixed-size
area somewhere in the uninitialized data section (often called bss).
Remember that whether you choose the low address or the high address in
this area depends on the direction your stack grows.
-
Initialize all memory in the uninitialized-data (bss) section
to zero.
The easiest way to do this is with the help of a linker
script (see Linker scripts
in Using ld in
GNUPro Utilities). Use a linker script to define symbols
such as bss_start and bss_end to record the boundaries
of this section; then you can use a for loop to initialize all
memory between them in the crt0.s module.
-
Call main. Nothing else will!
A more complete crt0.s module might also do the
following processes.
-
Define an _exit subroutine. This is the C name;
in your assembler code. Use the label, _ _exit, with two
leading underbars. Its precise behavior depends on the details of your
system, and on your choice. Possibilities include trapping back to the
boot monitor, if there is one; or to the loader, if there is no monitor;
or even back to the symbol, start.
-
If your target has no monitor to mediate communications with
the debugger, you must set up the hardware exception handler in the crt0.s
module. See The
GDB remote serial protocol in Debugging
with GDB in GNUPro Debugging Tools for details on
how to use the GDB generic remote-target facilities for this purpose.
-
Perform other hardware-dependent initialization; for example,
initializing an mmu or an auxiliary floating-point chip.
-
Define low-level input and output subroutines. For example,
the crt0.s module is a convenient place to define the minimal
assembly-level routines; see System
calls in GNUPro
C Library in GNUPro Libraries.
Top|Contents|Index|Previous|Next