On Thu, Nov 3, 2016 at 7:20 PM, Lei Wang <lei.wang.l...@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

Reply via email to