* bfd-in.h (bfd_family_coff): Define.
[deliverable/binutils-gdb.git] / bfd / coffgen.c
index f2410d919d9a256c773abc5b8fd4fa870d07b53d..dee819b2646924f1f367eeb19e5fa1af0576c038 100644 (file)
@@ -525,7 +525,7 @@ coff_count_linenumbers (abfd)
     {
       asymbol *q_maybe = *p;
 
-      if (bfd_asymbol_flavour (q_maybe) == bfd_target_coff_flavour)
+      if (bfd_family_coff (bfd_asymbol_bfd (q_maybe)))
        {
          coff_symbol_type *q = coffsymbol (q_maybe);
 
@@ -564,7 +564,7 @@ coff_symbol_from (ignore_abfd, symbol)
      bfd *ignore_abfd ATTRIBUTE_UNUSED;
      asymbol *symbol;
 {
-  if (bfd_asymbol_flavour (symbol) != bfd_target_coff_flavour)
+  if (!bfd_family_coff (bfd_asymbol_bfd (symbol)))
     return (coff_symbol_type *) NULL;
 
   if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL)
@@ -608,8 +608,11 @@ fixup_symbol_value (abfd, coff_symbol_ptr, syment)
          syment->n_value = (coff_symbol_ptr->symbol.value
                             + coff_symbol_ptr->symbol.section->output_offset);
          if (! obj_pe (abfd))
-           syment->n_value +=
-             coff_symbol_ptr->symbol.section->output_section->vma;
+            {
+              syment->n_value += (syment->n_sclass == C_STATLAB)
+                ? coff_symbol_ptr->symbol.section->output_section->lma
+                : coff_symbol_ptr->symbol.section->output_section->vma;
+            }
        }
       else
        {
@@ -816,7 +819,16 @@ coff_fix_symbol_name (abfd, symbol, native, string_size_p,
     {
       unsigned int filnmlen;
 
-      strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
+      if (bfd_coff_force_symnames_in_strings (abfd))
+       {
+          native->u.syment._n._n_n._n_offset = 
+             (*string_size_p + STRING_SIZE_SIZE);
+         native->u.syment._n._n_n._n_zeroes = 0;
+         *string_size_p += 6;  /* strlen(".file") + 1 */
+       }
+      else
+       strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
+
       auxent = &(native + 1)->u.auxent;
 
       filnmlen = bfd_coff_filnmlen (abfd);
@@ -843,7 +855,7 @@ coff_fix_symbol_name (abfd, symbol, native, string_size_p,
     }
   else
     {
-      if (name_length <= SYMNMLEN)
+      if (name_length <= SYMNMLEN && !bfd_coff_force_symnames_in_strings (abfd))
        {
          /* This name will fit into the symbol neatly */
          strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
@@ -858,7 +870,8 @@ coff_fix_symbol_name (abfd, symbol, native, string_size_p,
       else
        {
          long filepos;
-         bfd_byte buf[2];
+         bfd_byte buf[4];
+         int prefix_len = bfd_coff_debug_string_prefix_length (abfd);
 
          /* This name should be written into the .debug section.  For
             some reason each name is preceded by a two byte length
@@ -868,24 +881,29 @@ coff_fix_symbol_name (abfd, symbol, native, string_size_p,
          if (*debug_string_section_p == (asection *) NULL)
            *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
          filepos = bfd_tell (abfd);
-         bfd_put_16 (abfd, name_length + 1, buf);
+         if (prefix_len == 4)
+           bfd_put_32 (abfd, name_length + 1, buf);
+         else
+           bfd_put_16 (abfd, name_length + 1, buf);
+
          if (!bfd_set_section_contents (abfd,
                                         *debug_string_section_p,
                                         (PTR) buf,
                                         (file_ptr) *debug_string_size_p,
-                                        (bfd_size_type) 2)
+                                        (bfd_size_type) prefix_len)
              || !bfd_set_section_contents (abfd,
                                            *debug_string_section_p,
                                            (PTR) symbol->name,
                                            ((file_ptr) *debug_string_size_p
-                                            + 2),
+                                            + prefix_len),
                                            (bfd_size_type) name_length + 1))
            abort ();
          if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
            abort ();
-         native->u.syment._n._n_n._n_offset = *debug_string_size_p + 2;
+         native->u.syment._n._n_n._n_offset = 
+             *debug_string_size_p + prefix_len;
          native->u.syment._n._n_n._n_zeroes = 0;
-         *debug_string_size_p += name_length + 3;
+         *debug_string_size_p += name_length + 1 + prefix_len;
        }
     }
 }
@@ -1241,7 +1259,7 @@ coff_write_symbols (abfd)
            {
              /* This is not a COFF symbol, so it certainly is not a
                 file name, nor does it go in the .debug section.  */
-             maxlen = SYMNMLEN;
+             maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
            }
          else if (bfd_coff_symname_in_debug (abfd,
                                              &c_symbol->native->u.syment))
@@ -1252,9 +1270,13 @@ coff_write_symbols (abfd)
            }
          else if (c_symbol->native->u.syment.n_sclass == C_FILE
                   && c_symbol->native->u.syment.n_numaux > 0)
-           maxlen = bfd_coff_filnmlen (abfd);
+           {
+             if (bfd_coff_force_symnames_in_strings (abfd)) 
+               bfd_write (".file", 1, 6, abfd);
+             maxlen = bfd_coff_filnmlen (abfd);
+           }
          else
-           maxlen = SYMNMLEN;
+           maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN;
 
          if (name_length > maxlen)
            {
@@ -2178,7 +2200,7 @@ coff_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
   *line_ptr = 0;
 
   /* Don't try and find line numbers in a non coff file */
-  if (abfd->xvec->flavour != bfd_target_coff_flavour)
+  if (!bfd_family_coff (abfd))
     return false;
 
   if (cof == NULL)
This page took 0.025431 seconds and 4 git commands to generate.