This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC 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: crt{begin,end}.o and __do_global_{c,d}tors_aux


Alan Modra wrote:
Can someone tell me why on ELF system, crtbegin.o defines
__do_global_dtors_aux and crtend.o defines __do_global_ctors_aux, and
not the other way around?  Is it just so that the calls from _fini and
_init respectively are to static functions?

There are some comments in crtstuff.c that explains some of this stuff. crtstuff.c is the file from which all crtbegin/crtend files are derived.


ctors and dtors have to be run in opposite orders. ctors are run from the end (CTOR_END). dtors are run from the beginning (DTOR_LIST). CTOR_END is defined in crtend, so do_global_ctors_aux is put in crtend.
Similarly, DTOR_LIST is defined in crtbegin, so do_global_dtors_aux is put in crtbegin. This makes sure that there is no confusion about which CTOR_END/DTOR_LIST symbol is being used by these functions. This is per my reading of the comments. I'm not saying that things should work this way, that just seems to be the reason for it according to the comments.


The reason I'm asking is that this arrangement means that the calls go
from one end of the app to the other, which isn't ideal for targets
having limited branch range.

Yes, that is annoying. For IA-64, the first branches out of range are always the ones in crtbegin/crtend.


Jim




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