NetBSD/lib/libc
kamil 8a69d50880 Deregister vadvise.S from lib/libc/sys/Makefile.inc
Such file was never registered since the inception of NetBSD.
The (o)vadvise is dummy since the beginning of NetBSD.

Sponsored by <The NetBSD Foundation>
2017-12-19 18:43:42 +00:00
..
arch fix to work 2017-11-28 13:09:05 +00:00
atomic Add membar_datadep_consumer to the NAME section 2017-10-24 18:19:17 +00:00
cdb Use a more efficient data structure for graph peeling. 2017-11-11 18:05:31 +00:00
citrus s == NULL is illegal. 2017-07-13 16:00:30 +00:00
compat scandir/alphasort take "const struct dirent **" not "const void *" in 2016-12-16 04:45:04 +00:00
compat-43 End sentence with a dot. 2013-05-06 13:29:12 +00:00
compiler_rt Do not use IEEE 754 specific functions for VAX 2017-07-23 09:50:54 +00:00
db Fix syntax for currently not compiled in code. From Henning Petersen in 2016-10-09 11:48:24 +00:00
dlfcn Implement __cxa_thread_atexit and __cxa_thread_atexit_impl. This 2017-07-11 15:21:31 +00:00
gdtoa PR/50937: Henning Petersen: Fix subnormal printf for long double x86. From 2016-03-13 19:44:58 +00:00
gen Revert change made by rev 1.11; now, fmtcheck(3) does not complain about 2017-12-13 06:43:45 +00:00
gmon make more descriptors that we open as close-on-exec 2014-09-18 13:58:20 +00:00
hash Add riastradh's man pages for sha3 and friends. 2017-11-30 16:00:48 +00:00
iconv Bump date for previous. 2016-06-08 07:53:15 +00:00
include Import SHA-3 code into libc and libkern. 2017-11-30 05:47:24 +00:00
inet Remove workaround for ancient HTML generation code. 2017-07-03 21:28:48 +00:00
isc time_t casts 2012-03-21 00:34:54 +00:00
locale PR/52801: Kamil Rytarowski: Add missing weak aliases for wcsto{f,d,ld}_l 2017-12-09 22:48:00 +00:00
md undo, the right place for this is compat_defs.h 2014-09-24 13:18:52 +00:00
misc PR 51654: Don't initialize _dlauxinfo for static binaries. 2017-06-17 15:26:44 +00:00
nameser reduce diffs with other copies of this code. 2014-03-07 01:07:01 +00:00
net Fix Bl argument. 2017-10-30 15:46:38 +00:00
nls belt-n-suspenders, close on exec catalog files. 2014-09-16 01:30:28 +00:00
quad Don't return 0x1.0p31 for every input value 2^N. 2013-09-30 19:32:14 +00:00
regex Remove workaround for ancient HTML generation code. 2017-07-03 21:28:48 +00:00
resolv PR/52578: Benjamin M. Schwartz Set the AD bit when DNSSEC is enabled 2017-09-28 23:32:01 +00:00
rpc Add __svc_getcallercreds to the NAME section 2017-10-25 16:49:24 +00:00
softfloat Avoid warnings (signed/unsigned comparision and unused variable) 2016-03-29 18:42:29 +00:00
ssp Remove workaround for ancient HTML generation code. 2017-07-03 21:28:48 +00:00
stdio Add O_REGULAR to enforce opening of only regular files 2017-11-09 20:30:01 +00:00
stdlib Fix obvious typo (cut&pasto or whatever) - there's only one value that 2017-12-07 22:19:17 +00:00
string PR/52499: Justin: stresep uses memmove with of-by-one length 2017-08-23 10:27:41 +00:00
sys Deregister vadvise.S from lib/libc/sys/Makefile.inc 2017-12-19 18:43:42 +00:00
termios Remove empty Fd. Use minus for return value. End list. Sort SEE ALSO. 2017-10-30 15:43:21 +00:00
thread-stub Add CHECK_NOT_THREADED() in __libc_mutexattr_settype_stub() 2016-10-31 18:10:11 +00:00
time Fix the escape used for em dash 2017-10-29 06:07:48 +00:00
tls fix powerpc TLS problems by removing the hacks for PPC EABI. 2014-12-14 23:49:17 +00:00
uuid
yp Remove workaround for ancient HTML generation code. 2017-07-03 21:28:48 +00:00
Makefile Only create and install the tags file for the normal libc (not any of the 2015-06-15 14:24:01 +00:00
Makefile.inc Don't unconditionally pass MLIBDIR via CPPFLAGS. Drop now dead branch. 2015-08-28 11:45:02 +00:00
README Omit duplicate text. 2017-02-08 13:31:36 +00:00
libcincludes.mk MKCOMPAT fixes for when compat MACHINE_CPU != normal MACHINE_CPU 2014-08-10 23:39:08 +00:00
shlib_version Implement tcgetwinsize() and tcsetwinsize() in libc, with access 2017-10-25 06:32:59 +00:00

README

	$NetBSD: README,v 1.7 2017/02/08 13:31:36 riastradh Exp $

libc: The C library.

* ELF symbols and source names

libc contains symbols for:

(a) standard library routines in C and POSIX,
(b) published NetBSD-specific nonstandard extensions,
(c) internal symbols, and
(d) old versions of any published library routines.

** Standard library routines

If a library routine is standard and its signature has never changed,
it is provided as an ELF global symbol.  Its name is declared normally
in the appropriate header file.

=> Example: The names `malloc' and `free' are declared normally in
   <stdlib.h> (src/include/stdlib.h):

	void	*malloc(size_t);
	void	 free(void *);

   libc provides the following ELF symbols:

	malloc		global
	free		global

   In the implementation of libc, malloc and free are defined normally
   in src/lib/libc/stdlib/jemalloc.c:

	void *
	malloc(size_t size)
	{
	...

	void
	free(void *ptr)
	{
	...

** NetBSD-specific nonstandard extensions

If a library routine is nonstandard but published and its signature has
never changed, it is provided as an ELF weak symbol aliasing an ELF
global symbol of the same name with an underscore prefix.

The name is declared normally in the appropriate header file, provided
that the relevant feature macro, such as _NETBSD_SOURCE, is defined.

Within libc, the name is defined in "namespace.h"
(src/lib/libc/include/namespace.h) as a macro expanding to the
underscored name, which is included before the relevant header file, so
that

(a) the definition in a .c file will define the underscored ELF global
symbol, and

(b) the declaration in the standard header file will match the
definition in the .c file.

Alongside the definition in the .c file is a __weak_alias directive to
create the ELF weak symbol alias.

=> Example: For the nonstandard extension consttime_memequal, the
   header file <string.h> (src/include/string.h) declares
   `consttime_memequal' normally, if the caller defines _NETBSD_SOURCE:

	#if defined(_NETBSD_SOURCE)
	...
	int	consttime_memequal(const void *, const void *, size_t);
	...
	#endif	/* _NETBSD_SOURCE */

   libc provides the following ELF symbols:

	_consttime_memequal	global
	consttime_memequal	weak alias for	_consttime_memequal

   In the implementation of libc, the header file "namespace.h"
   (src/lib/libc/include/namespace.h) defines `consttime_memequal' as a
   macro expanding to `_consttime_memequal':

	#define	consttime_memequal	_consttime_memequal

   The source file src/common/lib/libc/string/consttime_memequal.c
   includes "namespace.h" and <string.h>, and defines
   `consttime_memequal' normally:

	int
	consttime_memequal(const void *b1, const void *b2, size_t len)
	{
	...

   Macro expansion replaces `consttime_memequal' by
   `_consttime_memequal', which is the ELF global symbol this defines.
   Alongside the definition is

	__weak_alias(consttime_memequal,_consttime_memequal)

   to provide `consttime_memequal' as an ELF weak symbol aliasing
   `_consttime_memequal'.

** Internal symbols

If a library routine is internal to libc, it is defined as an ELF
global symbol with an underscore prefix.  Its name is declared in the
appropriate internal header file.

=> Example: The implementations of opendir and rewinddir use a common
   subroutine _initdir, which is not part of the libc API or ABI -- it
   is just an internal subroutine.

   libc provides the following ELF symbols:

	_initdir	global

   The name `_initdir' is declared normally in
   src/lib/libc/gen/dirent_private.h:

	int	_initdir(DIR *, int, const char *);

   The name `_initdir' is defined normally in
   src/lib/libc/gen/initdir.c:

	int
	_initdir(DIR *dirp, int fd, const char *name)
	{
	...

** Old versions of library routines

If the signature or semantics of a library routine foo changed in (for
example) NetBSD 6.0, then libc provides

(1) an ELF global symbol `_foo' implementing its old signature,
(2) an ELF weak symbol `foo' aliasing `_foo', and
(3) an ELF global symbol `__foo50' implementing its new signature (yes,
    `__foo50', not `__foo60').

The name foo is declared in the appropriate header file, under any
relevant feature macros, with a __RENAME directive so that for calls to
foo, the compiler will generate relocations for __foo50.  Old programs,
compiled with the old signature, will continue to use the old symbol.

=> Example: In NetBSD 5.0, time_t was int32_t on every machine.  In
   NetBSD 6.0 and onward, time_t is int64_t on every machine.
   Consequently, the signature of time(3), written as

	time_t	time(time_t *);

   was effectively

	int32_t	time(int32_t *);

   before NetBSD 6.0.  In NetBSD 6.0, it changed to be effectively

	int64_t time(int64_t *);

   Before NetBSD 6.0, libc provided the following libc symbols:

	_time		global (implementing the old signature)
	time		weak alias for _time

   In NetBSD 6.0 and later, libc provides the following ELF symbols:

	_time		global (implementing the old signature)
	time		weak alias for _time
	__time50	global (implementing the new signature)

   (Note that the only change is to add __time50, so that existing
   programs linked against old versions of libc will see the same
   semantics for the symbols that were already there.)

   The header file <time.h> (src/include/time.h) declares

	time_t	time(time_t *) __RENAME(__time50);

   so that compiling C programs that call time will yield objects that
   use the __time50 symbol from libc.  However, old programs that were
   compiled against the 32-bit declaration will continue to use the
   32-bit symbol from libc.

   The header file "namespace.h" (src/lib/libc/include/namespace.h)
   defines `time' as a macro expanding to `_time':

	#define	time	_time

   The source file src/lib/libc/gen/time.c includes "namespace.h" and
   <time.h> and defines `time' normally:

	time_t
	time(time_t *t)
	{
	...

   Macro expansion replaces `time' by `_time', but the
   `__RENAME(__time50)' directive on the declaration <time.h> (to which
   the "namespace.h" macro expansion also applies) means the ELF global
   symbol defined here is actually `__time50'.

   The header file <compat/include/time.h>
   (src/lib/libc/compat/include/time.h) declares

	int32_t	time(int32_t *);

   The source file src/lib/libc/compat/gen/compat_time.c includes
   "namespace.h", <compat/include/time.h>, and <time.h>, but suppresses
   the normal declaration of `time' in <time.h> by defining
   __LIBC12_SOURCE__ and thus gets it from <compat/include/time.h>
   instead.  Then compat_time.c defines `time' normally:

	int32_t
	time(int32_t *t)
	{
	...

   Again, macro expansion replaces `time' by `_time', but since there
   is no __RENAME directive in <compat/include/time.h>, the resulting
   ELF global symbol is `_time'.  (Actually, compat_time.c just has
   `#define time_t int32_t' and `#include "gen/time.c"' to get the same
   text of the definition of time.  The above definition is what we get
   effectively by substituting int32_t for the type time_t.)

   Finally, alongside the definition in compat_time.c is

	__weak_alias(time,_time)

   to define `time' as an ELF weak symbol aliasing `_time'.

   The net effect is that NetBSD 6's libc provides the same definitions
   as NetBSD 5's libc for the symbols `time' and `_time', so that old
   programs that were compiled in NetBSD 5 will continue to work with
   NetBSD 6's libc.  But programs compiled in NetBSD 6 will have 64-bit
   time_t.