Thu Nov 19 16:02:46 1998 Dave Brolley <brolley@cygnus.com>
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index b11cfb409937d7eac032426a06934f5599968ea7..99bf9e521a09ffdb4c3025f05d68400f7f726750 100644 (file)
@@ -863,7 +863,8 @@ dependent COFF routines:
 .       struct bfd_link_hash_entry **hashp));
 .
 . boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
-.      bfd * abfd ));
+.      bfd * abfd,
+.       struct coff_final_link_info * pfinfo));
 . boolean (*_bfd_coff_final_link_postscript) PARAMS ((
 .      bfd * abfd,
 .      struct coff_final_link_info * pfinfo));
@@ -982,8 +983,8 @@ dependent COFF routines:
 .        ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
 .         (info, abfd, name, flags, section, value, string, cp, coll, hashp))
 .
-.#define bfd_coff_link_output_has_begun(a) \
-.        ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a))
+.#define bfd_coff_link_output_has_begun(a,p) \
+.        ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
 .#define bfd_coff_final_link_postscript(a,p) \
 .        ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
 .
@@ -1028,6 +1029,8 @@ coff_new_section_hook (abfd, section)
      bfd * abfd;
      asection * section;
 {
+  combined_entry_type *native;
+
   section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
 
 #ifdef RS6000COFF_C
@@ -1044,9 +1047,21 @@ coff_new_section_hook (abfd, section)
 
      @@ The 10 is a guess at a plausible maximum number of aux entries
      (but shouldn't be a constant).  */
-  coffsymbol (section->symbol)->native =
-    (combined_entry_type *) bfd_zalloc (abfd,
-                                       sizeof (combined_entry_type) * 10);
+  native = ((combined_entry_type *)
+           bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
+  if (native == NULL)
+    return false;
+
+  /* We don't need to set up n_name, n_value, or n_scnum in the native
+     symbol information, since they'll be overriden by the BFD symbol
+     anyhow.  However, we do need to set the type and storage class,
+     in case this symbol winds up getting written out.  The value 0
+     for n_numaux is already correct.  */
+
+  native->u.syment.n_type = T_NULL;
+  native->u.syment.n_sclass = C_STAT;
+
+  coffsymbol (section->symbol)->native = native;
 
   /* The .stab section must be aligned to 2**2 at most, because
      otherwise there may be gaps in the section which gdb will not
@@ -1329,7 +1344,7 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
 
 #ifdef ARM 
   /* Set the flags field from the COFF header read in */
-  if (! coff_arm_bfd_set_private_flags (abfd, internal_f->f_flags))
+  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
     coff->flags = 0;
 #endif
   
@@ -2198,11 +2213,10 @@ coff_compute_section_file_positions (abfd)
   asection *previous = (asection *) NULL;
   file_ptr sofar = FILHSZ;
   boolean align_adjust;
-
-#ifndef I960
+  unsigned int count;
+#ifdef ALIGN_SECTIONS_IN_FILE
   file_ptr old_sofar;
 #endif
-  unsigned int count;
 
 #ifdef RS6000COFF_C
   /* On XCOFF, if we have symbols, set up the .debug section.  */
@@ -2741,13 +2755,22 @@ coff_write_object_contents (abfd)
        {
          unsigned int i, count;
          asymbol **psym;
-         coff_symbol_type *csym;
+         coff_symbol_type *csym = NULL;
+         asymbol **psymsec;
 
+         psymsec = NULL;
          count = bfd_get_symcount (abfd);
          for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
            {
-             /* Here *PSYM is the section symbol for CURRENT.  */
+             if ((*psym)->section != current)
+               continue;
+
+             /* Remember the location of the first symbol in this
+                 section.  */
+             if (psymsec == NULL)
+               psymsec = psym;
 
+             /* See if this is the section symbol.  */
              if (strcmp ((*psym)->name, current->name) == 0)
                {
                  csym = coff_symbol_from (abfd, *psym);
@@ -2757,6 +2780,9 @@ coff_write_object_contents (abfd)
                      || csym->native->u.syment.n_sclass != C_STAT
                      || csym->native->u.syment.n_type != T_NULL)
                    continue;
+
+                 /* Here *PSYM is the section symbol for CURRENT.  */
+
                  break;
                }
            }
@@ -2793,6 +2819,24 @@ coff_write_object_contents (abfd)
                    IMAGE_COMDAT_SELECT_EXACT_MATCH;
                  break;
                }
+
+             /* The COMDAT symbol must be the first symbol from this
+                 section in the symbol table.  In order to make this
+                 work, we move the COMDAT symbol before the first
+                 symbol we found in the search above.  It's OK to
+                 rearrange the symbol table at this point, because
+                 coff_renumber_symbols is going to rearrange it
+                 further and fix up all the aux entries.  */
+             if (psym != psymsec)
+               {
+                 asymbol *hold;
+                 asymbol **pcopy;
+
+                 hold = *psym;
+                 for (pcopy = psym; pcopy > psymsec; pcopy--)
+                   pcopy[0] = pcopy[-1];
+                 *psymsec = hold;
+               }
            }
        }
 #endif /* COFF_WITH_PE */
@@ -3353,10 +3397,11 @@ coff_slurp_line_table (abfd, asect)
 
              warned = false;
              symndx = dst.l_addr.l_symndx;
-             if (symndx < 0 || symndx >= obj_raw_syment_count (abfd))
+             if (symndx < 0
+                 || (unsigned long) symndx >= obj_raw_syment_count (abfd))
                {
                  (*_bfd_error_handler)
-                   ("%s: warning: illegal symbol index %ld in line numbers",
+                   (_("%s: warning: illegal symbol index %ld in line numbers"),
                     bfd_get_filename (abfd), dst.l_addr.l_symndx);
                  symndx = 0;
                  warned = true;
@@ -3370,7 +3415,7 @@ coff_slurp_line_table (abfd, asect)
              if (sym->lineno != NULL && ! warned)
                {
                  (*_bfd_error_handler)
-                   ("%s: warning: duplicate line number information for `%s'",
+                   (_("%s: warning: duplicate line number information for `%s'"),
                     bfd_get_filename (abfd),
                     bfd_asymbol_name (&sym->symbol));
                }
@@ -3474,7 +3519,7 @@ coff_slurp_symbol_table (abfd)
 #ifdef COFF_WITH_PE
             /* PE uses storage class 0x68 to denote a section symbol */
             case C_SECTION:
-           /* PE uses storage class 0x67 for a weak external symbol.  */
+           /* PE uses storage class 0x69 for a weak external symbol.  */
            case C_NT_WEAK:
 #endif
              if ((src->u.syment.n_scnum) == 0)
@@ -3693,7 +3738,7 @@ coff_slurp_symbol_table (abfd)
            case C_HIDDEN:      /* ext symbol in dmert public lib */
            default:
              (*_bfd_error_handler)
-               ("%s: Unrecognized storage class %d for %s symbol `%s'",
+               (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
                 bfd_get_filename (abfd), src->u.syment.n_sclass,
                 dst->symbol.section->name, dst->symbol.name);
              dst->symbol.flags = BSF_DEBUGGING;
@@ -3877,7 +3922,7 @@ coff_slurp_reloc_table (abfd, asect, symbols)
          if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
            {
              (*_bfd_error_handler)
-               ("%s: warning: illegal symbol index %ld in relocs",
+               (_("%s: warning: illegal symbol index %ld in relocs"),
                 bfd_get_filename (abfd), dst.r_symndx);
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
              ptr = NULL;
@@ -3915,7 +3960,7 @@ coff_slurp_reloc_table (abfd, asect, symbols)
       if (cache_ptr->howto == NULL)
        {
          (*_bfd_error_handler)
-           ("%s: illegal relocation type %d at address 0x%lx",
+           (_("%s: illegal relocation type %d at address 0x%lx"),
             bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
          bfd_set_error (bfd_error_bad_value);
          return false;
@@ -4098,8 +4143,9 @@ dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
 #ifndef coff_link_output_has_begun
 #define coff_link_output_has_begun _coff_link_output_has_begun
 static boolean
-_coff_link_output_has_begun (abfd)
+_coff_link_output_has_begun (abfd, info)
      bfd * abfd;
+     struct bfd_link_info * info;
 {
   return abfd->output_has_begun;
 }
@@ -4253,3 +4299,7 @@ static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
 #ifndef coff_bfd_relax_section
 #define coff_bfd_relax_section             bfd_generic_relax_section
 #endif
+
+#ifndef coff_bfd_gc_sections
+#define coff_bfd_gc_sections               bfd_generic_gc_sections
+#endif
This page took 0.026579 seconds and 4 git commands to generate.