Page MenuHomeFreeBSD

D20663.id58916.diff
No OneTemporary

D20663.id58916.diff

Index: lib/libc/gen/gen-private.h
===================================================================
--- lib/libc/gen/gen-private.h
+++ lib/libc/gen/gen-private.h
@@ -51,7 +51,11 @@
int dd_len; /* size of data buffer */
off_t dd_seek; /* magic cookie returned by getdirentries */
int dd_flags; /* flags for readdir */
+#ifndef IN_RTLD
struct pthread_mutex *dd_lock; /* lock */
+#else
+ struct _donotuse *dd_lock; /* unused in rtld, keep same layout */
+#endif
struct _telldir *dd_td; /* telldir position recording */
void *dd_compat_de; /* compat dirent */
};
Index: lib/libc/stdlib/realpath.c
===================================================================
--- lib/libc/stdlib/realpath.c
+++ lib/libc/stdlib/realpath.c
@@ -91,7 +91,7 @@
*/
p = strchr(left, '/');
- next_token_len = p != NULL ? p - left : left_len;
+ next_token_len = p != NULL ? (size_t)(p - left) : left_len;
memcpy(next_token, left, next_token_len);
next_token[next_token_len] = '\0';
@@ -146,7 +146,7 @@
return (NULL);
}
slen = readlink(resolved, symlink, sizeof(symlink));
- if (slen <= 0 || slen >= sizeof(symlink)) {
+ if (slen <= 0 || slen >= (ssize_t)sizeof(symlink)) {
if (slen < 0)
; /* keep errno from readlink(2) call */
else if (slen == 0)
@@ -173,7 +173,7 @@
*/
if (p != NULL) {
if (symlink[slen - 1] != '/') {
- if (slen + 1 >= sizeof(symlink)) {
+ if (slen + 1 >= (ssize_t)sizeof(symlink)) {
errno = ENAMETOOLONG;
return (NULL);
}
Index: libexec/rtld-elf/Makefile
===================================================================
--- libexec/rtld-elf/Makefile
+++ libexec/rtld-elf/Makefile
@@ -63,7 +63,8 @@
CFLAGS.reloc.c+=-fno-jump-tables
.endif
LDFLAGS+= -shared -Wl,-Bsymbolic -Wl,-z,defs
-LIBADD= c_nossp_pic
+# Pull in the dependencies that we use from libc
+.include "rtld-libc/Makefile.inc"
.if ${MK_TOOLCHAIN} == "no"
LDFLAGS+= -L${LIBCDIR}
.endif
Index: libexec/rtld-elf/debug.h
===================================================================
--- libexec/rtld-elf/debug.h
+++ libexec/rtld-elf/debug.h
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#include <string.h>
-#include <unistd.h>
+#include "rtld_printf.h"
void debug_printf(const char *, ...) __printflike(1, 2);
extern int debug;
@@ -57,7 +57,7 @@
#define assert(cond) ((cond) ? (void) 0 : \
(msg(_MYNAME ": assert failed: " __FILE__ ":" \
__XSTRING(__LINE__) "\n"), abort()))
-#define msg(s) write(STDOUT_FILENO, s, strlen(s))
+#define msg(s) rtld_putstr(s)
#define trace() msg(_MYNAME ": " __XSTRING(__LINE__) "\n")
Index: libexec/rtld-elf/libmap.c
===================================================================
--- libexec/rtld-elf/libmap.c
+++ libexec/rtld-elf/libmap.c
@@ -17,6 +17,7 @@
#include "rtld.h"
#include "libmap.h"
#include "paths.h"
+#include "rtld_libc.h"
TAILQ_HEAD(lm_list, lm);
struct lm {
Index: libexec/rtld-elf/rtld-libc/Makefile.inc
===================================================================
--- /dev/null
+++ libexec/rtld-elf/rtld-libc/Makefile.inc
@@ -0,0 +1,59 @@
+# $FreeBSD$
+.include <bsd.compiler.mk>
+
+# Add the necessary libc dependencies for RTLD without pulling in all of the
+# complex libc bits such as locales, etc.
+CFLAGS+= -I${SRCTOP}/libexec/rtld-elf/rtld-libc
+
+# Build all the files that use __libc_interposing here with -DIN_RTLD. With that
+# define they avoid the use of __libc_interposing and call the syscall directly.
+.PATH: ${SRCTOP}/lib/libc/gen
+SRCS+= opendir.c closedir.c readdir.c telldir.c
+
+# Avoid further dependencies by providing simple implementations of libc
+# functions such as __error(), etc.
+.PATH: ${SRCTOP}/libexec/rtld-elf/rtld-libc
+SRCS+= rtld_libc.c
+
+# Now build the remaining files from libc:
+.PATH: ${SRCTOP}/lib/libc/stdlib
+SRCS+= reallocf.c realpath.c getenv.c merge.c reallocarray.c
+# TODO: fix merge.c to build with WARNS=6
+.if ${COMPILER_TYPE} == "clang"
+CFLAGS.merge.c+=-Wno-error=null-pointer-arithmetic
+.endif
+.PATH: ${SRCTOP}/lib/libc/gen
+SRCS+= errlst.c getcwd.c getprogname.c raise.c sigsetops.c sysctlnametomib.c \
+ __xuname.c
+
+# Use the string and memory .o files from libc instead of rebuilding them (they
+# might be using optimized assembly and duplicating that logic here is awkward).
+_libc_string_objects= bcopy memchr memcmp memcpy memmove stpncpy strcat \
+ strchr strcmp stpcpy strcpy strcspn strdup strlcat strlcpy strlen strncmp \
+ strncpy strrchr strsep strspn strstr strtok
+# Also use all the syscall .o files from libc_nossp_pic:
+_libc_sycall_objects= sigsetjmp lstat stat fstat fstatat fstatfs syscall \
+ cerror geteuid getegid munmap mprotect sysarch __sysctl issetugid __getcwd \
+ utrace thr_self thr_kill pread mmap lseek _exit _fstat _fstatat _fstatfs \
+ getdirentries _getdirentries _close _fcntl _open _openat _read \
+ _sigprocmask _write readlink _setjmp setjmp setjmperr
+
+# Extract all the .o files from libc_nossp_pic.a. This ensures that
+# we don't accidentally pull in the interposing table or similar by linking
+# directly against libc_nossp_pic.a
+_rtld_libc_objs=
+.for _obj in ${_libc_sycall_objects} ${_libc_string_objects}
+_rtld_libc_objs+=${_obj}.nossppico
+CLEANFILES+=${_obj}.nossppico
+# LDFLAGS+= -Wl,--trace-symbol=${_obj}
+.endfor
+# LDFLAGS+= -Wl,--trace
+
+# We insert all the .o files from libc_nossp_pic.a into a new rtld_libc.a file
+# to ensure that only .o files that are actually used end up being included.
+rtld_libc.a: ${LIBC_NOSSP_PIC}
+ ${AR} x ${LIBC_NOSSP_PIC} ${_rtld_libc_objs}
+ ${AR} cr ${.OBJDIR}/${.TARGET} ${_rtld_libc_objs}
+CLEANFILES+=rtld_libc.a
+LDADD+=${.OBJDIR}/rtld_libc.a
+${PROG}: rtld_libc.a
Index: libexec/rtld-elf/rtld-libc/errlst.h
===================================================================
--- /dev/null
+++ libexec/rtld-elf/rtld-libc/errlst.h
@@ -0,0 +1,34 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2019 Alex Richadson <arichardson@FreeBSD.org>
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory (Department of Computer Science and
+ * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
+ * DARPA SSITH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* We can't add lib/libc/include to the -I flags so include it directly here: */
+#include "../../../lib/libc/include/errlst.h"
Index: libexec/rtld-elf/rtld-libc/libc_private.h
===================================================================
--- /dev/null
+++ libexec/rtld-elf/rtld-libc/libc_private.h
@@ -0,0 +1,37 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2019 Alex Richadson <arichardson@FreeBSD.org>
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory (Department of Computer Science and
+ * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
+ * DARPA SSITH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _RTLD_LIBC_PRIVATE_H_
+#define _RTLD_LIBC_PRIVATE_H_
+
+#include "rtld_libc.h"
+
+#endif /* _RTLD_LIBC_PRIVATE_H_ */
Index: libexec/rtld-elf/rtld-libc/namespace.h
===================================================================
--- /dev/null
+++ libexec/rtld-elf/rtld-libc/namespace.h
@@ -0,0 +1,37 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2019 Alex Richadson <arichardson@FreeBSD.org>
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory (Department of Computer Science and
+ * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
+ * DARPA SSITH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#define fcntl _fcntl
+#define open _open
+#define openat _openat
+#define fstatfs _fstatfs
+#define close _close
+#define getdirentries _getdirentries
Index: libexec/rtld-elf/rtld-libc/rtld_libc.h
===================================================================
--- /dev/null
+++ libexec/rtld-elf/rtld-libc/rtld_libc.h
@@ -0,0 +1,86 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2019 Alex Richadson <arichardson@FreeBSD.org>
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory (Department of Computer Science and
+ * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
+ * DARPA SSITH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _RTLD_AVOID_LIBC_DEPS_H_
+#define _RTLD_AVOID_LIBC_DEPS_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/fcntl.h>
+#include <sys/stat.h>
+
+/* Avoid dependencies on libthr (used by closedir/opendir/readdir) */
+#define __isthreaded 0
+#define _pthread_mutex_lock(mtx) (void)0
+#define _pthread_mutex_unlock(mtx) (void)0
+#define _pthread_mutex_destroy(mtx) (void)0
+
+int __sys_close(int);
+void __sys_exit(int) __dead2;
+int __sys_fcntl(int, int, ...);
+int __sys_fstat(int fd, struct stat *);
+int __sys_fstatat(int, const char *, struct stat *, int);
+int __sys___getcwd(char *, size_t);
+int __sys_open(const char *, int, ...);
+int __sys_openat(int, const char *, int, ...);
+int __sys_sigprocmask(int, const sigset_t *, sigset_t *);
+int __sys_thr_kill(long, int);
+int __sys_thr_self(long *);
+__ssize_t __sys_pread(int, void *, __size_t, __off_t);
+__ssize_t __sys_read(int, void *, __size_t);
+__ssize_t __sys_write(int, const void *, __size_t);
+
+extern char* __progname;
+const char *_getprogname(void);
+int __getosreldate(void);
+
+
+/*
+ * Don't pull in any of the libc wrappers. Instead we use the system call
+ * directly inside RTLD to avoid pulling in __libc_interposing (which pulls
+ * in lots more object files).
+ */
+#define close(fd) __sys_close(fd)
+#define _close(fd) __sys_close(fd)
+#define exit(status) __sys_exit(status)
+#define _exit(status) __sys_exit(status)
+#define fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
+#define _fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
+#define _fstat(fd, sb) __sys_fstat(fd, sb)
+#define open(path, ...) __sys_open(path, __VA_ARGS__)
+#define pread(fd, buf, nbytes, offset) __sys_pread(fd, buf, nbytes, offset)
+#define read(fd, buf, nbytes) __sys_read(fd, buf, nbytes)
+#define sigprocmask(how, set, oset) __sys_sigprocmask(how, set, oset)
+#define strerror(errno) rtld_strerror(errno)
+#define _write(fd, buf, nbytes) __sys_write(fd, buf, nbytes)
+#define write(fd, buf, nbytes) __sys_write(fd, buf, nbytes)
+
+#endif /* _RTLD_AVOID_LIBC_DEPS_H_ */
Index: libexec/rtld-elf/rtld-libc/rtld_libc.c
===================================================================
--- /dev/null
+++ libexec/rtld-elf/rtld-libc/rtld_libc.c
@@ -0,0 +1,140 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2019 Alex Richadson <arichardson@FreeBSD.org>
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory (Department of Computer Science and
+ * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
+ * DARPA SSITH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <assert.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "rtld.h"
+#include "rtld_printf.h"
+#include "rtld_libc.h"
+
+/*
+ * Avoid dependencies from various libc calls on abort(). Since this is only
+ * used for assertions in RTLD, we can just raise SIGABRT directly.
+ */
+void
+abort(void)
+{
+ raise(SIGABRT);
+ __builtin_trap();
+}
+
+static int rtld_errno;
+int *__error(void);
+int *
+__error(void)
+{
+
+ return (&rtld_errno);
+}
+
+/* Avoid dependency on __libc_interposing, use the system call directly. */
+#undef sigprocmask
+int
+sigprocmask(int how, const sigset_t *set, sigset_t *oset)
+{
+
+ return (__sys_sigprocmask(how, set, oset));
+}
+__strong_reference(sigprocmask, __libc_sigprocmask);
+
+#if defined DEBUG || !defined(NDEBUG)
+/* Provide an implementation of __assert that does not pull in fprintf() */
+void
+__assert(const char *func, const char *file, int line, const char *failedexpr)
+{
+
+ if (func == NULL)
+ (void)rtld_fdprintf(STDERR_FILENO,
+ "Assertion failed: (%s), file %s, line %d.\n", failedexpr,
+ file, line);
+ else
+ (void)rtld_fdprintf(STDERR_FILENO,
+ "Assertion failed: (%s), function %s, file %s, line %d.\n",
+ failedexpr, func, file, line);
+ abort();
+ /* NOTREACHED */
+}
+#endif
+
+/*
+ * Avoid pulling in all of pthreads from getpagesize().
+ * It normally uses libc/gen/auxv.c which pulls in pthread_once().
+ */
+int
+getpagesize(void)
+{
+ int mib[2];
+ int value;
+ size_t size;
+
+ static int pagesize;
+
+ if (pagesize != 0)
+ return (pagesize);
+
+ if (npagesizes > 0)
+ pagesize = pagesizes[0];
+
+ if (pagesize == 0) {
+ mib[0] = CTL_HW;
+ mib[1] = HW_PAGESIZE;
+ size = sizeof(value);
+ if (sysctl(mib, nitems(mib), &value, &size, NULL, 0) == -1)
+ pagesize = PAGE_SIZE;
+ else
+ pagesize = value;
+ }
+
+ return (pagesize);
+}
+
+extern int __sys___sysctl(const int *name, u_int namelen, void *oldp,
+ size_t *oldlenp, const void *newp, size_t newlen);
+
+int
+sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,
+ const void *newp, size_t newlen)
+{
+ int retval;
+
+ assert(name[0] != CTL_USER && "Not supported inside rtld!");
+ retval = __sys___sysctl(name, namelen, oldp, oldlenp, newp, newlen);
+ return (retval);
+}
Index: libexec/rtld-elf/rtld-libc/un-namespace.h
===================================================================
--- /dev/null
+++ libexec/rtld-elf/rtld-libc/un-namespace.h
@@ -0,0 +1,39 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2019 Alex Richadson <arichardson@FreeBSD.org>
+ *
+ * This software was developed by SRI International and the University of
+ * Cambridge Computer Laboratory (Department of Computer Science and
+ * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
+ * DARPA SSITH research programme.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#undef fcntl
+#undef open
+#undef openat
+#undef close
+#undef fstatfs
+#undef getdirentries
+
+#include "rtld_libc.h"
Index: libexec/rtld-elf/rtld.c
===================================================================
--- libexec/rtld-elf/rtld.c
+++ libexec/rtld-elf/rtld.c
@@ -69,6 +69,7 @@
#include "rtld_malloc.h"
#include "rtld_utrace.h"
#include "notes.h"
+#include "rtld_libc.h"
/* Types. */
typedef void (*func_ptr_type)(void);
@@ -78,7 +79,6 @@
/* Variables that cannot be static: */
extern struct r_debug r_debug; /* For GDB */
extern int _thread_autoinit_dummy_decl;
-extern char* __progname;
extern void (*__cleanup)(void);
@@ -250,7 +250,6 @@
/* Only here to fix -Wmissing-prototypes warnings */
int __getosreldate(void);
-void __pthread_cxa_finalize(struct dl_phdr_info *a);
func_ptr_type _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp);
Elf_Addr _rtld_bind(Obj_Entry *obj, Elf_Size reloff);
@@ -5641,26 +5640,6 @@
osreldate = osrel;
return (osreldate);
}
-
-void
-exit(int status)
-{
-
- _exit(status);
-}
-
-void (*__cleanup)(void);
-int __isthreaded = 0;
-int _thread_autoinit_dummy_decl = 1;
-
-/*
- * No unresolved symbols for rtld.
- */
-void
-__pthread_cxa_finalize(struct dl_phdr_info *a __unused)
-{
-}
-
const char *
rtld_strerror(int errnum)
{
Index: libexec/rtld-elf/rtld_lock.c
===================================================================
--- libexec/rtld-elf/rtld_lock.c
+++ libexec/rtld-elf/rtld_lock.c
@@ -52,6 +52,7 @@
#include "debug.h"
#include "rtld.h"
#include "rtld_machdep.h"
+#include "rtld_libc.h"
void _rtld_thread_init(struct RtldLockInfo *) __exported;
void _rtld_atfork_pre(int *) __exported;
Index: libexec/rtld-elf/rtld_printf.h
===================================================================
--- libexec/rtld-elf/rtld_printf.h
+++ libexec/rtld-elf/rtld_printf.h
@@ -31,6 +31,7 @@
#define RTLD_PRINTF_H 1
#include <sys/cdefs.h>
+#include <stdarg.h>
#include <unistd.h>
int rtld_snprintf(char *buf, size_t bufsize, const char *fmt, ...)
Index: libexec/rtld-elf/rtld_printf.c
===================================================================
--- libexec/rtld-elf/rtld_printf.c
+++ libexec/rtld-elf/rtld_printf.c
@@ -44,6 +44,7 @@
#include <string.h>
#include <unistd.h>
#include "rtld_printf.h"
+#include "rtld_libc.h"
#define MAXNBUF (sizeof(intmax_t) * NBBY + 1)
Index: libexec/rtld-elf/xmalloc.c
===================================================================
--- libexec/rtld-elf/xmalloc.c
+++ libexec/rtld-elf/xmalloc.c
@@ -34,6 +34,7 @@
#include "rtld.h"
#include "rtld_printf.h"
#include "rtld_malloc.h"
+#include "rtld_libc.h"
void *
xcalloc(size_t number, size_t size)

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 8, 12:24 PM (10 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14534743
Default Alt Text
D20663.id58916.diff (24 KB)

Event Timeline