- (dolist (obj (reverse *shared-objects*))
- (dlclose (shared-object-sap obj))
- (setf (shared-object-sap obj) nil))
- (dlclose *runtime-dlhandle*)
- (setf *runtime-dlhandle* nil))
-
-(defun get-dynamic-foreign-symbol-address (symbol)
- (dlerror) ; clear old errors
- (let ((result (sap-int (dlsym *runtime-dlhandle* symbol)))
- (err (dlerror)))
- (if (or (not (zerop result)) (not err))
- result
- (dolist (obj *shared-objects*)
- (setf result (sap-int (dlsym (shared-object-sap obj) symbol))
- err (dlerror))
- (when (or (not (zerop result)) (not err))
- (return result))))))
+ (mapc #'dlclose-or-lose (reverse *shared-objects*))
+ (dlclose-or-lose))
+
+(let ((symbols ())
+ (undefineds ()))
+ (defun get-dynamic-foreign-symbol-address (symbol)
+ (dlerror) ; clear old errors
+ (unless *runtime-dlhandle*
+ (bug "Cannot resolve foreign symbol: lost *runtime-dlhandle*"))
+ (let* ((result (sap-int (dlsym *runtime-dlhandle* symbol)))
+ (err (dlerror))
+ (addr (if (or (not (zerop result)) (not err))
+ result
+ (dolist (obj *shared-objects*)
+ (let ((sap (shared-object-sap obj)))
+ (when sap
+ (setf result (sap-int (dlsym sap symbol))
+ err (dlerror))
+ (when (or (not (zerop result)) (not err))
+ (return result))))))))
+ (cond ((not addr)
+ (style-warn "Undefined alien: ~S" symbol)
+ (pushnew symbol undefineds :test #'equal)
+ (remove symbol symbols :test #'equal)
+ undefined-alien-address)
+ (addr
+ (pushnew symbol symbols :test #'equal)
+ (remove symbol undefineds :test #'equal)
+ addr))))
+ (defun dynamic-foreign-symbols ()
+ symbols)
+ (defun undefined-foreign-symbols ()
+ undefineds))