0.8.21.50:
[sbcl.git] / src / code / foreign-load.lisp
index d8723f2..95a9ecf 100644 (file)
@@ -75,7 +75,7 @@
            (setf dlerror (dlerror)
                  (shared-object-sap obj) nil)))
     (when dlerror
-      (cerror dlerror))))
+      (cerror "Ignore the error and continue anyway" "dlerror returned an error: ~S" dlerror))))
 
 (defun load-shared-object (file)
   "Load a shared library/dynamic shared object file/general dlopenable
@@ -141,18 +141,21 @@ SB-EXT:SAVE-LISP-AND-DIE for details."
 
 (let ((symbols ())
       (undefineds ()))
-  (defun get-dynamic-foreign-symbol-address (symbol)
+  (defun get-dynamic-foreign-symbol-address (symbol &optional datap)
     (dlerror)                          ; clear old errors
     (unless *runtime-dlhandle*
       (bug "Cannot resolve foreign symbol: lost *runtime-dlhandle*"))
-    (let* ((result (sap-int (dlsym *runtime-dlhandle* symbol)))
+    ;; On real ELF & dlsym platforms the EXTERN-ALIEN-NAME is a no-op,
+    ;; but on platforms where dlsym is simulated we use the mangled name.
+    (let* ((extern (extern-alien-name symbol))
+          (result (sap-int (dlsym *runtime-dlhandle* extern)))
            (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))
+                           (setf result (sap-int (dlsym sap extern))
                                  err (dlerror))
                            (when (or (not (zerop result)) (not err))
                              (return result))))))))
@@ -160,7 +163,10 @@ SB-EXT:SAVE-LISP-AND-DIE for details."
               (style-warn "Undefined alien: ~S" symbol)
               (pushnew symbol undefineds :test #'equal)
               (remove symbol symbols :test #'equal)
-              undefined-alien-address)
+             (if datap
+                 undefined-alien-address
+                 (foreign-symbol-address-as-integer 
+                  "undefined_alien_function")))
              (addr
               (pushnew symbol symbols :test #'equal)
               (remove symbol undefineds :test #'equal)