[Openmcl-cvs-notifications] r10048 - /trunk/source/level-0/l0-cfm-support.lisp

gb at clozure.com gb at clozure.com
Wed Jul 16 10:22:02 EDT 2008


Author: gb
Date: Wed Jul 16 10:22:02 2008
New Revision: 10048

Log:
Conditionalize for Solaris.

Use *rtld-default* instead of *rtld-next* in many places; they seem
to yield the same results on other ELF-based systems, but differ
slightly on Solaris.

Modified:
    trunk/source/level-0/l0-cfm-support.lisp

Modified: trunk/source/level-0/l0-cfm-support.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/level-0/l0-cfm-support.lisp (original)
+++ trunk/source/level-0/l0-cfm-support.lisp Wed Jul 16 10:22:02 2008
@@ -43,13 +43,20 @@
 (defun external-entry-point-p (x)
   (istruct-typep x 'external-entry-point))
 =

+;;; On both Linux and FreeBSD, RTLD_NEXT and RTLD_DEFAULT behave
+;;; the same way wrt symbols defined somewhere other than the lisp
+;;; kernel.  On Solaris, RTLD_DEFAULT will return the address of
+;;; an imported symbol's procedure linkage table entry if the symbol
+;;; has a plt entry (e.g., if it happens to be referenced by the
+;;; lisp kernel.)  *RTLD-NEXT* is therefore a slightly better
+;;; default; we've traditionaly used *RTLD-DEFAULT*.
 (defvar *rtld-next*)
 (defvar *rtld-default*)
 (setq *rtld-next* (%incf-ptr (%null-ptr) -1)
       *rtld-default* (%int-to-ptr #+(or linux-target darwin-target)  0
 				  #-(or linux-target darwin-target)  -2))
 =

-#+(or linux-target freebsd-target)
+#+(or linux-target freebsd-target solaris-target)
 (progn
 =

 (defvar *dladdr-entry*)
@@ -98,7 +105,7 @@
     =

 (defvar *shared-libraries* nil)
 =

-#+(or linux-target freebsd-target)
+#+(or linux-target freebsd-target solaris-target)
 (progn
 =

 (defun soname-ptr-from-link-map (map)
@@ -136,9 +143,9 @@
                                (let* ((disp (%get-signed-natural
                                              dynamic-entries
                                              target::node-size)))
-                                 #+freebsd-target
+                                 #+(or freebsd-target solaris-target)
                                  (%inc-ptr (pref map :link_map.l_addr) dis=
p)
-                                 #-freebsd-target
+                                 #-(or freebsd-target solaris-target)
                                  (%int-to-ptr =

                                   (if (< disp 0) =

                                     (+ disp (pref map :link_map.l_addr))
@@ -431,13 +438,13 @@
 =

 (defun ensure-open-shlib (c force)
   (if (or (shlib.map c) (not force))
-    *rtld-default*
+    *rtld-next*
     (error "Shared library not open: ~s" (shlib.soname c))))
 =

 (defun resolve-container (c force)
   (if c
     (ensure-open-shlib c force)
-    *rtld-default*
+    *rtld-next*
     ))
 =

 =

@@ -453,7 +460,7 @@
 ;;; function addresses on at least a 16-byte boundary, but some
 ;;; linkers don't quite get the concept ...)
 =

-(defun foreign-symbol-entry (name &optional (handle *rtld-default*))
+(defun foreign-symbol-entry (name &optional (handle *rtld-next*))
   "Try to resolve the address of the foreign symbol name. If successful,
 return a fixnum representation of that address, else return NIL."
   (with-cstrs ((n name))
@@ -475,7 +482,7 @@
 =

 (defvar *statically-linked* nil)
 =

-#+(or linux-target freebsd-target)
+#+(or linux-target freebsd-target solaris-target)
 (progn
 =

 (defun %library-base-containing-address (address)
@@ -580,7 +587,7 @@
 ;; end Darwin progn
 )
 =

-#-(or linux-target darwin-target freebsd-target)
+#-(or linux-target darwin-target freebsd-target solaris-target)
 (defun shlib-containing-entry (entry &optional name)
   (declare (ignore entry name))
   *rtld-default*)
@@ -602,7 +609,7 @@
 =

 =

 =

-(defun foreign-symbol-address (name &optional (map *rtld-default*))
+(defun foreign-symbol-address (name &optional (map *rtld-next*))
   "Try to resolve the address of the foreign symbol name. If successful,
 return that address encapsulated in a MACPTR, else returns NIL."
   (with-cstrs ((n name))
@@ -629,6 +636,8 @@
     (resolve-eep eep nil)
     eep))
 =

+
+
 (defun load-fv (name type)
   (let* ((fv (or (gethash name (fvs)) (setf (gethash name *fvs*) (%cons-fo=
reign-variable name type)))))
     (resolve-foreign-variable fv nil)
@@ -639,7 +648,7 @@
 =

 =

 =

-#+(or linux-target freebsd-target)
+#+(or linux-target freebsd-target solaris-target)
 (progn
 ;;; It's assumed that the set of libraries that the OS has open
 ;;; (accessible via the _dl_loaded global variable) is a subset of
@@ -727,7 +736,7 @@
   (setq *statically-linked* (not (eql 0 (%get-kernel-global 'statically-li=
nked))))
   (%revive-macptr *rtld-next*)
   (%revive-macptr *rtld-default*)
-  #+(or linux-target freebsd-target)
+  #+(or linux-target freebsd-target solaris-target)
   (unless *statically-linked*
     (setq *dladdr-entry* (foreign-symbol-entry "dladdr"))
     (revive-shared-libraries)



More information about the Openmcl-cvs-notifications mailing list