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
 | ||||||
|  | @ -27,10 +27,10 @@ int main(){ | ||||||
| #if 0 | #if 0 | ||||||
| // wrapped in a macro:
 | // wrapped in a macro:
 | ||||||
| 
 | 
 | ||||||
| #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) | ||||||
| 
 | 
 | ||||||
| BEFORE_MAIN(before_main_rule){ | BEFORE_MAIN(before_main_rule){ | ||||||
|  |  | ||||||
|  | @ -33,10 +33,10 @@ | ||||||
| 
 | 
 | ||||||
| # pragma section(".CRT$XCU", read) | # pragma section(".CRT$XCU", read) | ||||||
| 
 | 
 | ||||||
| # 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) | ||||||
| 
 | 
 | ||||||
| #elif OS_LINUX | #elif OS_LINUX | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue