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

Andrew Shalit alms at clozure.com
Tue Oct 14 12:08:16 PDT 2008


I've captured this useful description of macptrs in a blog posting:

http://ccl.clozure.com/blog/?p=15

Speaking of which, ccl now has a blog!  There isn't much in there yet,  
but we'll be remedying that in the coming weeks.

Andrew

On Oct 14, 2008, at 12:32 AM, Gary Byers wrote:

>
>
> 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.)
>
>
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel




More information about the Openmcl-devel mailing list