Index: gnu/lib/Makefile
===================================================================
--- gnu/lib/Makefile
+++ gnu/lib/Makefile
@@ -2,12 +2,16 @@
 
 .include <src.opts.mk>
 
-SUBDIR=			csu
+SUBDIR=
 SUBDIR.${MK_DIALOG}+=	libdialog
 SUBDIR.${MK_GCC}+=	libgcov libgomp
 SUBDIR.${MK_SSP}+=	libssp
 SUBDIR.${MK_TESTS}+=	tests
 
+.if ${MK_BSD_CRTBEGIN} == "no"
+SUBDIR+=		csu
+.endif
+
 .if ${MK_GNU_GREP} != "no" || ${MK_GNU_GREP_COMPAT} != "no" || \
     ${MK_GDB} != "no"
 SUBDIR+=		libregex
Index: lib/csu/Makefile.inc
===================================================================
--- lib/csu/Makefile.inc
+++ lib/csu/Makefile.inc
@@ -6,4 +6,27 @@
 
 NO_WMISSING_VARIABLE_DECLARATIONS=
 
+.include <src.opts.mk>
+
+.if ${MK_BSD_CRTBEGIN} != "no"
+
+OBJS+=	crtbegin.o crtbeginS.o crtbeginT.o
+OBJS+=	crtend.o crtendS.o
+
+CFLAGS_CRTS=	-DSHARED ${PICFLAG}
+
+crtbegin.o: crtbegin.c
+crtbeginS.o: crtbegin.c
+crtbeginT.o: crtbegin.c
+crtend.o: crtend.c
+crtendS.o: crtend.c
+
+crtbegin.o crtend.o crtbeginT.o:
+	${CC} ${CFLAGS} -I${.CURDIR} -c -o ${.TARGET} ${.ALLSRC}
+
+crtbeginS.o crtendS.o:
+	${CC} ${CFLAGS} -I${.CURDIR} ${CFLAGS_CRTS} -c -o ${.TARGET} ${.ALLSRC}
+
+.endif
+
 .include "../Makefile.inc"
Index: lib/csu/aarch64/crt.h
===================================================================
--- /dev/null
+++ lib/csu/aarch64/crt.h
@@ -0,0 +1 @@
+/* $FreeBSD$ */
Index: lib/csu/amd64/crt.h
===================================================================
--- /dev/null
+++ lib/csu/amd64/crt.h
@@ -0,0 +1,32 @@
+/*-
+ * SPDX-License-Identifier: BSD-1-Clause
+ *
+ * Copyright 2018 Andrew Turner
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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 _CRT_H_
+#define	_CRT_H_
+
+#define	HAVE_CTORS
+#define	INIT_CALL_SEQ(func)	"call " __STRING(func)
+
+#endif
Index: lib/csu/common/crtbegin.c
===================================================================
--- /dev/null
+++ lib/csu/common/crtbegin.c
@@ -0,0 +1,99 @@
+/*-
+ * SPDX-License-Identifier: BSD-1-Clause
+ *
+ * Copyright 2018 Andrew Turner
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+
+#include "crt.h"
+
+typedef void (*crt_func)(void);
+
+/*
+ * On some architectures and toolchains we may need to call the .dtors.
+ * These are called in the order they are in the ELF file.
+ */
+#ifndef HAVE_CTORS
+static void __do_global_dtors_aux(void) __used;
+
+crt_func __CTOR_LIST__[] __section(".ctors") __hidden = {
+	(crt_func)-1
+};
+crt_func __DTOR_LIST__[] __section(".dtors") __hidden = {
+	(crt_func)-1
+};
+
+static void
+__do_global_dtors_aux(void)
+{
+	crt_func fn;
+	int n;
+
+	for (n = 1;; n++) {
+		fn = __DTOR_LIST__[n];
+		if (fn == (crt_func)0 || fn == (crt_func)-1)
+			break;
+		fn();
+	}
+}
+
+asm (
+    ".pushsection .fini		\n"
+    INIT_CALL_SEQ(__do_global_dtors_aux) "\n"
+    ".popsection		\n"
+);
+#endif
+
+/*
+ * Handler for gcj. These provide a _Jv_RegisterClasses function and fill
+ * out the .jcr section. We just need to call this function with a pointer
+ * to the appropriate section.
+ */
+extern void _Jv_RegisterClasses(void *) __weak_symbol;
+static void register_classes(void) __used;
+
+crt_func __JCR_LIST__[] __section(".jcr") __used __hidden = { };
+
+#ifndef CTORS_CONSTRUCTORS
+__attribute__((constructor))
+#endif
+static void
+register_classes(void)
+{
+
+	if (_Jv_RegisterClasses != NULL && __JCR_LIST__[0] != 0)
+		_Jv_RegisterClasses(__JCR_LIST__);
+}
+
+/*
+ * We can't use constructors when they use the .ctors section as they may be
+ * placed before __CTOR_LIST__.
+ */
+#ifdef CTORS_CONSTRUCTORS
+asm (
+    ".pushsection .init		\n"
+    INIT_CALL_SEQ(register_classes) "\n"
+    ".popsection		\n"
+);
+#endif
Index: lib/csu/common/crtend.c
===================================================================
--- /dev/null
+++ lib/csu/common/crtend.c
@@ -0,0 +1,64 @@
+/*-
+ * SPDX-License-Identifier: BSD-1-Clause
+ *
+ * Copyright 2018 Andrew Turner
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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>
+__FBSDID("$FreeBSD$");
+
+#include "crt.h"
+
+#ifdef HAVE_CTORS
+typedef void (*crt_func)(void);
+
+/*
+ * On some architectures and toolchains we may need to call the .dtors.
+ * These are called in the reverse order they are in the ELF file.
+ */
+static void __do_global_ctors_aux(void) __used;
+
+crt_func __CTOR_END__[] __section(".ctors") __used __hidden = {
+	(crt_func)0
+};
+crt_func __DTOR_END__[] __section(".dtors") __used __hidden = {
+	(crt_func)0
+};
+
+static void
+__do_global_ctors_aux(void)
+{
+	crt_func fn;
+	int n;
+
+	for (n = 1;; n++) {
+		fn = __CTOR_END__[-n];
+		if (fn == (crt_func)0 || fn == (crt_func)-1)
+			break;
+		fn();
+	}
+}
+
+asm (
+    ".pushsection .init		\n"
+    INIT_CALL_SEQ(__do_global_ctors_aux) "\n"
+    ".popsection		\n"
+);
+#endif
Index: lib/csu/i386/crt.h
===================================================================
--- /dev/null
+++ lib/csu/i386/crt.h
@@ -0,0 +1,32 @@
+/*-
+ * SPDX-License-Identifier: BSD-1-Clause
+ *
+ * Copyright 2018 Andrew Turner
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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 _CRT_H_
+#define	_CRT_H_
+
+#define	HAVE_CTORS
+#define	INIT_CALL_SEQ(func)	"call " __STRING(func)
+
+#endif
Index: lib/csu/powerpc64/crt.h
===================================================================
--- /dev/null
+++ lib/csu/powerpc64/crt.h
@@ -0,0 +1,33 @@
+/*-
+ * SPDX-License-Identifier: BSD-1-Clause
+ *
+ * Copyright 2018 Andrew Turner
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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 _CRT_H_
+#define	_CRT_H_
+
+#define	HAVE_CTORS
+#define	CTORS_CONSTRUCTORS
+#define	INIT_CALL_SEQ(func)	"bl " __STRING(func) "; nop"
+
+#endif
Index: share/mk/src.opts.mk
===================================================================
--- share/mk/src.opts.mk
+++ share/mk/src.opts.mk
@@ -388,6 +388,14 @@
 __DEFAULT_NO_OPTIONS+=NVME
 .endif
 
+.if ${__T} == "aarch64" || ${__T} == "powerpc64"
+__DEFAULT_YES_OPTIONS+=BSD_CRTBEGIN
+.elif ${__T} == "amd64" || ${__T} == "i386"
+__DEFAULT_NO_OPTIONS+=BSD_CRTBEGIN
+.else
+BROKEN_OPTIONS+=BSD_CRTBEGIN
+.endif
+
 .include <bsd.mkopt.mk>
 
 #
Index: tools/build/options/WITHOUT_BSD_CRTBEGIN
===================================================================
--- /dev/null
+++ tools/build/options/WITHOUT_BSD_CRTBEGIN
@@ -0,0 +1,2 @@
+.\" $FreeBSD$
+Disable the BSD licensed crtbegin.o and crtend.o
Index: tools/build/options/WITH_BSD_CRTBEGIN
===================================================================
--- /dev/null
+++ tools/build/options/WITH_BSD_CRTBEGIN
@@ -0,0 +1,2 @@
+.\" $FreeBSD$
+Enable the BSD licensed crtbegin.o and crtend.o