Builtin Toolchains
Occlum provides multiple builtin toolchains or libraries in the Occlum development docker image to ease the porting or developing effort for users. Part of them are toolchains used to recompile or repackage the applications to make them runnable in Occlum TEE environment. The others are some frequently-used auxiliary libraries which can be directly used or linked by applications running in Occlum.
All the build scripts could be found on github.
Toolchains
Generally, Occlum supports both musl-libc and glibc based toolchains. It is up to the users to descide which one to be chosen.
Less memory footprint, perhaps musl-libc based.
More compatible to existed applications, maybe glibc based.
glibc
To support running glibc based application in Occlum, a customized glibc is provided in the Occlum development docker image.
libc | Compatible Version in Occlum | Path in Occlum Docker Image |
---|---|---|
glibc | <=2.31 (default version in Ubuntu:20.04) |
/opt/occlum/glibc/lib/ |
The main changes on top of general glibc are as below:
Redirect syscalls into Occlum
Support posix_spawn syscall for Occlum
Modify vdso to calling syscalls in Occlum
To users, all the glibc libraries to be used in Occlum need to be replaced by the ones in /opt/occlum/glibc/lib/
.
Thus, Occlum can support gcc
compilation with PIE enabled, which make it compatible to popular compile systems.
golang
To support compiling and running Golang in Occlum LibOS, a customized go is provided in the Occlum development docker image, path /opt/occlum/toolchains/golang
. Every Golang to be executed in Occlum needs to be recompiled by occlum-go (a wrapper of go).
Currently Occlum supports two versions of Golang, 1.16 and 1.18 (default one in Occlum development docker image) which are both linked to musl-libc in default. But users can easily configure the occlum-go to use gcc like below.
# CC=gcc occlum-go build
java
There are three JAVA versions provided in the Occlum development docker image, path /opt/occlum/toolchains/jvm
.
JDK | libc | Path in Occlum Docker Image |
---|---|---|
openjdk8 | musl-libc | /opt/occlum/toolchains/jvm/java-1.8-openjdk |
openjdk11 | musl-libc | /opt/occlum/toolchains/jvm/java-11-openjdk |
dragonwell-jdk11 | musl-libc | /opt/occlum/toolchains/jvm/java-11-alibaba-dragonwell |
Both the unmodified openjdk 8/11 in the table are directly imported from Alpine:3.11.
The dragonwell-jdk11 for enclave is a musl-based JDK version compatible with the Alpine Linux and Occlum, and it’s an open source project, see Alibaba Dragonwell.
By default Occlum uses Dragonwell JDK11 as the default JDK. Thus occlum-java
and occlum-javac
(provided in the Docker image path /opt/occlum/toolchains/jvm/bin/) use Dragonwell JDK11.
Besides the musl-libc based JDK (less memory footprint), glibc based JDK are also supported. Users are free to change to other JDK version by setting the JAVA_HOME
to point to the installation directory of OpenJDK and copying it into Occlum instance.
musl-gcc
To support compiling and running musl-libc based application in Occlum, a customized musl is provided in the Occlum development docker image.
libc | Compatible Version in Occlum | Path in Occlum Docker Image |
---|---|---|
musl libc | <=1.1.24 (default version in Alpine:3.11) |
/usr/local/occlum/x86_64-linux-musl/lib/ |
To users, all the musl-libc libraries to be used in Occlum need to be replaced by the ones in /usr/local/occlum/x86_64-linux-musl/lib/
.
Moreover, wrapped occlum-gcc, occlum-g++ and occlum-ld are provided as well to do the recompiling if necessary. Any applications generated by these wrapped tools, are expected to run successfully in Occlum.
rust
Occlum supports general glibc based rust tools such as cargo and rustc.
Wrapped occlum-cargo and occlum-rustc are also provided to do musl-libc based rust compilation, which can be found on the path /opt/occlum/toolchains/rust/bin/
in the Occlum development docker image.
Auxiliary Libraries
Besides toolchains, several auxiliary libraries to be used in Occlum are provided as well to ease the development effort.
bash
To support running bash shell script in Occlum, a customized bash is provided in the Occlum development docker image. Both musl-libc and glibc versions are provided in the path /opt/occlum/toolchains/bash
. Users can use it directly for application in Occlum, details could refer to demo bash.
busybox
To support running general CLI commands in Occlum, a prebuilt busybox is provided in the Occlum development docker image. Both musl-libc and glibc versions are provided in the path /opt/occlum/toolchains/busybox
. Users can use it directly for application in Occlum, details could refer to demo bash.
DCAP library
Occlum provides wrapped library libocclum_dcap
for DCAP
remote attestion applications.
Both musl-libc and glibc versions are provided in the path /opt/occlum/toolchains/dcap_lib
.
|-- glibc
| |-- dcap_test
| |-- libocclum_dcap.a
| `-- libocclum_dcap.so
|-- inc
| `-- occlum_dcap.h
`-- musl
|-- dcap_test
|-- libocclum_dcap.a
`-- libocclum_dcap.so
Two versions (glibc and musl-libc), including static and dynamic libraries are provided to meet different scenarios. Unified header file occlum_dcap.h
is provided as well in which defines the exported APIs for DCAP quote generation and verification.
In short, applications can link to the prebuilt libocclum_dcap.so
and use the APIs defined in occlum_dcap.h
for their usage.
For details how to use the library, please refer to the demo.
The source code of the library is in the path.