Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libc First draft of documentation for the libc symbol ma...
details: https://anonhg.NetBSD.org/src/rev/a14d0bb0f606
branches: trunk
changeset: 806938:a14d0bb0f606
user: riastradh <riastradh%NetBSD.org@localhost>
date: Fri Mar 20 12:57:48 2015 +0000
description:
First draft of documentation for the libc symbol madness.
Currently describes only what we do, not why we do it.
diffstat:
lib/libc/README | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 110 insertions(+), 0 deletions(-)
diffs (114 lines):
diff -r 639888b63e00 -r a14d0bb0f606 lib/libc/README
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/README Fri Mar 20 12:57:48 2015 +0000
@@ -0,0 +1,110 @@
+ $NetBSD: README,v 1.1 2015/03/20 12:57:48 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) old versions of library routines, and
+(d) internal symbols.
+
+If a library routine is standard and its signature has never changed,
+it is defined as an ELF global symbol. Its name is declared normally
+in the appropriate header file.
+
+=> Example: libc defines global symbols `malloc' and `free' for the
+ standard C memory allocator routines. The names `malloc' and `free'
+ are declared normally in <stdlib.h> (src/include/stdlib.h).
+
+If a library routine is nonstandard but published and its signature has
+never changed, it is defined 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, so that the definition in a .c file will define the
+underscored ELF global symbol.
+
+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, libc
+ defines a weak symbol `consttime_memequal' aliasing a global symbol
+ `_consttime_memequal'.
+
+ The name `consttime_memequal' is declared in <string.h>
+ (src/include/string.h) if the caller defines _NETBSD_SOURCE.
+
+ The name `consttime_memequal' is defined as a macro in "namespace.h"
+ (src/lib/libc/include/namespace.h) expanding to
+ `_consttime_memequal'. The source name `consttime_memequal' is
+ defined in src/common/lib/libc/string/consttime_memequal.c, causing
+ the ELF global symbol `_consttime_memequal' to be defined, after
+ macro expansion.
+
+ Alongside the definition is
+
+ __weak_alias(consttime_memequal,_consttime_memequal)
+
+ to provide `consttime_memequal' as an ELF weak symbol aliasing
+ `_consttime_memequal'.
+
+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: For the internal library routine _initdir, used by the
+ implementations of opendir and rewinddir, libc defines a global
+ symbol `_initdir'.
+
+ The name `_initdir' is declared normally in
+ src/lib/libc/gen/dirent_private.h.
+
+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 *);
+
+ changed in NetBSD 6.0 from being effectively
+
+ int32_t time(int32_t *);
+
+ to being effectively
+
+ int64_t time(int64_t *);
+
+ Thus, libc provides
+
+ (1) the ELF global symbol `_time' implementing the old signature,
+ (2) the ELF weak symbol `time' aliasing `_time', and
+ (3) the ELF global symbol `__time50' implementing the new signature.
+
+ The header file <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.
Home |
Main Index |
Thread Index |
Old Index