Index: qemu/Makefile
@@ -45,7 +45,10 @@
 LIBS+=-lwinmm -lws2_32 -liphlpapi
 endif
 
-build-all: $(TOOLS) $(DOCS) recurse-all
+build-all: bsd/libmath.a $(TOOLS) $(DOCS) recurse-all
+
+bsd/libmath.a:
+	( cd bsd ; unset MAKEFLAGS ; $(BSD_MAKE) CC=$(CC) )
 
 config-host.mak: configure
 ifneq ($(wildcard config-host.mak),)
@@ -242,6 +245,7 @@
 
 clean:
 # avoid old build problems by removing potentially incorrect old files
+	( cd bsd ; $(BSD_MAKE) clean )
 	rm -f config.mak config.h op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
 	rm -f *.o *.d *.a $(TOOLS) TAGS cscope.* *.pod *~ */*~
 	rm -f slirp/*.o slirp/*.d audio/*.o audio/*.d block/*.o block/*.d
Index: qemu/Makefile.target
@@ -339,7 +339,7 @@
 # WARNING: this LDFLAGS is _very_ tricky : qemu is an ELF shared object
 # that the kernel ELF loader considers as an executable. I think this
 # is the simplest way to make it self virtualizable!
-LDFLAGS+=-Wl,-shared
+#LDFLAGS+=-Wl,-shared
 endif
 endif
 
@@ -408,7 +408,7 @@
 # cpu_signal_handler() in cpu-exec.c.
 signal.o: CFLAGS += $(HELPER_CFLAGS)
 
-ARLIBS=libqemu.a ../libqemu_user.a
+ARLIBS=libqemu.a ../libqemu_user.a ../bsd/libmath.a
 
 endif #CONFIG_BSD_USER
 
@@ -658,7 +658,7 @@
 monitor.o: qemu-monitor.h
 
 LIBS += $(SDL_LIBS) $(COCOA_LIBS) $(CURSES_LIBS) $(BRLAPI_LIBS) $(VDE_LIBS) $(CURL_LIBS)
-ARLIBS=../libqemu_common.a libqemu.a $(HWLIB)
+ARLIBS=../libqemu_common.a libqemu.a $(HWLIB) ../bsd/libmath.a
 
 endif # !CONFIG_USER_ONLY
 
Index: qemu/fpu/softfloat-native.c
@@ -6,10 +6,15 @@
 #include <fenv.h>
 #endif
 
+#if defined(__FreeBSD__) && __FreeBSD_version < 500000
+#include <ieeefp.h>
+#endif
+
 void set_float_rounding_mode(int val STATUS_PARAM)
 {
     STATUS(float_rounding_mode) = val;
-#if defined(HOST_BSD) && !defined(__APPLE__) ||         \
+#if defined(HOST_BSD) && !defined(__APPLE__) && !defined(__FreeBSD__) || \
+    (defined(__FreeBSD__) && __FreeBSD_version < 500000) || \
     (defined(HOST_SOLARIS) && HOST_SOLARIS < 10)
     fpsetround(val);
 #elif defined(__arm__)
@@ -26,7 +31,7 @@
 }
 #endif
 
-#if defined(HOST_BSD) || (defined(HOST_SOLARIS) && HOST_SOLARIS < 10)
+#if (defined(HOST_BSD) && !defined(__FreeBSD__)) || (defined(HOST_SOLARIS) && HOST_SOLARIS < 10)
 #define lrint(d)		((int32_t)rint(d))
 #define llrint(d)		((int64_t)rint(d))
 #define lrintf(f)		((int32_t)rint(f))
Index: qemu/fpu/softfloat-native.h
@@ -1,8 +1,28 @@
 /* Native implementation of soft float functions */
 #include <math.h>
 
-#if (defined(HOST_BSD) && !defined(__APPLE__)) || defined(HOST_SOLARIS)
+#ifdef __FreeBSD__
+#include <osreldate.h>
+long double fabsl(long double x);
+long double remainderl(long double x, long double y);
+long double sqrtl(long double x);
+long double rintl(long double x);
+long lrintl(long double x);
+long long llrintl(long double x);
+#endif
+
+#if (defined(HOST_BSD) && !defined(__APPLE__) && \
+     (!defined(__FreeBSD__) || __FreeBSD_version < 500000)) || \
+    defined(HOST_SOLARIS)
 #include <ieeefp.h>
+#if defined(__FreeBSD__)
+#define isgreater(x, y)		__builtin_isgreater((x), (y))
+#define isgreaterequal(x, y)	__builtin_isgreaterequal((x), (y))
+#define isless(x, y)		__builtin_isless((x), (y))
+#define islessequal(x, y)	__builtin_islessequal((x), (y))
+#define islessgreater(x, y)	__builtin_islessgreater((x), (y))
+#define isunordered(x, y)	__builtin_isunordered((x), (y))
+#endif
 #define fabsf(f) ((float)fabs(f))
 #else
 #include <fenv.h>
@@ -109,6 +109,8 @@
 | Software IEC/IEEE floating-point rounding mode.
 *----------------------------------------------------------------------------*/
-#if (defined(HOST_BSD) && !defined(__APPLE__)) || defined(HOST_SOLARIS)
+#if (defined(HOST_BSD) && !defined(__APPLE__) && \
+      (!defined(__FreeBSD__) || __FreeBSD_version < 500000)) || \
+     defined(HOST_SOLARIS)
 #if defined(__OpenBSD__)
 #define FE_RM FP_RM
 #define FE_RP FP_RP
Index: qemu/fpu/softfloat.h
@@ -84,7 +84,8 @@
 #define FLOAT128
 #else
 /* native float support */
-#if (defined(__i386__) || defined(__x86_64__)) && !defined(HOST_BSD)
+#if (defined(__i386__) || defined(__x86_64__)) && \
+    (!defined(HOST_BSD) || defined(__FreeBSD__))
 #define FLOATX80
 #endif
 #endif /* !CONFIG_SOFTFLOAT */
Index: qemu/target-ppc/op_helper.c
@@ -293,6 +293,13 @@
     uint32_t exp = (u.ll >> 52) & 0x7FF;
     return ((0 < exp) && (exp < 0x7FF));
 }
+#else
+#ifndef isnormal
+#define isnormal(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isnormalf(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isnormal(x)	\
+    : __isnormall(x))
+#endif
 #endif
 
 uint32_t helper_compute_fprf (uint64_t arg, uint32_t set_fprf)
Index: qemu/x86_64.ld
@@ -2,7 +2,7 @@
 OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
 OUTPUT_ARCH(i386:x86-64)
 ENTRY(_start)
-SEARCH_DIR("/lib64"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/local/lib64");
+SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib");
 SECTIONS
 {
   /* Read-only sections, merged into text segment: */
@@ -59,8 +59,6 @@
   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
   .rodata1        : { *(.rodata1) }
   .eh_frame_hdr : { *(.eh_frame_hdr) }
-  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
-  .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table) }
   /* Adjust the address for the data segment.  We want to adjust up to
      the same address within the page on the next page up.  */
   . = ALIGN (0x100000) - ((0x100000 - .) & (0x100000 - 1)); . = DATA_SEGMENT_ALIGN (0x100000, 0x1000);
@@ -86,8 +84,8 @@
   .data1          : { *(.data1) }
   .tdata	  : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
   .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
-  .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
-  .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table) }
+  .eh_frame       : { KEEP (*(.eh_frame)) }
+  .gcc_except_table   : { *(.gcc_except_table) }
   .dynamic        : { *(.dynamic) }
   .ctors          :
   {