]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - bfd/coffcode.h
Updated soruces in bfd/* to compile cleanly with -Wc++-compat.
[thirdparty/binutils-gdb.git] / bfd / coffcode.h
index cfa1a40567aca1a74aeb3167008c3492266a6fda..19f4159ac3185a0410fce8633e65766161278f26 100644 (file)
@@ -153,6 +153,14 @@ SUBSUBSECTION
        points to a function that allows the value of the flag to be altered
        at runtime, on formats that support long section names at all; on
        other formats it points to a stub that returns an error indication.
+       
+       With input BFDs, the flag is set according to whether any long section
+       names are detected while reading the section headers.  For a completely
+       new BFD, the flag is set to the default for the target format.  This
+       information can be used by a client of the BFD library when deciding
+       what output format to generate, and means that a BFD that is opened
+       for read and subsequently converted to a writeable BFD and modified
+       in-place will retain whatever format it had on input.
 
        If @code{COFF_LONG_SECTION_NAMES} is simply defined (blank), or is
        defined to the value "1", then long section names are enabled by
@@ -353,6 +361,8 @@ CODE_FRAGMENT
 
 */
 
+#include "libiberty.h"
+
 #ifdef COFF_WITH_PE
 #include "peicode.h"
 #else
@@ -363,6 +373,7 @@ CODE_FRAGMENT
 
 #define DOT_DEBUG      ".debug"
 #define GNU_LINKONCE_WI ".gnu.linkonce.wi."
+#define DOT_RELOC      ".reloc"
 
 #if defined (COFF_LONG_SECTION_NAMES)
 /* Needed to expand the inputs to BLANKOR1TOODD.  */
@@ -637,7 +648,7 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
   /* FIXME: There is no gas syntax to specify the debug section flag.  */
   if (CONST_STRNEQ (sec_name, DOT_DEBUG)
       || CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
-    sec_flags = SEC_DEBUGGING;
+    sec_flags = SEC_DEBUGGING | SEC_READONLY;
 
   /* skip LOAD */
   /* READONLY later */
@@ -666,19 +677,14 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
   /* skip LINK_DUPLICATES */
   /* skip LINKER_CREATED */
 
-  if (sec_flags & (SEC_ALLOC | SEC_LOAD))
-    {
-      /* For now, the read/write bits are mapped onto SEC_READONLY, even
-        though the semantics don't quite match.  The bits from the input
-        are retained in pei_section_data(abfd, section)->pe_flags.  */
-      styp_flags |= IMAGE_SCN_MEM_READ;       /* Always readable.  */
-      if ((sec_flags & SEC_READONLY) == 0)
-       styp_flags |= IMAGE_SCN_MEM_WRITE;    /* Invert READONLY for write.  */
-      if (sec_flags & SEC_CODE)
-       styp_flags |= IMAGE_SCN_MEM_EXECUTE;  /* CODE->EXECUTE.  */
-      if (sec_flags & SEC_COFF_SHARED)
-       styp_flags |= IMAGE_SCN_MEM_SHARED;   /* Shared remains meaningful.  */
-    }
+  if ((sec_flags & SEC_COFF_NOREAD) == 0)
+    styp_flags |= IMAGE_SCN_MEM_READ;     /* Invert NOREAD for read.  */
+  if ((sec_flags & SEC_READONLY) == 0)
+    styp_flags |= IMAGE_SCN_MEM_WRITE;    /* Invert READONLY for write.  */
+  if (sec_flags & SEC_CODE)
+    styp_flags |= IMAGE_SCN_MEM_EXECUTE;  /* CODE->EXECUTE.  */
+  if (sec_flags & SEC_COFF_SHARED)
+    styp_flags |= IMAGE_SCN_MEM_SHARED;   /* Shared remains meaningful.  */
 
   return styp_flags;
 }
@@ -941,7 +947,8 @@ handle_COMDAT (bfd * abfd,
                   but there's some checking we can do to be
                   sure.  */
 
-               if (! (isym.n_sclass == C_STAT
+               if (! ((isym.n_sclass == C_STAT
+                       || isym.n_sclass == C_EXT)
                       && isym.n_type == T_NULL
                       && isym.n_value == 0))
                  abort ();
@@ -951,7 +958,7 @@ handle_COMDAT (bfd * abfd,
                   names like .text$foo__Fv (in the case of a
                   function).  See comment above for more.  */
 
-               if (strcmp (name, symname) != 0)
+               if (isym.n_sclass == C_STAT && strcmp (name, symname) != 0)
                  _bfd_error_handler (_("%B: warning: COMDAT symbol '%s' does not match section name '%s'"),
                                      abfd, symname, name);
 
@@ -1064,7 +1071,7 @@ handle_COMDAT (bfd * abfd,
 
                amt = sizeof (struct coff_comdat_info);
                coff_section_data (abfd, section)->comdat
-                 = bfd_alloc (abfd, amt);
+                 = (struct coff_comdat_info *) bfd_alloc (abfd, amt);
                if (coff_section_data (abfd, section)->comdat == NULL)
                  abort ();
 
@@ -1072,7 +1079,7 @@ handle_COMDAT (bfd * abfd,
                  (esym - esymstart) / bfd_coff_symesz (abfd);
 
                amt = strlen (symname) + 1;
-               newname = bfd_alloc (abfd, amt);
+               newname = (char *) bfd_alloc (abfd, amt);
                if (newname == NULL)
                  abort ();
 
@@ -1117,6 +1124,10 @@ styp_to_sec_flags (bfd *abfd,
   /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified.  */
   sec_flags = SEC_READONLY;
 
+  /* If section disallows read, then set the NOREAD flag. */
+  if ((styp_flags & IMAGE_SCN_MEM_READ) == 0)
+    sec_flags |= SEC_COFF_NOREAD;
+
   /* Process each flag bit in styp_flags in turn.  */
   while (styp_flags)
     {
@@ -1149,7 +1160,7 @@ styp_to_sec_flags (bfd *abfd,
          break;
 #endif
        case IMAGE_SCN_MEM_READ:
-         /* Ignored, assume it always to be true.  */
+         sec_flags &= ~SEC_COFF_NOREAD;
          break;
        case IMAGE_SCN_TYPE_NO_PAD:
          /* Skip.  */
@@ -1552,6 +1563,10 @@ Special entry points for gdb to swap in coff symbol table parts:
 .#define bfd_coff_print_pdata(a,p) \
 .  ((coff_backend_info (a)->_bfd_coff_print_pdata) (a, p))
 .
+.{* Macro: Returns true if the bfd is a PE executable as opposed to a
+.   PE object file.  *}
+.#define bfd_pei_p(abfd) \
+.  (CONST_STRNEQ ((abfd)->xvec->name, "pei-"))
 */
 
 /* See whether the magic number matches.  */
@@ -1699,7 +1714,7 @@ coff_new_section_hook (bfd * abfd, asection * section)
      @@ The 10 is a guess at a plausible maximum number of aux entries
      (but shouldn't be a constant).  */
   amt = sizeof (combined_entry_type) * 10;
-  native = bfd_zalloc (abfd, amt);
+  native = (combined_entry_type *) bfd_zalloc (abfd, amt);
   if (native == NULL)
     return FALSE;
 
@@ -1979,6 +1994,11 @@ coff_mkobject_hook (bfd * abfd,
     abfd->flags |= HAS_DEBUG;
 #endif
 
+  if ((internal_f->f_flags & F_GO32STUB) != 0)
+    coff->go32stub = (char *) bfd_alloc (abfd, (bfd_size_type) GO32_STUBSIZE);
+  if (coff->go32stub != NULL)
+    memcpy (coff->go32stub, internal_f->go32stub, GO32_STUBSIZE);
+
   return coff;
 }
 #endif
@@ -2416,7 +2436,7 @@ symname_in_debug_hook (bfd * abfd ATTRIBUTE_UNUSED, struct internal_syment *sym)
 #define FORCE_SYMNAMES_IN_STRINGS
 #endif
 
-/* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
+/* Handle the csect auxent of a C_EXT, C_AIX_WEAKEXT or C_HIDEXT symbol.  */
 
 static bfd_boolean
 coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED,
@@ -2425,9 +2445,9 @@ coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED,
                          unsigned int indaux,
                          combined_entry_type *aux)
 {
-  int class = symbol->u.syment.n_sclass;
+  int n_sclass = symbol->u.syment.n_sclass;
 
-  if ((class == C_EXT || class == C_HIDEXT)
+  if (CSECT_SYM_P (n_sclass)
       && indaux + 1 == symbol->u.syment.n_numaux)
     {
       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
@@ -2485,8 +2505,7 @@ coff_print_aux (bfd *abfd ATTRIBUTE_UNUSED,
                unsigned int indaux ATTRIBUTE_UNUSED)
 {
 #ifdef RS6000COFF_C
-  if ((symbol->u.syment.n_sclass == C_EXT
-       || symbol->u.syment.n_sclass == C_HIDEXT)
+  if (CSECT_SYM_P (symbol->u.syment.n_sclass)
       && indaux + 1 == symbol->u.syment.n_numaux)
     {
       /* This is a csect entry.  */
@@ -3175,13 +3194,20 @@ coff_compute_section_file_positions (bfd * abfd)
     int target_index;
     bfd_size_type amt;
 
+#ifdef COFF_PAGE_SIZE
+    /* Clear D_PAGED if section alignment is smaller than
+       COFF_PAGE_SIZE.  */
+   if (pe_data (abfd)->pe_opthdr.SectionAlignment < COFF_PAGE_SIZE)
+     abfd->flags &= ~D_PAGED;
+#endif
+
     count = 0;
     for (current = abfd->sections; current != NULL; current = current->next)
       ++count;
 
     /* We allocate an extra cell to simplify the final loop.  */
     amt = sizeof (struct asection *) * (count + 1);
-    section_list = bfd_malloc (amt);
+    section_list = (asection **) bfd_malloc (amt);
     if (section_list == NULL)
       return FALSE;
 
@@ -3607,7 +3633,7 @@ coff_write_object_contents (bfd * abfd)
       bfd_boolean is_reloc_section = FALSE;
 
 #ifdef COFF_IMAGE_WITH_PE
-      if (strcmp (current->name, ".reloc") == 0)
+      if (strcmp (current->name, DOT_RELOC) == 0)
        {
          is_reloc_section = TRUE;
          hasrelocs = TRUE;
@@ -3629,8 +3655,29 @@ coff_write_object_contents (bfd * abfd)
          len = strlen (current->name);
          if (len > SCNNMLEN)
            {
-             memset (section.s_name, 0, SCNNMLEN);
-             sprintf (section.s_name, "/%lu", (unsigned long) string_size);
+             /* The s_name field is defined to be NUL-padded but need not be
+                NUL-terminated.  We use a temporary buffer so that we can still
+                sprintf all eight chars without splatting a terminating NUL
+                over the first byte of the following member (s_paddr).  */
+             char s_name_buf[SCNNMLEN + 1];
+
+             /* An inherent limitation of the /nnnnnnn notation used to indicate
+                the offset of the long name in the string table is that we
+                cannot address entries beyone the ten million byte boundary.  */
+             if (string_size >= 10000000)
+               {
+                 bfd_set_error (bfd_error_file_too_big);
+                 (*_bfd_error_handler)
+                   (_("%B: section %s: string table overflow at offset %ld"),
+                   abfd, current->name, string_size);
+                 return FALSE;
+               }
+
+             /* snprintf not strictly necessary now we've verified the value
+                has less than eight ASCII digits, but never mind.  */
+             snprintf (s_name_buf, SCNNMLEN + 1, "/%lu", (unsigned long) string_size);
+             /* Then strncpy takes care of any padding for us.  */
+             strncpy (section.s_name, s_name_buf, SCNNMLEN);
              string_size += len + 1;
              long_section_names = TRUE;
            }
@@ -4231,7 +4278,7 @@ coff_write_object_contents (bfd * abfd)
     char * buff;
     bfd_size_type amount = bfd_coff_filhsz (abfd);
 
-    buff = bfd_malloc (amount);
+    buff = (char *) bfd_malloc (amount);
     if (buff == NULL)
       return FALSE;
 
@@ -4251,7 +4298,7 @@ coff_write_object_contents (bfd * abfd)
       char * buff;
       bfd_size_type amount = bfd_coff_aoutsz (abfd);
 
-      buff = bfd_malloc (amount);
+      buff = (char *) bfd_malloc (amount);
       if (buff == NULL)
        return FALSE;
 
@@ -4420,7 +4467,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
   BFD_ASSERT (asect->lineno == NULL);
 
   amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
-  lineno_cache = bfd_alloc (abfd, amt);
+  lineno_cache = (alent *) bfd_alloc (abfd, amt);
   if (lineno_cache == NULL)
     return FALSE;
 
@@ -4499,7 +4546,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
       alent *n_lineno_cache;
 
       /* Create a table of functions.  */
-      func_table = bfd_alloc (abfd, nbr_func * sizeof (alent *));
+      func_table = (alent **) bfd_alloc (abfd, nbr_func * sizeof (alent *));
       if (func_table != NULL)
        {
          alent **p = func_table;
@@ -4514,7 +4561,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
 
          /* Create the new sorted table.  */
          amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
-         n_lineno_cache = bfd_alloc (abfd, amt);
+         n_lineno_cache = (alent *) bfd_alloc (abfd, amt);
          if (n_lineno_cache != NULL)
            {
              alent *n_cache_ptr = n_lineno_cache;
@@ -4568,13 +4615,13 @@ coff_slurp_symbol_table (bfd * abfd)
   /* Allocate enough room for all the symbols in cached form.  */
   amt = obj_raw_syment_count (abfd);
   amt *= sizeof (coff_symbol_type);
-  cached_area = bfd_alloc (abfd, amt);
+  cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt);
   if (cached_area == NULL)
     return FALSE;
 
   amt = obj_raw_syment_count (abfd);
   amt *= sizeof (unsigned int);
-  table_ptr = bfd_alloc (abfd, amt);
+  table_ptr = (unsigned int *) bfd_alloc (abfd, amt);
 
   if (table_ptr == NULL)
     return FALSE;
@@ -5066,7 +5113,7 @@ coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
   amt = (bfd_size_type) bfd_coff_relsz (abfd) * asect->reloc_count;
   native_relocs = (RELOC *) buy_and_read (abfd, asect->rel_filepos, amt);
   amt = (bfd_size_type) asect->reloc_count * sizeof (arelent);
-  reloc_cache = bfd_alloc (abfd, amt);
+  reloc_cache = (arelent *) bfd_alloc (abfd, amt);
 
   if (reloc_cache == NULL || native_relocs == NULL)
     return FALSE;
@@ -5572,6 +5619,10 @@ static bfd_coff_backend_data ticoff1_swap_table =
   _bfd_generic_section_already_linked
 #endif
 
+#ifndef coff_bfd_define_common_symbol
+#define coff_bfd_define_common_symbol      bfd_generic_define_common_symbol
+#endif
+
 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)    \
 const bfd_target VAR =                                                 \
 {                                                                      \