--- a/src/hotspot/os/linux/os_linux.cpp
+++ b/src/hotspot/os/linux/os_linux.cpp
@@ -4567,14 +4567,16 @@ bool os::Linux::signal_handlers_are_inst
 
 // For signal-chaining
 struct sigaction sigact[NSIG];
-uint64_t sigs = 0;
-#if (64 < NSIG-1)
-#error "Not all signals can be encoded in sigs. Adapt its type!"
-#endif
+sigset_t sigs;
 bool os::Linux::libjsig_is_loaded = false;
 typedef struct sigaction *(*get_signal_t)(int);
 get_signal_t os::Linux::get_signal_action = NULL;
 
+static __attribute__((constructor)) void sigs_init()
+{
+    sigemptyset(&sigs);
+}
+
 struct sigaction* os::Linux::get_chained_signal_action(int sig) {
   struct sigaction *actp = NULL;
 
@@ -4649,7 +4651,7 @@ bool os::Linux::chained_handler(int sig,
 }
 
 struct sigaction* os::Linux::get_preinstalled_handler(int sig) {
-  if ((((uint64_t)1 << (sig-1)) & sigs) != 0) {
+  if (sigismember(&sigs, sig)) {
     return &sigact[sig];
   }
   return NULL;
@@ -4658,7 +4660,7 @@ struct sigaction* os::Linux::get_preinst
 void os::Linux::save_preinstalled_handler(int sig, struct sigaction& oldAct) {
   assert(sig > 0 && sig < NSIG, "vm signal out of expected range");
   sigact[sig] = oldAct;
-  sigs |= (uint64_t)1 << (sig-1);
+  sigaddset(&sigs, sig);
 }
 
 // for diagnostic
