--- /dev/null
+#define WIN32_LEAN_AND_MEAN\r
+#include <stdio.h>\r
+#include <windows.h>\r
+#include <stdlib.h>\r
+#include "objcrt.h"\r
+\r
+// Boundary symbols for metadata sections\r
+\r
+#pragma section(".objc_module_info$A",long,read,write)\r
+#pragma data_seg(".objc_module_info$A")\r
+static uintptr_t __objc_modStart = 0;\r
+#pragma section(".objc_module_info$C",long,read,write)\r
+#pragma data_seg(".objc_module_info$C")\r
+static uintptr_t __objc_modEnd = 0;\r
+\r
+#pragma section(".objc_protocol$A",long,read,write)\r
+#pragma data_seg(".objc_protocol$A")\r
+static uintptr_t __objc_protoStart = 0;\r
+#pragma section(".objc_protocol$C",long,read,write)\r
+#pragma data_seg(".objc_protocol$C")\r
+static uintptr_t __objc_protoEnd = 0;\r
+\r
+#pragma section(".objc_image_info$A",long,read,write)\r
+#pragma data_seg(".objc_image_info$A")\r
+static uintptr_t __objc_iiStart = 0;\r
+#pragma section(".objc_image_info$C",long,read,write)\r
+#pragma data_seg(".objc_image_info$C")\r
+static uintptr_t __objc_iiEnd = 0;\r
+\r
+#pragma section(".objc_message_refs$A",long,read,write)\r
+#pragma data_seg(".objc_message_refs$A")\r
+static uintptr_t __objc_selrefsStart = 0;\r
+#pragma section(".objc_message_refs$C",long,read,write)\r
+#pragma data_seg(".objc_message_refs$C")\r
+static uintptr_t __objc_selrefsEnd = 0;\r
+\r
+#pragma section(".objc_class_refs$A",long,read,write)\r
+#pragma data_seg(".objc_class_refs$A")\r
+static uintptr_t __objc_clsrefsStart = 0;\r
+#pragma section(".objc_class_refs$C",long,read,write)\r
+#pragma data_seg(".objc_class_refs$C")\r
+static uintptr_t __objc_clsrefsEnd = 0;\r
+\r
+#pragma data_seg()\r
+\r
+// Merge all metadata into .data\r
+// fixme order these by usage?\r
+#pragma comment(linker, "/MERGE:.objc_module_info=.data")\r
+#pragma comment(linker, "/MERGE:.objc_protocol=.data")\r
+#pragma comment(linker, "/MERGE:.objc_image_info=.data")\r
+#pragma comment(linker, "/MERGE:.objc_message_refs=.data")\r
+#pragma comment(linker, "/MERGE:.objc_class_refs=.data")\r
+\r
+\r
+// Image initializers\r
+\r
+static void *__hinfo = NULL; // cookie from runtime\r
+extern IMAGE_DOS_HEADER __ImageBase; // this image's header\r
+\r
+static int __objc_init(void)\r
+{\r
+ objc_sections sections = {\r
+ 5, \r
+ &__objc_modStart, &__objc_modEnd, \r
+ &__objc_protoStart, &__objc_protoEnd, \r
+ &__objc_iiStart, &__objc_iiEnd, \r
+ &__objc_selrefsStart, &__objc_selrefsEnd, \r
+ &__objc_clsrefsStart, &__objc_clsrefsEnd, \r
+ };\r
+ __hinfo = _objc_init_image((HMODULE)&__ImageBase, §ions);\r
+ return 0;\r
+}\r
+\r
+static void __objc_unload(void)\r
+{\r
+ _objc_unload_image((HMODULE)&__ImageBase, __hinfo);\r
+}\r
+\r
+static int __objc_load(void)\r
+{\r
+ _objc_load_image((HMODULE)&__ImageBase, __hinfo);\r
+ return 0;\r
+}\r
+\r
+// run _objc_init_image ASAP\r
+#pragma section(".CRT$XIAA",long,read,write)\r
+#pragma data_seg(".CRT$XIAA")\r
+static void *__objc_init_fn = &__objc_init;\r
+\r
+// run _objc_load_image (+load methods) after init_seg(compiler) but before init_seg(library) or init_seg(user)\r
+#pragma section(".CRT$XCI",long,read,write)\r
+#pragma data_seg(".CRT$XCI")\r
+static void *__objc_load_fn = &__objc_load;\r
+\r
+// _objc_unload_image is called by atexit(), not by an image terminator\r
+\r
+#pragma data_seg()\r