Keil Logo

Technical Support

On-Line Manuals

Libraries and Floating Point Support Guide

Preface The ARM C and C++ Libraries Mandatory linkage with the C library C and C++ runtime libraries Summary of the C and C++ runtime libraries Compliance with the Application Binary Interface ( Increasing portability of object files to other CL ARM C and C++ library directory structure Selection of ARM C and C++ library variants based Thumb C libraries C and C++ library features C++ and C libraries and the std namespace Multithreaded support in ARM C libraries ARM C libraries and multithreading ARM C libraries and reentrant functions ARM C libraries and thread-safe functions Use of static data in the C libraries Use of the __user_libspace static data area by the C library functions to access subsections of the _ Re-implementation of legacy function __user_libspa Management of locks in multithreaded applications How to ensure re-implemented mutex functions are c Using the ARM C library in a multithreaded environ Thread safety in the ARM C library Thread safety in the ARM C++ library The floating-point status word in a multithreaded Support for building an application with the C lib Using the C library with an application Using the C and C++ libraries with an application Using $Sub$$ to mix semihosted and nonsemihosted I Using the libraries in a nonsemihosting environmen C++ exceptions in a non-semihosting environment Direct semihosting C library function dependencies Indirect semihosting C library function dependenci C library API definitions for targeting a differen Support for building an application without the C Building an application without the C library Creating an application as bare machine C without Integer and floating-point compiler functions and Bare machine integer C Bare machine C with floating-point processing Customized C library startup code and access to C Using low-level functions when exploiting the C li Using high-level functions when exploiting the C l Using malloc() when exploiting the C library Tailoring the C library to a new execution environ Initialization of the execution environment and ex C++ initialization, construction and destruction Exceptions system initialization Emergency buffer memory for exceptions Library functions called from main() Program exit and the assert macro Assembler macros that tailor locale functions in t Link time selection of the locale subsystem in the Runtime selection of the locale subsystem in the C Definition of locale data blocks in the C library LC_CTYPE data block LC_COLLATE data block LC_MONETARY data block LC_NUMERIC data block LC_TIME data block Modification of C library functions for error sign Stack and heap memory allocation and the ARM C and Library heap usage requirements of the ARM C and C Choosing a heap implementation for memory allocati Stack pointer initialization and heap bounds Legacy support for __user_initial_stackheap() Avoiding the heap and heap-using library functions Tailoring input/output functions in the C and C++ Target dependencies on low-level functions in the The C library printf family of functions The C library scanf family of functions Redefining low-level library functions to enable d The C library functions fread(), fgets() and gets( Re-implementing __backspace() in the C library Re-implementing __backspacewc() in the C library Redefining target-dependent system I/O functions i Tailoring non-input/output C library functions Real-time integer division in the ARM libraries ISO C library implementation definition How the ARM C library fulfills ISO C specification mathlib error handling ISO-compliant implementation of signals supported ISO-compliant C library input/output characteristi Standard C++ library implementation definition C library functions and extensions Compiler generated and library-resident helper fun C and C++ library naming conventions Using macro__ARM_WCHAR_NO_IO to disable FILE decla Using library functions with execute-only memory The ARM C Micro-library Floating-point Support The C and C++ Library Functions reference Floating-point Support Functions Reference

Use of static data in the C libraries

1.5.4 Use of static data in the C libraries

Static data refers to persistent read/write data that is not stored on the stack or the heap. Callouts from the C library enable access to static data.

Static data can be external or internal in scope, and is:
  • At a fixed address, when compiled with --apcs /norwpi.
  • At a fixed address relative to the static base, register r9, when compiled with --apcs /rwpi.
  • At a fixed address relative to the program counter (pc), when compiled with --apcs /fpic.
Libraries that use static data might be reentrant, but this depends on their use of the __user_libspace static data area, and on the build options you choose:
  • When compiled with --apcs /norwpi, read/write static data is addressed in a position-dependent fashion. This is the default. Code from these variants is single-threaded because it uses read/write static data.
  • When compiled with --apcs /rwpi, read/write static data is addressed in a position-independent fashion using offsets from the static base register sb. Code from these variants is reentrant and can be multithreaded if each thread uses a different static base value.
The following describes how the C libraries use static data:
  • The default floating-point arithmetic libraries fz_* and fj_* do not use static data and are always reentrant. For software floating-point, the f_* and g_* libraries use static data to store the Floating-Point (FP) status word. For hardware floating-point, the f_* and g_* libraries do not use static data.
  • All statically-initialized data in the C libraries is read-only.
  • All writable static data is zero-initialized.
  • Most C library functions use no writable static data and are reentrant whether built with default build options, --apcs /norwpi or reentrant build options, --apcs /rwpi.
  • Some functions have static data implicit in their definitions. You must not use these in a reentrant application unless you build it with --apcs /rwpi and the callers use different values in sb.

Note

Exactly which functions use static data in their definitions might change in future releases.
Callouts from the C library enable access to static data. C library functions that use static data can be categorized as:
  • Functions that do not use any static data of any kind, for example fprintf().
  • Functions that manage a static state, such as malloc(), rand(), and strtok().
  • Functions that do not manage a static state, but use static data in a way that is specific to the implementation in ARM® Compiler, for example isalpha().
When the C library does something that requires implicit static data, it uses a callout to a function you can replace. These functions are shown in the following table. They do not use semihosting.

Table 1-1 C library callouts

Function Description
__rt_errno_addr() Called to get the address of the variable errno
__rt_fp_status_addr() Called by the floating-point support code to get the address of the floating-point status word
locale functions The function __user_libspace() creates a block of private static data for the library
The default implementation of __user_libspace creates a 96-byte block in the ZI region. Even if your application does not have a main() function, the __user_libspace() function does not normally have to be redefined.

Note

Exactly which functions use static data in their definitions might change in future releases.
Related reference
Non-ConfidentialPDF file icon PDF versionARM DUI0378H
Copyright © 2007, 2008, 2011, 2012, 2014-2016 ARM. All rights reserved. 
  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.