diff -Naur Python-2.7.9-orig/configure.ac Python-2.7.9/configure.ac
--- Python-2.7.9-orig/configure.ac	2014-12-11 13:51:08.234600000 +0300
+++ Python-2.7.9/configure.ac	2014-12-11 13:51:16.409000000 +0300
@@ -641,6 +641,17 @@
 CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
 EXPORT_MACOSX_DEPLOYMENT_TARGET='#'
 
+# There are certain cases where we don't want build machine's
+# sysroot folders (/usr/include, /usr/lib, /usr/lib64 etc) to
+# be used. An example of where this is needed is if running
+# on a 64bit machine via linux32 running a 32bit targetting GCC.
+# Without this, 64bit libs will cause the linker to fail.
+# This also prevents add_multiarch_paths from being called.
+# You can specify this multiple times to add more prefixes.
+AC_MSG_CHECKING(for --with-build-sysroot)
+AC_ARG_WITH([build-sysroot],
+AS_HELP_STRING([--with-build-sysroot], [Select sysroot and ignore multilibs, even when not cross-compiling]))
+
 # checks for alternative programs
 
 # compiler flags are generated in two sets, BASECFLAGS and OPT.  OPT is just
diff -Naur Python-2.7.9-orig/setup.py Python-2.7.9/setup.py
--- Python-2.7.9-orig/setup.py	2014-12-11 13:51:11.495000000 +0300
+++ Python-2.7.9/setup.py	2014-12-11 13:51:16.409000000 +0300
@@ -43,6 +43,16 @@
 # Were we compiled --with-pydebug or with #define Py_DEBUG?
 COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
 
+with_build_sysroot_args = [arg.split('=')[-1] for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
+                           if ('--with-build-sysroot' in arg)]
+
+if len(with_build_sysroot_args):
+    with_build_sysroot_specified = True
+    with_build_sysroots = [arg.replace("'",'') for arg in with_build_sysroot_args]
+else:
+    with_build_sysroot_specified = False
+    with_build_sysroots = ['/usr']
+
 # This global variable is used to hold the list of modules to be disabled.
 disabled_module_list = []
 
@@ -391,10 +401,11 @@
             os.unlink(tmpfile)
 
         if multiarch_path_component != '':
-            add_dir_to_list(self.compiler.library_dirs,
-                            '/usr/lib/' + multiarch_path_component)
-            add_dir_to_list(self.compiler.include_dirs,
-                            '/usr/include/' + multiarch_path_component)
+            for sysroot in with_build_sysroots:
+                add_dir_to_list(self.compiler.library_dirs,
+                                sysroot + '/lib/' + multiarch_path_component)
+                add_dir_to_list(self.compiler.include_dirs,
+                                sysroot + '/include/' + multiarch_path_component)
             return
 
         if not find_executable('dpkg-architecture'):
@@ -412,10 +423,11 @@
             if ret >> 8 == 0:
                 with open(tmpfile) as fp:
                     multiarch_path_component = fp.readline().strip()
-                add_dir_to_list(self.compiler.library_dirs,
-                                '/usr/lib/' + multiarch_path_component)
-                add_dir_to_list(self.compiler.include_dirs,
-                                '/usr/include/' + multiarch_path_component)
+                for sysroot in with_build_sysroots:
+                    add_dir_to_list(self.compiler.library_dirs,
+                                    sysroot + '/lib/' + multiarch_path_component)
+                    add_dir_to_list(self.compiler.include_dirs,
+                                    sysroot + '/include/' + multiarch_path_component)
         finally:
             os.unlink(tmpfile)
 
@@ -453,7 +465,7 @@
 
     def detect_modules(self):
         # Ensure that /usr/local is always used
-        if not cross_compiling:
+        if not cross_compiling and not with_build_sysroot_specified:
             add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
             add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
         if cross_compiling:
@@ -516,7 +528,7 @@
         # be assumed that no additional -I,-L directives are needed.
         inc_dirs = self.compiler.include_dirs[:]
         lib_dirs = self.compiler.library_dirs[:]
-        if not cross_compiling:
+        if not cross_compiling and not with_build_sysroot_specified:
             for d in (
                 '/usr/include',
                 ):
@@ -804,11 +816,11 @@
             elif curses_library:
                 readline_libs.append(curses_library)
             elif self.compiler.find_library_file(lib_dirs +
-                                                     ['/usr/lib/termcap'],
+                                                     [sr + '/lib/termcap' for sr in with_build_sysroots],
                                                      'termcap'):
                 readline_libs.append('termcap')
             exts.append( Extension('readline', ['readline.c'],
-                                   library_dirs=['/usr/lib/termcap'],
+                                   library_dirs=[sr + '/lib/termcap' for sr in with_build_sysroots],
                                    extra_link_args=readline_extra_link_args,
                                    libraries=readline_libs) )
         else:
@@ -837,20 +849,20 @@
                                libraries=_socket_libs) )
         # Detect SSL support for the socket module (via _ssl)
         search_for_ssl_incs_in = [
-                              '/usr/local/ssl/include',
-                              '/usr/contrib/ssl/include/'
+                              sr + sslinc for sr in with_build_sysroots
+                              for sslinc in ('/local/ssl/include', '/contrib/ssl/include')
                              ]
         ssl_incs = find_file('openssl/ssl.h', inc_dirs,
                              search_for_ssl_incs_in
                              )
         if ssl_incs is not None:
             krb5_h = find_file('krb5.h', inc_dirs,
-                               ['/usr/kerberos/include'])
+                               [sr + '/kerberos/include' for sr in with_build_sysroots])
             if krb5_h:
                 ssl_incs += krb5_h
         ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-                                     ['/usr/local/ssl/lib',
-                                      '/usr/contrib/ssl/lib/'
+                                     [sr + ssllib for sr in with_build_sysroots
+                                      for ssllib in ('/local/ssl/lib', '/contrib/ssl/lib')
                                      ] )
 
         if (ssl_incs is not None and
