From: Nikodemus S. <tsi...@cc...> - 2003-11-18 07:52:28
|
Some time ago I reported a problem with accessing alien variables that are visible in the runtime after foreign libraries have been loaded. http://www.caddr.com/macho/archives/sbcl-devel/2003-8/2504.html I subsequently suggested a fix, using either the runtime dl-handle or RTLD_DEFAULT to resolve all symbols. I have been given to understand that this may not work on FreeBSD, however. What follows is a minimal patch that both adds a test for this behaviour, and fixes the issue by searching the dlhandles in reverse order (the same order the system would when accessing via RTLD_DEFAULT or global dlhandle). Cheers, -- Nikodemus Index: src/code/foreign.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/foreign.lisp,v retrieving revision 1.18 diff -u -r1.18 foreign.lisp --- src/code/foreign.lisp 29 Jul 2003 13:01:55 -0000 1.18 +++ src/code/foreign.lisp 18 Nov 2003 07:46:44 -0000 @@ -176,7 +176,7 @@ ;; that the list isn't guaranteed to be in reverse order of loading, ;; at least not if a file is loaded more than once. Is this the ;; right thing? (In what cases does it matter?) - (dolist (handle *handles-from-dlopen*) + (dolist (handle (reverse *handles-from-dlopen*)) ;; KLUDGE: We implicitly exclude the possibility that the variable ;; could actually be NULL, but the man page for dlsym(3) ;; recommends doing a more careful test. -- WHN 20000825 Index: tests/foreign.test.sh =================================================================== RCS file: /cvsroot/sbcl/sbcl/tests/foreign.test.sh,v retrieving revision 1.10 diff -u -r1.10 foreign.test.sh --- tests/foreign.test.sh 8 May 2002 19:57:24 -0000 1.10 +++ tests/foreign.test.sh 18 Nov 2003 07:46:45 -0000 @@ -24,6 +24,8 @@ # Test interaction with the shared object file. ${SBCL:-sbcl} <<EOF + (define-alien-variable environ (* c-string)) + (defvar *environ* environ) (handler-case (load-foreign '("$testfilestem.so")) (sb-int:unsupported-operator () @@ -31,6 +33,10 @@ ;; on every OS. In that case, there's nothing to test, and we ;; can just fall through to success. (sb-ext:quit :unix-status 52))) ; success convention for Lisp program + ;; Test that loading an object file didn't screw up our sense out + ;; of variables visible in runtime. + (assert (= (sb-sys:sap-int (alien-sap *environ*)) + (sb-sys:sap-int (alien-sap environ)))) (define-alien-routine summish int (x int) (y int)) (assert (= (summish 10 20) 31)) (sb-ext:quit :unix-status 52) ; success convention for Lisp program |