windows_runtime.c (1419B)
1 #include <signal.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <windows.h> 5 6 static int ctor_seen; 7 static volatile sig_atomic_t signal_seen; 8 static _Thread_local int tls_value = 37; 9 10 __attribute__((constructor)) static void probe_ctor(void) { ctor_seen = 17; } 11 12 static void probe_signal(int signo) { 13 if (signo == SIGFPE) signal_seen = 1; 14 } 15 16 static void probe_fini(void) { 17 static const char message[] = "strip-fini-ok\n"; 18 DWORD wrote = 0; 19 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), message, sizeof(message) - 1, 20 &wrote, 0); 21 } 22 23 __attribute__((noinline)) static int imported_behavior(const char *arg) { 24 return strcmp(arg, "strip-probe") == 0 ? 5 : 0; 25 } 26 27 int main(int argc, char **argv) { 28 static const char out_message[] = "strip-runtime-ok\n"; 29 static const char err_message[] = "strip-signal-ok\n"; 30 DWORD wrote = 0; 31 32 if (argc != 2 || imported_behavior(argv[1]) != 5) return 10; 33 if (ctor_seen != 17) return 11; 34 if (signal(SIGFPE, probe_signal) == SIG_ERR) return 12; 35 if (raise(SIGFPE) != 0 || !signal_seen) return 13; 36 tls_value += 5; 37 if (tls_value != 42) return 14; 38 if (atexit(probe_fini) != 0) return 15; 39 40 if (!WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), out_message, 41 sizeof(out_message) - 1, &wrote, 0)) return 16; 42 if (!WriteFile(GetStdHandle(STD_ERROR_HANDLE), err_message, 43 sizeof(err_message) - 1, &wrote, 0)) return 17; 44 return 0; 45 }