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


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

Re: Error sbrk undefined


   Date: Tue, 17 Jun 1997 21:13:28 +0900
   From: Jens Doege <doege@ljk.atsugi.asahi-kasei.co.jp>

   I use cygnus gcc2.7.2 with newlib-1.7.0.

   When linking my project 

   gcc68k -static -T ld.scr test.o upd72611.o dcpio.o bios.o endian.o
   g_scsi.o dsp_acc.o vec_tbl.o	-o fwtest.rom

   I get the following error message: 

   /usr/local/m68k-unknown-coff/lib/libg.a(sbrkr.o): In function `_sbrk_r':
   sbrkr.c:60: undefined reference to `sbrk'
   make: *** [fwtest] Error 1

   I figured out, thet it has something to do with the malloc() function I
   use. 
   Does anybody have an idea, what I'm doing wrong?

You need to write `sbrk'.

This is covered in the FAQ, though perhaps not as clearly as it
should be.  [Clearly one can't just stub out sbrk. :-)]

What is sbrk?  It is the low level system call upon which malloc is built.
If you want to use the malloc in newlib then you need to write sbrk.

Here's an example from newlib/libc/sys/sh/syscalls.c:

register char *stack_ptr asm ("r15");

caddr_t
_sbrk (int incr)
{
  extern char end;		/* Defined by the linker */
  static char *heap_end;
  char *prev_heap_end;

  if (heap_end == 0)
    {
      heap_end = &end;
    }
  prev_heap_end = heap_end;
  if (heap_end + incr > stack_ptr)
    {
      _write (1, "Heap and stack collision\n", 25);
      abort ();
    }
  heap_end += incr;
  return (caddr_t) prev_heap_end;
}

-----
4.5 Where are open, read, write, close, etc. ?

The following is a typical situation people run into when linking their
application.

/usr/local/m68k-coff/lib/libc.a(sbrkr.o): In function `_sbrk_r':
sbrkr.c:60: undefined reference to `sbrk'
/usr/local/m68k-coff/lib/libc.a(makebuf.o): In function `__smakebuf':
makebuf.c:93: undefined reference to `isatty'
/usr/local/m68k-coff/lib/libc.a(filer.o): In function `_open_r':
filer.c:63: undefined reference to `open'
/usr/local/m68k-coff/lib/libc.a(filer.o): In function `_close_r':
filer.c:100: undefined reference to `close'
/usr/local/m68k-coff/lib/libc.a(filer.o): In function `_lseek_r':
filer.c:142: undefined reference to `lseek'
/usr/local/m68k-coff/lib/libc.a(filer.o): In function `_read_r':
filer.c:184: undefined reference to `read'
/usr/local/m68k-coff/lib/libc.a(filer.o): In function `_write_r':
filer.c:226: undefined reference to `write'
/usr/local/m68k-coff/lib/libc.a(fstatr.o): In function `_fstat_r':
fstatr.c:61: undefined reference to `fstat'

Depending upon the target, system calls are not built into newlib's libc.a.
They are too dependent upon the particular target board in use.
Libgloss (which comes with newlib net releases) is intended to be the
repository of such routines and may either provide them in another library
that you must link against or in an object file.

For systems that don't have a need for such routines, just stub
them out. e.g.

int open (char *f, int flags, ...) { errno = ENOSYS; return -1; }

etc.