5 @cindex linking the C library
6 The C subroutine library depends on a handful of subroutine calls for
7 operating system services. If you use the C library on a system that
8 complies with the POSIX
.1 standard (also known as IEEE
1003.1), most of
9 these subroutines are supplied with your operating system.
11 If some of these subroutines are not provided with your system---in
12 the extreme case, if you are developing software for a ``bare board''
13 system, without an OS---you will at least need to provide do-nothing
14 stubs (or subroutines with minimal functionality) to allow your
15 programs to link with the subroutines in @code
{libc.a
}.
18 * Stubs:: Definitions for OS interface
19 * Reentrant Syscalls:: Reentrant covers for OS subroutines
23 @section Definitions for OS interface
26 @cindex subroutines for OS interface
27 @cindex OS interface subroutines
28 This is the complete set of system definitions (primarily subroutines)
29 required; the examples shown implement the minimal functionality
30 required to allow @code
{libc
} to link, and fail gracefully where OS
31 services are not available.
33 Graceful failure is permitted by returning an error code. A minor
34 complication arises here: the C library must be compatible with
35 development environments that supply fully functional versions of these
36 subroutines. Such environments usually return error codes in a global
37 @code
{errno
}. However, the Cygnus C library provides a @emph
{macro
}
38 definition for @code
{errno
} in the header file @file
{errno.h
}, as part
39 of its support for reentrant routines (@pxref
{Reentrancy,,Reentrancy
}).
41 @cindex @code
{errno
} global vs macro
42 The bridge between these two interpretations of @code
{errno
} is
43 straightforward: the C library routines with OS interface calls
44 capture the @code
{errno
} values returned globally, and record them in
45 the appropriate field of the reentrancy structure (so that you can query
46 them using the @code
{errno
} macro from @file
{errno.h
}).
48 This mechanism becomes visible when you write stub routines for OS
49 interfaces. You must include @file
{errno.h
}, then disable the macro,
59 The examples in this chapter include this treatment of @code
{errno
}.
63 Exit a program without cleaning up files. If your system doesn't
64 provide this, it is best to avoid linking with subroutines that require
65 it (@code
{exit
}, @code
{system
}).
68 Close a file. Minimal implementation:
77 A pointer to a list of environment variables and their values. For a
78 minimal environment, this empty list is adequate:
81 char *__env
[1] = @
{ 0 @
};
82 char **environ = __env;
86 Transfer control to a new process. Minimal implementation (for a system
93 int execve(char *name, char **argv, char **env)@
{
100 Create a new process. Minimal implementation (for a system without processes):
113 Status of an open file. For consistency with other minimal
114 implementations in these examples, all files are regarded as character
115 special devices. The @file
{sys/stat.h
} header file required is
116 distributed in the @file
{include
} subdirectory for this C library.
119 #include <sys/stat.h>
120 int fstat(int file, struct stat *st) @
{
121 st->st_mode = S_IFCHR;
127 Process-ID; this is sometimes used to generate strings unlikely to
128 conflict with other processes. Minimal implementation, for a system
138 Query whether output stream is a terminal. For consistency with the
139 other minimal implementations, which only support output to
140 @code
{stdout
}, this minimal implementation is suggested:
143 int isatty(int file)@
{
149 Send a signal. Minimal implementation:
155 int kill(int pid, int sig)@
{
162 Establish a new name for an existing file. Minimal implementation:
168 int link(char *old, char *new)@
{
175 Set position in a file. Minimal implementation:
178 int lseek(int file, int ptr, int dir)@
{
184 Open a file. Minimal implementation:
187 int open(const char *name, int flags, int mode)@
{
193 Read from a file. Minimal implementation:
196 int read(int file, char *ptr, int len)@
{
202 Increase program data space. As @code
{malloc
} and related functions
203 depend on this, it is useful to have a working implementation. The
204 following suffices for a standalone system; it exploits the symbol
205 @code
{end
} automatically defined by the GNU linker.
209 caddr_t sbrk(int incr)@
{
210 extern char end; /* @r
{Defined by the linker
} */
211 static char *heap_end;
214 if (heap_end ==
0) @
{
217 prev_heap_end = heap_end;
218 if (heap_end + incr > stack_ptr)
220 _write (
1, "Heap and stack collision
\n",
25);
225 return (caddr_t) prev_heap_end;
231 Status of a file (by name). Minimal implementation:
234 int stat(char *file, struct stat *st) @
{
235 st->st_mode = S_IFCHR;
241 Timing information for current process. Minimal implementation:
244 int times(struct tms *buf)@
{
250 Remove a file's directory entry. Minimal implementation:
256 int unlink(char *name)@
{
263 Wait for a child process. Minimal implementation:
268 int wait(int *status) @
{
275 Write a character to a file. @file
{libc
} subroutines will use this
276 system routine for output to all files, @emph
{including
}
277 @code
{stdout
}---so if you need to generate any output, for example to a
278 serial port for debugging, you should make your minimal @code
{write
}
279 capable of doing this. The following minimal implementation is an
280 incomplete example; it relies on a @code
{writechar
} subroutine (not
281 shown; typically, you must write this in assembler from examples
282 provided by your hardware manufacturer) to actually perform the output.
286 int write(int file, char *ptr, int len)@
{
289 for (todo =
0; todo < len; todo++) @
{
300 @node Reentrant Syscalls
301 @section Reentrant covers for OS subroutines
303 Since the system subroutines are used by other library routines that
304 require reentrancy, @file{libc.a} provides cover routines (for example,
305 the reentrant version of @code{fork} is @code{_fork_r}). These cover
306 routines are consistent with the other reentrant subroutines in this
307 library, and achieve reentrancy by using a reserved global data block
308 (@pxref{Reentrancy,,Reentrancy}).
310 @c FIXME!!! The following ignored text specifies how this section ought
311 @c to work; however, both standalone info and Emacs info mode fail when
312 @c confronted with nodes beginning `_' as of 24may93. Restore when Info
316 * _open_r:: Reentrant version of open
317 * _close_r:: Reentrant version of close
318 * _lseek_r:: Reentrant version of lseek
319 * _read_r:: Reentrant version of read
320 * _write_r:: Reentrant version of write
321 * _link_r:: Reentrant version of link
322 * _unlink_r:: Reentrant version of unlink
323 * _stat_r:: Reentrant version of stat
324 * _fstat_r:: Reentrant version of fstat
325 * _sbrk_r:: Reentrant version of sbrk
326 * _fork_r:: Reentrant version of fork
327 * _wait_r:: Reentrant version of wait
331 @include reent/filer.def
332 @include reent/execr.def
333 @include reent/statr.def
334 @include reent/fstatr.def
335 @include reent/linkr.def
336 @include reent/unlinkr.def
337 @include reent/sbrkr.def
343 A reentrant version of @code{open}. It takes a pointer
344 to the global data block, which holds @code{errno}.
347 int _open_r(void *@var{reent},
348 const char *@var{file}, int @var{flags}, int @var{mode});
353 A reentrant version of @code{open64}. It takes a pointer
354 to the global data block, which holds @code{errno}.
357 int _open64_r(void *@var{reent},
358 const char *@var{file}, int @var{flags}, int @var{mode});
363 A reentrant version of @code{close}. It takes a pointer to the global
364 data block, which holds @code{errno}.
367 int _close_r(void *@var{reent}, int @var{fd});
371 A reentrant version of @code{lseek}. It takes a pointer to the global
372 data block, which holds @code{errno}.
375 off_t _lseek_r(void *@var{reent},
376 int @var{fd}, off_t @var{pos}, int @var{whence});
381 A reentrant version of @code{lseek64}. It takes a pointer to the global
382 data block, which holds @code{errno}.
385 off_t _lseek64_r(void *@var{reent},
386 int @var{fd}, off_t @var{pos}, int @var{whence});
391 A reentrant version of @code{read}. It takes a pointer to the global
392 data block, which holds @code{errno}.
395 long _read_r(void *@var{reent},
396 int @var{fd}, void *@var{buf}, size_t @var{cnt});
400 A reentrant version of @code{write}. It takes a pointer to the global
401 data block, which holds @code{errno}.
404 long _write_r(void *@var{reent},
405 int @var{fd}, const void *@var{buf}, size_t @var{cnt});
409 A reentrant version of @code{fork}. It takes a pointer to the global
410 data block, which holds @code{errno}.
413 int _fork_r(void *@var{reent});
417 A reentrant version of @code{wait}. It takes a pointer to the global
418 data block, which holds @code{errno}.
421 int _wait_r(void *@var{reent}, int *@var{status});
425 A reentrant version of @code{stat}. It takes a pointer to the global
426 data block, which holds @code{errno}.
429 int _stat_r(void *@var{reent},
430 const char *@var{file}, struct stat *@var{pstat});
434 A reentrant version of @code{fstat}. It takes a pointer to the global
435 data block, which holds @code{errno}.
438 int _fstat_r(void *@var{reent},
439 int @var{fd}, struct stat *@var{pstat});
444 A reentrant version of @code{fstat64}. It takes a pointer to the global
445 data block, which holds @code{errno}.
448 int _fstat64_r(void *@var{reent},
449 int @var{fd}, struct stat *@var{pstat});
454 A reentrant version of @code{link}. It takes a pointer to the global
455 data block, which holds @code{errno}.
458 int _link_r(void *@var{reent},
459 const char *@var{old}, const char *@var{new});
463 A reentrant version of @code{unlink}. It takes a pointer to the global
464 data block, which holds @code{errno}.
467 int _unlink_r(void *@var{reent}, const char *@var{file});
471 A reentrant version of @code{sbrk}. It takes a pointer to the global
472 data block, which holds @code{errno}.
475 char *_sbrk_r(void *@var{reent}, size_t @var{incr});