Introduce GCC-base toolchain and use it by default
This commit is contained in:
parent
8ef52c7c2d
commit
00949d9741
@ -1,4 +1,4 @@
|
|||||||
CC := musl-clang
|
CC := occlum-gcc
|
||||||
CFLAGS := -fPIC -pie
|
CFLAGS := -fPIC -pie
|
||||||
|
|
||||||
.PHONY: all test test-native clean
|
.PHONY: all test test-native clean
|
||||||
@ -9,7 +9,7 @@ hello_world: hello_world.c
|
|||||||
$(CC) $(CFLAGS) $^ -o $@
|
$(CC) $(CFLAGS) $^ -o $@
|
||||||
|
|
||||||
# Run hello_world on Occlum inside an SGX enclave
|
# Run hello_world on Occlum inside an SGX enclave
|
||||||
test:
|
test: hello_world
|
||||||
rm -rf occlum_workspace
|
rm -rf occlum_workspace
|
||||||
mkdir occlum_workspace
|
mkdir occlum_workspace
|
||||||
cd occlum_workspace && \
|
cd occlum_workspace && \
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
"default_heap_size": "16MB",
|
"default_heap_size": "16MB",
|
||||||
"default_mmap_size": "32MB"
|
"default_mmap_size": "32MB"
|
||||||
},
|
},
|
||||||
|
"env": [
|
||||||
|
"OCCLUM=yes"
|
||||||
|
],
|
||||||
"mount": [
|
"mount": [
|
||||||
{
|
{
|
||||||
"target": "/",
|
"target": "/",
|
||||||
|
@ -121,9 +121,6 @@ static int test_cpuid_with_basic_leaf_one() {
|
|||||||
if (cpu.eax == 0) {
|
if (cpu.eax == 0) {
|
||||||
throw_error("faild to call cpuid with eax=1");
|
throw_error("faild to call cpuid with eax=1");
|
||||||
}
|
}
|
||||||
if (!((cpu.ecx >> 6) & 1)) {
|
|
||||||
throw_error("smx is not enabled");
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
test/env/main.c
vendored
2
test/env/main.c
vendored
@ -27,7 +27,7 @@ const char* expect_argv[EXPECT_ARGC] = {
|
|||||||
|
|
||||||
// Expected child arguments
|
// Expected child arguments
|
||||||
const int child_argc = 2;
|
const int child_argc = 2;
|
||||||
const char* child_argv[child_argc + 1] = {
|
const char* child_argv[3] = {
|
||||||
"env",
|
"env",
|
||||||
"child",
|
"child",
|
||||||
NULL
|
NULL
|
||||||
|
@ -15,10 +15,10 @@ CXX_OBJS := $(addprefix $(BUILD_DIR)/test/obj/$(TEST_NAME)/,$(CXX_SRCS:%.cc=%.o)
|
|||||||
|
|
||||||
ALL_BUILD_SUBDIRS := $(sort $(patsubst %/,%,$(dir $(BIN) $(C_OBJS) $(CXX_OBJS))))
|
ALL_BUILD_SUBDIRS := $(sort $(patsubst %/,%,$(dir $(BIN) $(C_OBJS) $(CXX_OBJS))))
|
||||||
|
|
||||||
CC := /usr/local/occlum/bin/musl-clang
|
CC := occlum-gcc
|
||||||
CXX := /usr/local/occlum/bin/musl-clang++
|
CXX := occlum-g++
|
||||||
|
|
||||||
C_FLAGS = -Wall -I../include -O2 -fPIC $(EXTRA_C_FLAGS)
|
C_FLAGS = -Wall -Wno-return-local-addr -I../include -O2 -fPIC $(EXTRA_C_FLAGS)
|
||||||
LINK_FLAGS = $(C_FLAGS) -pie $(EXTRA_LINK_FLAGS)
|
LINK_FLAGS = $(C_FLAGS) -pie $(EXTRA_LINK_FLAGS)
|
||||||
|
|
||||||
.PHONY: all test test-native clean
|
.PHONY: all test test-native clean
|
||||||
|
@ -110,7 +110,7 @@ int main(int argc, const char* argv[]) {
|
|||||||
|
|
||||||
int child_pid;
|
int child_pid;
|
||||||
extern char ** environ;
|
extern char ** environ;
|
||||||
const char* new_argv[] = {"./dev_null", NULL};
|
char* new_argv[] = {"./dev_null", NULL};
|
||||||
if (posix_spawn(&child_pid, "dev_null", &file_actions,
|
if (posix_spawn(&child_pid, "dev_null", &file_actions,
|
||||||
NULL, new_argv, environ) < 0) {
|
NULL, new_argv, environ) < 0) {
|
||||||
printf("ERROR: failed to spawn a child process\n");
|
printf("ERROR: failed to spawn a child process\n");
|
||||||
|
@ -63,9 +63,9 @@ RUN curl https://sh.rustup.rs -sSf | \
|
|||||||
rm -rf /root/.cargo/registry && rm -rf /root/.cargo/git
|
rm -rf /root/.cargo/registry && rm -rf /root/.cargo/git
|
||||||
|
|
||||||
# Install Occlum toolchain
|
# Install Occlum toolchain
|
||||||
WORKDIR /tmp
|
COPY toolchains/gcc /tmp
|
||||||
COPY build_toolchain.sh /tmp
|
WORKDIR /tmp/gcc
|
||||||
RUN ./build_toolchain.sh
|
RUN ./build.sh
|
||||||
ENV PATH="/opt/occlum/build/bin:/usr/local/occlum/bin:$PATH"
|
ENV PATH="/opt/occlum/build/bin:/usr/local/occlum/bin:$PATH"
|
||||||
|
|
||||||
WORKDIR /root
|
WORKDIR /root
|
||||||
|
17
tools/docker/build.sh
Executable file
17
tools/docker/build.sh
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [[ ( "$#" < 1 ) ]] ; then
|
||||||
|
echo "Error: tag is not given"
|
||||||
|
echo ""
|
||||||
|
echo "Usage: run command"
|
||||||
|
echo " build.sh <tag>"
|
||||||
|
echo "to build a Docker image with a tag (e.g., occlum/occlum:latest)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
tag=$1
|
||||||
|
|
||||||
|
cd "$script_dir/.."
|
||||||
|
docker build -f "$script_dir/Dockerfile" -t "$tag" .
|
30
tools/occlum
30
tools/occlum
@ -17,12 +17,6 @@ report_arg_error() {
|
|||||||
echo " occlum run <program_name> <program_args>"
|
echo " occlum run <program_name> <program_args>"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
get_conf_user_space_size() {
|
|
||||||
cat "$working_dir/Occlum.json" | \
|
|
||||||
python -c "import sys, json; print json.load(sys.stdin)['vm']['user_space_size']"
|
|
||||||
}
|
|
||||||
|
|
||||||
get_conf_default_stack_size() {
|
get_conf_default_stack_size() {
|
||||||
cat "$working_dir/Occlum.json" | \
|
cat "$working_dir/Occlum.json" | \
|
||||||
python -c "import sys, json; print json.load(sys.stdin)['process']['default_stack_size']"
|
python -c "import sys, json; print json.load(sys.stdin)['process']['default_stack_size']"
|
||||||
@ -38,6 +32,15 @@ get_conf_default_mmap_size() {
|
|||||||
python -c "import sys, json; print json.load(sys.stdin)['process']['default_mmap_size']"
|
python -c "import sys, json; print json.load(sys.stdin)['process']['default_mmap_size']"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_conf_user_space_size() {
|
||||||
|
cat "$working_dir/Occlum.json" | \
|
||||||
|
python -c "import sys, json; print json.load(sys.stdin)['vm']['user_space_size']"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_conf_env() {
|
||||||
|
cat "$working_dir/Occlum.json" | \
|
||||||
|
python -c "import sys, json; print json.dumps(json.load(sys.stdin)['env'])"
|
||||||
|
}
|
||||||
|
|
||||||
get_occlum_conf_file_mac() {
|
get_occlum_conf_file_mac() {
|
||||||
"$occlum_dir/build/bin/occlum-protect-integrity" show-mac "$context_dir/build/Occlum.json.protected"
|
"$occlum_dir/build/bin/occlum-protect-integrity" show-mac "$context_dir/build/Occlum.json.protected"
|
||||||
@ -63,12 +66,13 @@ cmd_init() {
|
|||||||
mkdir -p image/host
|
mkdir -p image/host
|
||||||
mkdir -p image/tmp
|
mkdir -p image/tmp
|
||||||
|
|
||||||
cp \
|
local occlum_gcc_lib=/usr/local/occlum/x86_64-linux-musl/lib
|
||||||
|
cp -t image/lib/ \
|
||||||
/lib/ld-musl-x86_64.so.1 \
|
/lib/ld-musl-x86_64.so.1 \
|
||||||
/usr/local/occlum/lib/libc++.so.1 \
|
"$occlum_gcc_lib/libc.so" \
|
||||||
/usr/local/occlum/lib/libc++abi.so.1 \
|
"$occlum_gcc_lib/libstdc++.so.6" \
|
||||||
/usr/local/occlum/lib/libunwind.so.1 \
|
"$occlum_gcc_lib/libgcc_s.so.1" \
|
||||||
image/lib/
|
"$occlum_gcc_lib/libgomp.so.1"
|
||||||
|
|
||||||
cp "$occlum_dir"/etc/template/* "$working_dir"/
|
cp "$occlum_dir"/etc/template/* "$working_dir"/
|
||||||
|
|
||||||
@ -101,12 +105,10 @@ cmd_build() {
|
|||||||
export OCCLUM_CONF_DEFAULT_STACK_SIZE=`get_conf_default_stack_size`
|
export OCCLUM_CONF_DEFAULT_STACK_SIZE=`get_conf_default_stack_size`
|
||||||
export OCCLUM_CONF_DEFAULT_HEAP_SIZE=`get_conf_default_heap_size`
|
export OCCLUM_CONF_DEFAULT_HEAP_SIZE=`get_conf_default_heap_size`
|
||||||
export OCCLUM_CONF_DEFAULT_MMAP_SIZE=`get_conf_default_mmap_size`
|
export OCCLUM_CONF_DEFAULT_MMAP_SIZE=`get_conf_default_mmap_size`
|
||||||
|
export OCCLUM_CONF_ENV=`get_conf_env`
|
||||||
cd "$context_dir/build"
|
cd "$context_dir/build"
|
||||||
"$occlum_dir/build/bin/occlum-gen-default-occlum-json"\
|
"$occlum_dir/build/bin/occlum-gen-default-occlum-json"\
|
||||||
> "Occlum_new.json"
|
|
||||||
jq -s '.[0] + .[1]' "../../Occlum.json" "Occlum_new.json"\
|
|
||||||
> "Occlum.json"
|
> "Occlum.json"
|
||||||
rm -f "Occlum_new.json"
|
|
||||||
"$occlum_dir/build/bin/occlum-protect-integrity" protect Occlum.json
|
"$occlum_dir/build/bin/occlum-protect-integrity" protect Occlum.json
|
||||||
|
|
||||||
export OCCLUM_BUILTIN_CONF_FILE_MAC=`get_occlum_conf_file_mac`
|
export OCCLUM_BUILTIN_CONF_FILE_MAC=`get_occlum_conf_file_mac`
|
||||||
|
@ -33,6 +33,7 @@ cat <<EOF
|
|||||||
"target": "/tmp",
|
"target": "/tmp",
|
||||||
"type": "ramfs"
|
"type": "ramfs"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"env": $OCCLUM_CONF_ENV
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
BUILD_DIR=/tmp/occlum_toolchain
|
BUILD_DIR=/tmp/occlum_clang_toolchain
|
||||||
INSTALL_DIR=/usr/local/occlum
|
INSTALL_DIR=/opt/occlum/toolchains/clang
|
||||||
|
|
||||||
# Exit if any command fails
|
# Exit if any command fails
|
||||||
set -e
|
set -e
|
||||||
@ -117,3 +117,6 @@ cd ..
|
|||||||
|
|
||||||
# Remove all source code and build files
|
# Remove all source code and build files
|
||||||
rm -rf ${BUILD_DIR}
|
rm -rf ${BUILD_DIR}
|
||||||
|
|
||||||
|
# Link the toolchain directory
|
||||||
|
ln -s -f ${INSTALL_DIR} /usr/local/occlum
|
62
tools/toolchains/gcc/0014-libgomp-futex-occlum.diff
Normal file
62
tools/toolchains/gcc/0014-libgomp-futex-occlum.diff
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
diff --git a/libgomp/config/linux/x86/futex.h b/libgomp/config/linux/x86/futex.h
|
||||||
|
index 02d5b95..23c019a 100644
|
||||||
|
--- a/libgomp/config/linux/x86/futex.h
|
||||||
|
+++ b/libgomp/config/linux/x86/futex.h
|
||||||
|
@@ -30,10 +30,25 @@
|
||||||
|
# define SYS_futex 202
|
||||||
|
# endif
|
||||||
|
|
||||||
|
+#pragma GCC visibility push(default)
|
||||||
|
+#define _GNU_SOURCE
|
||||||
|
+#include <unistd.h>
|
||||||
|
+#include <sys/syscall.h>
|
||||||
|
+
|
||||||
|
+#pragma GCC visibility pop
|
||||||
|
+
|
||||||
|
static inline void
|
||||||
|
futex_wait (int *addr, int val)
|
||||||
|
{
|
||||||
|
- long res;
|
||||||
|
+ int err = syscall (SYS_futex, addr, gomp_futex_wait, val, NULL);
|
||||||
|
+ if (__builtin_expect (err < 0 && errno == ENOSYS, 0))
|
||||||
|
+ {
|
||||||
|
+ gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
|
||||||
|
+ gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
|
||||||
|
+ syscall (SYS_futex, addr, gomp_futex_wait, val, NULL);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+/* long res;
|
||||||
|
|
||||||
|
register long r10 __asm__("%r10") = 0;
|
||||||
|
__asm volatile ("syscall"
|
||||||
|
@@ -51,12 +66,21 @@ futex_wait (int *addr, int val)
|
||||||
|
"d" (val), "r" (r10)
|
||||||
|
: "r11", "rcx", "memory");
|
||||||
|
}
|
||||||
|
+*/
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
futex_wake (int *addr, int count)
|
||||||
|
{
|
||||||
|
- long res;
|
||||||
|
+ int err = syscall (SYS_futex, addr, gomp_futex_wake, count);
|
||||||
|
+ if (__builtin_expect (err < 0 && errno == ENOSYS, 0))
|
||||||
|
+ {
|
||||||
|
+ gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
|
||||||
|
+ gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
|
||||||
|
+ syscall (SYS_futex, addr, gomp_futex_wake, count);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+/* long res;
|
||||||
|
|
||||||
|
__asm volatile ("syscall"
|
||||||
|
: "=a" (res)
|
||||||
|
@@ -73,6 +97,7 @@ futex_wake (int *addr, int count)
|
||||||
|
"d" (count)
|
||||||
|
: "r11", "rcx", "memory");
|
||||||
|
}
|
||||||
|
+*/
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# ifndef SYS_futex
|
55
tools/toolchains/gcc/build.sh
Executable file
55
tools/toolchains/gcc/build.sh
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||||
|
BUILD_DIR=/tmp/occlum_gcc_toolchain
|
||||||
|
INSTALL_DIR=/opt/occlum/toolchains/gcc
|
||||||
|
|
||||||
|
# Exit if any command fails
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Clean previous build and installation if any
|
||||||
|
rm -rf ${BUILD_DIR}
|
||||||
|
rm -rf ${INSTALL_DIR}
|
||||||
|
|
||||||
|
# Create the build directory
|
||||||
|
mkdir -p ${BUILD_DIR}
|
||||||
|
cd ${BUILD_DIR}
|
||||||
|
|
||||||
|
# Download musl-cross-make project
|
||||||
|
git clone https://github.com/richfelker/musl-cross-make
|
||||||
|
cd musl-cross-make
|
||||||
|
git checkout d969dea983a2cc54a1e0308a0cdeb6c3307e4bfa
|
||||||
|
|
||||||
|
# Let musl-cross-make build for x86-64 Linux
|
||||||
|
TARGET=x86_64-linux-musl
|
||||||
|
# We will check out the branch ${MUSL_VER} from ${MUSL_REPO}
|
||||||
|
MUSL_REPO=https://github.com/occlum/musl
|
||||||
|
MUSL_VER=1.1.20
|
||||||
|
# We will use this version of GCC
|
||||||
|
GCC_VER=8.3.0
|
||||||
|
|
||||||
|
# This patch replaces syscall instruction with libc's syscall wrapper
|
||||||
|
cp ${THIS_DIR}/0014-libgomp-*.diff patches/gcc-${GCC_VER}/
|
||||||
|
|
||||||
|
# Build musl-gcc toolchain for Occlum
|
||||||
|
cat > config.mak <<EOF
|
||||||
|
TARGET = ${TARGET}
|
||||||
|
OUTPUT = ${INSTALL_DIR}
|
||||||
|
COMMON_CONFIG += CFLAGS="-fPIC" CXXFLAGS="-fPIC" LDFLAGS="-pie"
|
||||||
|
|
||||||
|
GCC_VER = ${GCC_VER}
|
||||||
|
|
||||||
|
MUSL_VER = git-${MUSL_VER}
|
||||||
|
MUSL_REPO = ${MUSL_REPO}
|
||||||
|
EOF
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Remove all source code and build files
|
||||||
|
rm -rf ${BUILD_DIR}
|
||||||
|
|
||||||
|
# Link the toolchain directory
|
||||||
|
ln -sf ${INSTALL_DIR}/bin/${TARGET}-gcc ${INSTALL_DIR}/bin/occlum-gcc
|
||||||
|
ln -sf ${INSTALL_DIR}/bin/${TARGET}-g++ ${INSTALL_DIR}/bin/occlum-g++
|
||||||
|
ln -sf ${INSTALL_DIR}/bin/${TARGET}-ld ${INSTALL_DIR}/bin/occlum-ld
|
||||||
|
ln -sf ${INSTALL_DIR}/x86_64-linux-musl/lib/libc.so /lib/ld-musl-x86_64.so.1
|
||||||
|
ln -sf ${INSTALL_DIR} /usr/local/occlum
|
Loading…
Reference in New Issue
Block a user