--- src/VBox/Additions/common/crOpenGL/Makefile.kmk.orig	2013-04-12 12:35:06.000000000 +0200
+++ src/VBox/Additions/common/crOpenGL/Makefile.kmk	2013-05-31 13:21:24.556041267 +0200
@@ -42,7 +42,7 @@
 
 if1of ($(KBUILD_TARGET), linux solaris freebsd)
  #VBoxOGL_DRI = 1
- ifn1of ($(KBUILD_TARGET),solaris freebsd)   # No DRI on Solaris yet
+ ifn1of ($(KBUILD_TARGET),solaris)   # No DRI on Solaris yet
   VBoxOGL_FAKEDRI = 1
  endif
 
@@ -209,8 +209,13 @@
  	$(PATH_STAGE_LIB)/libXfixes.so \
  	$(PATH_STAGE_LIB)/libXext.so
  ifdef VBoxOGL_FAKEDRI
-  VBoxOGL_LIBS += \
+  ifeq ($(KBUILD_TARGET), freebsd)
+    VBoxOGL_LIBS += \
+        elf
+  else
+    VBoxOGL_LIBS += \
   	dl
+  endif
  endif
 endif
 ifdef VBOX_WITH_CRHGSMI
@@ -368,6 +373,13 @@
 		| $$(dir $$@)
 	$(call MSG_GENERATE,python,$@,$<)
 	$(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
+  else ifeq ($(KBUILD_TARGET),freebsd)
+$(VBOX_PATH_CROGL_GENFILES)/freebsd_exports.c: \
+		$(PATH_SUB_CURRENT)/FreeBSD_exports.py \
+		$(VBOX_CROGL_API_FILES) $(PATH_SUB_CURRENT)/entrypoints.py \
+		| $$(dir $$@)
+	$(call MSG_GENERATE,python,$@,$<)
+	$(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI)
   else
 $(VBOX_PATH_CROGL_GENFILES)/linux_exports.c: \
 		$(PATH_SUB_CURRENT)/Linux_exports.py \
--- src/VBox/Additions/common/crOpenGL/fakedri_drv.c.orig	2013-04-12 12:35:07.000000000 +0200
+++ src/VBox/Additions/common/crOpenGL/fakedri_drv.c	2013-05-31 13:24:46.527048965 +0200
@@ -29,6 +29,15 @@
 #include <dlfcn.h>
 #include <elf.h>
 #include <unistd.h>
+
+#include <sys/param.h>
+#if defined(BSD)
+#include <fcntl.h>
+#include <gelf.h>
+#include <libelf.h>
+#include <string.h>
+#endif
+
 /** X server message type definitions. */
 typedef enum {
     X_PROBED,			/* Value was probed */
@@ -50,11 +59,21 @@
 
 //@todo this could be different...
 #ifdef RT_ARCH_AMD64
-# define DRI_DEFAULT_DRIVER_DIR "/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri"
-# define DRI_XORG_DRV_DIR "/usr/lib/xorg/modules/drivers/"
+# ifdef BSD
+#  define DRI_DEFAULT_DRIVER_DIR "/usr/local/lib/dri"
+#  define DRI_XORG_DRV_DIR "/usr/local/lib/xorg/modules/drivers/"
+# else
+#  define DRI_DEFAULT_DRIVER_DIR "/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri"
+#  define DRI_XORG_DRV_DIR "/usr/lib/xorg/modules/drivers/"
+# endif
 #else
-# define DRI_DEFAULT_DRIVER_DIR "/usr/lib/dri:/usr/lib/i386-linux-gnu/dri"
-# define DRI_XORG_DRV_DIR "/usr/lib/xorg/modules/drivers/"
+# ifdef BSD
+#  define DRI_DEFAULT_DRIVER_DIR "/usr/local/lib/dri"
+#  define DRI_XORG_DRV_DIR "/usr/local/lib/xorg/modules/drivers/"
+# else
+#  define DRI_DEFAULT_DRIVER_DIR "/usr/lib/dri:/usr/lib/i386-linux-gnu/dri"
+#  define DRI_XORG_DRV_DIR "/usr/lib/xorg/modules/drivers/"
+# endif
 #endif
 
 #ifdef DEBUG_DRI_CALLS
@@ -209,6 +228,85 @@
 
 #define FAKEDRI_JMP64_PATCH_SIZE 13
 
+#if defined(BSD)
+/* Provide basic dladdr1 flags */
+enum {
+	RTLD_DL_SYMENT	= 1
+};
+
+/* Provide a minimal local version of dladdr1 */
+static int
+dladdr1(const void *address, Dl_info *dlip, void **info, int flags)
+{
+	static DRI_ELFSYM desym;
+	GElf_Sym sym;
+	GElf_Shdr shdr;
+	Elf *elf;
+	Elf_Scn *scn;
+	Elf_Data *data;
+	int ret, fd, count, i;
+
+	/* Initialize variables */
+	fd = -1;
+	elf = NULL;
+
+	/* Call dladdr first */
+	ret = dladdr(address, dlip);
+	if (ret == 0) goto err_exit;
+
+	/* Check for supported flags */
+	if (flags != RTLD_DL_SYMENT) return 1;
+
+	/* Open shared library's ELF file */
+	if (elf_version(EV_CURRENT) == EV_NONE) goto err_exit;
+	fd = open(dlip->dli_fname, O_RDONLY);
+	if (fd < 0) goto err_exit;
+	elf = elf_begin(fd, ELF_C_READ, NULL);
+	if (elf == NULL) goto err_exit;
+
+	/* Find the '.dynsym' section */
+	scn = elf_nextscn(elf, NULL);
+	while (scn != NULL) {
+		if (gelf_getshdr(scn, &shdr) == NULL) goto err_exit;
+		if (shdr.sh_type == SHT_DYNSYM) break;
+		scn = elf_nextscn(elf, scn);
+	}
+	if (scn == NULL) goto err_exit;
+
+	/* Search for the requested symbol by name and offset */
+	data = elf_getdata(scn, NULL);
+	count = shdr.sh_size / shdr.sh_entsize;
+	for (i = 0; i < count; i++) {
+		gelf_getsym(data, i, &sym);
+		if ((strcmp(dlip->dli_sname,
+		        elf_strptr(elf, shdr.sh_link, sym.st_name)) == 0) &&
+		    (sym.st_value == (dlip->dli_saddr - dlip->dli_fbase))) {
+			break;
+		}
+	}
+
+	/* Close ELF file */
+	elf_end(elf);
+	close(fd);
+
+	/* Return symbol entry in native format */
+	desym.st_name = sym.st_name;
+	desym.st_info = sym.st_info;
+	desym.st_other = sym.st_other;
+	desym.st_shndx = sym.st_shndx;
+	desym.st_value = sym.st_value;
+	desym.st_size = sym.st_size;
+	*info = &desym;
+	return 1;
+
+	/* Error handler */
+err_exit:
+	if (elf != NULL) elf_end(elf);
+	if (fd >= 0) close(fd);
+	return 0;
+}
+#endif
+
 static void
 vboxPatchMesaExport(const char* psFuncName, const void *pStart, const void *pEnd)
 {
