Build obmalloc.c directly instead of #include'ing from object.c.
Also move all _PyMalloc_XXX entry points into obmalloc.c.

The Windows build works fine.
The Unix build is changed here (Makefile.pre.in), but not tested.
No other platform's build process has been fiddled.
diff --git a/Makefile.pre.in b/Makefile.pre.in
index 5bed545..8a10a10 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -263,6 +263,7 @@
 		Objects/methodobject.o \
 		Objects/moduleobject.o \
 		Objects/object.o \
+		Objects/obmalloc.o \
 		Objects/rangeobject.o \
 		Objects/sliceobject.o \
 		Objects/stringobject.o \
@@ -424,8 +425,6 @@
 Python/importdl.o: $(srcdir)/Python/importdl.c
 		$(CC) -c $(CFLAGS) $(CPPFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c
 
-Objects/object.o: $(srcdir)/Objects/object.c $(srcdir)/Objects/obmalloc.c
-
 Objects/unicodectype.o:	$(srcdir)/Objects/unicodectype.c \
 				$(srcdir)/Objects/unicodetype_db.h
 
diff --git a/Objects/object.c b/Objects/object.c
index 494e840..6ec8c8b 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -2090,46 +2090,3 @@
 		--_PyTrash_delete_nesting;
 	}
 }
-
-#ifdef WITH_PYMALLOC
-#include "obmalloc.c"
-#else
-void *_PyMalloc_Malloc(size_t n)
-{
-	return PyMem_MALLOC(n);
-}
-
-void *_PyMalloc_Realloc(void *p, size_t n)
-{
-	return PyMem_REALLOC(p, n);
-}
-
-void _PyMalloc_Free(void *p)
-{
-	PyMem_FREE(p);
-}
-#endif /* !WITH_PYMALLOC */
-
-PyObject *_PyMalloc_New(PyTypeObject *tp)
-{
-	PyObject *op;
-	op = (PyObject *) _PyMalloc_MALLOC(_PyObject_SIZE(tp));
-	if (op == NULL)
-		return PyErr_NoMemory();
-	return PyObject_INIT(op, tp);
-}
-
-PyVarObject *_PyMalloc_NewVar(PyTypeObject *tp, int nitems)
-{
-	PyVarObject *op;
-	const size_t size = _PyObject_VAR_SIZE(tp, nitems);
-	op = (PyVarObject *) _PyMalloc_MALLOC(size);
-	if (op == NULL)
-		return (PyVarObject *)PyErr_NoMemory();
-	return PyObject_INIT_VAR(op, tp, nitems);
-}
-
-void _PyMalloc_Del(PyObject *op)
-{
-	_PyMalloc_FREE(op);
-}
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index 7fb0d8b..a3f4cf8 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -1,3 +1,7 @@
+#include "Python.h"
+
+#ifdef WITH_PYMALLOC
+
 /* An object allocator for Python.
 
    Here is an introduction to the layers of the Python memory architecture,
@@ -636,3 +640,49 @@
 }
 */
 
+#else	/* ! WITH_PYMALLOC */
+void
+*_PyMalloc_Malloc(size_t n)
+{
+	return PyMem_MALLOC(n);
+}
+
+void
+*_PyMalloc_Realloc(void *p, size_t n)
+{
+	return PyMem_REALLOC(p, n);
+}
+
+void
+_PyMalloc_Free(void *p)
+{
+	PyMem_FREE(p);
+}
+#endif /* WITH_PYMALLOC */
+
+PyObject
+*_PyMalloc_New(PyTypeObject *tp)
+{
+	PyObject *op;
+	op = (PyObject *) _PyMalloc_MALLOC(_PyObject_SIZE(tp));
+	if (op == NULL)
+		return PyErr_NoMemory();
+	return PyObject_INIT(op, tp);
+}
+
+PyVarObject *
+_PyMalloc_NewVar(PyTypeObject *tp, int nitems)
+{
+	PyVarObject *op;
+	const size_t size = _PyObject_VAR_SIZE(tp, nitems);
+	op = (PyVarObject *) _PyMalloc_MALLOC(size);
+	if (op == NULL)
+		return (PyVarObject *)PyErr_NoMemory();
+	return PyObject_INIT_VAR(op, tp, nitems);
+}
+
+void
+_PyMalloc_Del(PyObject *op)
+{
+	_PyMalloc_FREE(op);
+}
diff --git a/PCbuild/pythoncore.dsp b/PCbuild/pythoncore.dsp
index 6495952..b91355f 100644
--- a/PCbuild/pythoncore.dsp
+++ b/PCbuild/pythoncore.dsp
@@ -1268,6 +1268,21 @@
 # End Source File

 # Begin Source File

 

+SOURCE=..\Objects\obmalloc.c

+

+!IF  "$(CFG)" == "pythoncore - Win32 Release"

+

+!ELSEIF  "$(CFG)" == "pythoncore - Win32 Debug"

+

+!ELSEIF  "$(CFG)" == "pythoncore - Win32 Alpha Debug"

+

+!ELSEIF  "$(CFG)" == "pythoncore - Win32 Alpha Release"

+

+!ENDIF 

+

+# End Source File

+# Begin Source File

+

 SOURCE=..\Modules\operator.c

 

 !IF  "$(CFG)" == "pythoncore - Win32 Release"