Constructors between vsyscall init and libc init

Add a region for constructors to be placed between __sysinfo being
initialised to sel4_vsyscall and libc_init to allow a user-level
implementation to set up virtual memory syscalls use by libc_init whilst
depending on a functioning implementation of malloc.

Signed-off-by: Curtis Millar <curtis.millar@data61.csiro.au>
diff --git a/libsel4muslcsys/CMakeLists.txt b/libsel4muslcsys/CMakeLists.txt
index 336a75c..731bc65 100644
--- a/libsel4muslcsys/CMakeLists.txt
+++ b/libsel4muslcsys/CMakeLists.txt
@@ -61,7 +61,7 @@
 	they occur after external initialisation of the system call
 	dependencies."
     DEFAULT
-    "CONSTRUCTOR_MIN_PRIORITY + 1"
+    "MUSLCSYS_WITH_VSYSCALL_PRIORITY + 10"
     UNQUOTE
 )
 mark_as_advanced(
diff --git a/libsel4muslcsys/include/muslcsys/vsyscall.h b/libsel4muslcsys/include/muslcsys/vsyscall.h
index 722cee7..c96871d 100644
--- a/libsel4muslcsys/include/muslcsys/vsyscall.h
+++ b/libsel4muslcsys/include/muslcsys/vsyscall.h
@@ -19,6 +19,8 @@
 #include <bits/syscall.h>
 #include <utils/attribute.h>
 
+#define MUSLCSYS_WITH_VSYSCALL_PRIORITY (CONSTRUCTOR_MIN_PRIORITY + 10)
+
 typedef long (*muslcsys_syscall_t)(va_list);
 
 /* Installs a new handler for the given syscall. Any previous handler is returned
diff --git a/libsel4muslcsys/src/vsyscall.c b/libsel4muslcsys/src/vsyscall.c
index d48d58b..aa3ce88 100644
--- a/libsel4muslcsys/src/vsyscall.c
+++ b/libsel4muslcsys/src/vsyscall.c
@@ -291,6 +291,20 @@
     return ret;
 }
 
+extern void *__sysinfo;
+
+/* Set the virtual syscall handler so that a portion of muslc will
+ * function.
+ *
+ * This is required for apps using a dynamic heap, which need to make
+ * use of malloc in order to provide an implementation of brk and mmap
+ * that are used during the initialisation of muslc.
+ */
+static void CONSTRUCTOR(MUSLCSYS_WITH_VSYSCALL_PRIORITY - 1) init_vsyscall(void)
+{
+    __sysinfo = sel4_vsyscall;
+}
+
 /* Put a pointer to sel4_vsyscall in a special section so anyone loading us
  * knows how to configure our syscall table */
 uintptr_t VISIBLE SECTION("__vsyscall") __vsyscall_ptr = (uintptr_t) sel4_vsyscall;