I want to have automated calls to initialize and deinitialize my shared library.
In my shared library, I need some static initialization of C++ objects, among others because of use of third party code (e.g. UnitTest++). When my init function is executed, I need to be guaranted, that all static initialization of C++ objects (of all linked translation units) is done (and vice versa for deinit); so just the same conditions as the execution of main() can expect in a C++ program.
I've seen much informations about linux shared library init/deinit e.g. like:
- Automatically executed functions when loading shared libraries
- How to initialize a shared library on Linux
- http://www.faqs.org/docs/Linux-HOWTO/Program-Library-HOWTO.html#INIT-AND-CLEANUP
__attribute__((constructor))
and even -Wl,-init,<function name>
) the init function seems to be called before static initialization of C++ objects is completely done.I also played around with __attribute__ ((init_priority(…)))
like:
class InitAndDeinit {
public:
InitAndDeinit() {
// Do some initialization
}
~InitAndDeinit() {
// Do some cleanup
}
} initAndDeinit __attribute__((init_priority(65535)));
But that also won't place the calls to the desired point; even with __attribute__((constructor(65535)))
.
I'd tested with gcc 4.6.4, 4.7.3 and 4.8.1 (4.6.4 shows a slightly different behaviour regarding the sorting of __attribute__((constructor))
).
Any suggestions?
My current workaround is to provide exported functions (lib_init() and lib_deinit()) which have to called manually by the application.