Skip to main content

🚀 Developing TAs with Rust Standard Library in Docker

This guide covers the dev-env with std support that enables developing TA using Rust standard library (std), compared to the regular no-std environment documented in emulate-and-dev-in-docker.md.

The dev-env with std support provides a complete setup for building TAs that can use Rust's standard library features like collections, networking, etc.

đź“– Prerequisites: Read the original Docker development guide first. This document focuses only on std-specific differences and capabilities.

What the Dev-Env with Std Support Provides​

The dev-env with std support enables developing TA using Rust std by providing:

  • Flexible configuration management - Switch between std/no-std modes and architectures dynamically
  • Rust standard library tailored for OP-TEE - Build TAs using collections, networking, serialization capabilities
  • Mixed development support - Combine different host and TA architectures, including switching between no-std/std in the same project

1. Setting Up the Dev-Env with Std Support​

Pull the Docker Image​

# Pull the dev-env with std support for developing TA using Rust std
$ docker pull teaclave/teaclave-trustzone-emulator-std-optee-4.5.0-expand-memory:latest

# Launch the dev-env container
$ docker run -it --rm \
--name teaclave_dev_env \
-v $(pwd):/root/teaclave_sdk_src \
-w /root/teaclave_sdk_src \
teaclave/teaclave-trustzone-emulator-std-optee-4.5.0-expand-memory:latest

One-Time Setup Inside Container​

# Create symbolic link to make it compatiable with existing SDK examples
$ ln -s $RUST_STD_DIR rust

📝 Note: This symlink is required for current SDK examples due to hardcoded std dependency paths in Cargo.toml. Your own projects may organize std files differently.

2. Configuration Management System​

The key difference is the unified configuration system that allows switching between std/no-std modes and different architectures on demand.

Check Available Configurations​

# Show current active configuration
$ switch_config --status

# List all supported configurations
$ switch_config --list

TA Configurations Available:

  • std/aarch64, std/arm32 - With Rust standard library
  • no-std/aarch64, no-std/arm32 - Without standard library

Host Configurations Available: aarch64, arm32

Default Configuration: Host=aarch64, TA=std/aarch64

Switching Between Configurations​

# Switch TA configurations
$ switch_config --ta std/aarch64 # Enable std for 64-bit TA
$ switch_config --ta std/arm32 # Enable std for 32-bit TA
$ switch_config --ta no-std/aarch64 # Disable std, use 64-bit no-std

# Switch host architecture
$ switch_config --host arm32 # Use 32-bit host

# Mixed development example: 32-bit host + 64-bit std TA
$ switch_config --host arm32 && switch_config --ta std/aarch64

3. Building and Target Differences​

Follow the original building instructions, but note these important target differences:

ConfigurationTA TargetBuild ToolHost Target
std/**-unknown-opteexargo*-unknown-linux-gnu
no-std/**-unknown-linux-gnucargo*-unknown-linux-gnu

Example std build output:

TA=ta/target/aarch64-unknown-optee/release/133af0ca-bdab-11eb-9130-43bf7873bf67.ta

4. Hello World Example: Std vs No-Std​

Build with Default Std Configuration​

# Build hello world with std/aarch64 (default configuration)
$ cd examples/hello_world-rs/
$ make

Result: TA built with std enabled, targeting aarch64-unknown-optee:

TA=ta/target/aarch64-unknown-optee/release/133af0ca-bdab-11eb-9130-43bf7873bf67.ta

Switch to No-Std and Rebuild​

# Switch TA to no-std mode and rebuild
$ switch_config --ta no-std/aarch64
$ make clean && make

Result: TA now targets aarch64-unknown-linux-gnu (no-std):

TA=ta/target/aarch64-unknown-linux-gnu/release/133af0ca-bdab-11eb-9130-43bf7873bf67.ta

5. Emulation and Execution​

The emulation process is identical to the no-std environment. Follow sections 3-6 of the original guide for complete emulation setup instructions.