Index: uspace/lib/c/generic/dlfcn.c
===================================================================
--- uspace/lib/c/generic/dlfcn.c	(revision 9c07c3d937d51ff587e1eac05d09ce9b2423f541)
+++ uspace/lib/c/generic/dlfcn.c	(revision 153c7a29e3a8082bd7b08d69177e32d48d1873a7)
@@ -49,23 +49,10 @@
 	module_t *m;
 
-	if (runtime_env == NULL) {
-		printf("Dynamic linker not set up -- initializing.\n");
-		rtld_init_static();
-	}
-
-	printf("dlopen(\"%s\", %d)\n", path, flag);
-
-	printf("module_find('%s')\n", path);
 	m = module_find(runtime_env, path);
 	if (m == NULL) {
-		printf("NULL. module_load('%s')\n", path);
 		m = module_load(runtime_env, path, mlf_local);
-		printf("module_load_deps(m)\n");
 		module_load_deps(m, mlf_local);
 		/* Now relocate. */
-		printf("module_process_relocs(m)\n");
 		module_process_relocs(m);
-	} else {
-		printf("not NULL\n");
 	}
 
@@ -81,5 +68,4 @@
 	module_t *sm;
 
-	printf("dlsym(0x%lx, \"%s\")\n", (long)mod, sym_name);
 	sd = symbol_bfs_find(sym_name, (module_t *) mod, &sm);
 	if (sd != NULL) {
Index: uspace/lib/c/generic/libc.c
===================================================================
--- uspace/lib/c/generic/libc.c	(revision 9c07c3d937d51ff587e1eac05d09ce9b2423f541)
+++ uspace/lib/c/generic/libc.c	(revision 153c7a29e3a8082bd7b08d69177e32d48d1873a7)
@@ -41,4 +41,5 @@
  */
 
+#include <errno.h>
 #include <libc.h>
 #include <stdlib.h>
@@ -65,4 +66,7 @@
 void __main(void *pcb_ptr)
 {
+	/* Initialize user task run-time environment */
+	__malloc_init();
+	
 	/* Save the PCB pointer */
 	__pcb = (pcb_t *) pcb_ptr;
@@ -71,8 +75,9 @@
 	if (__pcb != NULL && __pcb->rtld_runtime != NULL) {
 		runtime_env = (rtld_t *) __pcb->rtld_runtime;
+	} else {
+		if (rtld_init_static() != EOK)
+			abort();
 	}
 #endif
-	/* Initialize user task run-time environment */
-	__malloc_init();
 	
 	fibril_t *fibril = fibril_setup();
Index: uspace/lib/c/generic/rtld/module.c
===================================================================
--- uspace/lib/c/generic/rtld/module.c	(revision 9c07c3d937d51ff587e1eac05d09ce9b2423f541)
+++ uspace/lib/c/generic/rtld/module.c	(revision 153c7a29e3a8082bd7b08d69177e32d48d1873a7)
@@ -49,4 +49,37 @@
 #include <rtld/rtld_arch.h>
 #include <rtld/module.h>
+
+/** Create module for static executable.
+ *
+ * @param rtld Run-time dynamic linker
+ * @param rmodule Place to store pointer to new module or @c NULL
+ * @return EOK on success, ENOMEM if out of memory
+ */
+int module_create_static_exec(rtld_t *rtld, module_t **rmodule)
+{
+	module_t *module;
+
+	module = calloc(1, sizeof(module_t));
+	if (module == NULL)
+		return ENOMEM;
+
+	module->id = rtld_get_next_id(rtld);
+	module->dyn.soname = "[program]";
+
+	module->rtld = rtld;
+	module->exec = true;
+	module->local = true;
+
+	module->tdata = &_tdata_start;
+	module->tdata_size = &_tdata_end - &_tdata_start;
+	module->tbss_size = &_tbss_end - &_tbss_start;
+	module->tls_align = (uintptr_t)&_tls_alignment;
+
+	list_append(&module->modules_link, &rtld->modules);
+
+	if (rmodule != NULL)
+		*rmodule = module;
+	return EOK;
+}
 
 /** (Eagerly) process all relocation tables in a module.
@@ -191,5 +224,5 @@
 	m->tls_align = info.tls.tls_align;
 
-	printf("tdata at %p size %zu, tbss size %zu\n",
+	DPRINTF("tdata at %p size %zu, tbss size %zu\n",
 	    m->tdata, m->tdata_size, m->tbss_size);
 
Index: uspace/lib/c/generic/rtld/rtld.c
===================================================================
--- uspace/lib/c/generic/rtld/rtld.c	(revision 9c07c3d937d51ff587e1eac05d09ce9b2423f541)
+++ uspace/lib/c/generic/rtld/rtld.c	(revision 153c7a29e3a8082bd7b08d69177e32d48d1873a7)
@@ -45,6 +45,8 @@
 
 /** Initialize the runtime linker for use in a statically-linked executable. */
-void rtld_init_static(void)
-{
+int rtld_init_static(void)
+{
+	int rc;
+
 	runtime_env = &rt_env_static;
 	list_initialize(&runtime_env->modules);
@@ -52,4 +54,13 @@
 	runtime_env->next_bias = 0x2000000;
 	runtime_env->program = NULL;
+	runtime_env->next_id = 1;
+
+	rc = module_create_static_exec(runtime_env, NULL);
+	if (rc != EOK)
+		return rc;
+
+	modules_process_tls(runtime_env);
+
+	return EOK;
 }
 
@@ -98,5 +109,5 @@
 	prog->tls_align = p_info->tls.tls_align;
 
-	printf("prog tdata at %p size %zu, tbss size %zu\n",
+	DPRINTF("prog tdata at %p size %zu, tbss size %zu\n",
 	    prog->tdata, prog->tdata_size, prog->tbss_size);
 
Index: uspace/lib/c/include/rtld/module.h
===================================================================
--- uspace/lib/c/include/rtld/module.h	(revision 9c07c3d937d51ff587e1eac05d09ce9b2423f541)
+++ uspace/lib/c/include/rtld/module.h	(revision 153c7a29e3a8082bd7b08d69177e32d48d1873a7)
@@ -42,4 +42,5 @@
 #include <types/rtld/rtld.h>
 
+extern int module_create_static_exec(rtld_t *, module_t **);
 extern void module_process_relocs(module_t *);
 extern module_t *module_find(rtld_t *, const char *);
Index: uspace/lib/c/include/rtld/rtld.h
===================================================================
--- uspace/lib/c/include/rtld/rtld.h	(revision 9c07c3d937d51ff587e1eac05d09ce9b2423f541)
+++ uspace/lib/c/include/rtld/rtld.h	(revision 153c7a29e3a8082bd7b08d69177e32d48d1873a7)
@@ -46,5 +46,5 @@
 extern rtld_t *runtime_env;
 
-extern void rtld_init_static(void);
+extern int rtld_init_static(void);
 extern int rtld_prog_process(elf_finfo_t *, rtld_t **);
 extern tcb_t *rtld_tls_make(rtld_t *);
