[RFA] Don't mark NOLOAD sections as READ or WRITE on PE targets

Christopher Faylor me@cgf.cx
Wed Jun 8 20:52:00 GMT 2005


This seems to fix a fairly long-standing bug in the handling of PE
sections which are not meant to be loaded into memory.

Apparently the Windows loader will go ahead and load a "NEVER_LOAD"
section if it is marked as READONLY (or WRITE).  The patch below makes
sure that sections which are marked as not allocated will never have
READ or WRITE flags set.

This patch also removes an (apparently) invalid flag from the section
header.  AFAICT, NT does not define STYP_NOLOAD.

I don't know if this falls within my checkin privilege authority or not
but this seems to be the right thing to do for Windows PE, at least.

cgf

2005-06-08  Christopher Faylor  <cgf@timesys.com>

        * coffcode.h (sec_to_styp_flags): Remove read/write flags from noload
        section header.  Do not add STYP_NOLOAD since it does not appear to be
        a valid PE flag.

Index: coffcode.h
===================================================================
RCS file: /cvs/src/src/bfd/coffcode.h,v
retrieving revision 1.125
diff -u -p -r1.125 coffcode.h
--- coffcode.h	4 May 2005 15:53:05 -0000	1.125
+++ coffcode.h	8 Jun 2005 20:47:37 -0000
@@ -531,7 +531,7 @@ sec_to_styp_flags (const char *sec_name,
   /* FIXME: There is no gas syntax to specify the debug section flag.  */
   if (strncmp (sec_name, DOT_DEBUG, sizeof (DOT_DEBUG) - 1) == 0
       || strncmp (sec_name, GNU_LINKONCE_WI, sizeof (GNU_LINKONCE_WI) - 1) == 0)
-    sec_flags = SEC_READONLY | SEC_DEBUGGING;
+    sec_flags = SEC_DEBUGGING;
 
   /* skip LOAD */
   /* READONLY later */
@@ -545,10 +545,6 @@ sec_to_styp_flags (const char *sec_name,
   /* skip ROM */
   /* skip constRUCTOR */
   /* skip CONTENTS */
-#ifdef STYP_NOLOAD
-  if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
-    styp_flags |= STYP_NOLOAD;
-#endif
   if ((sec_flags & SEC_IS_COMMON) != 0)
     styp_flags |= IMAGE_SCN_LNK_COMDAT;
   if ((sec_flags & SEC_DEBUGGING) != 0)
@@ -564,17 +560,19 @@ sec_to_styp_flags (const char *sec_name,
   /* skip LINK_DUPLICATES */
   /* skip LINKER_CREATED */
 
-  /* 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_ALLOC)
+    {
+      /* 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.  */
+    }
 
   return styp_flags;
 }



More information about the Binutils mailing list