From: longchuan <lon...@ko...> - 2002-06-28 14:08:28
|
Hello : Anyone tell some thing about __CTOR_LIST__,__CTOR_END__,__DTOR_END__,__DTOR_END__? Seems that I need to use those function pointers to perform static variables' initialization in __main. But I am not sure how they work with compiler . I copy a piece of code from gcc source libgcc.c to my lib source : typedef void(*func_ptr)(void); func_ptr __CTOR_END__[1] __attribute__((section(".ctors"), aligned(sizeof(func_ptr)))) = { (func_ptr) 0 }; void __attribute__((used)) __do_global_ctors_aux (void){ func_ptr *p; for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--) (*p) (); } void __main() { static int initialized; if (! initialized){ initialized = 1; // __do_global_ctors (); __do_global_ctors_aux(); } } In my debugger ,I found __CTOR_END__ - 1 points to value 0xff , so __do_global_ctors_aux() did nothing . The map file shows: *(.glue_7) 0x004080d4 ___CTOR_LIST__ = . 0x004080d4 __CTOR_LIST__ = . 0x004080d4 0x4 LONG 0xffffffff *(SORT(.ctors.*)) *(.ctors) .ctors 0x004080d8 0x4 D:\obj\_gnu_ix86.dbg\lib\libc.lib(libgcc.o) 0x004080d8 __CTOR_END__ Seems that initialization list is empty but address 0x004080dc point to a wrapped __static_initialization_and_destruction__ call which seems like what I want . What should I do ? I wonder how the compiler considers the four variables , how it assigns static variables' constructors or destructor to the 4 points . Could anyone tell me or show me some documents or codes about that . I am working on win2k ,mingw gcc3.1 ,target is ix86. TIA . |
From: Stephen M. W. <ste...@cr...> - 2002-06-28 15:42:45
|
On June 28, 2002 10:05 am, longchuan wrote: > Hello : > Anyone tell some thing about > __CTOR_LIST__,__CTOR_END__,__DTOR_END__,__DTOR_END__? > Seems that I need to use those function pointers to > perform static variables' initialization in __main. But I am not > sure how they work with compiler . I copy a piece of code from gcc > source libgcc.c to my lib source : Those symbols are a part of the C++ runtime. The only time you should need to concern yourself about them is if you're hacking the C++ compiler or runtime yourself. You might want to start with a simpler portion of the compiler if that's your interest. The static variable construction takes place before main() is called, and the compiler takes care of calling your statioc constructors and destructors. You don't need to call them directly. An example might be as follows. #include <iostream> class StaticClass { public: StaticClass() { std::cout << "StaticClass constructor\n"; } ~StaticClass() { std::cout << "StaticClass destructor\n"; } }; StaticClass staticObject; int main(int argc, char* argv[]) { std::coutr << "main()\n"; } Build this using the g++ command so the C++ runtime is linked in ("g++ -o demo.exe demo.cpp"), run it, and the console output should be as follows. StaticClass constructor main() StaticClass destructor > I wonder how the compiler considers the four variables, how it assigns > static variables' constructors or destructor to the 4 points . Could > anyone tell me or show me some documents or codes about that . > I am working on win2k ,mingw gcc3.1 ,target is ix86. To understand how the compiler knows to do this you'll have to study all the gcc sources as well as the C++ library sources. I would recommend at this point you simply trust it to do the right thing. -- Stephen M. Webb |
From: longchuan <lon...@ko...> - 2002-06-29 04:15:33
|
I think I didn't make my self clear. I am not working under gnu environment , that is , I don't use gnu c++ runtime , just using the gcc compiler , I need to construct my own run time library, like crt0, so I think I have to care about static variables initialization. Any ideas? -----Original Message----- From: Stephen M. Webb [mailto:ste...@cr...]=20 Sent: =D0=C7=C6=DA=CE=E5 2002 06 28 23:52 To: longchuan; min...@li... Subject: Re: [Mingw-users] about __CTOR_LIST__,__CTOR_END__,__DTOR_END__,__DTOR_END__ Those symbols are a part of the C++ runtime. The only time you should=20 need to concern yourself about them is if you're hacking the C++=20 compiler or runtime yourself. You might want to start with a simpler=20 portion of the compiler if that's your interest. The static variable construction takes place before main() is called,=20 and the compiler takes care of calling your statioc constructors and=20 destructors. You don't need to call them directly. |
From: Stephen M. W. <ste...@cr...> - 2002-07-02 12:51:28
|
On June 29, 2002 12:10 am, longchuan wrote: > I think I didn't make my self clear. I am not working under gnu > environment , that is , I don't use gnu c++ runtime , just using the > gcc compiler , I need to construct my own run time library, like > crt0, so I think I have to care about static variables > initialization. Any ideas? If you aren't using C++, you don't need to worry about running global constructors and destructors outside of main(). C static variables don't have constructors or destructors, and they're initialized when loaded from their BSS segment. You can just ignore the whole issue. If you're using C++, you're using the C++ runtime. The runime is intimately entwined with the compiler, and to replace a part of it you need to understand the compiler in detail, both the C++ front end and the middle end, and the entire C++ runtime since it's all interrelated. It includes global constructors and destructors as well as RTTI and exception mechanisms and things like vtable implementations and virtual function dispatch. If you're targeting a non-hosted environment like an embedded application, you're better off going with a cross compiler built with the newlib runtime from GCC rather than rolling your own. If you're targeting Windows, the MinGW environment takes care of everything for you, no need to go the extra mile. -- Stephen M. Webb |