Index: HelenOS.config
===================================================================
--- HelenOS.config	(revision 938f2272055195f5d64165d562663b5a90200a42)
+++ HelenOS.config	(revision cf84f1bfcf4b95cf9de04fc4503c64ddd07c5717)
@@ -362,4 +362,7 @@
 ! CONFIG_TEST (y/n)
 
+% Use link-time optimization
+! [COMPILER=gcc_cross|COMPILER=gcc_native] CONFIG_LTO (n/y)
+
 
 ## Hardware support
Index: kernel/Makefile
===================================================================
--- kernel/Makefile	(revision 938f2272055195f5d64165d562663b5a90200a42)
+++ kernel/Makefile	(revision cf84f1bfcf4b95cf9de04fc4503c64ddd07c5717)
@@ -118,4 +118,8 @@
 endif
 
+ifeq ($(CONFIG_LTO),y)
+	GCC_CFLAGS += -flto
+endif
+
 -include arch/$(KARCH)/Makefile.inc
 -include genarch/Makefile.inc
@@ -167,4 +171,7 @@
 	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
 endif
+
+AFLAGS =
+LFLAGS = -N -T $(LINK) -M
 
 ## Generic kernel sources
@@ -348,4 +355,6 @@
 GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES)))
 
+LFLAGS_LTO := $(addprefix -Xlinker ,$(LFLAGS))
+
 ifeq ($(CONFIG_SYMTAB),y)
 	SYMTAB_OBJECTS := generic/src/debug/real_map.o
@@ -361,7 +370,11 @@
 
 $(RAW): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
-	$(LD) -N $(LFLAGS) -T $(LINK) -M -Map $(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
+ifeq ($(CONFIG_LTO),y)
+	$(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
+else
+	$(LD) $(LFLAGS) -Map $(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
+endif
 ifeq ($(CONFIG_STRIP_BINARIES),y)
-	$(STRIP) $(RAW) 
+	$(STRIP) $(RAW)
 endif
 
@@ -370,5 +383,5 @@
 
 %.o: %.S $(DEPEND)
-	$(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -c $< -o $@
+	$(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -c -o $@ $<
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(GCC_CFLAGS) -D__ASM__
@@ -387,5 +400,5 @@
 
 test/fpu/%.o: test/fpu/%.c $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) -c $< -o $@
+	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) -c -o $@ $<
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ cc test $(DEFS) $(CFLAGS) $(EXTRA_FLAGS)
@@ -397,5 +410,5 @@
 
 %.o: %.c $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) -c $< -o $@
+	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) -c -o $@ $<
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS)
@@ -407,5 +420,9 @@
 $(REAL_MAP).bin: $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS)
 	echo $(SYMTAB_SECTION) | $(AS) $(AFLAGS) -o $(EMPTY_MAP)
-	$(LD) -N $(LFLAGS) -T $(LINK) -M -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
+ifeq ($(CONFIG_LTO),y)
+	$(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP_PREV) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
+else
+	$(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
+endif
 	$(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
 	$(GENMAP) $(MAP_PREV) $(DUMP) $@
@@ -415,5 +432,9 @@
 	
 	echo $(SYMTAB_SECTION)" .incbin \"$@\"" | $(AS) $(AFLAGS) -o $(SIZEOK_MAP)
-	$(LD) -N $(LFLAGS) -T $(LINK) -M -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
+ifeq ($(CONFIG_LTO),y)
+	$(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP_PREV) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
+else
+	$(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
+endif
 	$(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
 	$(GENMAP) $(MAP_PREV) $(DUMP) $@
Index: kernel/arch/ia64/Makefile.inc
===================================================================
--- kernel/arch/ia64/Makefile.inc	(revision 938f2272055195f5d64165d562663b5a90200a42)
+++ kernel/arch/ia64/Makefile.inc	(revision cf84f1bfcf4b95cf9de04fc4503c64ddd07c5717)
@@ -34,6 +34,6 @@
 ICC_CFLAGS += $(CMN1)
 
-LFLAGS = -EL
-AFLAGS = -mconstant-gp
+AFLAGS += -mconstant-gp
+LFLAGS += -EL
 
 BITS = 64
Index: kernel/arch/ppc32/Makefile.inc
===================================================================
--- kernel/arch/ppc32/Makefile.inc	(revision 938f2272055195f5d64165d562663b5a90200a42)
+++ kernel/arch/ppc32/Makefile.inc	(revision cf84f1bfcf4b95cf9de04fc4503c64ddd07c5717)
@@ -32,6 +32,6 @@
 
 GCC_CFLAGS += -mcpu=powerpc -msoft-float -m32
-AFLAGS = -a32
-LFLAGS = -no-check-sections -N
+AFLAGS += -a32
+LFLAGS += -no-check-sections
 
 BITS = 32
Index: kernel/arch/sparc64/Makefile.inc
===================================================================
--- kernel/arch/sparc64/Makefile.inc	(revision 938f2272055195f5d64165d562663b5a90200a42)
+++ kernel/arch/sparc64/Makefile.inc	(revision cf84f1bfcf4b95cf9de04fc4503c64ddd07c5717)
@@ -34,5 +34,5 @@
 SUNCC_CFLAGS += -m64 -xarch=sparc -xregs=appl,no%float
 
-LFLAGS = -no-check-sections -N
+LFLAGS += -no-check-sections
 
 BITS = 64
