* elf64-ppc.c (ppc64_elf_relocate_section): Provide section/offset
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index ad35e32f05052c3f04c46f0759c676062a0e2492..5500f01e7490c5bcda8e8585669af5bcda34aff8 100644 (file)
@@ -373,6 +373,7 @@ CODE_FRAGMENT
 
 #define DOT_DEBUG      ".debug"
 #define GNU_LINKONCE_WI ".gnu.linkonce.wi."
+#define GNU_LINKONCE_WT ".gnu.linkonce.wt."
 #define DOT_RELOC      ".reloc"
 
 #if defined (COFF_LONG_SECTION_NAMES)
@@ -557,7 +558,8 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
       styp_flags = STYP_DEBUG_INFO;
     }
 #ifdef COFF_LONG_SECTION_NAMES
-  else if (CONST_STRNEQ (sec_name, GNU_LINKONCE_WI))
+  else if (CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)
+          || CONST_STRNEQ (sec_name, GNU_LINKONCE_WT))
     {
       styp_flags = STYP_DEBUG_INFO;
     }
@@ -636,6 +638,15 @@ static long
 sec_to_styp_flags (const char *sec_name, flagword sec_flags)
 {
   long styp_flags = 0;
+  bfd_boolean is_dbg = FALSE;
+
+  if (CONST_STRNEQ (sec_name, DOT_DEBUG)
+#ifdef COFF_LONG_SECTION_NAMES
+      || CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)
+      || CONST_STRNEQ (sec_name, GNU_LINKONCE_WT)
+#endif
+      || CONST_STRNEQ (sec_name, ".stab"))
+    is_dbg = TRUE;
 
   /* caution: there are at least three groups of symbols that have
      very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
@@ -646,16 +657,15 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
      but there are more IMAGE_SCN_* 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_READONLY;
+  if (is_dbg)
+      sec_flags = SEC_DEBUGGING | SEC_READONLY;
 
   /* skip LOAD */
   /* READONLY later */
   /* skip RELOC */
   if ((sec_flags & SEC_CODE) != 0)
     styp_flags |= IMAGE_SCN_CNT_CODE;
-  if ((sec_flags & SEC_DATA) != 0)
+  if ((sec_flags & (SEC_DATA | SEC_DEBUGGING)) != 0)
     styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
   if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
     styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA;  /* ==STYP_BSS */
@@ -666,9 +676,9 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
     styp_flags |= IMAGE_SCN_LNK_COMDAT;
   if ((sec_flags & SEC_DEBUGGING) != 0)
     styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
-  if ((sec_flags & SEC_EXCLUDE) != 0)
+  if ((sec_flags & SEC_EXCLUDE) != 0 && !is_dbg)
     styp_flags |= IMAGE_SCN_LNK_REMOVE;
-  if ((sec_flags & SEC_NEVER_LOAD) != 0)
+  if ((sec_flags & SEC_NEVER_LOAD) != 0 && !is_dbg)
     styp_flags |= IMAGE_SCN_LNK_REMOVE;
   /* skip IN_MEMORY */
   /* skip SORT */
@@ -792,6 +802,7 @@ styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED,
 #endif
 #ifdef COFF_LONG_SECTION_NAMES
           || CONST_STRNEQ (name, GNU_LINKONCE_WI)
+          || CONST_STRNEQ (name, GNU_LINKONCE_WT)
 #endif
           || CONST_STRNEQ (name, ".stab"))
     {
@@ -949,7 +960,7 @@ handle_COMDAT (bfd * abfd,
 
                if (! ((isym.n_sclass == C_STAT
                        || isym.n_sclass == C_EXT)
-                      && isym.n_type == T_NULL
+                      && BTYPE (isym.n_type) == T_NULL
                       && isym.n_value == 0))
                  abort ();
 
@@ -1120,7 +1131,15 @@ styp_to_sec_flags (bfd *abfd,
   long styp_flags = internal_s->s_flags;
   flagword sec_flags;
   bfd_boolean result = TRUE;
+  bfd_boolean is_dbg = FALSE;
 
+  if (CONST_STRNEQ (name, DOT_DEBUG)
+#ifdef COFF_LONG_SECTION_NAMES
+      || CONST_STRNEQ (name, GNU_LINKONCE_WI)
+      || CONST_STRNEQ (name, GNU_LINKONCE_WT)
+#endif
+      || CONST_STRNEQ (name, ".stab"))
+    is_dbg = TRUE;
   /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified.  */
   sec_flags = SEC_READONLY;
 
@@ -1190,27 +1209,30 @@ styp_to_sec_flags (bfd *abfd,
             mean that a given section contains debug information.  Thus
             we only set the SEC_DEBUGGING flag on sections that we
             recognise as containing debug information.  */
-            if (CONST_STRNEQ (name, DOT_DEBUG)
+            if (is_dbg
 #ifdef _COMMENT
              || strcmp (name, _COMMENT) == 0
 #endif
-#ifdef COFF_LONG_SECTION_NAMES
-             || CONST_STRNEQ (name, GNU_LINKONCE_WI)
-#endif
-             || CONST_STRNEQ (name, ".stab"))
-           sec_flags |= SEC_DEBUGGING;
+             )
+           {
+             sec_flags |= SEC_DEBUGGING | SEC_READONLY;
+           }
          break;
        case IMAGE_SCN_MEM_SHARED:
          sec_flags |= SEC_COFF_SHARED;
          break;
        case IMAGE_SCN_LNK_REMOVE:
-         sec_flags |= SEC_EXCLUDE;
+         if (!is_dbg)
+           sec_flags |= SEC_EXCLUDE;
          break;
        case IMAGE_SCN_CNT_CODE:
          sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
          break;
        case IMAGE_SCN_CNT_INITIALIZED_DATA:
-         sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
+         if (is_dbg)
+           sec_flags |= SEC_DEBUGGING;
+         else
+           sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
          break;
        case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
          sec_flags |= SEC_ALLOC;
@@ -4487,7 +4509,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
            {
              (*_bfd_error_handler)
                (_("%B: warning: illegal symbol index %ld in line numbers"),
-                abfd, dst.l_addr.l_symndx);
+                abfd, (long) symndx);
              symndx = 0;
              warned = TRUE;
            }
@@ -4830,7 +4852,7 @@ coff_slurp_symbol_table (bfd * abfd)
                 to the symbol instead of the index.  FIXME: This
                 should use a union.  */
              src->u.syment.n_value =
-               (long) (native_symbols + src->u.syment.n_value);
+               (long) (intptr_t) (native_symbols + src->u.syment.n_value);
              dst->symbol.value = src->u.syment.n_value;
              src->fix_value = 1;
              break;
@@ -5123,7 +5145,7 @@ coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
            {
              (*_bfd_error_handler)
                (_("%B: warning: illegal symbol index %ld in relocs"),
-                abfd, dst.r_symndx);
+                abfd, (long) dst.r_symndx);
              cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
              ptr = NULL;
            }
This page took 0.026186 seconds and 4 git commands to generate.