Below C code demonstrates how to define a void(void) function to be called at program/library load time, before main executes.
For MSVC, this places a pointer to the function in the user initializer section (.CRT$XCU), basically the same thing the compiler does for the constructor calls for static C++ objects. For GCC, uses a constructor attribute.
// Initializer/finalizer sample for MSVC and GCC/Clang.
// 2010-2016 Joe Lowe. Released into the public domain.
#include <stdio.h>
#include <stdlib.h>
#ifdef __cplusplus
#define INITIALIZER(f)
static void f(void);
struct f##_t_ { f##_t_(void) { f(); } }; static f##_t_ f##_;
static void f(void)
#elif defined(_MSC_VER)
#pragma section(".CRT$XCU",read)
#define INITIALIZER2_(f,p)
static void f(void);
__declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f;
__pragma(comment(linker,"/include:" p #f "_"))
static void f(void)
#ifdef _WIN64
#define INITIALIZER(f) INITIALIZER2_(f,"")
#else
#define INITIALIZER(f) INITIALIZER2_(f,"_")
#endif
#else
#define INITIALIZER(f)
static void f(void) __attribute__((constructor));
static void f(void)
#endif
static void finalize(void)
{
printf( "finalize
");
}
INITIALIZER( initialize)
{
printf( "initialize
");
atexit( finalize);
}
int main( int argc, char** argv)
{
printf( "main
");
return 0;
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…