kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }