X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Fforeign-load.lisp;h=95a9ecf93532b84f2a936a7713dc0ba7edf298db;hb=69ef68ba7393e3492c1b4a756d1140f71c2922bc;hp=d8723f2c67884d9e915127587ffce568c0bc106a;hpb=5e1fcdac979db9a6aebe69531229355def8c0f90;p=sbcl.git diff --git a/src/code/foreign-load.lisp b/src/code/foreign-load.lisp index d8723f2..95a9ecf 100644 --- a/src/code/foreign-load.lisp +++ b/src/code/foreign-load.lisp @@ -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)