-;;; Initialize the linkage-table. Called during initialization after
-;;; all shared libraries have been reopened.
-(defun linkage-table-reinit ()
- (/show0 "linkage-table-reinit")
- ;; No locking here, as this should be done just once per image initialization,
- ;; before any threads user are spawned.
- (maphash (lambda (name info)
- (let ((datap (linkage-info-datap info))
- (table-address (linkage-info-address info))
- (real-address (get-dynamic-foreign-symbol-address name)))
- (cond (real-address
- (write-linkage-table-entry table-address
- real-address
- datap))
- (t
- (/show0 "oops")
- (cerror "Ignore. Attempts to access this foreign symbol ~
- will lead to badness characterized by ~
- segfaults, and potential corruption."
- "Could not resolve foreign function ~S for ~
- linkage-table." name)))))
- *linkage-info*))
+;;; Update the linkage-table. Called during initialization after all
+;;; shared libraries have been reopened, and after a previously loaded
+;;; shared object is reloaded.
+;;;
+;;; FIXME: Should figure out how to write only those entries that need
+;;; updating.
+(defun update-linkage-table ()
+ (dohash ((name-and-datap info) *linkage-info* :locked t)
+ (let* ((name (car name-and-datap))
+ (datap (cdr name-and-datap))
+ (table-address (linkage-info-address info))
+ (real-address
+ (ensure-dynamic-foreign-symbol-address name datap)))
+ (aver (and table-address real-address))
+ (write-linkage-table-entry table-address
+ real-address
+ datap))))