[Openmcl-devel] Elf symbols doesn't work on linuxx86-64.

Gary Byers gb at clozure.com
Tue Oct 14 04:32:44 UTC 2008



On Mon, 13 Oct 2008, David Brown wrote:

> On Mon, Oct 13, 2008 at 05:40:31AM -0600, Gary Byers wrote:
>
>> There seem to be a few different packages which provide incompatible
>> versions of libelf.  On a Fedora 9 system, I have
>
> That does seem to be the problem.  On gentoo, it looks like I need
> 'elfutils', instead of 'libelf'.  Only one of the packages can be
> compiled.
>
> Of course, that brings me to my Dead Mac Pointer bug when I try using
> saved images.  But, the elf thing seems to be working now.
>
> David
>
>

If you've described this (dead pointer) problem, I haven't seen the
message.  I don't think that this is documented (well) anywhere; sorry
if I'm repeating something that's in the manual.  (Actually, the manual
seems to mention the issue but doesn't say what to do about it.)

In general, a pointer (to some foreign address) is only meaningful
within a session; SAVE-APPLICATION walks memory, changing the type of
any non-NULL pointers it finds to DEAD-MACPTR.  Most operations on
pointers do typechecking, so attempting to access something leftover
from the previous session gets a type error (rather than acessing a foreign
address that's leftover from the previous session.)  The exception for
NULL pointers is somewhat arbitrary; it'd be just as reasonable to decide
that something pointing to a "small" address (for some value of "small")
isn't really a pointer "to" anything.

So:

(defvar *some-foreign-pointer* (#_malloc 1000))

(defun read-into-foreign-pointer (fd)
   (#_read fd *some-foreign-pointer* 1000))

(save-application "new-image")

...

;;; run the new image

...

(read-into-foreign-pointer some-fd)

will signal a TYPE-ERROR (because SAVE-APPLICATION has marked the value
of *some-foreign-pointer* as being dead.)

In a very simple case like this (where the pointer's only accessible
via a special variable), it's possible to use CCL:DEFLOADVAR:

(ccl:defloadvar *some-foreign-pointer* (#_malloc 1000))

That'll behave like DEFSTATIC (which -is- documented ...), but will
additionally push (a compiled version of) the initform on a list
of pointer-reinitialization functions that's run when an image
starts up.  Entries on this list are run in the order in which they're
defined, so:

(ccl:defloadvar *a* (something))

(ccl:defloadvar *b* (something-that-depends-on *a*))

will do the (re)initialization in the same order that the initialization
is done.

That's often adequate.  There are some other mechanisms (it's possible
to destructively change a DEAD-MACPTR back into a MACPTR in cases where
EQness matters, and it's possible to run arbitrary code at image startup
time.)





More information about the Openmcl-devel mailing list