History

Add windows constructor/destructor support

herman ten brugge committed 6 years ago

Commit df72b8d1 parent 4e9ce595 files · +63 −10Browse files

Unified · Split

5 files
  1. tccelf.c +1 −3
  2. tests/tests2/Makefile +0 −1
  3. win32/lib/crt1.c +23 −2
  4. win32/lib/dllcrt1.c +22 −3
  5. win32/lib/wincrt1.c +17 −1
tccelf.c+1−3
@@ -1256,7 +1256,6 @@ static void put_dt(Section *dynamic, int dt, addr_t val) · 1255 unmodified lines
12561256 dyn->d_un.d_val = val;
12571257 }
12581258
1259−#ifndef TCC_TARGET_PE
12601259 static void add_init_array_defines(TCCState *s1, const char *section_name)
12611260 {
12621261 Section *s;
@@ -1285,6 +1284,7 @@ static void add_init_array_defines(TCCState *s1, const char *section_name) · 22 unmodified lines
12851284 s->sh_num, sym_end);
12861285 }
12871286
1287+#ifndef TCC_TARGET_PE
12881288 static int tcc_add_support(TCCState *s1, const char *filename)
12891289 {
12901290 char buf[1024];
@@ -1402,12 +1402,10 @@ static void tcc_add_linker_symbols(TCCState *s1) · 111 unmodified lines
14021402 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
14031403 data_section->sh_num, "__global_pointer$");
14041404 #endif
1405−#ifndef TCC_TARGET_PE
14061405 /* horrible new standard ldscript defines */
14071406 add_init_array_defines(s1, ".preinit_array");
14081407 add_init_array_defines(s1, ".init_array");
14091408 add_init_array_defines(s1, ".fini_array");
1410−#endif
14111409
14121410 /* add start and stop symbols for sections whose name can be
14131411 expressed in C */
tests/tests2/Makefile+0−1
@@ -33,7 +33,6 @@ ifeq (-$(CONFIG_WIN32)-$(CONFIG_i386)$(CONFIG_arm)-,--yes-) · 32 unmodified lines
3333 endif
3434 ifneq (-$(CONFIG_WIN32)$(CONFIG_WIN64)-,--)
3535 SKIP += 106_pthread.test # No pthread support
36− SKIP += 108_constructor.test # No contructor/destructor support
3736 endif
3837
3938 # Some tests might need arguments
win32/lib/crt1.c+23−2
@@ -34,6 +34,27 @@ int __cdecl __tgetmainargs(int *pargc, _TCHAR ***pargv, _TCHAR ***penv, int glob · 33 unmodified lines
3434 void __cdecl __set_app_type(int apptype);
3535 unsigned int __cdecl _controlfp(unsigned int new_value, unsigned int mask);
3636 extern int _tmain(int argc, _TCHAR * argv[], _TCHAR * env[]);
37+extern void (*__init_array_start[]) (void);
38+extern void (*__init_array_end[]) (void);
39+extern void (*__fini_array_start[]) (void);
40+extern void (*__fini_array_end[]) (void);
41+
42+static int do_main (int argc, _TCHAR * argv[], _TCHAR * env[])
43+{
44+ int retval;
45+ long i;
46+
47+ i = 0;
48+ while (&__init_array_start[i] != __init_array_end) {
49+ (*__init_array_start[i++])();
50+ }
51+ retval = _tmain(__argc, __targv, _tenviron);
52+ i = 0;
53+ while (&__fini_array_end[i] != __fini_array_start) {
54+ (*__fini_array_end[--i])();
55+ }
56+ return retval;
57+}
3758
3859 /* Allow command-line globbing with "int _dowildcard = 1;" in the user source */
3960 int _dowildcard;
@@ -57,7 +78,7 @@ void _tstart(void) · 17 unmodified lines
5778 #endif
5879
5980 __tgetmainargs( &__argc, &__targv, &_tenviron, _dowildcard, &start_info);
60− exit(_tmain(__argc, __targv, _tenviron));
81+ exit(do_main(__argc, __targv, _tenviron));
6182 }
6283
6384 int _runtmain(int argc, /* as tcc passed in */ char **argv)
@@ -78,7 +99,7 @@ int _runtmain(int argc, /* as tcc passed in */ char **argv) · 14 unmodified lines
7899 #if defined __i386__ || defined __x86_64__
79100 _controlfp(_PC_53, _MCW_PC);
80101 #endif
81− return _tmain(__argc, __targv, _tenviron);
102+ return do_main(__argc, __targv, _tenviron);
82103 }
83104
84105 // =============================================
win32/lib/dllcrt1.c+22−3
@@ -2,12 +2,31 @@ · 1 unmodified line
22
33 #include <windows.h>
44
5+extern void (*__init_array_start[]) (void);
6+extern void (*__init_array_end[]) (void);
7+extern void (*__fini_array_start[]) (void);
8+extern void (*__fini_array_end[]) (void);
9+
510 BOOL WINAPI DllMain (HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved);
611
712 BOOL WINAPI _dllstart(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
813 {
9− BOOL bRet;
10− bRet = DllMain (hDll, dwReason, lpReserved);
11− return bRet;
14+ BOOL bRet;
15+ int i;
16+
17+ if (dwReason == DLL_PROCESS_ATTACH) { /* ignore DLL_THREAD_ATTACH */
18+ i = 0;
19+ while (&__init_array_start[i] != __init_array_end) {
20+ (*__init_array_start[i++])();
21+ }
22+ }
23+ if (dwReason == DLL_PROCESS_DETACH) { /* ignore DLL_THREAD_DETACH */
24+ i = 0;
25+ while (&__fini_array_end[i] != __fini_array_start) {
26+ (*__fini_array_end[--i])();
27+ }
28+ }
29+ bRet = DllMain (hDll, dwReason, lpReserved);
30+ return bRet;
1231 }
1332
win32/lib/wincrt1.c+17−1
@@ -23,6 +23,11 @@ int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int); · 22 unmodified lines
2323 #define _runtwinmain _runwinmain
2424 #endif
2525
26+extern void (*__init_array_start[]) (void);
27+extern void (*__init_array_end[]) (void);
28+extern void (*__fini_array_start[]) (void);
29+extern void (*__fini_array_end[]) (void);
30+
2631 typedef struct { int newmode; } _startupinfo;
2732 int __cdecl __tgetmainargs(int *pargc, _TCHAR ***pargv, _TCHAR ***penv, int globb, _startupinfo*);
2833
@@ -31,6 +36,8 @@ static int go_winmain(TCHAR *arg1) · 2 unmodified lines
3136 STARTUPINFO si;
3237 _TCHAR *szCmd, *p;
3338 int fShow;
39+ int retval;
40+ int i;
3441
3542 GetStartupInfo(&si);
3643 if (si.dwFlags & STARTF_USESHOWWINDOW)
@@ -48,7 +55,16 @@ static int go_winmain(TCHAR *arg1) · 11 unmodified lines
4855 #if defined __i386__ || defined __x86_64__
4956 _controlfp(0x10000, 0x30000);
5057 #endif
51− return _tWinMain(GetModuleHandle(NULL), NULL, szCmd, fShow);
58+ i = 0;
59+ while (&__init_array_start[i] != __init_array_end) {
60+ (*__init_array_start[i++])();
61+ }
62+ retval = _tWinMain(GetModuleHandle(NULL), NULL, szCmd, fShow);
63+ i = 0;
64+ while (&__fini_array_end[i] != __fini_array_start) {
65+ (*__fini_array_end[--i])();
66+ }
67+ return retval;
5268 }
5369
5470 static LONG WINAPI catch_sig(EXCEPTION_POINTERS *ex)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t