This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.
> >>
> 
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]