[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