# Restrictions and known behavior
Libnative makes certain compromises in order to function:
- Libnative is not cycle accurate, and provides no timing model. Further,
Libnative is not a performance model, and makes no claim about the runtime
of the Hexagon target it models.
- Libnative is not bit-exact with XQFloat. This is not possible while keeping the
structs 32-bit, as there is no way to model the extra four bits.
Libnative is bit-exact with all non-XQFloat intrinsics on v81 and later, and is
bit-exact with all intrinsics, including QFloat, on v68 through v79.
## Configuration is fixed after initialization
The configuration must be complete before the first intrinsic call. Libnative
initializes itself lazily on that call and freezes the configuration; a later
attempt to reconfigure prints a diagnostic and aborts.
One process therefore exercises one configuration. A test matrix over
architectures needs one process per combination. See
[When configuration can be changed](https://docs.qualcomm.com/doc/80-N3040-23/topic/libnative-ug-configuration.html#libnative-config-timing).
## Diagnostics and failure behavior
Invalid configuration and misuse of the configuration API produce a diagnostic on
standard error and abort.
The messages a user is most likely to see:
| Message | Cause |
| --- | --- |
| `Libnative configured with unsupported arch vNN` | `arch` is not one of the compiled-in versions. See
[Supported versions](https://docs.qualcomm.com/doc/80-N3040-23/topic/libnative-ug-architecture-versions.html#libnative-arch-supported). |
| `libnative_configure() called after config was finalized` | A configuration call was made after the first intrinsic call. |
| `Config section [S] does not exist` /
`Config key [S].K does not exist` | A getter was called with an unknown section or key, or with a value of the
wrong type. |
Warning
A TOML string that fails to parse is ignored rather than diagnosed,
so a syntax error produces no message of its own. See
[Configuration API](https://docs.qualcomm.com/doc/80-N3040-23/topic/libnative-ug-configuration.html#libnative-config-api).
## Threading
Emulated state is per thread by default. Setting `use_tls = false` makes
Libnative use a single shared copy on a unified heap instead; see
[General settings](https://docs.qualcomm.com/doc/80-N3040-23/topic/libnative-ug-configuration.html#libnative-config-general). Sharing emulated state across threads with
`use_tls = false` is not advised, as Libnative does not enforce atomic
accesses in this mode.
Last Published: Oct 06, 2026
[Previous Topic
Selecting the version](https://docs.qualcomm.com/bundle/publicresource/80-N3040-23/topics/libnative-ug-architecture-versions.md) [Next Topic
Profiler User Guide](https://docs.qualcomm.com/bundle/publicresource/80-N3040-23/topics/index_80-n2040-10_profiler_user_guide.md)