| |||
| Home > The C and C++ Libraries > Writing reentrant and thread-safe code > The __user_libspace static data area | |||
The __user_libspace static data area holds
the static data for the C libraries. This is a block of 96 bytes
in the ZI segment, supplied by the C library. It is also used as
a temporary stack during C library initialization.
The default ARM C libraries use the __user_libspace area
to hold:
errno,
used by any function that is capable of setting errno.
By default, __rt_errno_addr() returns a pointer
to errno.
The FP status word for software floating-point (exception
flags, rounding mode). It is unused in hardware floating-point.
By default, __rt_fp_status_addr() returns a pointer
to the FP status word.
A pointer to the base of the heap (that is, the __Heap_Descriptor),
used by all the malloc-related functions.
The alloca state, used by alloca() and
its helper functions.
The current locale settings, used by functions such
as setlocale(), but also used by all other library
functions which depend on them. For example, the ctype.h functions
have to access the LC_CTYPE setting.
The C++ libraries use the __user_libspace area
to hold:
The new_handler field
and ddtor_pointer:
the new_handler field
is used to keep track of the value passed to std::set_new_handler()
the ddtor_pointer is used by __cxa_atexit() and __aeabi_atexit().
C++ exception handling information for functions
such as std::set_terminate() and std::set_unexpected().
See the C++ ABI for the ARM Architecture and Exception
Handling ABI for the ARM Architecture specifications
for more information on __aeabi_atexit(), std::set_terminate() and std::set_unexpected().
How the C and C++ library use the __user_libspace area
might change in future releases.
Two wrapper functions are provided to return a subsection
of the __user_libspace static data area:
Returns a pointer to 96 bytes used to store data that is global to an entire process, that is data shared between all threads.
Returns a pointer to 96 bytes used to store data
that is local to a particular thread. This means that __user_perthread_libspace() returns
a different address depending on the thread it is called from.
The __user_libspace() function does not
normally have to be redefined. However, if you are writing an operating
system or a process switcher, you must re-implement this function
(see Tailoring static data access for more
details).
Where you are porting single-threaded processes to RVCT v2.2 that re-implement this function, you can continue to do this without having to change your code. The change in behavior is, however, important if you are using RVCT to write multithreaded applications.