diff --git a/asdf-ecl.lisp b/asdf-ecl.lisp
index 3cf8575..14033e7 100644
--- a/asdf-ecl.lisp
+++ b/asdf-ecl.lisp
@@ -15,6 +15,36 @@
 (require :cmp)
 
 ;;;
+;;; We rewrite a subset of ASDF functions so that instead of generating one
+;;; FASL file per lisp file, ASDF creates an object file and a FASL file. The
+;;; object file is reused by the extensions below.
+;;;
+
+(setf *compile-op-compile-file-function*
+      (lambda (input-file &rest keys &key output-file &allow-other-keys)
+        (declare (ignore output-file))
+        (multiple-value-bind (object-file flags1 flags2)
+            (apply #'call-next-method input-file :system-p t keys)
+          (values (and object-file
+                       (c::build-fasl (compile-file-pathname object-file :type :fasl)
+                                      :lisp-files (list object-file))
+                       object-file)
+                  flags1
+                  flags2))))
+
+(defmethod output-files ((operation compile-op) (c cl-source-file))
+  (declare (ignorable operation))
+  (let ((p (lispize-pathname (component-pathname c))))
+    (list (compile-file-pathname p :type :object)
+          (compile-file-pathname p :type :fasl))))
+
+(defmethod perform ((o load-op) (c cl-source-file))
+  (map () #'load
+       (loop :for i :in (input-files o c)
+          :unless (string= (pathname-type i) "fas")
+          :collect (compile-file-pathname (lispize-pathname i)))))
+
+;;;
 ;;; COMPILE-OP / LOAD-OP
 ;;;
 ;;; In ECL, these operations produce both FASL files and the
diff --git a/asdf.lisp b/asdf.lisp
index c6ad0bc..9c6b5a4 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -189,8 +189,7 @@
            (#:perform #:explain #:output-files #:operation-done-p
             #:perform-with-restarts #:component-relative-pathname
             #:system-source-file #:operate #:find-component #:find-system
-            #:apply-output-translations #:translate-pathname* #:resolve-location
-            #:compile-file*)
+            #:apply-output-translations #:translate-pathname* #:resolve-location)
            :unintern
            (#:*asdf-revision* #:around #:asdf-method-combination
             #:split #:make-collector
@@ -1907,6 +1906,9 @@ recursive calls to traverse.")
   (setf (gethash (type-of operation) (component-operation-times c))
         (get-universal-time)))
 
+(defvar *compile-op-compile-file-function* 'compile-file*
+  "Function used to compile lisp files.")
+
 ;;; perform is required to check output-files to find out where to put
 ;;; its answers, in case it has been overridden for site policy
 (defmethod perform ((operation compile-op) (c cl-source-file))
@@ -1918,7 +1920,8 @@ recursive calls to traverse.")
         (*compile-file-warnings-behaviour* (operation-on-warnings operation))
         (*compile-file-failure-behaviour* (operation-on-failure operation)))
     (multiple-value-bind (output warnings-p failure-p)
-        (apply #'compile-file* source-file :output-file output-file
+        (apply *compile-op-compile-file-function*
+               source-file :output-file output-file
                (compile-op-flags operation))
       (when warnings-p
         (case (operation-on-warnings operation)
@@ -1941,8 +1944,7 @@ recursive calls to traverse.")
   (declare (ignorable operation))
   (let ((p (lispize-pathname (component-pathname c))))
     #-broken-fasl-loader
-    (list (compile-file-pathname p #+ecl :type #+ecl :object)
-          #+ecl (compile-file-pathname p :type :fasl))
+    (list (compile-file-pathname p))
     #+broken-fasl-loader (list p)))
 
 (defmethod perform ((operation compile-op) (c static-file))
@@ -1969,11 +1971,7 @@ recursive calls to traverse.")
 (defclass load-op (basic-load-op) ())
 
 (defmethod perform ((o load-op) (c cl-source-file))
-  (map () #'load
-       #-ecl (input-files o c)
-       #+ecl (loop :for i :in (input-files o c)
-               :unless (string= (pathname-type i) "fas")
-               :collect (compile-file-pathname (lispize-pathname i)))))
+  (map () #'load (input-files o c)))
 
 (defmethod perform-with-restarts (operation component)
   (perform operation component))
@@ -3193,7 +3191,7 @@ effectively disabling the output translation facility."
   (when (and x (probe-file x))
     (delete-file x)))
 
-(defmethod compile-file* (input-file &rest keys &key output-file &allow-other-keys)
+(defun* compile-file* (input-file &rest keys &key output-file &allow-other-keys)
   (let* ((output-file (or output-file (apply 'compile-file-pathname* input-file keys)))
          (tmp-file (tmpize-pathname output-file))
          (status :error))
@@ -3217,18 +3215,6 @@ effectively disabling the output translation facility."
          (setf output-truename nil)))
       (values output-truename warnings-p failure-p))))
 
-#+(and ecl (not ecl-bytecmp))
-(defmethod compile-file* :around (input-file &rest keys &key output-file &allow-other-keys)
-  (declare (ignore output-file))
-  (multiple-value-bind (object-file flags1 flags2)
-      (apply #'call-next-method input-file :system-p t keys)
-    (values (and object-file
-                 (c::build-fasl (compile-file-pathname object-file :type :fasl)
-                                :lisp-files (list object-file))
-                           object-file)
-            flags1
-            flags2)))
-
 #+abcl
 (defun* translate-jar-pathname (source wildcard)
   (declare (ignore wildcard))
