win32_before_main update to holding the symbol with linker include option replacing dllexport
parent
0b6adfde1e
commit
9ddc06fc0a
|
@ -23,8 +23,11 @@ anything.
|
||||||
|
|
||||||
However, in this example I show how we can still make it work. We have to
|
However, in this example I show how we can still make it work. We have to
|
||||||
make sure the linker won't eliminate the global variable that we are trying to
|
make sure the linker won't eliminate the global variable that we are trying to
|
||||||
place into the ".CRT$XCU" section. I achieve this by marking it as an export
|
place into the ".CRT$XCU" section. We can tell the linker to keep a symbol with
|
||||||
symbol. Export symbols can't be eliminated even if they aren't used locally.
|
/include:<symbol-name> and we can add this command to the linker via a pragma
|
||||||
|
comment:
|
||||||
|
|
||||||
|
__pragma(comment(linker,"/include:<symbol-name>"))
|
||||||
|
|
||||||
From what I've seen in testing, this works as desired, even with the /GL option.
|
From what I've seen in testing, this works as desired, even with the /GL option.
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ static void run_before_main_func(void);
|
||||||
|
|
||||||
// set the before-main execution function pointer
|
// set the before-main execution function pointer
|
||||||
__declspec(allocate(".CRT$XCU"))
|
__declspec(allocate(".CRT$XCU"))
|
||||||
__declspec(dllexport)
|
__pragma(comment(linker,"/include:run_before_main_ptr"))
|
||||||
void (*run_before_main_ptr)(void) = run_before_main_func;
|
void (*run_before_main_ptr)(void) = run_before_main_func;
|
||||||
|
|
||||||
// define the "before main" function
|
// define the "before main" function
|
||||||
|
@ -29,7 +29,7 @@ int main(){
|
||||||
|
|
||||||
#define BEFORE_MAIN(n) static void n(void); \
|
#define BEFORE_MAIN(n) static void n(void); \
|
||||||
__declspec(allocate(".CRT$XCU")) \
|
__declspec(allocate(".CRT$XCU")) \
|
||||||
__declspec(dllexport) \
|
__pragma(comment(linker,"/include:" #n "__")) \
|
||||||
void (*n##__)(void) = n; \
|
void (*n##__)(void) = n; \
|
||||||
static void n(void)
|
static void n(void)
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
#define BEFORE_MAIN(n) static void n(void); \
|
#define BEFORE_MAIN(n) static void n(void); \
|
||||||
__declspec(allocate(".CRT$XCU")) \
|
__declspec(allocate(".CRT$XCU")) \
|
||||||
__declspec(dllexport) \
|
__pragma(comment(linker,"/include:" #n "__")) \
|
||||||
void (*n##__)(void) = n; \
|
void (*n##__)(void) = n; \
|
||||||
static void n(void)
|
static void n(void)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue