[patch] Implement __cxa_atexit

Jeff Johnston jjohnstn@redhat.com
Tue Sep 14 18:46:00 GMT 2004


Christopher Faylor wrote:
> On Thu, Sep 09, 2004 at 03:47:42PM -0400, Jeff Johnston wrote:
> 
>>Patch checked in with modifications to make it compile for _REENT_SMALL.
> 
> 
> It appears that this patch changes the size of the _reent structure,
> causing problems for cygwin when interacting with any programs which
> were linked with the previous structure.
> 
> Isn't changing the size of reent a bad idea, or, at least, isn't making
> changes to the middle of _reent a no-no?
> 
> cgf
>

In the past, I have avoided changes in the middle of REENT because the fact that 
the Makefile dependencies are not accurate means making such a change requires 
that the whole library be recompiled.  However, changing the structure at all 
should require such a rebuild anyway.  A potential problem exists when dealing 
with dynamic libraries such as Cygwin or x86-linux and older linked applications.

Correct me if I am wrong, but impure.o should live in the Cygwin dll as opposed 
to being linked statically with the user code.  If so, the cxa change should 
have no adverse effects to regular applications.  Applications that manually 
initialize their own reent structs would be broken but such applications will 
fail when just about any changes are made to the REENT struct (middle or end) so 
IMO, the long-term answer for this is to migrate them to use a new library 
interface which performs both allocation and initialization of a reent struct. 
For a typical C application, the only reent fields that cause a problem are 
those exposed via external header files: the std streams and signgam (correct me 
if I am missing any Cygwin-specific ones - remember that errno is accessed via 
function).  As long as the offsets to these few fields are preserved, the older 
applications should continue to work with changes to the reent struct since the 
library takes care of the allocation, initialization, and access to other 
fields.  In this particular change, the exposed field offsets are preserved. 
For applications that take advantage of reent internals, I would like to migrate 
them to new interfaces as needed to remove this dependency.  Have I missed anything?

-- Jeff J.

> 
>>-- Jeff J.
>>
>>Paul Brook wrote:
>>
>>>The attached patch implements __cxa_atexit and __cxa_finalize.
>>>
>>>As the name suggests these are used by C++ code to register static object 
>>>destructors. They are documented in section 3.3.5 of the C++ ABI 
>>>(http://www.codesourcery.com/cxx-abi/abi.html)
>>>
>>>Despite this they are generally provided by the C library, not the C++ 
>>>runtime library.
>>>
>>>I basically took the exitsing atexit/on_exit implementation, broke it out 
>>>into separate files, and added the extra _dso_handle field. I also 
>>>modified the _REENT_SMALL case to allow more than 32 handlers to be 
>>>registered.
>>>
>>>Tested with cross to arm-none-elf.
>>>Ok?
>>>
>>>Paul
>>>
>>>2004-09-03  Paul Brook  <paul@codesourcery.com>
>>>
>>>* libc/include/sys/reent.h (struct _on_exit_args): Add _dso_handle
>>>and _is_cxa.
>>>(struct _atexit): Add _next when _REENT_SMALL.
>>>(struct _reent): Add _atexit0 when _REENT_SMALL.
>>>(_REENT_INIT_PTR): Adjust.
>>>* libc/stdlib/Makefile.am (GENERAL_SOURCES): Add __atexit.c and
>>>__call_exit.c.
>>>(EXTENDED_SOURCES): Add cxa_atexit.c and cxa_finalize.c.
>>>* libc/stdlib/Makefile.in: Regenerate.
>>>* libc/stdlib/__atexit.c: New file.
>>>* libc/stdlib/__call_atexit.c: New file.
>>>* libc/stdlib/atexit.h: Remove old definitions.  Add new.
>>>* libc/stdlib/atexit.c (atexit): Use __register_exitproc.
>>>* libc/stdlib/cxa_atexit.c: New file.
>>>* libc/stdlib/cxa_finalize.c: New file.
>>>* libc/stdlib/exit.c (exit): Use __call_exitprocs.
>>>* libc/stdlib/on_exit.c (on_exit): Use __register_exitproc.
>>



More information about the Newlib mailing list