-} *shbuf;
-
-// Semaphore operation structures
-static struct sembuf SMrup[1] = {{0, -1, IPC_NOWAIT | SEM_UNDO}}; // set SMrup
-static struct sembuf SMrdn[2] = {{1, 0}, {0, +1, SEM_UNDO}}; // set SMrdn
-
-
-static void error_exit(const char *str) ATTRIBUTE_NORETURN;
+};
+
+static const struct sembuf init_sem[3] = {
+ {0, -1, IPC_NOWAIT | SEM_UNDO},
+ {1, 0}, {0, +1, SEM_UNDO}
+};
+
+struct globals {
+ struct sembuf SMrup[1]; // {0, -1, IPC_NOWAIT | SEM_UNDO},
+ struct sembuf SMrdn[2]; // {1, 0}, {0, +1, SEM_UNDO}
+ struct shbuf_ds *shbuf;
+};
+#define G (*(struct globals*)&bb_common_bufsiz1)
+#define SMrup (G.SMrup)
+#define SMrdn (G.SMrdn)
+#define shbuf (G.shbuf)
+#define INIT_G() do { \
+ memcpy(SMrup, init_sem, sizeof(init_sem)); \
+} while (0)
+
+static void error_exit(const char *str) NORETURN;