Setting up Newlib for a Sparc-elf configured GCC

Jeff Johnston jjohnstn@redhat.com
Thu Aug 7 03:35:00 GMT 2008


MichaelMontcalm wrote:
> Hi All,
>
> I've been in the process of setting up a new install of GCC recently, and am
> nearly done. The only thing I do not understand how to do is finish the
> setup of Newlib before making my own crt0.o file.
>
> I've currently installed binutils 2.17 and gcc 4.2.0 successfully (after
> nearly putting my laptop through the wall a few times). I've also installed
> gmp and mpfr (in case I need to move to a newer version of GCC in the
> future). I've been following the Wiki
> (http://wiki.osdev.org/GCC_Cross-Compiler) on how to do this, but have
> gotten stuck on the porting Newlib section
> (http://wiki.osdev.org/Porting_Newlib).
>
> The part I'm lost at is right near the beginning, where it requires you to
> make the system calls. It shows a large set of code, but gives no
> explanation as to what I'm supposed to do with it. In my
> newlib-1.16.0/libgloss folder I do have several of the commands mentioned in
> the wiki, but I'm unsure what to do now. Do I need to edit the ones there
> and create files for the entries that do not exist? Are these files
> different because I configured newlib for sparc-elf as opposed to x86?
>
>   
The code that is documented are minimal stubs that you would put into 
your libgloss library which would reside in libgloss/YOUR_PLATFORM 
(which in your case is libgloss/sparc and already exists).  The stubs 
are already supplied for you in libnosys which gets built as part of 
libgloss.  With the exception of sbrk, those syscall stubs usually 
return a failure return code and may set errno appropriately.  The 
examples given are written in C so they will work on any platform.  To 
use the libnosys library, you simply add -lnosys to your link. 

If you look at the libgloss/sparc directory you will see there are 
already a number of BSP (Board Support Packages) supplied.  Each has its 
own .ld script which set  the libraries to automatically link to so the 
user just specifies -Txxxx.ld on the compile/link statement.  One can 
add -lnosys inside an ld script GROUP command to default any missing 
syscalls to the default stubs.  If you have a sparc board that isn't 
already provided, you should probably look at copying a BSP that is 
close and change what you need and add it to Makefile.in.  The end-user 
would just specify -T{your_ld_script_name}.ld  If an existing BSP 
already matches your board, then you have nothing to do.  An end-user 
would specify -T{existing_ld_script_name}.ld when compiling/linking the 
application.

With the stubs documented, plus a crt0 (usually sets up the stack 
register, clears the bss, calls main, and calls exit or _exit when main 
returns), you have enough to link and run C programs using newlib.  As 
previously stated, most calls fail so the C routines that use them under 
the covers will also return failure (e.g. fopen() will return NULL).  If 
you need to have some of the functionality work rather than fail, then 
you'll want to supply your own versions of the syscalls.  For example, 
some boards supply read/write syscalls that receive and send data to the 
serial port to support the std stream file descriptors (e.g. printf).  
It all depends on the board and what you want to support.  If you have 
an OS, then you'll want to hook into the real syscalls provided by the OS.

If running under a simulator, you would want to invent a special trap or 
insn sequence that the simulator can recognize.  It doesn't have to work 
on the real hardware.  The simulator is then written to recognize the 
special trap or insn sequence you have set up and simply calls local C 
library functions to do the work.

Hopefully, that clarifies a bit.

-- Jeff J.
> Any help would be appreciated!
>   



More information about the Newlib mailing list