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:
__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.
Here's one possible solution.
Static objects in a TU are initialized in their order of definition. Append a definition of a static object of a special type T to the end of each source file. The constructor of T should increment a static zero-initialized member. As soon as the counter reaches the number of source files in the module (determined by a build script), call your lib_init().
lib_deinit() is called after the counter is decremented back to zero.
Each library should have its own T.
You should be able to modify your makefile such that you don't have to physically alter source files. For instance, instead of g++ -c foo.C use g++ -c myspecialstaticinitcode.C -o foo.C -include foo.C or something like that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With