* reloc.c (BFD_RELOC_MIPS_GOT_HI16): Define.
authorIan Lance Taylor <ian@airs.com>
Tue, 13 Feb 1996 22:08:52 +0000 (22:08 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 13 Feb 1996 22:08:52 +0000 (22:08 +0000)
(BFD_RELOC_MIPS_GOT_LO16): Define.
* bfd-in2.h, libbfd.h: Rebuild.
* elf32-mips.c (mips_reloc_map): Map new relocs.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/elf32-mips.c
bfd/libbfd.h
bfd/reloc.c

index 5b9276b10955fd8d766bd12f1eb24fd303407933..1bbeaea2a1d5a47c1f4a9c3768d545938c483a19 100644 (file)
@@ -11,6 +11,11 @@ Tue Feb 13 15:36:37 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
 
 Tue Feb 13 14:35:15 1996  Ian Lance Taylor  <ian@cygnus.com>
 
+       * reloc.c (BFD_RELOC_MIPS_GOT_HI16): Define.
+       (BFD_RELOC_MIPS_GOT_LO16): Define.
+       * bfd-in2.h, libbfd.h: Rebuild.
+       * elf32-mips.c (mips_reloc_map): Map new relocs.
+
        * configure.host: Set HDLFLAGS for *-*-hpux with --enable-shared.
 
        * Makefile.in ($(SHLINK)): Check ts against $(SHLIB), not
index cd3785a89fc4abb1f6e6423f06bd413eb0bded43..c19551aa22fe75ed1a57f2359aa0d9f83440ed49 100644 (file)
@@ -1523,7 +1523,9 @@ relocation types already defined. */
   BFD_RELOC_SPARC_WDISP16,
   BFD_RELOC_SPARC_WDISP19,
   BFD_RELOC_SPARC_GLOB_JMP,
-  BFD_RELOC_SPARC_LO7,
+  BFD_RELOC_SPARC_7,
+  BFD_RELOC_SPARC_6,
+  BFD_RELOC_SPARC_5,
 
 /* Alpha ECOFF relocations.  Some of these treat the symbol or "addend"
 in some special way.
@@ -1598,6 +1600,8 @@ to compensate for the borrow when the low bits are added. */
   BFD_RELOC_MIPS_GOT16,
   BFD_RELOC_MIPS_CALL16,
 #define BFD_RELOC_MIPS_GPREL32 BFD_RELOC_GPREL32
+  BFD_RELOC_MIPS_GOT_HI16,
+  BFD_RELOC_MIPS_GOT_LO16,
 
 /* i386/elf relocations */
   BFD_RELOC_386_GOT32,
index b6c544a99abe8d8421fdc383a5c192ca0bfcadf7..e9bdba3cc4044096ad50c871cd61e5eadbf555c3 100644 (file)
@@ -1250,7 +1250,9 @@ static CONST struct elf_reloc_map mips_reloc_map[] =
   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
   { BFD_RELOC_16_PCREL, R_MIPS_PC16 },
   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
-  { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 }
+  { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 },
+  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
+  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 }
 };
 
 /* Given a BFD reloc type, return a howto structure.  */
@@ -3956,6 +3958,9 @@ mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
              local = false;
              indx = r_symndx - extsymoff;
              h = elf_sym_hashes (input_bfd)[indx];
+             while (h->root.type == bfd_link_hash_indirect
+                    || h->root.type == bfd_link_hash_warning)
+               h = (struct elf_link_hash_entry *) h->root.u.i.link;
              if (strcmp (h->root.root.string, "_gp_disp") == 0)
                {
                  if (elf_gp (output_bfd) == 0)
@@ -4350,6 +4355,7 @@ mips_elf_create_dynamic_sections (abfd, info)
                  get_elf_backend_data (abfd)->collect,
                  (struct bfd_link_hash_entry **) &h)))
            return false;
+         h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
          h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
          h->type = STT_SECTION;
 
@@ -4388,6 +4394,7 @@ mips_elf_create_dynamic_sections (abfd, info)
              get_elf_backend_data (abfd)->collect,
              (struct bfd_link_hash_entry **) &h)))
        return false;
+      h->elf_link_hash_flags ^=~ ELF_LINK_NON_ELF;
       h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
       h->type = STT_SECTION;
 
@@ -4458,6 +4465,7 @@ mips_elf_create_got_section (abfd, info)
          get_elf_backend_data (abfd)->collect,
          (struct bfd_link_hash_entry **) &h)))
     return false;
+  h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
   h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
   h->type = STT_OBJECT;
 
@@ -5832,6 +5840,5 @@ static const struct ecoff_debug_swap mips_elf_ecoff_debug_swap =
                                        mips_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections \
                                        mips_elf_finish_dynamic_sections
-#define elf_backend_want_hdr_in_seg    1
 
 #include "elf32-target.h"
index 49fb97149b72d0c0f05f47fab7fd91c684c5cab0..6f18e90b8950a6c8d533b67b6771bcdaccaa065a 100644 (file)
@@ -347,6 +347,11 @@ extern long _bfd_generic_read_minisymbols
 extern asymbol *_bfd_generic_minisymbol_to_symbol
   PARAMS ((bfd *, boolean, const PTR, asymbol *));
 
+/* Find the nearest line using .stab/.stabstr sections.  */
+extern boolean _bfd_stab_section_find_nearest_line
+  PARAMS ((bfd *, asymbol **, asection *, bfd_vma, boolean *, const char **,
+          const char **, unsigned int *, PTR *));
+
 /* A routine to create entries for a bfd_link_hash_table.  */
 extern struct bfd_hash_entry *_bfd_link_hash_newfunc
   PARAMS ((struct bfd_hash_entry *entry,
@@ -601,7 +606,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_SPARC_WDISP16",
   "BFD_RELOC_SPARC_WDISP19",
   "BFD_RELOC_SPARC_GLOB_JMP",
-  "BFD_RELOC_SPARC_LO7",
+  "BFD_RELOC_SPARC_7",
+  "BFD_RELOC_SPARC_6",
+  "BFD_RELOC_SPARC_5",
   "BFD_RELOC_ALPHA_GPDISP_HI16",
   "BFD_RELOC_ALPHA_GPDISP_LO16",
   "BFD_RELOC_ALPHA_LITERAL",
@@ -616,6 +623,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_MIPS_LITERAL",
   "BFD_RELOC_MIPS_GOT16",
   "BFD_RELOC_MIPS_CALL16",
+  "BFD_RELOC_MIPS_GOT_HI16",
+  "BFD_RELOC_MIPS_GOT_LO16",
   "BFD_RELOC_386_GOT32",
   "BFD_RELOC_386_PLT32",
   "BFD_RELOC_386_COPY",
@@ -650,6 +659,22 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_PPC_JMP_SLOT",
   "BFD_RELOC_PPC_RELATIVE",
   "BFD_RELOC_PPC_LOCAL24PC",
+  "BFD_RELOC_PPC_EMB_NADDR32",
+  "BFD_RELOC_PPC_EMB_NADDR16",
+  "BFD_RELOC_PPC_EMB_NADDR16_LO",
+  "BFD_RELOC_PPC_EMB_NADDR16_HI",
+  "BFD_RELOC_PPC_EMB_NADDR16_HA",
+  "BFD_RELOC_PPC_EMB_SDAI16",
+  "BFD_RELOC_PPC_EMB_SDA2I16",
+  "BFD_RELOC_PPC_EMB_SDA2REL",
+  "BFD_RELOC_PPC_EMB_SDA21",
+  "BFD_RELOC_PPC_EMB_MRKREF",
+  "BFD_RELOC_PPC_EMB_RELSEC16",
+  "BFD_RELOC_PPC_EMB_RELST_LO",
+  "BFD_RELOC_PPC_EMB_RELST_HI",
+  "BFD_RELOC_PPC_EMB_RELST_HA",
+  "BFD_RELOC_PPC_EMB_BIT_FLD",
+  "BFD_RELOC_PPC_EMB_RELSDA",
   "BFD_RELOC_CTOR",
   "BFD_RELOC_ARM_PCREL_BRANCH",
   "BFD_RELOC_ARM_IMMEDIATE",
index 328525286f6af57dcf33ff62075fa75fed0a3c8a..5e6004a638b85a2c7b5fd935f59c1ea2cd42dab4 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD support for handling relocation entries.
-   Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+   Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -16,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /*
 SECTION
@@ -105,7 +105,7 @@ CODE_FRAGMENT
 .  bfd_vma addend;
 .
 .       {* Pointer to how to perform the required relocation *}
-.  const struct reloc_howto_struct *howto;
+.  reloc_howto_type *howto;
 .
 .} arelent;
 
@@ -286,9 +286,6 @@ SUBSUBSECTION
 CODE_FRAGMENT
 .struct symbol_cache_entry;            {* Forward declaration *}
 .
-.typedef unsigned char bfd_byte;
-.typedef const struct reloc_howto_struct reloc_howto_type;
-.
 .struct reloc_howto_struct
 .{
 .       {*  The type field has mainly a documetary use - the back end can
@@ -719,16 +716,14 @@ space consuming.  For each target:
      machine word.
      FIXME: We should also do overflow checking on the result after
      adding in the value contained in the object file.  */
-  if (howto->complain_on_overflow != complain_overflow_dont)
+  if (howto->complain_on_overflow != complain_overflow_dont
+      && flag == bfd_reloc_ok)
     {
       bfd_vma check;
 
       /* Get the value that will be used for the relocation, but
         starting at bit position zero.  */
-      if (howto->rightshift > howto->bitpos)
-       check = relocation >> (howto->rightshift - howto->bitpos);
-      else
-       check = relocation << (howto->bitpos - howto->rightshift);
+      check = relocation >> howto->rightshift;
       switch (howto->complain_on_overflow)
        {
        case complain_overflow_signed:
@@ -739,11 +734,11 @@ space consuming.  For each target:
 
            /* The above right shift is incorrect for a signed value.
               Fix it up by forcing on the upper bits.  */
-           if (howto->rightshift > howto->bitpos
+           if (howto->rightshift > 0
                && (bfd_signed_vma) relocation < 0)
              check |= ((bfd_vma) - 1
                        & ~((bfd_vma) - 1
-                           >> (howto->rightshift - howto->bitpos)));
+                           >> howto->rightshift));
            if ((bfd_signed_vma) check > reloc_signed_max
                || (bfd_signed_vma) check < reloc_signed_min)
              flag = bfd_reloc_overflow;
@@ -774,12 +769,12 @@ space consuming.  For each target:
                /* The above right shift is incorrect for a signed
                   value.  See if turning on the upper bits fixes the
                   overflow.  */
-               if (howto->rightshift > howto->bitpos
+               if (howto->rightshift > 0
                    && (bfd_signed_vma) relocation < 0)
                  {
                    check |= ((bfd_vma) - 1
                              & ~((bfd_vma) - 1
-                                 >> (howto->rightshift - howto->bitpos)));
+                                 >> howto->rightshift));
                    if (((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits))
                      flag = bfd_reloc_overflow;
                  }
@@ -899,6 +894,15 @@ space consuming.  For each target:
       }
       break;
 
+    case -1:
+      {
+       long x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
+       relocation = -relocation;
+       DOIT (x);
+       bfd_put_16 (abfd, x, (bfd_byte *) data + addr);
+      }
+      break;
+
     case 3:
       /* Do nothing */
       break;
@@ -1176,10 +1180,7 @@ space consuming.  For each target:
 
       /* Get the value that will be used for the relocation, but
         starting at bit position zero.  */
-      if (howto->rightshift > howto->bitpos)
-       check = relocation >> (howto->rightshift - howto->bitpos);
-      else
-       check = relocation << (howto->bitpos - howto->rightshift);
+      check = relocation >> howto->rightshift;
       switch (howto->complain_on_overflow)
        {
        case complain_overflow_signed:
@@ -1190,11 +1191,11 @@ space consuming.  For each target:
 
            /* The above right shift is incorrect for a signed value.
               Fix it up by forcing on the upper bits.  */
-           if (howto->rightshift > howto->bitpos
+           if (howto->rightshift > 0
                && (bfd_signed_vma) relocation < 0)
              check |= ((bfd_vma) - 1
                        & ~((bfd_vma) - 1
-                           >> (howto->rightshift - howto->bitpos)));
+                           >> howto->rightshift));
            if ((bfd_signed_vma) check > reloc_signed_max
                || (bfd_signed_vma) check < reloc_signed_min)
              flag = bfd_reloc_overflow;
@@ -1225,12 +1226,12 @@ space consuming.  For each target:
                /* The above right shift is incorrect for a signed
                   value.  See if turning on the upper bits fixes the
                   overflow.  */
-               if (howto->rightshift > howto->bitpos
+               if (howto->rightshift > 0
                    && (bfd_signed_vma) relocation < 0)
                  {
                    check |= ((bfd_vma) - 1
                              & ~((bfd_vma) - 1
-                                 >> (howto->rightshift - howto->bitpos)));
+                                 >> howto->rightshift));
                    if (((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits))
                      flag = bfd_reloc_overflow;
                  }
@@ -1692,12 +1693,70 @@ the section containing the relocation.  It depends on the specific target.
 
 The 24-bit relocation is used in some Intel 960 configurations.
 
+ENUM
+  BFD_RELOC_32_GOT_PCREL
+ENUMX
+  BFD_RELOC_16_GOT_PCREL
+ENUMX
+  BFD_RELOC_8_GOT_PCREL
+ENUMX
+  BFD_RELOC_32_GOTOFF
+ENUMX
+  BFD_RELOC_16_GOTOFF
+ENUMX
+  BFD_RELOC_LO16_GOTOFF
+ENUMX
+  BFD_RELOC_HI16_GOTOFF
+ENUMX
+  BFD_RELOC_HI16_S_GOTOFF
+ENUMX
+  BFD_RELOC_8_GOTOFF
+ENUMX
+  BFD_RELOC_32_PLT_PCREL
+ENUMX
+  BFD_RELOC_24_PLT_PCREL
+ENUMX
+  BFD_RELOC_16_PLT_PCREL
+ENUMX
+  BFD_RELOC_8_PLT_PCREL
+ENUMX
+  BFD_RELOC_32_PLTOFF
+ENUMX
+  BFD_RELOC_16_PLTOFF
+ENUMX
+  BFD_RELOC_LO16_PLTOFF
+ENUMX
+  BFD_RELOC_HI16_PLTOFF
+ENUMX
+  BFD_RELOC_HI16_S_PLTOFF
+ENUMX
+  BFD_RELOC_8_PLTOFF
+ENUMDOC
+  For ELF.
+
+ENUM
+  BFD_RELOC_68K_GLOB_DAT
+ENUMX
+  BFD_RELOC_68K_JMP_SLOT
+ENUMX
+  BFD_RELOC_68K_RELATIVE
+ENUMDOC
+  Relocations used by 68K ELF.
+
 ENUM
   BFD_RELOC_32_BASEREL
 ENUMX
   BFD_RELOC_16_BASEREL
+ENUMX
+  BFD_RELOC_LO16_BASEREL
+ENUMX
+  BFD_RELOC_HI16_BASEREL
+ENUMX
+  BFD_RELOC_HI16_S_BASEREL
 ENUMX
   BFD_RELOC_8_BASEREL
+ENUMX
+  BFD_RELOC_RVA
 ENUMDOC
   Linkage-table relative.
 
@@ -1813,7 +1872,11 @@ ENUMX
 ENUMX
   BFD_RELOC_SPARC_GLOB_JMP
 ENUMX
-  BFD_RELOC_SPARC_LO7
+  BFD_RELOC_SPARC_7
+ENUMX
+  BFD_RELOC_SPARC_6
+ENUMX
+  BFD_RELOC_SPARC_5
 ENUMDOC
   Some relocations we're using for SPARC V9 -- subject to change.
 
@@ -1914,6 +1977,10 @@ ENUMX
 ENUMEQX
   BFD_RELOC_MIPS_GPREL32
   BFD_RELOC_GPREL32
+ENUMX
+  BFD_RELOC_MIPS_GOT_HI16
+ENUMX
+  BFD_RELOC_MIPS_GOT_LO16
 ENUMDOC
   MIPS ELF relocations.
 
@@ -1965,18 +2032,66 @@ ENUMDOC
 
 ENUM
   BFD_RELOC_PPC_B26
-ENUMDOC
-  PowerPC/POWER (RS/6000) relocs.
-  26 bit relative branch.  Low two bits must be zero.  High 24
-     bits installed in bits 6 through 29 of instruction.
-ENUM
+ENUMX
   BFD_RELOC_PPC_BA26
-ENUMDOC
-  26 bit absolute branch, like BFD_RELOC_PPC_B26 but absolute.
-ENUM
+ENUMX
   BFD_RELOC_PPC_TOC16
+ENUMX
+  BFD_RELOC_PPC_B16
+ENUMX
+  BFD_RELOC_PPC_B16_BRTAKEN
+ENUMX
+  BFD_RELOC_PPC_B16_BRNTAKEN
+ENUMX
+  BFD_RELOC_PPC_BA16
+ENUMX
+  BFD_RELOC_PPC_BA16_BRTAKEN
+ENUMX
+  BFD_RELOC_PPC_BA16_BRNTAKEN
+ENUMX
+  BFD_RELOC_PPC_COPY
+ENUMX
+  BFD_RELOC_PPC_GLOB_DAT
+ENUMX
+  BFD_RELOC_PPC_JMP_SLOT
+ENUMX
+  BFD_RELOC_PPC_RELATIVE
+ENUMX
+  BFD_RELOC_PPC_LOCAL24PC
+ENUMX
+  BFD_RELOC_PPC_EMB_NADDR32
+ENUMX
+  BFD_RELOC_PPC_EMB_NADDR16
+ENUMX
+  BFD_RELOC_PPC_EMB_NADDR16_LO
+ENUMX
+  BFD_RELOC_PPC_EMB_NADDR16_HI
+ENUMX
+  BFD_RELOC_PPC_EMB_NADDR16_HA
+ENUMX
+  BFD_RELOC_PPC_EMB_SDAI16
+ENUMX
+  BFD_RELOC_PPC_EMB_SDA2I16
+ENUMX
+  BFD_RELOC_PPC_EMB_SDA2REL
+ENUMX
+  BFD_RELOC_PPC_EMB_SDA21
+ENUMX
+  BFD_RELOC_PPC_EMB_MRKREF
+ENUMX
+  BFD_RELOC_PPC_EMB_RELSEC16
+ENUMX
+  BFD_RELOC_PPC_EMB_RELST_LO
+ENUMX
+  BFD_RELOC_PPC_EMB_RELST_HI
+ENUMX
+  BFD_RELOC_PPC_EMB_RELST_HA
+ENUMX
+  BFD_RELOC_PPC_EMB_BIT_FLD
+ENUMX
+  BFD_RELOC_PPC_EMB_RELSDA
 ENUMDOC
-  16 bit TOC relative reference.
+  Power(rs6000) and PowerPC relocations.
 
 ENUM
   BFD_RELOC_CTOR
@@ -2002,6 +2117,14 @@ ENUMX
   BFD_RELOC_ARM_MULTI
 ENUMX
   BFD_RELOC_ARM_CP_OFF_IMM
+ENUMX
+  BFD_RELOC_ARM_ADR_IMM
+ENUMX
+  BFD_RELOC_ARM_LDR_IMM
+ENUMX
+  BFD_RELOC_ARM_LITERAL
+ENUMX
+  BFD_RELOC_ARM_IN_POOL
 ENUMDOC
   These relocs are only used within the ARM assembler.  They are not
   (at present) written to any object files.
@@ -2013,14 +2136,18 @@ ENUM
 ENUMDOC
   Argonaut RISC Core (ARC) relocs.
   ARC 22 bit pc-relative branch.  The lowest two bits must be zero and are
-  not stored in the instruction.  High 20 bits installed in bits 7 through 26
-  of instruction.
+  not stored in the instruction.  The high 20 bits are installed in bits 26
+  through 7 of the instruction.
+ENUM
+  BFD_RELOC_ARC_B26
+ENUMDOC
+  ARC 26 bit absolute branch.  The lowest two bits must be zero and are not
+  stored in the instruction.  The high 24 bits are installed in bits 23
+  through 0.
 COMMENT
 {* end-sanitize-arc *}
-
 ENDSENUM
   BFD_RELOC_UNUSED
-
 CODE_FRAGMENT
 .
 .typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
@@ -2032,7 +2159,7 @@ FUNCTION
        bfd_reloc_type_lookup
 
 SYNOPSIS
-       const struct reloc_howto_struct *
+       reloc_howto_type *
        bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code);
 
 DESCRIPTION
@@ -2043,7 +2170,7 @@ DESCRIPTION
 */
 
 
-const struct reloc_howto_struct *
+reloc_howto_type *
 bfd_reloc_type_lookup (abfd, code)
      bfd *abfd;
      bfd_reloc_code_real_type code;
@@ -2060,7 +2187,7 @@ INTERNAL_FUNCTION
        bfd_default_reloc_type_lookup
 
 SYNOPSIS
-       const struct reloc_howto_struct *bfd_default_reloc_type_lookup
+       reloc_howto_type *bfd_default_reloc_type_lookup
        (bfd *abfd, bfd_reloc_code_real_type  code);
 
 DESCRIPTION
@@ -2069,7 +2196,7 @@ DESCRIPTION
 
 */
 
-const struct reloc_howto_struct *
+reloc_howto_type *
 bfd_default_reloc_type_lookup (abfd, code)
      bfd *abfd;
      bfd_reloc_code_real_type code;
@@ -2093,7 +2220,7 @@ bfd_default_reloc_type_lookup (abfd, code)
     default:
       BFD_FAIL ();
     }
-  return (const struct reloc_howto_struct *) NULL;
+  return (reloc_howto_type *) NULL;
 }
 
 /*
@@ -2185,12 +2312,9 @@ bfd_generic_get_relocated_section_contents (abfd, link_info, link_order, data,
   if (reloc_size < 0)
     goto error_return;
 
-  reloc_vector = (arelent **) malloc (reloc_size);
+  reloc_vector = (arelent **) bfd_malloc ((size_t) reloc_size);
   if (reloc_vector == NULL && reloc_size != 0)
-    {
-      bfd_set_error (bfd_error_no_memory);
-      goto error_return;
-    }
+    goto error_return;
 
   /* read in the section */
   if (!bfd_get_section_contents (input_bfd,