README revision 1.4 1 $NetBSD: README,v 1.4 2015/07/11 14:29:50 riastradh Exp $
2
3 libc: The C library.
4
5 * ELF symbols and source names
6
7 libc contains symbols for:
8
9 (a) standard library routines in C and POSIX,
10 (b) published NetBSD-specific nonstandard extensions,
11 (c) internal symbols, and
12 (d) old versions of any published library routines.
13
14 ** Standard library routines
15
16 If a library routine is standard and its signature has never changed,
17 it is defined as an ELF global symbol. Its name is declared normally
18 in the appropriate header file.
19
20 => Example: libc defines global symbols `malloc' and `free' for the
21 standard C memory allocator routines. The names `malloc' and `free'
22 are declared normally in <stdlib.h> (src/include/stdlib.h).
23
24 ** NetBSD-specific nonstandard extensions
25
26 If a library routine is nonstandard but published and its signature has
27 never changed, it is defined as an ELF weak symbol aliasing an ELF
28 global symbol of the same name with an underscore prefix.
29
30 The name is declared normally in the appropriate header file, provided
31 that the relevant feature macro, such as _NETBSD_SOURCE, is defined.
32
33 Within libc, the name is defined in "namespace.h"
34 (src/lib/libc/include/namespace.h) as a macro expanding to the
35 underscored name, so that the definition in a .c file will define the
36 underscored ELF global symbol.
37
38 Alongside the definition in the .c file is a __weak_alias directive to
39 create the ELF weak symbol alias.
40
41 => Example: For the nonstandard extension consttime_memequal, libc
42 defines a weak symbol `consttime_memequal' aliasing a global symbol
43 `_consttime_memequal'.
44
45 The header file <string.h> (src/include/string.h) declares
46 `consttime_memequal' normally, if the caller defines _NETBSD_SOURCE.
47
48 The header file "namespace.h" (src/lib/libc/include/namespace.h)
49 defines `consttime_memequal' as a macro expanding to
50 `_consttime_memequal'.
51
52 The source file src/common/lib/libc/string/consttime_memequal.c
53 includes "namespace.h" and <string.h>, and defines
54 `consttime_memequal' normally, which, after macro expansion, causes
55 the ELF global symbol `_consttime_memequal' to be defined.
56
57 Alongside the definition is
58
59 __weak_alias(consttime_memequal,_consttime_memequal)
60
61 to provide `consttime_memequal' as an ELF weak symbol aliasing
62 `_consttime_memequal'.
63
64 ** Internal symbols
65
66 If a library routine is internal to libc, it is defined as an ELF
67 global symbol with an underscore prefix. Its name is declared in the
68 appropriate internal header file.
69
70 => Example: For the internal library routine _initdir, used by the
71 implementations of opendir and rewinddir, libc defines a global
72 symbol `_initdir'. The name `_initdir' is declared normally in
73 src/lib/libc/gen/dirent_private.h, and defined normally in
74 src/lib/libc/gen/initdir.c.
75
76 ** Old versions of library routines
77
78 If the signature or semantics of a library routine foo changed in (for
79 example) NetBSD 6.0, then libc provides
80
81 (1) an ELF global symbol `_foo' implementing its old signature,
82 (2) an ELF weak symbol `foo' aliasing `_foo', and
83 (3) an ELF global symbol `__foo50' implementing its new signature (yes,
84 `__foo50', not `__foo60').
85
86 The name foo is declared in the appropriate header file, under any
87 relevant feature macros, with a __RENAME directive so that for calls to
88 foo, the compiler will generate relocations for __foo50. Old programs,
89 compiled with the old signature, will continue to use the old symbol.
90
91 => Example: In NetBSD 5.0, time_t was int32_t on every machine. In
92 NetBSD 6.0 and onward, time_t is int64_t on every machine.
93 Consequently, the signature of time(3), written as
94
95 time_t time(time_t *);
96
97 changed in NetBSD 6.0 from being effectively
98
99 int32_t time(int32_t *);
100
101 to being effectively
102
103 int64_t time(int64_t *);
104
105 Thus, libc provides
106
107 (1) the ELF global symbol `_time' implementing the old signature,
108 (2) the ELF weak symbol `time' aliasing `_time', and
109 (3) the ELF global symbol `__time50' implementing the new signature.
110
111 The header file <time.h> (src/include/time.h) declares
112
113 time_t time(time_t *) __RENAME(__time50);
114
115 so that compiling C programs that call time will yield objects that
116 use the __time50 symbol from libc. However, old programs that were
117 compiled against the 32-bit declaration will continue to use the
118 32-bit symbol from libc.
119
120 The header file "namespace.h" (src/lib/libc/include/namespace.h)
121 defines `time' as a macro expanding to `_time'.
122
123 The source file src/lib/libc/gen/time.c includes "namespace.h" and
124 <time.h> and defines `time' normally. The declaration of `time' in
125 <time.h> is replaced after macro expansion by a declaration of
126 `_time', and the definition in time.c is replaced by a definition of
127 `_time'. But the __RENAME directive causes the resulting ELF global
128 symbol to be `__time50'.
129
130 The header file <compat/include/time.h>
131 (src/lib/libc/compat/include/time.h) declares
132
133 int32_t time(int32_t *);
134
135 The source file src/lib/libc/compat/gen/compat_time.c includes
136 "namespace.h", <compat/include/time.h>, and <time.h>, but suppresses
137 the normal declaration of `time' in <time.h> by defining
138 __LIBC12_SOURCE__. Then compat_time.c defines `time' normally.
139 Again, the name is replaced after macro expansion by `_time', but
140 since there is no __RENAME directive in <compat/include/time.h>, the
141 resulting ELF global symbol is `_time'.
142
143 Finally, alongside the definition in compat_time.c is
144
145 __weak_alias(time,_time)
146
147 to provide `time' as an ELF weak symbol aliasing `_time'.
148
149 The net effect is that NetBSD 6's libc provides the same definitions
150 as NetBSD 5's libc for the symbols `time' and `_time', so that old
151 programs that were compiled in NetBSD 5 will continue to work with
152 NetBSD 6's libc. But programs compiled in NetBSD 6 will have 64-bit
153 time_t.
154