[BACK]Return to README CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc

Annotation of src/lib/libc/README, Revision 1.3

1.3     ! riastrad    1:        $NetBSD: README,v 1.2 2015/03/20 13:26:51 riastradh Exp $
1.1       riastrad    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:
1.3     ! riastrad   41:    The header file <string.h> (src/include/string.h) declares
        !            42:    `consttime_memequal' normally, if the caller defines _NETBSD_SOURCE.
1.1       riastrad   43:
1.3     ! riastrad   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.
1.1       riastrad   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
1.2       riastrad   61: global symbol with an underscore prefix.  Its name is declared in the
                     62: appropriate internal header file.
1.1       riastrad   63:
                     64: => Example: For the internal library routine _initdir, used by the
                     65:    implementations of opendir and rewinddir, libc defines a global
1.2       riastrad   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.
1.1       riastrad   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:
1.2       riastrad  103:    The header file <time.h> (src/include/time.h) declares
1.1       riastrad  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.
1.2       riastrad  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.

CVSweb <webmaster@jp.NetBSD.org>