2010-09-22 Kai Tietz <kai.tietz@onevision.com>
authorKai Tietz <kai.tietz@onevision.com>
Wed, 22 Sep 2010 14:19:35 +0000 (14:19 +0000)
committerKai Tietz <kai.tietz@onevision.com>
Wed, 22 Sep 2010 14:19:35 +0000 (14:19 +0000)
        * coffcode.h (sec_to_styp_flags): Adjust debug
        sections to be conform to pe-coff specification
        and avoid marking them as excluded.
        (styp_to_sec_flags): Doing reverse mapping.

bfd/ChangeLog
bfd/coffcode.h

index c2cd439f05fe6de60b6bdd6fe890578f72d902d1..56e2f12d2863869f451c520677bbdaf0ac70b6eb 100644 (file)
@@ -1,5 +1,10 @@
 2010-09-22  Kai Tietz  <kai.tietz@onevision.com>
 
+       * coffcode.h (sec_to_styp_flags): Adjust debug
+       sections to be conform to pe-coff specification
+       and avoid marking them as excluded.
+       (styp_to_sec_flags): Doing reverse mapping.
+
        * peXXigen.c (_bfd_XXi_final_link_postscript):
        Add handling for setting IAT directory entry.
 
index 790908a5cfd16f61d727680bb4c7799b729f0c9f..ff69704558fe2749376477f3fcd440b1ee9ec759 100644 (file)
@@ -636,6 +636,14 @@ 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)
+#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 +654,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 +673,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 */
@@ -1120,7 +1127,14 @@ 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)
+#endif
+      || CONST_STRNEQ (name, ".stab"))
+    is_dbg = TRUE;
   /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified.  */
   sec_flags = SEC_READONLY;
 
@@ -1190,27 +1204,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;