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


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.



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