blob: 4965dcc9f1d5792209b70bf88e09e2a430608671 [file] [log] [blame] [view]
Fuchsia Core Libraries
======================
This document describes the core libraries in the Fuchsia system, starting from
the bottom of the dependency chain.
# Zircon libraries
## libzircon
This library defines the Zircon system ABI.
TODO(kulakowski) Talk about how this is not quite the kernel
syscall interface, since the VDSO abstracts that.
## libzx
libzircon defines C types and function calls acting on those
objects. libzx is a light C++ wrapper around those. It adds type
safety beyond `zx_handle_t`, so that every kernel object type has a
corresponding C++ type, and adds ownership semantics to those
handles. It otherwise takes no opinions around naming or policy.
For more information about libzx, see
[its documentation](/zircon/system/ulib/zx/README.md).
## FBL
Much of Zircon is written in C++, both in kernel and in
userspace. Linking against the C++ standard library is not especially
well suited to this environment (it is too easy to allocate, throw
exceptions, etc., and the library itself is large). There are a number
of useful constructs in the standard library that we would wish to use,
like type traits and unique pointers. However, C++ standard libraries
are not really to be consumed piecemeal like this. So we built a
library which provides similar constructs named fbl. This library
also includes constructs not present in the standard library but which
are useful library code for kernel and device driver environments (for
instance, slab allocation).
For more information about FBL,
[read its overview](/docs/development/languages/c-cpp/cxx.md#fbl).
# FXL
FXL is a platform-independent library containing basic C++ building blocks, such
as logging and reference counting. FXL depends on the C++ standard library but
not on any Zircon- or Fuchsia-specific libraries. We build FXL both for target
(Fuchsia) and for host (Linux, Mac) systems.
Generally speaking, we try to use the C++ standard library for basic building
blocks, but in some cases the C++ standard library either doesn't have something
we need (e.g., a featureful logging system) or has a version of what we need
doesn't meet our requirements (e.g., `std::shared_ptr` is twice as large as
`fxl::RefPtr`).