mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
lib/libc/glibc/: Add README.md
Add a README with an overview of how Zig's glibc support is implemented.
This commit is contained in:
parent
42d7b69d81
commit
71e809852c
1 changed files with 85 additions and 0 deletions
85
lib/libc/glibc/README.md
vendored
Normal file
85
lib/libc/glibc/README.md
vendored
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
# Zig GNU C Library ("glibc") Support
|
||||||
|
|
||||||
|
*Date*: November, 2023
|
||||||
|
|
||||||
|
Zig supports building binaries that will dynamically link against the
|
||||||
|
[GNU C Library ("glibc")](https://www.gnu.org/software/libc/) when run.
|
||||||
|
This support extends across a range of glibc versions.
|
||||||
|
|
||||||
|
By default, Zig binaries will not depend on any external C library, but
|
||||||
|
they can be linked against one with the `-lc` option. The compilation
|
||||||
|
target defines which C library: `musl` for the
|
||||||
|
[musl C library](https://musl.libc.org/) or `gnu` for the GNU C library.
|
||||||
|
|
||||||
|
A specific GNU C library version can be chosen with an appropriate
|
||||||
|
`-target`. For example, `-target native-native-gnu.2.19` will use the
|
||||||
|
default CPU and OS targets, but will link in a run-time dependency on
|
||||||
|
glibc v2.19 (or later). Use `zig env` to show the default target and
|
||||||
|
version.
|
||||||
|
|
||||||
|
Glibc symbols are defined in the `std.c.` namespace in Zig, though the
|
||||||
|
`std.os.` namespace is generally what should be used to access C-library
|
||||||
|
APIs in Zig code (it is defined depending on the linked C library).
|
||||||
|
|
||||||
|
See `src/glibc.zig` for how Zig will build the glibc components. The
|
||||||
|
generated shared object files are sufficient only for compile-time
|
||||||
|
linking. They are stub libraries that only indicate that which symbols
|
||||||
|
will be present at run-time, along with their type and size. The symbols
|
||||||
|
do not reference an actual implementation.
|
||||||
|
|
||||||
|
## Targets
|
||||||
|
|
||||||
|
The GNU C Library supports a very wide set of platforms and architectures.
|
||||||
|
The current Zig support for glibc only supports Linux.
|
||||||
|
|
||||||
|
Zig supports glibc versions back to v2.17 (2012) as the Zig standard
|
||||||
|
library depends on symbols that were introduced in 2.17.
|
||||||
|
|
||||||
|
## Glibc stubs
|
||||||
|
|
||||||
|
The file `lib/libc/glibc/abilist` is a Zig-specific binary blob that
|
||||||
|
defines the supported glibc versions and the set of symbols each version
|
||||||
|
must define. See https://github.com/ziglang/glibc-abi-tool for the
|
||||||
|
tooling to generate this blob. The code in `glibc.zig` parses the abilist
|
||||||
|
to build version-specific stub libraries on demand.
|
||||||
|
|
||||||
|
The generated stub library is used for compile-time linking, with the
|
||||||
|
expectation that at run-time the real glibc library will provide the
|
||||||
|
actual symbol implementations.
|
||||||
|
|
||||||
|
### Public Headers
|
||||||
|
|
||||||
|
The glibc headers are in `lib/libc/include/generic-glibc/`. These are
|
||||||
|
customized and have a couple Zig-specific `#ifdef`s to make the single set
|
||||||
|
of headers represent any of the supported glibc versions. There are
|
||||||
|
currently a handful of patches to these headers to represent new features
|
||||||
|
(e.g. `reallocarray`) or changes in implementation (e.g., the `stat()`
|
||||||
|
family of functions).
|
||||||
|
|
||||||
|
The related Zig https://github.com/ziglang/universal-headers is a project
|
||||||
|
designed to more robustly build multi-version header files suitable for
|
||||||
|
compliation across a variety of target C library versions.
|
||||||
|
|
||||||
|
## Glibc static C-Runtime object files and libraries
|
||||||
|
|
||||||
|
Linking against glibc also implies linking against several, generally
|
||||||
|
"invisible" glibc C Runtime libraries: `crti.o`, `crtn.o`, `Scrt1.o` and
|
||||||
|
`libc_nonshared.a`. These objects are linked into generated Zig binaries
|
||||||
|
and are not run-time linking dependencies. Generally they provide
|
||||||
|
bootstrapping, initialization, and mapping of un-versioned public APIs to
|
||||||
|
glibc-private versioned APIs.
|
||||||
|
|
||||||
|
Like the public headers, these files contain a couple customiziations for
|
||||||
|
Zig to be able to build for any supported glibc version. E.g., for glibc
|
||||||
|
versions before v2.32, `libc_nonshared.a` contained stubs that directed
|
||||||
|
the `fstat()` call to a versioned `__fxstat()` call.
|
||||||
|
|
||||||
|
These files used for these objects are in `lib/libc/glibc`. See the
|
||||||
|
`tools/update_glibc.zig` tool for updating content in here from the
|
||||||
|
upstream glibc.
|
||||||
|
|
||||||
|
# More Information
|
||||||
|
|
||||||
|
See
|
||||||
|
https://github.com/ziglang/zig/commit/2314051acaad37dd5630dd7eca08571d620d6496
|
||||||
|
for an example commit that updates glibc (to v2.38).
|
||||||
Loading…
Add table
Reference in a new issue