aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/cgo/gcc_libinit_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/cgo/gcc_libinit_windows.c')
-rw-r--r--src/runtime/cgo/gcc_libinit_windows.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/runtime/cgo/gcc_libinit_windows.c b/src/runtime/cgo/gcc_libinit_windows.c
index 78b32254cf..ed30878c3c 100644
--- a/src/runtime/cgo/gcc_libinit_windows.c
+++ b/src/runtime/cgo/gcc_libinit_windows.c
@@ -14,6 +14,29 @@
#include "libcgo.h"
+#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800
+// With modern mingw, we can use the normal struct:
+//
+// const IMAGE_LOAD_CONFIG_DIRECTORY _load_config_used = {
+// .Size = sizeof(_load_config_used),
+// .GuardFlags = IMAGE_GUARD_SECURITY_COOKIE_UNUSED
+// };
+//
+// But we support older toolchains, so instead, fix the offsets:
+#ifdef _WIN64
+const ULONGLONG _load_config_used[40] = {
+ sizeof(_load_config_used),
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ IMAGE_GUARD_SECURITY_COOKIE_UNUSED
+};
+#else
+const DWORD _load_config_used[48] = {
+ sizeof(_load_config_used),
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ IMAGE_GUARD_SECURITY_COOKIE_UNUSED
+};
+#endif
+
static volatile LONG runtime_init_once_gate = 0;
static volatile LONG runtime_init_once_done = 0;