=== modified file 'binutils/readelf.c'
--- binutils/readelf.c	2012-04-07 20:45:47 +0000
+++ binutils/readelf.c	2012-04-07 21:29:22 +0000
@@ -8600,6 +8600,7 @@ get_symbol_binding (unsigned int binding
 	{
 	  if (binding == STB_GNU_UNIQUE
 	      && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
+		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
 		  /* GNU is still using the default value 0.  */
 		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
 	    return "UNIQUE";
@@ -8653,6 +8654,7 @@ get_symbol_type (unsigned int type)
 
 	  if (type == STT_GNU_IFUNC
 	      && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
+		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
 		  /* GNU is still using the default value 0.  */
 		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
 	    return "IFUNC";

=== modified file 'gas/config/obj-elf.c'
--- gas/config/obj-elf.c	2012-04-07 20:45:47 +0000
+++ gas/config/obj-elf.c	2012-04-07 21:30:40 +0000
@@ -1702,6 +1702,7 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSE
 
       bed = get_elf_backend_data (stdoutput);
       if (!(bed->elf_osabi == ELFOSABI_GNU
+	    || bed->elf_osabi == ELFOSABI_FREEBSD
 	    /* GNU is still using the default value 0.  */
 	    || bed->elf_osabi == ELFOSABI_NONE))
 	as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
@@ -1714,12 +1715,14 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSE
 
       bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput);
       if (!(bed->elf_osabi == ELFOSABI_GNU
+	    || bed->elf_osabi == ELFOSABI_FREEBSD
 	    /* GNU is still using the default value 0.  */
 	    || bed->elf_osabi == ELFOSABI_NONE))
 	as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
 		type_name);
       type = BSF_OBJECT | BSF_GNU_UNIQUE;
       /* PR 10549: Always set OSABI field to GNU for objects containing unique symbols.  */
+      if (bed->elf_osabi != ELFOSABI_FREEBSD)
       bed->elf_osabi = ELFOSABI_GNU;
     }
 #ifdef md_elf_symbol_type

