Home | History | Annotate | Line # | Download | only in libc
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