OS/2 codes: How to writes initialization/termination codes with gcc
When programming, one of the most annoying things is to write initialization/termination codes. In case of DLL, OS/2 provides the opportunity for this by _DLL_InitTerm(). However, if it is a static library, OS/2 does not provide any ways for this. Instead, compilers provides its own ways for this.
Of course, gcc has its own ways. They are __attribute__((consturctor)) for intialization and __attribute__((destructor)) for termination. Here are the sample code.
If you run this program, you can see the following.
However, be careful when linking DLL with customized _DLL_InitTerm(). The default codes of _DLL_InitTerm() are like this,
By the way, sometimes __ctordotrInit() and __ctordotrTerm() are missed because C++ codes are not used. But without them, functions declared with __attribute__((constructor)) and __attribute__((destructor)) are not called. So if you write DLLs and use cutomized _DLL_InitTerm(), it would be a good habit to call __ctordtorInit() and __ctordtorTerm() regardless of using C++ codes.
Of course, gcc has its own ways. They are __attribute__((consturctor)) for intialization and __attribute__((destructor)) for termination. Here are the sample code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> __attribute__((constructor)) static void before( void ) { printf("constructor : before()\n"); } __attribute__((destructor)) static void after( void ) { printf("destructor : after()\n"); } int main( void ) { printf("main()\n"); return 0; } |
If you run this program, you can see the following.
1 2 3 | constructor : before() main() destructor : after() |
However, be careful when linking DLL with customized _DLL_InitTerm(). The default codes of _DLL_InitTerm() are like this,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | unsigned long _System _DLL_InitTerm( unsigned long hmod, unsigned long flags ) { switch( flags ) { case 0 : if( _CRT_init() == -1 ) return 0; __ctordtorInit(); break; case 1 : __ctordtorTerm(); _CRT_term(); break; default : return 0; } return 1; } |
By the way, sometimes __ctordotrInit() and __ctordotrTerm() are missed because C++ codes are not used. But without them, functions declared with __attribute__((constructor)) and __attribute__((destructor)) are not called. So if you write DLLs and use cutomized _DLL_InitTerm(), it would be a good habit to call __ctordtorInit() and __ctordtorTerm() regardless of using C++ codes.
댓글
댓글 쓰기