Index: uspace/lib/c/arch/ia32/_link.ld.in
===================================================================
--- uspace/lib/c/arch/ia32/_link.ld.in	(revision 4ddbea735b086f2aee46396b84af11409e883218)
+++ uspace/lib/c/arch/ia32/_link.ld.in	(revision 729f774f860bfd8dc1a857e7bc279ff2a55a959a)
@@ -1,22 +1,31 @@
+#ifndef SHLIB
 STARTUP(LIBC_PATH/arch/UARCH/src/entry.o)
 ENTRY(__entry)
+#endif
 
 PHDRS {
-#ifdef LOADER
+#if defined(LOADER)
 	interp PT_INTERP;
 	text PT_LOAD FILEHDR PHDRS FLAGS(5);
+#elif defined(DLEXE)
+	interp PT_INTERP;
+	text PT_LOAD FLAGS(5);
 #else
 	text PT_LOAD FLAGS(5);
 #endif
 	data PT_LOAD FLAGS(6);
+#if defined(SHLIB) || defined(DLEXE)
+	dynamic PT_DYNAMIC;
+#endif
 	debug PT_NOTE;
 }
 
 SECTIONS {
-#ifdef LOADER
+#if defined(LOADER) || defined(DLEXE)
 	.interp : {
 		*(.interp);
 	} :interp
-
+#endif
+#ifdef LOADER
 	. = 0x70001000 + SIZEOF_HEADERS;
 #else
@@ -31,6 +40,36 @@
 		*(.rodata .rodata.*);
 	} :text
+
+#if defined(SHLIB) || defined(DLEXE)
+	.rel.plt : {
+		*(.rel.plt);
+	}
+	/* 
+	 *.rel.dyn MUST FOLLOW IMMEDIATELY after .rel.plt 
+	 * without alignment gap or DT_REL will be broken
+	 */
+	.rel.dyn : {
+		*(.rel.*);
+	} :text
 	
+	.plt : {
+		*(.plt);
+	} :text
+	
+	.dynsym : {
+		*(.dynsym);
+	} :text
+	
+	.dynstr : {
+		*(.dynstr);
+	} :text
+#endif
 	. = . + 0x1000;
+	
+#if defined(SHLIB) || defined(DLEXE)
+	.dynamic : {
+		*(.dynamic);
+	} :data :dynamic
+#endif
 	
 	.data : {
@@ -38,4 +77,18 @@
 	} :data
 	
+#if defined(SHLIB) || defined(DLEXE)
+	.data.rel : {
+                *(.data.rel);
+	} :data
+
+	.got : {
+                *(.got);
+	} :data
+	.got.plt : {
+                *(.got.plt);
+	} :data
+#endif
+	
+#ifndef DLEXE
 	.tdata : {
 		_tdata_start = .;
@@ -49,4 +102,5 @@
 	
 	_tls_alignment = ALIGNOF(.tdata);
+#endif
 	
 	.bss : {
@@ -68,6 +122,13 @@
 #endif
 	
+#if defined(SHLIB)
+#elif defined(DLEXE)
+	/DISCARD/ : {
+		*(.comment);
+	}
+#else
 	/DISCARD/ : {
 		*(*);
 	}
+#endif
 }
Index: uspace/lib/c/arch/mips32/_link.ld.in
===================================================================
--- uspace/lib/c/arch/mips32/_link.ld.in	(revision 4ddbea735b086f2aee46396b84af11409e883218)
+++ uspace/lib/c/arch/mips32/_link.ld.in	(revision 729f774f860bfd8dc1a857e7bc279ff2a55a959a)
@@ -1,21 +1,30 @@
+#ifndef SHLIB
 STARTUP(LIBC_PATH/arch/UARCH/src/entry.o)
 ENTRY(__entry)
+#endif
 
 PHDRS {
-#ifdef LOADER
+#if defined(LOADER)
 	interp PT_INTERP;
 	text PT_LOAD FILEHDR PHDRS FLAGS(5);
+#elif defined(DLEXE)
+	interp PT_INTERP;
+	text PT_LOAD FLAGS(5);
 #else
 	text PT_LOAD FLAGS(5);
 #endif
 	data PT_LOAD FLAGS(6);
+#if defined(SHLIB) || defined(DLEXE)
+	dynamic PT_DYNAMIC;
+#endif
 }
 
 SECTIONS {
-#ifdef LOADER
+#if defined(LOADER) || defined(DLEXE)
 	.interp : {
 		*(.interp);
 	} :interp
-	
+#endif
+#ifdef LOADER
 	. = 0x70004000 + SIZEOF_HEADERS;
 #else
@@ -31,5 +40,35 @@
 	} :text
 	
+#if defined(SHLIB) || defined(DLEXE)
+	.rel.plt : {
+		*(.rel.plt);
+	}
+	/* 
+	 *.rel.dyn MUST FOLLOW IMMEDIATELY after .rel.plt 
+	 * without alignment gap or DT_REL will be broken
+	 */
+	.rel.dyn : {
+		*(.rel.*);
+	} :text
+	
+	.plt : {
+		*(.plt);
+	} :text
+	
+	.dynsym : {
+		*(.dynsym);
+	} :text
+	
+	.dynstr : {
+		*(.dynstr);
+	} :text
+#endif
 	. = . + 0x4000;
+	
+#if defined(SHLIB) || defined(DLEXE)
+	.dynamic : {
+		*(.dynamic);
+	} :data :dynamic
+#endif
 	
 	.data : {
@@ -43,4 +82,5 @@
 	} :data
 	
+#ifndef DLEXE
 	.tdata : {
 		_tdata_start = .;
@@ -56,5 +96,5 @@
 	
 	_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss));
-	
+#endif
 	.sbss : {
 		*(.scommon);
@@ -67,6 +107,13 @@
 	} :data
 	
+#if defined(SHLIB)
+#elif defined(DLEXE)
+	/DISCARD/ : {
+		*(.comment);
+	}
+#else
 	/DISCARD/ : {
 		*(*);
 	}
+#endif
 }
Index: uspace/lib/c/arch/ppc32/_link.ld.in
===================================================================
--- uspace/lib/c/arch/ppc32/_link.ld.in	(revision 4ddbea735b086f2aee46396b84af11409e883218)
+++ uspace/lib/c/arch/ppc32/_link.ld.in	(revision 729f774f860bfd8dc1a857e7bc279ff2a55a959a)
@@ -1,21 +1,30 @@
+#ifndef SHLIB
 STARTUP(LIBC_PATH/arch/UARCH/src/entry.o)
 ENTRY(__entry)
+#endif
 
 PHDRS {
-#ifdef LOADER
+#if defined(LOADER)
 	interp PT_INTERP;
 	text PT_LOAD FILEHDR PHDRS FLAGS(5);
+#elif defined(DLEXE)
+	interp PT_INTERP;
+	text PT_LOAD FLAGS(5);
 #else
 	text PT_LOAD FLAGS(5);
 #endif
 	data PT_LOAD FLAGS(6);
+#if defined(SHLIB) || defined(DLEXE)
+	dynamic PT_DYNAMIC;
+#endif
 }
 
 SECTIONS {
-#ifdef LOADER
+#if defined(LOADER) || defined(DLEXE)
 	.interp : {
 		*(.interp);
 	} :interp
-	
+#endif
+#ifdef LOADER
 	. = 0x70001000 + SIZEOF_HEADERS;
 #else
@@ -31,5 +40,35 @@
 	} :text
 	
+#if defined(SHLIB) || defined(DLEXE)
+	.rel.plt : {
+		*(.rel.plt);
+	}
+	/* 
+	 *.rel.dyn MUST FOLLOW IMMEDIATELY after .rel.plt 
+	 * without alignment gap or DT_REL will be broken
+	 */
+	.rel.dyn : {
+		*(.rel.*);
+	} :text
+	
+	.plt : {
+		*(.plt);
+	} :text
+	
+	.dynsym : {
+		*(.dynsym);
+	} :text
+	
+	.dynstr : {
+		*(.dynstr);
+	} :text
+#endif
 	. = . + 0x1000;
+	
+#if defined(SHLIB) || defined(DLEXE)
+	.dynamic : {
+		*(.dynamic);
+	} :data :dynamic
+#endif
 	
 	.data : {
@@ -38,4 +77,18 @@
 	} :data
 	
+#if defined(SHLIB) || defined(DLEXE)
+	.data.rel : {
+                *(.data.rel);
+	} :data
+	
+	.got : {
+                *(.got);
+	} :data
+	.got.plt : {
+                *(.got.plt);
+	} :data
+#endif
+	
+#ifndef DLEXE
 	.tdata : {
 		_tdata_start = .;
@@ -48,4 +101,5 @@
 	
 	_tls_alignment = ALIGNOF(.tdata);
+#endif
 	
 	.bss : {
@@ -55,6 +109,13 @@
 	} :data
 	
+#if defined(SHLIB)
+#elif defined(DLEXE)
+	/DISCARD/ : {
+		*(.comment);
+	}
+#else
 	/DISCARD/ : {
 		*(*);
 	}
+#endif
 }
