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 +#include +#include +#include +#include +#include + +#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