diff --git a/nx/include/switch.h b/nx/include/switch.h
index 30108008..fe0acdab 100644
--- a/nx/include/switch.h
+++ b/nx/include/switch.h
@@ -18,6 +18,7 @@ extern "C" {
 
 #include <switch/services/sm.h>
 #include <switch/services/bsd.h>
+#include <switch/services/fatal.h>
 
 #ifdef __cplusplus
 }
diff --git a/nx/include/switch/result.h b/nx/include/switch/result.h
index 54d2d90b..b9bd081a 100644
--- a/nx/include/switch/result.h
+++ b/nx/include/switch/result.h
@@ -17,3 +17,6 @@
 /// Builds a result code from its constituent components.
 #define MAKERESULT(module,description) \
     ((((module)&0x1FF)) | ((description)&0x1FFF)<<9)
+
+#define MODULE_LIBNX    345
+#define MODULE_BADRELOC   1
diff --git a/nx/include/switch/services/fatal.h b/nx/include/switch/services/fatal.h
new file mode 100644
index 00000000..59ddb6c1
--- /dev/null
+++ b/nx/include/switch/services/fatal.h
@@ -0,0 +1 @@
+void fatalSimple(Result err);
diff --git a/nx/include/switch/services/sm.h b/nx/include/switch/services/sm.h
index a667e419..a3bab05d 100644
--- a/nx/include/switch/services/sm.h
+++ b/nx/include/switch/services/sm.h
@@ -1,2 +1,3 @@
+bool smHasInitialized();
 Result smInitialize();
 Result smGetService(Handle* handle_out, const char* name);
diff --git a/nx/source/services/fatal.c b/nx/source/services/fatal.c
new file mode 100644
index 00000000..d99e23ff
--- /dev/null
+++ b/nx/source/services/fatal.c
@@ -0,0 +1,39 @@
+// Copyright 2017 plutoo
+#include <switch.h>
+
+void fatalSimple(Result err) {
+    Result rc = 0;
+
+    if (!smHasInitialized()) {
+        rc = smInitialize();
+    }
+
+    if (R_SUCCEEDED(rc)) {
+        Handle srv;
+        rc = smGetService(&srv, "fatal:u");
+
+        if (R_SUCCEEDED(rc)) {
+            IpcCommand c;
+            ipcInitialize(&c);
+            ipcSendPid(&c);
+
+            struct {
+                u64 magic;
+                u64 cmd_id;
+                u64 result;
+                u64 unknown;
+            } *raw;
+
+            raw = ipcPrepareHeader(&c, sizeof(*raw));
+
+            raw->magic = SFCI_MAGIC;
+            raw->cmd_id = 1;
+            raw->result = err;
+            raw->unknown = 0;
+
+            ipcDispatch(srv);
+        }
+    }
+
+    ((void(*)())0xBADC0DE)();
+}
diff --git a/nx/source/services/sm.c b/nx/source/services/sm.c
index b14d2567..01af93ad 100644
--- a/nx/source/services/sm.c
+++ b/nx/source/services/sm.c
@@ -3,6 +3,10 @@
 
 static Handle g_smHandle = -1;
 
+bool smHasInitialized() {
+    return g_smHandle != -1;
+}
+
 Result smInitialize() {
     Result rc = svcConnectToNamedPort(&g_smHandle, "sm:");
     Handle tmp;
diff --git a/nx/source/system/dynamic.c b/nx/source/system/dynamic.c
index 78f51df4..e693cffa 100644
--- a/nx/source/system/dynamic.c
+++ b/nx/source/system/dynamic.c
@@ -1,4 +1,4 @@
-#include <switch/types.h>
+#include <switch.h>
 #include <elf.h>
 
 void __nx_dynamic(uintptr_t base, const Elf64_Dyn* dyn)
@@ -20,7 +20,7 @@ void __nx_dynamic(uintptr_t base, const Elf64_Dyn* dyn)
 	}
 
 	if (rela == NULL)
-		for (;;); // Panic
+		fatalSimple(MAKERESULT(MODULE_LIBNX, MODULE_BADRELOC));
 
 	for (; relasz--; rela++)
 	{