mirror of
https://github.com/clearlinux/graphene.git
synced 2026-08-19 20:27:00 +00:00
6ea8e951f0
Instead of depending on dynamic linking for LibOS entry point (syscalldb), we pass a pointer in the shim_tcb structure, so that the patched code can enter syscall using 'jmp *%gs:<offset>'. The same applies to the vDSO syscall code that previously needed an up-to-date pointer to syscalldb function. Now, there is no need to adjust the values inside the vDSO page. In addition, this change removes the other two instances where we import a symbol directly from LibOS: register_library (can be also done through GS register) and glibc_version (not important because we build Graphene and glibc together). This simplifies things because the dynamic linking necessary to make the syscalldb function available had to be performed by LibOS itself (in many cases, effectively doing a second pass of dynamic linking after ld.so). After this change, there will be no need for LibOS to perform dynamic linking, and the ELF loading code can be simplified. Signed-off-by: Paweł Marczewski <pawel@invisiblethingslab.com>
223 lines
7.1 KiB
Makefile
223 lines
7.1 KiB
Makefile
include ../Scripts/Makefile.configs
|
|
include ../Scripts/Makefile.rules
|
|
|
|
RUNTIME_DIR = $(CURDIR)/../Runtime
|
|
|
|
define LN_SF_TO_RUNTIME_DIR_template =
|
|
$(RUNTIME_DIR)/$(notdir $(1)): $(1)
|
|
$$(call cmd,ln_sfr)
|
|
endef
|
|
|
|
GNU_MIRRORS ?= https://ftp.gnu.org/gnu/ \
|
|
https://mirrors.kernel.org/gnu/ \
|
|
https://mirrors.ocf.berkeley.edu/gnu/
|
|
|
|
# ------------------------------------------------------------------------------------------------
|
|
# Glibc build: patch libc.so and other C standard libraries to replace raw SYSCALL instructions
|
|
# with function calls into Graphene (plus some smaller patches for Graphene). The resulting
|
|
# libraries are symlinked under $RUNTIME_DIR.
|
|
#
|
|
# Override CC, CXX, AS in case we're compiling the rest of the project with clang.
|
|
# ------------------------------------------------------------------------------------------------
|
|
GLIBC_VERSION ?= 2.31
|
|
GLIBC_SRC = glibc-$(GLIBC_VERSION)
|
|
GLIBC_HASH = $(firstword $(shell grep $(GLIBC_SRC).tar.gz glibc-checksums))
|
|
SHIM_DIR = shim
|
|
BUILD_DIR = glibc-build
|
|
GLIBC_LIBS = \
|
|
csu/crt1.o \
|
|
csu/crti.o \
|
|
csu/crtn.o \
|
|
dlfcn/libdl.so.2 \
|
|
libc.so \
|
|
libc.so.6 \
|
|
login/libutil.so.1 \
|
|
math/libm.so.6 \
|
|
nptl/libpthread.so.0 \
|
|
nptl_db/libthread_db.so.1 \
|
|
resolv/libnss_dns.so.2 \
|
|
resolv/libresolv.so.2 \
|
|
rt/librt.so.1
|
|
ifeq ($(ARCH),x86_64)
|
|
GLIBC_LIBS += elf/ld-linux-x86-64.so.2
|
|
endif
|
|
|
|
GLIBC_TARGET = $(addprefix $(BUILD_DIR)/, $(GLIBC_LIBS))
|
|
GLIBC_RUNTIME = $(addprefix $(RUNTIME_DIR)/, $(notdir $(GLIBC_TARGET)))
|
|
|
|
GLIBC_CFLAGS = -O2 -Wp,-U_FORTIFY_SOURCE -Wno-unused-value
|
|
ifeq ($(DEBUG),1)
|
|
GLIBC_CFLAGS += -g
|
|
endif
|
|
export GLIBC_CFLAGS
|
|
|
|
# For LibOS entry API
|
|
GLIBC_CPPFLAGS = -I$(abspath $(SHIM_DIR))/include -I$(abspath $(SHIM_DIR))/include/arch/$(ARCH)
|
|
export GLIBC_CPPFLAGS
|
|
GLIBC_DEPS = shim/include/arch/$(ARCH)/shim_entry_api.h
|
|
|
|
.PHONY: all
|
|
all: $(GLIBC_TARGET) $(GLIBC_RUNTIME)
|
|
$(MAKE) -C $(SHIM_DIR) all
|
|
|
|
ifeq ($(findstring x86_64,$(SYS))$(findstring linux,$(SYS)),x86_64linux)
|
|
|
|
.SECONDARY: $(BUILD_DIR)/Build.success
|
|
|
|
$(BUILD_DIR)/Build.success: $(BUILD_DIR)/Makefile
|
|
@echo "Building glibc, may take a while to finish. Warning messages may show up. If this process terminates with failures, see \"$(BUILD_DIR)/build.log\" for more information."
|
|
(CC=gcc CXX=g++ AS=gcc $(MAKE) -C $(BUILD_DIR) 2>&1 > build.log) && touch $@
|
|
|
|
$(GLIBC_TARGET): $(BUILD_DIR)/Build.success
|
|
|
|
$(BUILD_DIR)/Makefile: $(GLIBC_SRC)/.configured
|
|
mkdir -p $(BUILD_DIR)
|
|
(cd $(BUILD_DIR) || exit 1; \
|
|
CC=gcc CXX=g++ AS=gcc \
|
|
CFLAGS=$$GLIBC_CFLAGS CPPFLAGS=$$GLIBC_CPPFLAGS \
|
|
../$(GLIBC_SRC)/configure --prefix=$(RUNTIME_DIR) \
|
|
--with-tls \
|
|
--without-selinux \
|
|
--disable-test \
|
|
--disable-nscd \
|
|
)
|
|
|
|
$(foreach lib,$(GLIBC_TARGET),$(eval $(call LN_SF_TO_RUNTIME_DIR_template,$(lib))))
|
|
|
|
GLIBC_PATCHES = \
|
|
glibc-patches/$(GLIBC_SRC).patch
|
|
|
|
GLIBC_PATCHES_2.27 = \
|
|
glibc-patches/hp-timing-2.27.patch
|
|
|
|
GLIBC_PATCHES_2.31 = \
|
|
glibc-patches/hp-timing-2.31.patch
|
|
|
|
GLIBC_PATCHES += $(GLIBC_PATCHES_$(GLIBC_VERSION))
|
|
|
|
.SECONDARY: $(GLIBC_SRC)/.configured
|
|
$(GLIBC_SRC)/.configured: $(GLIBC_PATCHES) $(GLIBC_SRC).tar.gz $(GLIBC_DEPS)
|
|
$(RM) -r $(GLIBC_SRC)
|
|
tar -mxzf $(GLIBC_SRC).tar.gz
|
|
cd $(GLIBC_SRC) && \
|
|
for p in $(GLIBC_PATCHES); do \
|
|
echo applying $$p; \
|
|
patch -p1 -l < ../$$p || exit 255; \
|
|
done
|
|
touch $@
|
|
|
|
$(GLIBC_SRC).tar.gz:
|
|
../Scripts/download --output $@ --sha256 $(GLIBC_HASH) $(foreach mirror,$(GNU_MIRRORS),--url $(mirror)glibc/$(GLIBC_SRC).tar.gz)
|
|
|
|
$(GLIBC_SRC)/elf/Versions: $(GLIBC_SRC)/.configured
|
|
|
|
$(GLIBC_SRC)/nptl/Versions: $(GLIBC_SRC)/.configured
|
|
|
|
$(GLIBC_SRC)/dlfcn/Versions: $(GLIBC_SRC)/.configured
|
|
|
|
# ------------------------------------------------------------------------------------------------
|
|
# GCC build: patch libgomp.so.1 (OpenMP runtime library) to replace raw SYSCALL instruction with
|
|
# function call into Graphene. GCC is not built by default with Graphene; use `make -C LibOS gcc`
|
|
# to build it. The resulting libgomp.so.1 is symlinked under $RUNTIME_DIR. This patched version
|
|
# makes sense only on x86_64 platforms. NOTE: We'd prefer to build libgomp.so.1 alone but it is
|
|
# impossible (the only way to build it is as part of the complete GCC build).
|
|
#
|
|
# We explicitly unset CC, CXX, AS environment variables for the case we're compiling the rest of the
|
|
# project with clang. This is because in GCC build, "defining certain environment variables such as
|
|
# CC can interfere with the functioning of make" (https://gcc.gnu.org/install/build.html). Indeed,
|
|
# defining CC=gcc or CC=clang leads to errors during GCC build.
|
|
# ------------------------------------------------------------------------------------------------
|
|
GCC_VERSION ?= 10.2.0
|
|
GCC_SRC = gcc-$(GCC_VERSION)
|
|
GCC_HASH = 27e879dccc639cd7b0cc08ed575c1669492579529b53c9ff27b0b96265fa867d
|
|
GCC_BUILD_DIR = gcc-build
|
|
GCC_LIBS = x86_64-pc-linux-gnu/libgomp/.libs/libgomp.so.1
|
|
GCC_TARGET = $(addprefix $(GCC_BUILD_DIR)/, $(GCC_LIBS))
|
|
GCC_RUNTIME = $(addprefix $(RUNTIME_DIR)/, $(notdir $(GCC_TARGET)))
|
|
|
|
.SECONDARY: $(GCC_BUILD_DIR)/Build.success
|
|
|
|
$(GCC_BUILD_DIR)/Build.success: $(GCC_BUILD_DIR)/Makefile
|
|
@echo "Building gcc, may take a while to finish. Warning messages may show up. If this process terminates with failures, see \"$(GCC_BUILD_DIR)/gcc-build.log\" for more information."
|
|
(unset CC CXX AS; $(MAKE) -C $(GCC_BUILD_DIR) 2>&1 > gcc-build.log) && touch $@
|
|
|
|
$(GCC_TARGET): $(GCC_BUILD_DIR)/Build.success
|
|
|
|
$(GCC_BUILD_DIR)/Makefile: $(GCC_SRC)/.configured
|
|
mkdir -p $(GCC_BUILD_DIR)
|
|
(cd $(GCC_BUILD_DIR) || exit 1; \
|
|
unset CC CXX AS; \
|
|
../$(GCC_SRC)/configure --prefix=$(RUNTIME_DIR) \
|
|
--enable-languages=c \
|
|
--disable-multilib \
|
|
)
|
|
|
|
$(foreach lib,$(GCC_TARGET),$(eval $(call LN_SF_TO_RUNTIME_DIR_template,$(lib))))
|
|
|
|
GCC_PATCHES = \
|
|
gcc-patches/libgomp-replace-futex-instruction.patch
|
|
|
|
# For LibOS entry API (file symlinked in patch)
|
|
GCC_DEPS = shim/include/arch/$(ARCH)/shim_entry_api.h
|
|
|
|
.SECONDARY: $(GCC_SRC)/.configured
|
|
$(GCC_SRC)/.configured: $(GCC_PATCHES) $(GCC_SRC).tar.gz $(GCC_DEPS)
|
|
$(RM) -r $(GCC_SRC)
|
|
tar -mxzf $(GCC_SRC).tar.gz
|
|
cd $(GCC_SRC) && \
|
|
for p in $(GCC_PATCHES); do \
|
|
echo applying $$p; \
|
|
patch -p1 -l < ../$$p || exit 255; \
|
|
done
|
|
cd $(GCC_SRC) && ./contrib/download_prerequisites
|
|
touch $@
|
|
|
|
$(GCC_SRC).tar.gz:
|
|
../Scripts/download --output $@ --sha256 $(GCC_HASH) $(foreach mirror,$(GNU_MIRRORS),--url $(mirror)gcc/$(GCC_SRC)/$(GCC_SRC).tar.gz)
|
|
|
|
.PHONY: gcc
|
|
gcc: $(GCC_TARGET) $(GCC_RUNTIME)
|
|
|
|
# ------------------------------------------------------------------------------------------------
|
|
# Common targets
|
|
# ------------------------------------------------------------------------------------------------
|
|
.PHONY: clean_
|
|
clean_:
|
|
$(RM) -r $(BUILD_DIR) $(GLIBC_SRC) $(GCC_BUILD_DIR) $(GCC_SRC) build.log gcc-build.log
|
|
|
|
.PHONY: clean
|
|
clean: clean_
|
|
$(MAKE) -C $(SHIM_DIR) clean
|
|
|
|
.PHONY: distclean
|
|
distclean: clean_
|
|
$(MAKE) -C $(SHIM_DIR) distclean
|
|
$(RM) $(GLIBC_SRC).tar.gz $(GCC_SRC).tar.gz
|
|
|
|
else
|
|
.IGNORE: $(GLIBC_TARGET)
|
|
$(GLIBC_TARGET):
|
|
|
|
.IGNORE: $(GCC_TARGET)
|
|
$(GCC_TARGET):
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
$(RM) -r $(BUILD_DIR) $(GCC_BUILD_DIR)
|
|
|
|
.PHONY: distclean
|
|
distclean: clean
|
|
endif
|
|
|
|
.PHONY: format
|
|
format:
|
|
$(MAKE) -C $(SHIM_DIR) format
|
|
|
|
.PHONY: test
|
|
test:
|
|
$(MAKE) -C $(SHIM_DIR) test
|
|
|
|
.PHONY: sgx-tokens
|
|
sgx-tokens:
|
|
$(MAKE) -C $(SHIM_DIR) sgx-tokens
|