# pyemscripten_2024_0

By default, all builds of the Pyodide runtime with Python 3.12 will use the
`pyemscripten_2024_0` platform.

```{note}
Prior to {pep}`783`, the platform was referenced as `pyodide_2024_0`.
```

## ABI Specification

### CPython and Emscripten Version

- **CPython**: 3.12
- **Emscripten**: 3.1.58

### WASM_BIGINT

All shared libraries must be linked with `-sWASM_BIGINT`.

Since Rust 1.84.0 or nightly 2024-11-05, Rust will automatically pass
`-Clink-arg=-sWASM_BIGINT`. In earlier versions of Rust it was required to pass
`-Clink-arg=-sWASM_BIGINT` explicitly. Passing it explicitly will work in all
cases.

### Unwinding ABIs

By default, C++ libraries are built with exceptions disabled, and `throw` is an
abort. The same is true for `setjmp`/`longjmp`. To enable exceptions and
`setjmp`/`longjmp`, `-fexceptions` must be passed at compile time and link time.

Rust will automatically enable unwinding.

### Rust Toolchain

The Rust toolchain used must be a nightly released prior to October 1st 2025.

### Runtime Library Loading Path

Specifying an RPATH is not supported, `emcc` will warn and ignore it. The
dynamic loader has been patched so that all dynamic libraries in a wheel named
`wheel_name-<tag>.whl` will be loaded as if
`/lib/python3.12/site-packages/wheel_name.libs` is on the `RPATH`, so any
dynamic library dependencies should be placed in the wheel in a folder called
`wheel_name.libs`.

### Libraries Linked to the Main Binary

The following libraries are statically linked to the binary:

- `libegl.js`
- `libeventloop.js`
- `libGL`
- `libhtml5_webgl.js`
- `libhtml5.js`
- `liblz4`
- `libsdl.js`
- `libwebgl.js`
- `libwebsocket.js`
- `bzip2`
- `zlib`

All of these come from Emscripten ports and the versions of these libraries are
determined by the version of Emscripten we build with. Any symbols from these
static libraries may be used by shared libraries.
