--- a/a/nss/Makefile
+++ a/a/nss/Makefile
@@ -91,13 +91,11 @@
 ifdef NS_USE_GCC
 NSPR_CONFIGURE_ENV = CC=gcc CXX=g++
 endif
-# Make sure to remove -arch arguments. NSPR can't handle that.
-remove_arch = $(filter-out __REMOVEME%,$(subst $(NULL) -arch , __REMOVEME,$(1)))
 ifdef CC
-NSPR_CONFIGURE_ENV = CC="$(call remove_arch,$(CC))"
+NSPR_CONFIGURE_ENV = CC="$(CC)"
 endif
 ifdef CCC
-NSPR_CONFIGURE_ENV += CXX="$(call remove_arch,$(CCC))"
+NSPR_CONFIGURE_ENV += CXX="$(CCC)"
 endif
 
 #
@@ -140,7 +138,6 @@
 
 build_nspr: $(NSPR_CONFIG_STATUS)
 	$(MAKE) -C $(CORE_DEPTH)/../nspr/$(OBJDIR_NAME)
-	$(MAKE) -C $(CORE_DEPTH)/../nspr/$(OBJDIR_NAME)/pr/tests
 
 install_nspr: build_nspr
 	$(MAKE) -C $(CORE_DEPTH)/../nspr/$(OBJDIR_NAME) install
--- a/a/nss/lib/ckfw/builtins/manifest.mn
+++ a/a/nss/lib/ckfw/builtins/manifest.mn
@@ -5,7 +5,7 @@
 
 CORE_DEPTH = ../../..
 
-DIRS = testlib
+DIRS =
 
 MODULE = nss
 
--- a/a/nss/lib/nss/nssinit.c
+++ a/a/nss/lib/nss/nssinit.c
@@ -275,6 +275,7 @@
                           const char *secmodprefix,
                           char **retoldpath, char **retnewpath)
 {
+#ifndef NSS_STATIC_PKCS11
     char *path, *oldpath = NULL, *lastsep;
     int len, path_len, secmod_len, dll_len;
 
@@ -309,6 +310,10 @@
     }
     *retoldpath = oldpath;
     *retnewpath = path;
+#else
+    *retoldpath = NULL;
+    *retnewpath = PORT_Strdup("NSSCKBI");
+#endif
     return;
 }
 
--- a/a/nss/lib/pk11wrap/pk11load.c
+++ a/a/nss/lib/pk11wrap/pk11load.c
@@ -390,6 +390,8 @@
 /*
  * load a new module into our address space and initialize it.
  */
+extern CK_RV NSSCKBI_C_GetFunctionList();
+
 SECStatus
 secmod_LoadPKCS11Module(SECMODModule *mod, SECMODModule **oldModule)
 {
@@ -468,6 +470,7 @@
 /* load the library. If this succeeds, then we have to remember to
          * unload the library if anything goes wrong from here on out...
          */
+#ifndef NSS_STATIC_PKCS11 // With NSS_STATIC_PKCS11, the only module wodule we load here is nssckbi
 #if defined(_WIN32)
         if (nssUTF8_Length(mod->dllName, NULL)) {
             wchar_t *dllNameWide = _NSSUTIL_UTF8ToWide(mod->dllName);
@@ -507,6 +510,11 @@
             mod->moduleDBFunc = (void *)
                 PR_FindSymbol(library, "NSS_ReturnModuleSpecData");
         }
+#else
+        if (strcmp(mod->dllName, "NSSCKBI") == 0)
+            fentry = NSSCKBI_C_GetFunctionList;
+#endif
+
         if (mod->moduleDBFunc == NULL)
             mod->isModuleDB = PR_FALSE;
         if ((ientry == NULL) && (fentry == NULL)) {
@@ -643,10 +651,12 @@
     }
 fail:
     mod->functionList = NULL;
+#ifndef NSS_STATIC_PKCS11
     disableUnload = PR_GetEnvSecure("NSS_DISABLE_UNLOAD");
     if (library && !disableUnload) {
         PR_UnloadLibrary(library);
     }
+#endif
     return SECFailure;
 }
 
--- a/a/nss/lib/ckfw/nssck.api
+++ a/a/nss/lib/ckfw/nssck.api
@@ -1842,7 +1842,11 @@
 
 /* This one is always present */
 CK_RV CK_ENTRY
+#ifndef NSS_STATIC_PKCS11
 C_GetFunctionList
+#else
+NSSCKBI_C_GetFunctionList
+#endif
 (
   CK_FUNCTION_LIST_PTR_PTR ppFunctionList
 )
--- a/a/nss/lib/freebl/loader.c
+++ a/a/nss/lib/freebl/loader.c
@@ -35,6 +35,7 @@
 static PRStatus
 freebl_LoadDSO(void)
 {
+#ifndef NSS_STATIC_FREEBL
     PRLibrary *handle;
     const char *name = getLibName();
 
@@ -47,32 +48,42 @@
     if (handle) {
         PRFuncPtr address = PR_FindFunctionSymbol(handle, "FREEBL_GetVector");
         if (address) {
-            FREEBLGetVectorFn *getVector = (FREEBLGetVectorFn *)address;
+#else
+            FREEBLGetVectorFn *getVector = FREEBL_GetVector;
+#endif
             const FREEBLVector *dsoVector = getVector();
             if (dsoVector) {
                 unsigned short dsoVersion = dsoVector->version;
                 unsigned short myVersion = FREEBL_VERSION;
                 if (MSB(dsoVersion) == MSB(myVersion) &&
                     LSB(dsoVersion) >= LSB(myVersion) &&
                     dsoVector->length >= sizeof(FREEBLVector)) {
                     vector = dsoVector;
+#ifndef NSS_STATIC_FREEBL
                     libraryName = name;
                     blLib = handle;
+#else
+                    libraryName = "self";
+#endif
                     return PR_SUCCESS;
                 }
             }
+            else
+                return PR_FAILURE;
+#ifndef NSS_STATIC_FREEBL
         }
 #ifdef DEBUG
         if (blLib) {
             PRStatus status = PR_UnloadLibrary(blLib);
             PORT_Assert(PR_SUCCESS == status);
         }
 #else
         if (blLib)
             PR_UnloadLibrary(blLib);
 #endif
     }
     return PR_FAILURE;
+#endif
 }
 
 static const PRCallOnceType pristineCallOnce;
@@ -860,6 +871,7 @@
 void
 BL_Unload(void)
 {
+#ifndef NSS_STATIC_FREEBL
     /* This function is not thread-safe, but doesn't need to be, because it is
      * only called from functions that are also defined as not thread-safe,
      * namely C_Finalize in softoken, and the SSL bypass shutdown callback called
@@ -872,6 +884,7 @@
         PR_UnloadLibrary(blLib);
 #endif
     }
+#endif
     blLib = NULL;
     loadFreeBLOnce = pristineCallOnce;
 }
--- a/a/nspr/build/autoconf/config.sub	2017-09-07 15:29:45.031246453 +0200
+++ a/a/nspr/build/autoconf/config.sub	2017-09-07 15:32:13.087235423 +0200
@@ -110,6 +110,9 @@
     exit 1;;
 esac
 
+if test $1 = "arm64-apple-darwin"; then echo $1; exit; fi
+if test $1 = "aarch64-apple-darwin"; then echo $1; exit; fi
+
 # Split fields of configuration type
 # shellcheck disable=SC2162
 IFS="-" read field1 field2 field3 field4 <<EOF
--- a/a/nspr/config/autoconf.mk.in
+++ a/a/nspr/config/autoconf.mk.in
@@ -69,7 +69,7 @@
 MSC_VER		= @MSC_VER@
 AR		= @AR@
 AR_FLAGS	= @AR_FLAGS@
-LD		= @LD@
+LD		= echo
 RANLIB		= @RANLIB@
 PERL		= @PERL@
 RC		= @RC@
--- a/a/nspr/configure
+++ a/a/nspr/configure
@@ -2507,7 +2507,7 @@
 OBJDIR='$(OBJDIR_NAME)'
 OBJDIR_NAME=.
 OBJDIR_SUFFIX=OBJ
-NSINSTALL='$(MOD_DEPTH)/config/$(OBJDIR_NAME)/nsinstall'
+NSINSTALL=${NSINSTALL?'$(MOD_DEPTH)/config/$(OBJDIR_NAME)/nsinstall'}
 NOSUCHFILE=/no-such-file
 LIBNSPR='-L$(dist_libdir) -lnspr$(MOD_MAJOR_VERSION)'
 LIBPLC='-L$(dist_libdir) -lplc$(MOD_MAJOR_VERSION)'
@@ -5571,7 +5571,7 @@
 LIB_SUFFIX=a
 DLL_SUFFIX=so
 ASM_SUFFIX=s
-MKSHLIB='$(LD) $(DSO_LDOPTS) -o $@'
+MKSHLIB='touch $@; echo'
 PR_MD_ASFILES=
 PR_MD_CSRCS=
 PR_MD_ARCH_DIR=unix
@@ -6485,7 +6485,7 @@
     DSO_CFLAGS=-fPIC
     DSO_LDOPTS='-dynamiclib -compatibility_version 1 -current_version 1 -all_load -install_name @__________________________________________________OOO/$@ -headerpad_max_install_names'
     _OPTIMIZE_FLAGS=-O2
-    MKSHLIB='$(CC) $(DSO_LDOPTS) -o $@'
+    MKSHLIB=touch $@
     STRIP="$STRIP -x -S"
     DLL_SUFFIX=dylib
     USE_PTHREADS=1
--- a/a/nss/coreconf/ruleset.mk
+++ a/a/nss/coreconf/ruleset.mk
@@ -45,7 +45,7 @@
 endif
 
 ifeq ($(MKPROG),)
-    MKPROG = $(CC)
+    MKPROG = touch $@; echo
 endif
 
 #
--- a/a/nss/coreconf/Darwin.mk
+++ a/a/nss/coreconf/Darwin.mk
@@ -116,7 +116,7 @@
    DSO_LDOPTS += --coverage
 endif
 
-MKSHLIB		= $(CC) $(DSO_LDOPTS) $(DARWIN_SDK_SHLIBFLAGS)
+MKSHLIB		= touch $@; echo
 DLL_SUFFIX	= dylib
 ifdef MAPFILE
 	MKSHLIB += -exported_symbols_list $(MAPFILE)
--- a/a/nss/coreconf/UNIX.mk
+++ a/a/nss/coreconf/UNIX.mk
@@ -19,10 +19,14 @@
 
 ifdef BUILD_TREE
 NSINSTALL_DIR  = $(BUILD_TREE)/nss
+ifndef NSINSTALL
 NSINSTALL      = $(BUILD_TREE)/nss/nsinstall
+endif
 else
 NSINSTALL_DIR  = $(CORE_DEPTH)/coreconf/nsinstall
+ifndef NSINSTALL
 NSINSTALL      = $(NSINSTALL_DIR)/$(OBJDIR_NAME)/nsinstall
+endif
 endif
 
 ####################################################################
--- a/a/nspr/pr/include/md/_darwin.h
+++ a/a/nspr/pr/include/md/_darwin.h
@@ -26,6 +26,8 @@
 #define _PR_SI_ARCHITECTURE "ppc"
 #elif defined(__arm__)
 #define _PR_SI_ARCHITECTURE "arm"
+#elif defined(__arm64__)
+#define _PR_SI_ARCHITECTURE "arm64"
 #elif defined(__aarch64__)
 #define _PR_SI_ARCHITECTURE "aarch64"
 #else
--- a/a/nss/cmd/shlibsign/sign.sh
+++ a/a/nss/cmd/shlibsign/sign.sh
@@ -2,6 +2,9 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Pointless to sign anything for iOS as we don't build any real shared libraries
+exit 0
 
 # arguments:
 # 1: full path to DIST/OBJDIR (parent dir of "lib")