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