This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Question about codes in libgcc/crtstuff.c
- From: Ian Lance Taylor <iant at google dot com>
- To: Lei Wang <lei dot wang dot left at gmail dot com>
- Cc: GCC Development <gcc at gcc dot gnu dot org>
- Date: Fri, 4 Nov 2016 07:33:46 -0700
- Subject: Re: Question about codes in libgcc/crtstuff.c
- Authentication-results: sourceware.org; auth=none
- References: <04728ABB-D10C-4644-A7D0-FB308B45BEE6@gmail.com>
On Thu, Nov 3, 2016 at 7:20 PM, Lei Wang <lei.wang.left@gmail.com> wrote:
> The brief structure of libgcc/crtstuff.c is as follows:
>
> #ifdef CRT_BEGIN
> …
> #elif defined(CRT_END)
> ...
> # ifdef OBJECT_FORMAT_ELF
> …
> # else
>
> static void
> __do_global_ctors_aux (void) /* prologue goes in .text section */
> {
> asm (__LIBGCC_INIT_SECTION_ASM_OP__);
> DO_GLOBAL_CTORS_BODY;
> atexit (__do_global_dtors);
> } /* epilogue and body go in .init section */
>
> FORCE_CODE_SECTION_ALIGN
> asm (__LIBGCC_TEXT_SECTION_ASM_OP__);
>
> #endif // OBJECT_FORMAT_ELF
>
> #else // !CRT_BEGIN && !CRT_END
> …
> #endif
>
> The __do_global_ctors_aux function shown above is static and without “used” attribute which result in optimizing out when compiled with optimization. This currently causes my port failed.
> My understanding is that this function is supposed to be split into two parts: a prologue in .text section and the rest part in .init section. Meanwhile there is another symmetric function with the same name which is also split into two parts: an prologue in .init section and the rest part in .text section, which result in two identical copies of this function, one in .init section and the other in .text section.
> Or is there any other purpose of this code?
This code is all ridiculously complicated. It's also not used on
modern ELF systems, which use a .init_array section instead. Tell us
more about your port, and why you need to worry about this.
Ian