This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
Re: [patch] Implement __cxa_atexit
- From: jjohnstn <jjohnstn at redhat dot com>
- To: Christopher Faylor <me at cgf dot cx>
- Cc: Paul Brook <paul at codesourcery dot com>, <newlib at sources dot redhat dot com>
- Date: Tue, 14 Sep 2004 14:46:57 -0400 (EDT)
- Subject: Re: [patch] Implement __cxa_atexit
On Mon, 13 Sep 2004, Jeff Johnston wrote:
> 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?
>
Apparently there is some hidden dependency in Cygwin on the _reent struct
as old applications are no longer working with this change. This is
unfortunate. Until someone from Cygwin can determine what the problem is
I have chosen to freeze sys/reent.h for Cygwin by putting it in the
libc/sys/cygwin/sys directory. The new changes have been modified to look
for a new flag __REENT_HAS_CXA_SUPPORT to enable the new cxa support. The
default libc/include/sys/reent.h has the flag turned on.
I have done x86-linux and i686-pc-cygwin builds of the new code. If
someone on the Cygwin side wants to work with me to determine what the
actual dependencies are , I am more than willing to try and find a
solution that allows Cygwin to get improvements such as the cxa exit code
and not jeopardize older linked applications.
I did not protect the _REENT_SMALL changes made by Paul as this path
should not be exercised by Cygwin.
-- Jeff J.
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.
> >>
>
>