diff -Naurp Python-2.7.15/Modules/Setup.dist.orig Python-2.7.15/Modules/Setup.dist
--- Python-2.7.15/Modules/Setup.dist.orig	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/Setup.dist	2018-11-17 20:40:20.153518694 +0100
@@ -464,7 +464,7 @@
 # Andrew Kuchling's zlib module.
 # This require zlib 1.1.3 (or later).
 # See http://www.gzip.org/zlib/
-#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
+zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

 # Interface to the Expat XML parser
 #
diff -Naurp Python-2.7.15.orig/Makefile.pre.in Python-2.7.15/Makefile.pre.in
--- Python-2.7.15.orig/Makefile.pre.in	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Makefile.pre.in	2018-11-18 00:43:58.777379280 +0100
@@ -20,6 +20,7 @@
 
 # === Variables set by makesetup ===
 
+MODNAMES=       _MODNAMES_
 MODOBJS=        _MODOBJS_
 MODLIBS=        _MODLIBS_
 
diff -Naurp Python-2.7.15.orig/Modules/_ctypes/libffi/src/arm/sysv.S Python-2.7.15/Modules/_ctypes/libffi/src/arm/sysv.S
--- Python-2.7.15.orig/Modules/_ctypes/libffi/src/arm/sysv.S	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/_ctypes/libffi/src/arm/sysv.S	2018-11-17 22:28:50.925456603 +0100
@@ -396,7 +396,7 @@ LSYM(Lbase_args):
 	beq	LSYM(Lepilogue_vfp)
 
 	cmp	r3, #FFI_TYPE_SINT64
-	stmeqia	r2, {r0, r1}
+	stmiaeq	r2, {r0, r1}
 	beq	LSYM(Lepilogue_vfp)
 
 	cmp	r3, #FFI_TYPE_FLOAT
diff -Naurp Python-2.7.15.orig/Modules/makesetup Python-2.7.15/Modules/makesetup
--- Python-2.7.15.orig/Modules/makesetup	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/Modules/makesetup	2018-11-18 00:43:10.289379743 +0100
@@ -110,6 +110,7 @@ sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 # Rules appended by makedepend
 " >$rulesf
 	DEFS=
+	NAMES=
 	MODS=
 	SHAREDMODS=
 	OBJS=
@@ -181,7 +182,7 @@ sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 			*.*)		echo 1>&2 "bad word $arg in $line"
 					exit 1;;
 			-u)		skip=libs; libs="$libs -u";;
-			[a-zA-Z_]*)	mods="$mods $arg";;
+			[a-zA-Z_]*)	NAMES="$NAMES $arg"; mods="$mods $arg";;
 			*)		echo 1>&2 "bad word $arg in $line"
 					exit 1;;
 			esac
@@ -284,6 +285,7 @@ sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 		echo "1i\\" >$sedf
 		str="# Generated automatically from $makepre by makesetup."
 		echo "$str" >>$sedf
+		echo "s%_MODNAMES_%$NAMES%" >>$sedf
 		echo "s%_MODOBJS_%$OBJS%" >>$sedf
 		echo "s%_MODLIBS_%$LIBS%" >>$sedf
 		echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
diff -Naurp Python-2.7.15.orig/setup.py Python-2.7.15/setup.py
--- Python-2.7.15.orig/setup.py	2018-04-30 00:47:33.000000000 +0200
+++ Python-2.7.15/setup.py	2018-11-18 00:40:50.021381080 +0100
@@ -217,7 +217,11 @@ class PyBuildExt(build_ext):
         # Python header files
         headers = [sysconfig.get_config_h_filename()]
         headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
-        for ext in self.extensions[:]:
+        # The sysconfig variable built by makesetup, listing the already
+        # built modules as configured by the Setup files.
+        modnames = sysconfig.get_config_var('MODNAMES').split()
+        removed_modules = []
+        for ext in self.extensions:
             ext.sources = [ find_module_file(filename, moddirlist)
                             for filename in ext.sources ]
             if ext.depends is not None:
@@ -231,10 +235,10 @@ class PyBuildExt(build_ext):
             # platform specific include directories
             ext.include_dirs.extend(incdirlist)
 
-            # If a module has already been built statically,
-            # don't build it here
-            if ext.name in sys.builtin_module_names:
-                self.extensions.remove(ext)
+            # If a module has already been built by the Makefile,
+            # don't build it here.
+            if ext.name in modnames:
+                removed_modules.append(ext)
 
         # Parse Modules/Setup and Modules/Setup.local to figure out which
         # modules are turned on in the file.
@@ -249,8 +253,9 @@ class PyBuildExt(build_ext):
             input.close()
 
         for ext in self.extensions[:]:
-            if ext.name in remove_modules:
-                self.extensions.remove(ext)
+            if removed_modules:
+                self.extensions = [x for x in self.extensions if x not in
+                                   removed_modules]
 
         # When you run "make CC=altcc" or something similar, you really want
         # those environment variables passed into the setup.py phase.  Here's
@@ -290,6 +295,13 @@ class PyBuildExt(build_ext):
                    " detect_modules() for the module's name.")
             print
 
+        if removed_modules:
+            print("The following modules found by detect_modules() in"
+                  " setup.py, have been")
+            print("built by the Makefile instead, as configured by the"
+                  " Setup files:")
+            print_three_column([ext.name for ext in removed_modules])
+
         if self.failed:
             failed = self.failed[:]
             print