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