Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Jun 2019 11:49:58 +0000 (UTC)
From:      Alex Richardson <arichardson@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r349554 - in head: lib/libc/gen libexec/rtld-elf libexec/rtld-elf/rtld-libc
Message-ID:  <201906301149.x5UBnwNG038243@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: arichardson
Date: Sun Jun 30 11:49:58 2019
New Revision: 349554
URL: https://svnweb.freebsd.org/changeset/base/349554

Log:
  Reduce size of rtld by 22% by pulling in less code from libc
  
  Currently RTLD is linked against libc_nossp_pic which means that any libc
  symbol used in rtld can pull in a lot of depedencies. This was causing
  symbol such as __libc_interposing and all the pthread stubs to be included
  in RTLD even though they are not required. It turns out most of these
  dependencies can easily be avoided by providing overrides inside of rtld.
  
  This change is motivated by CHERI, where we have an experimental ABI that
  requires additional relocation processing to allow the use of function
  pointers inside of rtld. Instead of adding this self-relocation code to
  RTLD I attempted to remove most function pointers from RTLD and discovered
  that most of them came from the libc dependencies instead of being actually
  used inside rtld.
  
  A nice side-effect of this change is that rtld is now 22% smaller on amd64.
  
     text	   data	    bss	    dec	    hex	filename
  0x21eb6	  0xce0	  0xe60	 145910	  239f6	/home/alr48/ld-elf-x86.before.so.1
  0x1a6ed	  0x728	  0xdd8	 113645	  1bbed	/home/alr48/ld-elf-x86.after.so.1
  
  The number of R_X86_64_RELATIVE relocations that need to be processed on
  startup has also gone down from 368 to 187 (almost 50% less).
  
  Reviewed By:	kib
  Differential Revision: https://reviews.freebsd.org/D20663

Added:
  head/libexec/rtld-elf/rtld-libc/
  head/libexec/rtld-elf/rtld-libc/Makefile.inc   (contents, props changed)
  head/libexec/rtld-elf/rtld-libc/libc_private.h   (contents, props changed)
  head/libexec/rtld-elf/rtld-libc/namespace.h   (contents, props changed)
  head/libexec/rtld-elf/rtld-libc/rtld_libc.c   (contents, props changed)
  head/libexec/rtld-elf/rtld-libc/rtld_libc.h   (contents, props changed)
  head/libexec/rtld-elf/rtld-libc/un-namespace.h   (contents, props changed)
Modified:
  head/lib/libc/gen/gen-private.h
  head/libexec/rtld-elf/Makefile
  head/libexec/rtld-elf/libmap.c
  head/libexec/rtld-elf/rtld.c
  head/libexec/rtld-elf/rtld_lock.c
  head/libexec/rtld-elf/rtld_printf.c
  head/libexec/rtld-elf/xmalloc.c

Modified: head/lib/libc/gen/gen-private.h
==============================================================================
--- head/lib/libc/gen/gen-private.h	Sun Jun 30 06:44:35 2019	(r349553)
+++ head/lib/libc/gen/gen-private.h	Sun Jun 30 11:49:58 2019	(r349554)
@@ -51,7 +51,11 @@ struct _dirdesc {
 	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 */
 };

Modified: head/libexec/rtld-elf/Makefile
==============================================================================
--- head/libexec/rtld-elf/Makefile	Sun Jun 30 06:44:35 2019	(r349553)
+++ head/libexec/rtld-elf/Makefile	Sun Jun 30 11:49:58 2019	(r349554)
@@ -63,7 +63,8 @@ CFLAGS+=	-fvisibility=hidden
 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

Modified: head/libexec/rtld-elf/libmap.c
==============================================================================
--- head/libexec/rtld-elf/libmap.c	Sun Jun 30 06:44:35 2019	(r349553)
+++ head/libexec/rtld-elf/libmap.c	Sun Jun 30 11:49:58 2019	(r349554)
@@ -17,6 +17,7 @@
 #include "rtld.h"
 #include "libmap.h"
 #include "paths.h"
+#include "rtld_libc.h"
 
 TAILQ_HEAD(lm_list, lm);
 struct lm {

Added: head/libexec/rtld-elf/rtld-libc/Makefile.inc
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rtld-elf/rtld-libc/Makefile.inc	Sun Jun 30 11:49:58 2019	(r349554)
@@ -0,0 +1,101 @@
+# $FreeBSD$
+# This makefiles adds the necessary libc dependencies for RTLD without pulling
+# in all of the complex libc bits such as locales, etc.
+
+.include <bsd.compiler.mk>
+
+LIBC_SRCTOP=${SRCTOP}/lib/libc
+.if exists(${LIBC_SRCTOP}/${MACHINE_ARCH})
+LIBC_ARCH=${MACHINE_ARCH}
+.else
+LIBC_ARCH=${MACHINE_CPUARCH}
+.endif
+
+CFLAGS+=	-I${SRCTOP}/libexec/rtld-elf/rtld-libc
+
+# Build all the libc files that use interposed symbols or pthreads again for
+# RTLD. We compile with a different libc_private.h and namespace.h that
+# redirects all calls to interposed functions to use the non-interposed version
+# instead.
+.PATH: ${LIBC_SRCTOP}/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: ${LIBC_SRCTOP}/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: ${LIBC_SRCTOP}/gen
+SRCS+=	errlst.c getcwd.c getprogname.c raise.c sigsetops.c sysctlnametomib.c \
+    __xuname.c
+# errlst.c needs the errlst.h header from libc:
+CFLAGS.errlst.c+=-I${LIBC_SRCTOP}/include
+
+# 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_other_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
+
+
+# Finally add additional architecture-dependent libc dependencies
+.if ${LIBC_ARCH} == "arm"
+# ARM needs aeabi_unwind_cpp for _setjmp
+_libc_other_objects+=aeabi_unwind_cpp
+.elif ${LIBC_ARCH} == "i386"
+# __udivdi3 is needed by kvprintf() in rtld_printf.c
+# i386 also needs i386_set_gsbase for allocate_initial_tls()
+_libc_other_objects+=udivdi3 qdivrem i386_set_gsbase
+.elif ${LIBC_ARCH} == "powerpc" || ${LIBC_ARCH} == "powerpcspe"
+# ppc needs __syncicache for reloc.c and __umoddi3+__udivdi3 for rtld_printf.c
+_libc_other_objects+=syncicache umoddi3 udivdi3 qdivrem
+# for some reason there is also a reference to abs()
+_libc_other_objects+=abs
+.elif ${LIBC_ARCH} == "powerpc64"
+# ppc64 needs __syncicache for reloc.c
+_libc_other_objects+=syncicache
+.elif ${LIBC_ARCH} == "mips"
+# 32-bit MIPS needs __umoddi3+__udivdi3 for rtld_printf.c
+.if ${MACHINE_ARCH:Mmipsn32*} == "" && ${MACHINE_ARCH:Mmips64*} == ""
+_libc_other_objects+=umoddi3 udivdi3 qdivrem
+.endif
+.elif ${LIBC_ARCH} == "sparc64"
+# reloc.c uses __sparc_utrap which needs a lot of other object files
+_libc_other_objects+=__sparc_utrap __sparc_utrap_fp_disabled __sparc_utrap_gen \
+    __sparc_utrap_setup __sparc_utrap_align __sparc_utrap_emul kill getpid \
+    fpu fpu_explode fpu_div fpu_reg fpu_sqrt fpu_implode fpu_subr fpu_add \
+    fpu_compare fpu_mul
+.endif
+
+# 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_other_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} ${SRCTOP}/libexec/rtld-elf/rtld-libc/Makefile.inc
+	${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

Added: head/libexec/rtld-elf/rtld-libc/libc_private.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rtld-elf/rtld-libc/libc_private.h	Sun Jun 30 11:49:58 2019	(r349554)
@@ -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.
+ *
+ * $FreeBSD$
+ */
+#ifndef _RTLD_LIBC_PRIVATE_H_
+#define _RTLD_LIBC_PRIVATE_H_
+
+#include "rtld_libc.h"
+
+#endif /* _RTLD_LIBC_PRIVATE_H_ */

Added: head/libexec/rtld-elf/rtld-libc/namespace.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rtld-elf/rtld-libc/namespace.h	Sun Jun 30 11:49:58 2019	(r349554)
@@ -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.
+ *
+ * $FreeBSD$
+ */
+#define fcntl _fcntl
+#define open _open
+#define openat _openat
+#define fstatfs _fstatfs
+#define close _close
+#define getdirentries _getdirentries

Added: head/libexec/rtld-elf/rtld-libc/rtld_libc.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rtld-elf/rtld-libc/rtld_libc.c	Sun Jun 30 11:49:58 2019	(r349554)
@@ -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.
+ *
+ * $FreeBSD$
+ */
+#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], 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);
+}

Added: head/libexec/rtld-elf/rtld-libc/rtld_libc.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rtld-elf/rtld-libc/rtld_libc.h	Sun Jun 30 11:49:58 2019	(r349554)
@@ -0,0 +1,89 @@
+/*-
+ * 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.
+ *
+ * $FreeBSD$
+ */
+#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
+#define __libc_interposing error, must not use this variable inside rtld
+
+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_ */

Added: head/libexec/rtld-elf/rtld-libc/un-namespace.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rtld-elf/rtld-libc/un-namespace.h	Sun Jun 30 11:49:58 2019	(r349554)
@@ -0,0 +1,41 @@
+/*-
+ * 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.
+ *
+ * $FreeBSD$
+ */
+#undef fcntl
+#undef open
+#undef openat
+#undef close
+#undef fstatfs
+#undef getdirentries
+
+#include "rtld_libc.h"

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Sun Jun 30 06:44:35 2019	(r349553)
+++ head/libexec/rtld-elf/rtld.c	Sun Jun 30 11:49:58 2019	(r349554)
@@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$");
 #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 @@ typedef void * (*path_enum_proc) (const char *path, si
 /* 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 @@ void _rtld_error(const char *, ...) __exported;
 
 /* 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);
 
@@ -5647,26 +5646,6 @@ __getosreldate(void)
 		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)
 {

Modified: head/libexec/rtld-elf/rtld_lock.c
==============================================================================
--- head/libexec/rtld-elf/rtld_lock.c	Sun Jun 30 06:44:35 2019	(r349553)
+++ head/libexec/rtld-elf/rtld_lock.c	Sun Jun 30 11:49:58 2019	(r349554)
@@ -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;

Modified: head/libexec/rtld-elf/rtld_printf.c
==============================================================================
--- head/libexec/rtld-elf/rtld_printf.c	Sun Jun 30 06:44:35 2019	(r349553)
+++ head/libexec/rtld-elf/rtld_printf.c	Sun Jun 30 11:49:58 2019	(r349554)
@@ -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)
 

Modified: head/libexec/rtld-elf/xmalloc.c
==============================================================================
--- head/libexec/rtld-elf/xmalloc.c	Sun Jun 30 06:44:35 2019	(r349553)
+++ head/libexec/rtld-elf/xmalloc.c	Sun Jun 30 11:49:58 2019	(r349554)
@@ -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)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906301149.x5UBnwNG038243>