Index: uspace/lib/c/arch/amd64/_link.ld.in
===================================================================
--- uspace/lib/c/arch/amd64/_link.ld.in	(revision 82fd245de2c84c7c6ad64f4941ec45e3a55826b7)
+++ uspace/lib/c/arch/amd64/_link.ld.in	(revision 4bea22a1c4d2a50915ea6e974e5cc0c24b65a99d)
@@ -55,4 +55,20 @@
 	} :data
 
+    __dso_handle = .;
+
+	.init_array : {
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+		KEEP (*(.init_array .ctors))
+		PROVIDE_HIDDEN (__init_array_end = .);
+	}
+
+	.fini_array : {
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+		KEEP (*(.fini_array .dtors))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+	}
+
 	_end = .;
 
Index: uspace/lib/c/generic/elf/elf_load.c
===================================================================
--- uspace/lib/c/generic/elf/elf_load.c	(revision 82fd245de2c84c7c6ad64f4941ec45e3a55826b7)
+++ uspace/lib/c/generic/elf/elf_load.c	(revision 4bea22a1c4d2a50915ea6e974e5cc0c24b65a99d)
@@ -112,4 +112,5 @@
 	pcb->dynamic = info->finfo.dynamic;
 	pcb->rtld_runtime = info->env;
+	pcb->cpp_data = info->finfo.cpp_data;
 }
 
Index: uspace/lib/c/generic/elf/elf_mod.c
===================================================================
--- uspace/lib/c/generic/elf/elf_mod.c	(revision 82fd245de2c84c7c6ad64f4941ec45e3a55826b7)
+++ uspace/lib/c/generic/elf/elf_mod.c	(revision 4bea22a1c4d2a50915ea6e974e5cc0c24b65a99d)
@@ -198,4 +198,9 @@
 	size_t phdr_len = header->e_phnum * header->e_phentsize;
 
+	elf->info->interp = NULL;
+	elf->info->dynamic = NULL;
+	elf->info->cpp_data.ctors_count = 0;
+	elf->info->cpp_data.dtors_count = 0;
+
 	if (phdr_len > sizeof(phdr)) {
 		DPRINTF("more than %d program headers\n", phdr_cap);
Index: uspace/lib/c/generic/libc.c
===================================================================
--- uspace/lib/c/generic/libc.c	(revision 82fd245de2c84c7c6ad64f4941ec45e3a55826b7)
+++ uspace/lib/c/generic/libc.c	(revision 4bea22a1c4d2a50915ea6e974e5cc0c24b65a99d)
@@ -61,6 +61,16 @@
 #endif
 
+static bool env_setup = false;
 
-static bool env_setup = false;
+/**
+ * Used for C++ constructors/destructors
+ * and the GCC constructor/destructor extension.
+ */
+typedef void (*init_array_entry_t)();
+extern init_array_entry_t __init_array_start[];
+extern init_array_entry_t __init_array_end[];
+typedef void (*fini_array_entry_t)();
+extern fini_array_entry_t __fini_array_start[];
+extern fini_array_entry_t __fini_array_end[];
 
 void __libc_main(void *pcb_ptr)
@@ -115,4 +125,12 @@
 
 	/*
+	 * C++ Static constructor calls.
+	 */
+	ptrdiff_t init_array_entries = (__init_array_end - __init_array_start);
+
+	for (int i = init_array_entries - 1; i > 0; --i)
+		__init_array_start[i]();
+
+	/*
 	 * Run main() and set task return value
 	 * according the result
@@ -124,4 +142,14 @@
 void __libc_exit(int status)
 {
+	/*
+	 * GCC extension __attribute__((destructor)),
+	 * C++ destructors are added to __cxa_finalize call
+	 * when the respective constructor is called.
+	 */
+	ptrdiff_t fini_array_entries = (__fini_array_end - __fini_array_start);
+
+	for (int i = 0; i < fini_array_entries; ++i)
+		__fini_array_start[i]();
+
 	if (env_setup) {
 		__stdio_done();
Index: uspace/lib/c/include/loader/pcb.h
===================================================================
--- uspace/lib/c/include/loader/pcb.h	(revision 82fd245de2c84c7c6ad64f4941ec45e3a55826b7)
+++ uspace/lib/c/include/loader/pcb.h	(revision 4bea22a1c4d2a50915ea6e974e5cc0c24b65a99d)
@@ -36,5 +36,4 @@
 #ifndef LIBC_PCB_H_
 #define LIBC_PCB_H_
-
 
 typedef void (*entry_point_t)(void);
@@ -76,4 +75,6 @@
 	/** Pointer to dynamic linker state structure (rtld_t). */
 	void *rtld_runtime;
+	/** C++ related data. */
+	cpp_data_t cpp_data;
 } pcb_t;
 
