diff --git a/Makefile b/Makefile
index 0f0b22db72d29e3304828264c012158260291d48..f922a3ea3cb9a029d934be4d497a34cf19b9d2a6 100644
--- a/Makefile
+++ b/Makefile
@@ -7,13 +7,23 @@ DEFINES=-DHAVE_BYTESWAP_H
 
 ifeq ($(ARCH),i386)
 CFLAGS+=-fomit-frame-pointer
-OP_CFLAGS=$(CFLAGS) -malign-functions=0 -mpreferred-stack-boundary=2
+OP_CFLAGS=$(CFLAGS) -mpreferred-stack-boundary=2
+ifeq ($(GCC_MAJOR),3)
+OP_CFLAGS+= -falign-functions=0
+else
+OP_CFLAGS+= -malign-functions=0
+endif
 endif
 
 ifeq ($(ARCH),ppc)
 OP_CFLAGS=$(CFLAGS)
 endif
 
+ifeq ($(GCC_MAJOR),3)
+# very important to generate a return at the end of every operation
+OP_CFLAGS+=-fno-reorder-blocks -fno-optimize-sibling-calls
+endif
+
 #########################################################
 
 DEFINES+=-D_GNU_SOURCE
diff --git a/configure b/configure
index 16252c4dce253eba99070fe35c16a93423590870..62b1e712220be51d7e888c8c4bbad956a2ed3783 100755
--- a/configure
+++ b/configure
@@ -13,6 +13,7 @@ fi
 
 TMPC="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.c"
 TMPO="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.o"
+TMPE="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}"
 TMPS="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.S"
 TMPH="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.h"
 
@@ -142,6 +143,14 @@ fi
 
 fi
 
+# check gcc version
+gcc_major="2"
+gcc_version="$($cc -v 2>&1 | grep version | cut -d ' ' -f3-)"
+case "$gcc_version" in
+3.*) gcc_major="3";
+;;
+esac
+
 if test x"$1" = x"-h" -o x"$1" = x"--help" ; then
 cat << EOF
 
@@ -181,6 +190,7 @@ echo "prefix=$prefix" >> config.mak
 echo "#define CONFIG_GEMU_PREFIX \"$prefix\"" >> $TMPH
 echo "MAKE=$make" >> config.mak
 echo "CC=$cc" >> config.mak
+echo "GCC_MAJOR=$gcc_major" >> config.mak
 echo "HOST_CC=$host_cc" >> config.mak
 echo "AR=$ar" >> config.mak
 echo "STRIP=$strip -s -R .comment -R .note" >> config.mak