Index: HelenOS.config
===================================================================
--- HelenOS.config	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ HelenOS.config	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -258,8 +258,17 @@
 
 % Compiler
-@ "gcc_cross" GNU C Compiler (cross-compiler for IA-32)
+@ "gcc_cross" GNU C Compiler (cross-compiler)
 @ "gcc_native" GNU C Compiler (native)
 @ "clang" Clang
 ! [PLATFORM=abs32le] COMPILER (choice)
+
+
+## Cross-compiler target for abstract architecture
+
+% Cross-compiler target
+@ "arm32" ARM 32-bit
+@ "ia32" Intel IA-32
+@ "mips32" MIPS 32-bit
+! [PLATFORM=abs32le&COMPILER=gcc_cross] CROSS_TARGET (choice)
 
 
Index: defaults/special/abs32le/Makefile.config
===================================================================
--- defaults/special/abs32le/Makefile.config	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ defaults/special/abs32le/Makefile.config	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -1,2 +1,8 @@
 # Platform
 PLATFORM = abs32le
+
+# Cross-compiler target
+CROSS_TARGET = ia32
+
+# Networking architecture
+NETWORKING = none
Index: kernel/arch/abs32le/Makefile.inc
===================================================================
--- kernel/arch/abs32le/Makefile.inc	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ kernel/arch/abs32le/Makefile.inc	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -33,7 +33,19 @@
 
 ifeq ($(COMPILER),gcc_cross)
-	TARGET = i686-pc-linux-gnu
-	TOOLCHAIN_DIR = $(CROSS_PREFIX)/ia32
-	GCC_CFLAGS += -march=pentium
+	TOOLCHAIN_DIR = $(CROSS_PREFIX)/$(CROSS_TARGET)
+	
+	ifeq ($(CROSS_TARGET),arm32)
+		TARGET = arm-linux-gnu
+		ATSIGN = %
+	endif
+	
+	ifeq ($(CROSS_TARGET),ia32)
+		TARGET = i686-pc-linux-gnu
+	endif
+	
+	ifeq ($(CROSS_TARGET),mips32)
+		TARGET = mipsel-linux-gnu
+		GCC_CFLAGS += -mno-abicalls
+	endif
 endif
 
Index: uspace/lib/libc/arch/abs32le/Makefile.inc
===================================================================
--- uspace/lib/libc/arch/abs32le/Makefile.inc	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ uspace/lib/libc/arch/abs32le/Makefile.inc	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -31,7 +31,17 @@
 
 ifeq ($(COMPILER),gcc_cross)
-	TARGET = i686-pc-linux-gnu
-	TOOLCHAIN_DIR = $(CROSS_PREFIX)/ia32/bin
-	GCC_CFLAGS += -march=pentium
+	TOOLCHAIN_DIR = $(CROSS_PREFIX)/$(CROSS_TARGET)/bin
+	
+	ifeq ($(CROSS_TARGET),arm32)
+		TARGET = arm-linux-gnu
+	endif
+	
+	ifeq ($(CROSS_TARGET),ia32)
+		TARGET = i686-pc-linux-gnu
+	endif
+	
+	ifeq ($(CROSS_TARGET),mips32)
+		TARGET = mipsel-linux-gnu
+	endif
 endif
 
Index: uspace/lib/libc/arch/abs32le/_link.ld.in
===================================================================
--- uspace/lib/libc/arch/abs32le/_link.ld.in	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ uspace/lib/libc/arch/abs32le/_link.ld.in	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -19,4 +19,5 @@
 	.data : {
 		*(.data);
+		*(.data.rel*);
 	} :data
 	
@@ -33,4 +34,9 @@
 	_tls_alignment = ALIGNOF(.tdata);
 	
+	.sbss : {
+		*(.scommon);
+		*(.sbss);
+	}
+	
 	.bss : {
 		*(COMMON);
Index: uspace/lib/libc/arch/abs32le/include/atomic.h
===================================================================
--- uspace/lib/libc/arch/abs32le/include/atomic.h	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ uspace/lib/libc/arch/abs32le/include/atomic.h	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -36,7 +36,20 @@
 #define LIBC_abs32le_ATOMIC_H_
 
+#include <bool.h>
+
 #define LIBC_ARCH_ATOMIC_H_
+#define CAS
 
 #include <atomicdflt.h>
+
+static inline bool cas(atomic_t *val, long ov, long nv)
+{
+	if (val->count == ov) {
+		val->count = nv;
+		return true;
+	}
+	
+	return false;
+}
 
 static inline void atomic_inc(atomic_t *val) {
Index: uspace/lib/libc/arch/abs32le/include/tls.h
===================================================================
--- uspace/lib/libc/arch/abs32le/include/tls.h	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ uspace/lib/libc/arch/abs32le/include/tls.h	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -55,4 +55,6 @@
 }
 
+extern uintptr_t __aeabi_read_tp(void);
+
 #endif
 
Index: uspace/lib/libc/arch/abs32le/src/tls.c
===================================================================
--- uspace/lib/libc/arch/abs32le/src/tls.c	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ uspace/lib/libc/arch/abs32le/src/tls.c	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -32,4 +32,5 @@
 #include <tls.h>
 #include <sys/types.h>
+#include <unistd.h>
 
 tcb_t * __alloc_tls(void **data, size_t size)
@@ -43,4 +44,9 @@
 }
 
+uintptr_t __aeabi_read_tp(void)
+{
+	return NULL;
+}
+
 /** @}
  */
Index: uspace/lib/libc/include/atomicdflt.h
===================================================================
--- uspace/lib/libc/include/atomicdflt.h	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ uspace/lib/libc/include/atomicdflt.h	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -56,5 +56,5 @@
 }
 
-#ifndef CAS 
+#ifndef CAS
 static inline bool cas(atomic_t *val, long ov, long nv)
 {
Index: uspace/srv/loader/arch/abs32le/_link.ld.in
===================================================================
--- uspace/srv/loader/arch/abs32le/_link.ld.in	(revision 101d9f4939436823013482f00c5df3706b846bf7)
+++ uspace/srv/loader/arch/abs32le/_link.ld.in	(revision 81983e397478462b29f24f7beae41f423f0fb920)
@@ -26,4 +26,5 @@
 	.data ALIGN(0x1000) : SUBALIGN(0x1000) {
 		*(.data);
+		*(.data.rel*);
 	} :data
 	
@@ -43,4 +44,9 @@
 	_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss));
 	
+	.sbss : {
+		*(.scommon);
+		*(.sbss);
+	}
+	
 	.bss : {
 		*(COMMON);
