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
1256 dyn->d_un.d_val = val;1256 dyn->d_un.d_val = val;
1257}1257}
1258 1258
1259#ifndef TCC_TARGET_PE
1260static void add_init_array_defines(TCCState *s1, const char *section_name)1259static void add_init_array_defines(TCCState *s1, const char *section_name)
1261{1260{
1262 Section *s;1261 Section *s;
@@ -1285,6 +1284,7 @@ static void add_init_array_defines(TCCState *s1, const char *section_name) · 22 unmodified lines
1285 s->sh_num, sym_end);1284 s->sh_num, sym_end);
1286}1285}
1287 1286
1287#ifndef TCC_TARGET_PE
1288static int tcc_add_support(TCCState *s1, const char *filename)1288static int tcc_add_support(TCCState *s1, const char *filename)
1289{1289{
1290 char buf[1024];1290 char buf[1024];
@@ -1402,12 +1402,10 @@ static void tcc_add_linker_symbols(TCCState *s1) · 111 unmodified lines
1402 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,1402 ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
1403 data_section->sh_num, "__global_pointer$");1403 data_section->sh_num, "__global_pointer$");
1404#endif1404#endif
1405#ifndef TCC_TARGET_PE
1406 /* horrible new standard ldscript defines */1405 /* horrible new standard ldscript defines */
1407 add_init_array_defines(s1, ".preinit_array");1406 add_init_array_defines(s1, ".preinit_array");
1408 add_init_array_defines(s1, ".init_array");1407 add_init_array_defines(s1, ".init_array");
1409 add_init_array_defines(s1, ".fini_array");1408 add_init_array_defines(s1, ".fini_array");
1410#endif
1411 1409
1412 /* add start and stop symbols for sections whose name can be1410 /* add start and stop symbols for sections whose name can be
1413 expressed in C */1411 expressed in C */
tests/tests2/Makefile+0−1
@@ -33,7 +33,6 @@ ifeq (-$(CONFIG_WIN32)-$(CONFIG_i386)$(CONFIG_arm)-,--yes-) · 32 unmodified lines
33endif33endif
34ifneq (-$(CONFIG_WIN32)$(CONFIG_WIN64)-,--)34ifneq (-$(CONFIG_WIN32)$(CONFIG_WIN64)-,--)
35 SKIP += 106_pthread.test # No pthread support35 SKIP += 106_pthread.test # No pthread support
36 SKIP += 108_constructor.test # No contructor/destructor support
37endif36endif
38 37
39# Some tests might need arguments38# 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
34void __cdecl __set_app_type(int apptype);34void __cdecl __set_app_type(int apptype);
35unsigned int __cdecl _controlfp(unsigned int new_value, unsigned int mask);35unsigned int __cdecl _controlfp(unsigned int new_value, unsigned int mask);
36extern int _tmain(int argc, _TCHAR * argv[], _TCHAR * env[]);36extern int _tmain(int argc, _TCHAR * argv[], _TCHAR * env[]);
37extern void (*__init_array_start[]) (void);
38extern void (*__init_array_end[]) (void);
39extern void (*__fini_array_start[]) (void);
40extern void (*__fini_array_end[]) (void);
41
42static 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}
37 58
38/* Allow command-line globbing with "int _dowildcard = 1;" in the user source */59/* Allow command-line globbing with "int _dowildcard = 1;" in the user source */
39int _dowildcard;60int _dowildcard;
@@ -57,7 +78,7 @@ void _tstart(void) · 17 unmodified lines
57#endif78#endif
58 79
59 __tgetmainargs( &__argc, &__targv, &_tenviron, _dowildcard, &start_info);80 __tgetmainargs( &__argc, &__targv, &_tenviron, _dowildcard, &start_info);
60 exit(_tmain(__argc, __targv, _tenviron));81 exit(do_main(__argc, __targv, _tenviron));
61}82}
62 83
63int _runtmain(int argc, /* as tcc passed in */ char **argv)84int _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
78#if defined __i386__ || defined __x86_64__99#if defined __i386__ || defined __x86_64__
79 _controlfp(_PC_53, _MCW_PC);100 _controlfp(_PC_53, _MCW_PC);
80#endif101#endif
81 return _tmain(__argc, __targv, _tenviron);102 return do_main(__argc, __targv, _tenviron);
82}103}
83 104
84// =============================================105// =============================================
win32/lib/dllcrt1.c+22−3
@@ -2,12 +2,31 @@ · 1 unmodified line
2 2
3#include <windows.h>3#include <windows.h>
4 4
5extern void (*__init_array_start[]) (void);
6extern void (*__init_array_end[]) (void);
7extern void (*__fini_array_start[]) (void);
8extern void (*__fini_array_end[]) (void);
9
5BOOL WINAPI DllMain (HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved);10BOOL WINAPI DllMain (HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved);
6 11
7BOOL WINAPI _dllstart(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)12BOOL WINAPI _dllstart(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
8{13{
9 BOOL bRet;14 BOOL bRet;
10 bRet = DllMain (hDll, dwReason, lpReserved);15 int i;
11 return bRet;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;
12}31}
13 32
win32/lib/wincrt1.c+17−1
@@ -23,6 +23,11 @@ int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int); · 22 unmodified lines
23#define _runtwinmain _runwinmain23#define _runtwinmain _runwinmain
24#endif24#endif
25 25
26extern void (*__init_array_start[]) (void);
27extern void (*__init_array_end[]) (void);
28extern void (*__fini_array_start[]) (void);
29extern void (*__fini_array_end[]) (void);
30
26typedef struct { int newmode; } _startupinfo;31typedef struct { int newmode; } _startupinfo;
27int __cdecl __tgetmainargs(int *pargc, _TCHAR ***pargv, _TCHAR ***penv, int globb, _startupinfo*);32int __cdecl __tgetmainargs(int *pargc, _TCHAR ***pargv, _TCHAR ***penv, int globb, _startupinfo*);
28 33
@@ -31,6 +36,8 @@ static int go_winmain(TCHAR *arg1) · 2 unmodified lines
31 STARTUPINFO si;36 STARTUPINFO si;
32 _TCHAR *szCmd, *p;37 _TCHAR *szCmd, *p;
33 int fShow;38 int fShow;
39 int retval;
40 int i;
34 41
35 GetStartupInfo(&si);42 GetStartupInfo(&si);
36 if (si.dwFlags & STARTF_USESHOWWINDOW)43 if (si.dwFlags & STARTF_USESHOWWINDOW)
@@ -48,7 +55,16 @@ static int go_winmain(TCHAR *arg1) · 11 unmodified lines
48#if defined __i386__ || defined __x86_64__55#if defined __i386__ || defined __x86_64__
49 _controlfp(0x10000, 0x30000);56 _controlfp(0x10000, 0x30000);
50#endif57#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;
52}68}
53 69
54static LONG WINAPI catch_sig(EXCEPTION_POINTERS *ex)70static 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