-
-(defun load-dso (filename)
- #+sbcl(sb-alien:load-shared-object filename)
- #+cmu(system::load-object-file filename))
-
-
-(defmethod perform ((o load-op) (c unix-dso))
+#+clisp
+(defvar *loaded-libraries* ())
+
+(defun load-shared-object (pathname &optional (absolute-p t))
+ (let* ((namestring (ensure-namestring pathname))
+ (directory (namestring (pathname-sans-name+type namestring)))
+ (name+type (subseq namestring (length directory))))
+ #+sbcl
+ (progn
+ (sb-alien:load-shared-object namestring)
+ (unless absolute-p
+ (let ((shared-object (find namestring sb-alien::*shared-objects*
+ :key #'sb-alien::shared-object-file
+ :test #'equal)))
+ (setf (sb-alien::shared-object-file shared-object) name+type))))
+ #+cmu
+ (progn
+ (ext:load-foreign namestring)
+ (unless absolute-p
+ (let ((shared-object (rassoc namestring system::*global-table*
+ :test #'equal)))
+ (setf (cdr shared-object) name+type))))
+ #+clisp
+ (progn
+ #?-(pkg-config:clisp>= 2 45)
+ (ffi::foreign-library namestring)
+ #?(pkg-config:clisp>= 2 45)
+ (ffi:open-foreign-library namestring)
+ (pushnew
+ (if absolute-p namestring name+type)
+ *loaded-libraries* :test #'string=))))
+
+
+(defmethod perform ((o load-op) (dso shared-object))