Question about codes in libgcc/crtstuff.c
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? Lei
Fwd: Question about codes in libgcc/crtstuff.c
In fact, I just want to find a practical way to make the crt work. Currently, I did the following configure in my port: include "elfos.h" in tm.h define HAS_INIT_SECTION undefine OBJECT_FORMAT_ELF define INVOKE__main use default INIT_SECTION_OP My port is working on a bare metal machine with newlib support. Seems I fall into an spurious configure for compiling crtstuff.c. Could you give me some guide to lead me back to common configuration of this? Thanks. Lei 2016-11-04 10:33 GMT-04:00 Ian Lance Taylor : > On Thu, Nov 3, 2016 at 7:20 PM, Lei Wang 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
Re: Question about codes in libgcc/crtstuff.c
Thanks. One more question, my current entry point of the program is main, after which there is a call to __main to do the constructor stuffs and register destructors. Without INVOKE__main, which point should I define as the entry? Lei 2016-11-04 11:06 GMT-04:00 Ian Lance Taylor : > On Fri, Nov 4, 2016 at 7:55 AM, lei wang wrote: >> >> In fact, I just want to find a practical way to make the crt work. >> Currently, I did the following configure in my port: >> >> include "elfos.h" in tm.h >> define HAS_INIT_SECTION >> undefine OBJECT_FORMAT_ELF >> define INVOKE__main >> use default INIT_SECTION_OP >> >> My port is working on a bare metal machine with newlib support. Seems >> I fall into an spurious configure for compiling crtstuff.c. Could you >> give me some guide to lead me back to common configuration of this? > > If you are using ELF, arrange for your startup code to execute the > functions in the .init_array section. If necessary, modify your > linker script to define symbols around .init_array that your startup > code can use to find the section. Pass --enable-initfini-array when > you run configure. Don't define INVOKE__main. Don't worry about > HAS_INIT_SECTION or OBJECT_FORMAT_ELF or INIT_SECTION_OP. > > Ian