Files
graphene/LibOS/glibc-liblibos.patch

179 lines
4.6 KiB
Diff

diff --git a/Makeconfig b/Makeconfig
index 1908f27..cf34ba1 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1033,7 +1034,7 @@ all-subdirs = csu assert ctype locale intl catgets math setjmp signal \
grp pwd posix io termios resource misc socket sysvipc gmon \
gnulib iconv iconvdata wctype manual shadow gshadow po argp \
crypt localedata timezone rt conform debug \
- $(add-on-subdirs) dlfcn elf
+ $(add-on-subdirs) dlfcn elf libos
ifndef avoid-generated
# sysd-sorted itself will contain rules making the sysd-sorted target
diff --git a/Versions.def b/Versions.def
index 759c754..e1a270e 100644
--- a/Versions.def
+++ b/Versions.def
@@ -148,3 +152,6 @@ libanl {
libcidn {
GLIBC_PRIVATE
}
+liblibos {
+ GLIBC_2.12
+}
diff --git a/shlib-versions b/shlib-versions
index 78b0ad7..5c3dcf2 100644
--- a/shlib-versions
+++ b/shlib-versions
@@ -108,3 +108,5 @@ sparc64.*-.*-.* libBrokenLocale=1 GLIBC_2.2
# This defines the libgcc soname version this glibc is to load for
# asynchronous cancellation to work correctly.
.*-.*-.* libgcc_s=1
+
+.*-.*-.* liblibos=1
diff --git a/libos/Makefile b/libos/Makefile
new file mode 100644
index 0000000..7e0027d
--- /dev/null
+++ b/libos/Makefile
@@ -0,0 +1,56 @@
+# Copyright (C) 1996-2001,2002,2003,2004,2005,2006
+# Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+# 02111-1307 USA.
+
+# Makefile for the libos library.
+
+subdir := libos
+
+# Installed header files.
+headers :=
+
+# Internal header files.
+distribute := errno.h
+
+liblibos-routines := wrapper
+
+# Build the -llibos library.
+
+extra-libs := liblibos
+extra-libs-others = $(extra-libs)
+
+include ../Makeconfig
+
+ifeq ($(versioning),yes)
+liblibos-routines +=
+liblibos-shared-only-routines :=
+endif
+
+tests =
+
+modules-names =
+
+extra-test-objs += $(modules-names:=.os)
+generated := $(modules-names:=.so)
+
+include ../Rules
+
+# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
+# This ensures they will load libc.so for needed symbols if loaded by
+# a statically-linked program that hasn't already loaded it.
+$(objpfx)liblibos.so: $(common-objpfx)libc.so $(common-objpfx)libc_nonshared.a
diff --git a/libos/Versions b/libos/Versions
new file mode 100644
index 0000000..3211637
--- /dev/null
+++ b/libos/Versions
@@ -0,0 +1,8 @@
+liblibos {
+ GLIBC_2.12 {
+ checkpoint;
+ sandbox_create; sandbox_attach; sandbox_current;
+ msgpersist;
+ benchmark_rpc; send_rpc; recv_rpc;
+ }
+}
diff --git a/libos/wrapper.c b/libos/wrapper.c
new file mode 100644
index 0000000..8785629
--- /dev/null
+++ b/libos/wrapper.c
@@ -0,0 +1,62 @@
+#include <errno.h>
+#include <kernel-features.h>
+#include <shim_unistd.h>
+#include <sysdep.h>
+#include <sysdep-cancel.h>
+#include <sys/syscall.h>
+
+#ifdef __NR_checkpoint
+int checkpoint (const char *filename)
+{
+ return INLINE_SYSCALL (checkpoint, 1, filename);
+}
+#endif
+
+#ifdef __NR_sandbox_create
+long sandbox_create(int flags, const char *fs_sb, struct net_sb *net_sb)
+{
+ return INLINE_SYSCALL (sandbox_create, 3, flags, fs_sb, net_sb);
+}
+#endif
+
+#ifdef __NR_sandbox_attach
+int sandbox_attach(unsigned int sbid)
+{
+ return INLINE_SYSCALL (sandbox_attach, 1, sbid);
+}
+#endif
+
+#ifdef __NR_sandbox_current
+long sandbox_current(void)
+{
+ return INLINE_SYSCALL (sandbox_current, 0);
+}
+#endif
+
+#ifdef __NR_msgpersist
+int msgpersist (int msqid, int cmd)
+{
+ return INLINE_SYSCALL (msgpersist, 2, msqid, cmd);
+}
+#endif
+
+#ifdef __NR_benchmark_rpc
+int benchmark_rpc(pid_t pid, int times, const void *buf, size_t size)
+{
+ return INLINE_SYSCALL (benchmark_rpc, 4, pid, times, buf, size);
+}
+#endif
+
+#ifdef __NR_send_rpc
+size_t send_rpc (pid_t pid, const void *buf, size_t size)
+{
+ return INLINE_SYSCALL (send_rpc, 3, pid, buf, size);
+}
+#endif
+
+#ifdef __NR_recv_rpc
+size_t recv_rpc (pid_t * pid, void *buf, size_t size)
+{
+ return INLINE_SYSCALL (recv_rpc, 3, pid, buf, size);
+}
+#endif