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