patches/binutils/2.20.1a/150-pt-pax-flags-20090909.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Sep 11 18:18:53 2011 +0200 (2011-09-11)
changeset 2664 346263a07115
parent 2088 patches/binutils/2.20.1/150-pt-pax-flags-20090909.patch@4f21ba5f8e91
permissions -rw-r--r--
binutils/binutils: fixup version strings

Recently, all binutils versions have been renamed after a GPL compliance
issue was found and fixed in binutils;
http://sourceware.org/ml/binutils/2011-08/msg00198.html

Although legacy symlinks have been put in place, we should now use
the new, real version strings.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@2088
     1
yann@2088
     2
yann@2088
     3
diff -durN binutils-2.20.1.orig/bfd/elf-bfd.h binutils-2.20.1/bfd/elf-bfd.h
yann@2088
     4
--- binutils-2.20.1.orig/bfd/elf-bfd.h	2009-09-10 13:47:12.000000000 +0200
yann@2088
     5
+++ binutils-2.20.1/bfd/elf-bfd.h	2010-08-17 19:32:11.000000000 +0200
yann@2088
     6
@@ -1531,6 +1531,9 @@
yann@1614
     7
   /* Segment flags for the PT_GNU_STACK segment.  */
yann@1614
     8
   unsigned int stack_flags;
yann@1614
     9
 
yann@1614
    10
+  /* Segment flags for the PT_PAX_FLAGS segment.  */
yann@1614
    11
+  unsigned int pax_flags;
yann@1614
    12
+
yann@1614
    13
   /* Symbol version definitions in external objects.  */
yann@1614
    14
   Elf_Internal_Verdef *verdef;
yann@1614
    15
 
yann@2088
    16
diff -durN binutils-2.20.1.orig/bfd/elf.c binutils-2.20.1/bfd/elf.c
yann@2088
    17
--- binutils-2.20.1.orig/bfd/elf.c	2009-09-10 13:47:12.000000000 +0200
yann@2088
    18
+++ binutils-2.20.1/bfd/elf.c	2010-08-17 19:32:11.000000000 +0200
yann@2088
    19
@@ -1083,6 +1083,7 @@
yann@1614
    20
     case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
yann@1614
    21
     case PT_GNU_STACK: pt = "STACK"; break;
yann@1614
    22
     case PT_GNU_RELRO: pt = "RELRO"; break;
yann@1614
    23
+    case PT_PAX_FLAGS: pt = "PAX_FLAGS"; break;
yann@1614
    24
     default: pt = NULL; break;
yann@1614
    25
     }
yann@1614
    26
   return pt;
yann@2088
    27
@@ -2396,6 +2397,9 @@
yann@1614
    28
     case PT_GNU_RELRO:
yann@1614
    29
       return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "relro");
yann@1614
    30
 
yann@1614
    31
+    case PT_PAX_FLAGS:
yann@1614
    32
+      return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "pax_flags");
yann@1614
    33
+
yann@1614
    34
     default:
yann@1614
    35
       /* Check for any processor-specific program segment types.  */
yann@1614
    36
       bed = get_elf_backend_data (abfd);
yann@2088
    37
@@ -3413,6 +3417,11 @@
yann@1614
    38
       ++segs;
yann@1614
    39
     }
yann@1614
    40
 
yann@1614
    41
+    {
yann@1614
    42
+      /* We need a PT_PAX_FLAGS segment.  */
yann@1614
    43
+      ++segs;
yann@1614
    44
+    }
yann@1614
    45
+
yann@1614
    46
   for (s = abfd->sections; s != NULL; s = s->next)
yann@1614
    47
     {
yann@1614
    48
       if ((s->flags & SEC_LOAD) != 0
yann@2088
    49
@@ -3994,6 +4003,20 @@
yann@1614
    50
 	    }
yann@1614
    51
 	}
yann@1614
    52
 
yann@1614
    53
+    {
yann@1614
    54
+      amt = sizeof (struct elf_segment_map);
yann@1614
    55
+      m = bfd_zalloc (abfd, amt);
yann@1614
    56
+      if (m == NULL)
yann@1614
    57
+	goto error_return;
yann@1614
    58
+      m->next = NULL;
yann@1614
    59
+      m->p_type = PT_PAX_FLAGS;
yann@1614
    60
+      m->p_flags = elf_tdata (abfd)->pax_flags;
yann@1614
    61
+      m->p_flags_valid = 1;
yann@1614
    62
+
yann@1614
    63
+      *pm = m;
yann@1614
    64
+      pm = &m->next;
yann@1614
    65
+    }
yann@1614
    66
+
yann@1614
    67
       free (sections);
yann@1614
    68
       elf_tdata (abfd)->segment_map = mfirst;
yann@1614
    69
     }
yann@2088
    70
@@ -5198,7 +5221,8 @@
yann@1614
    71
        6. PT_TLS segment includes only SHF_TLS sections.
yann@1614
    72
        7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
yann@1614
    73
        8. PT_DYNAMIC should not contain empty sections at the beginning
yann@1614
    74
-	  (with the possible exception of .dynamic).  */
yann@1614
    75
+	  (with the possible exception of .dynamic).
yann@1614
    76
+       9. PT_PAX_FLAGS segments do not include any sections.  */
yann@1614
    77
 #define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed)		\
yann@1614
    78
   ((((segment->p_paddr							\
yann@1614
    79
       ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr)	\
yann@2088
    80
@@ -5206,6 +5230,7 @@
yann@1614
    81
      && (section->flags & SEC_ALLOC) != 0)				\
yann@1614
    82
     || IS_NOTE (segment, section))					\
yann@1614
    83
    && segment->p_type != PT_GNU_STACK					\
yann@1614
    84
+   && segment->p_type != PT_PAX_FLAGS					\
yann@1614
    85
    && (segment->p_type != PT_TLS					\
yann@1614
    86
        || (section->flags & SEC_THREAD_LOCAL))				\
yann@1614
    87
    && (segment->p_type == PT_LOAD					\
yann@2088
    88
diff -durN binutils-2.20.1.orig/bfd/elflink.c binutils-2.20.1/bfd/elflink.c
yann@2088
    89
--- binutils-2.20.1.orig/bfd/elflink.c	2009-09-10 13:47:12.000000000 +0200
yann@2088
    90
+++ binutils-2.20.1/bfd/elflink.c	2010-08-17 19:32:11.000000000 +0200
yann@2088
    91
@@ -5469,16 +5469,30 @@
yann@1614
    92
     return TRUE;
yann@1614
    93
 
yann@1614
    94
   bed = get_elf_backend_data (output_bfd);
yann@1614
    95
+
yann@1614
    96
+  elf_tdata (output_bfd)->pax_flags = PF_NORANDEXEC;
yann@1614
    97
+  if (info->execheap)
yann@1614
    98
+    elf_tdata (output_bfd)->pax_flags |= PF_NOMPROTECT;
yann@1614
    99
+  else if (info->noexecheap)
yann@1614
   100
+    elf_tdata (output_bfd)->pax_flags |= PF_MPROTECT;
yann@1614
   101
+
yann@1614
   102
   if (info->execstack)
yann@1614
   103
-    elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
yann@1614
   104
+    {
yann@1614
   105
+      elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
yann@1614
   106
+      elf_tdata (output_bfd)->pax_flags |= PF_EMUTRAMP;
yann@1614
   107
+    }
yann@1614
   108
   else if (info->noexecstack)
yann@1614
   109
-    elf_tdata (output_bfd)->stack_flags = PF_R | PF_W;
yann@1614
   110
+    {
yann@1614
   111
+      elf_tdata (output_bfd)->stack_flags = PF_R | PF_W;
yann@1614
   112
+      elf_tdata (output_bfd)->pax_flags |= PF_NOEMUTRAMP;
yann@1614
   113
+    }
yann@1614
   114
   else
yann@1614
   115
     {
yann@1614
   116
       bfd *inputobj;
yann@1614
   117
       asection *notesec = NULL;
yann@1614
   118
       int exec = 0;
yann@1614
   119
 
yann@1614
   120
+      elf_tdata (output_bfd)->pax_flags |= PF_NOEMUTRAMP;
yann@1614
   121
       for (inputobj = info->input_bfds;
yann@1614
   122
 	   inputobj;
yann@1614
   123
 	   inputobj = inputobj->link_next)
yann@2088
   124
@@ -5491,7 +5505,11 @@
yann@1614
   125
 	  if (s)
yann@1614
   126
 	    {
yann@1614
   127
 	      if (s->flags & SEC_CODE)
yann@1614
   128
-		exec = PF_X;
yann@1614
   129
+		{
yann@1614
   130
+		  elf_tdata (output_bfd)->pax_flags &= ~PF_NOEMUTRAMP;
yann@1614
   131
+		  elf_tdata (output_bfd)->pax_flags |= PF_EMUTRAMP;
yann@1614
   132
+		  exec = PF_X;
yann@1614
   133
+		}
yann@1614
   134
 	      notesec = s;
yann@1614
   135
 	    }
yann@1614
   136
 	  else if (bed->default_execstack)
yann@2088
   137
diff -durN binutils-2.20.1.orig/binutils/readelf.c binutils-2.20.1/binutils/readelf.c
yann@2088
   138
--- binutils-2.20.1.orig/binutils/readelf.c	2010-01-14 11:48:23.000000000 +0100
yann@2088
   139
+++ binutils-2.20.1/binutils/readelf.c	2010-08-17 19:32:11.000000000 +0200
yann@2088
   140
@@ -2569,6 +2569,7 @@
yann@1614
   141
 			return "GNU_EH_FRAME";
yann@1614
   142
     case PT_GNU_STACK:	return "GNU_STACK";
yann@1614
   143
     case PT_GNU_RELRO:  return "GNU_RELRO";
yann@1614
   144
+    case PT_PAX_FLAGS:  return "PAX_FLAGS";
yann@1614
   145
 
yann@1614
   146
     default:
yann@1614
   147
       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
yann@2088
   148
diff -durN binutils-2.20.1.orig/include/bfdlink.h binutils-2.20.1/include/bfdlink.h
yann@2088
   149
--- binutils-2.20.1.orig/include/bfdlink.h	2009-09-10 13:47:30.000000000 +0200
yann@2088
   150
+++ binutils-2.20.1/include/bfdlink.h	2010-08-17 19:32:11.000000000 +0200
yann@2088
   151
@@ -321,6 +321,14 @@
yann@1614
   152
   /* TRUE if PT_GNU_RELRO segment should be created.  */
yann@1614
   153
   unsigned int relro: 1;
yann@1614
   154
 
yann@1614
   155
+  /* TRUE if PT_PAX_FLAGS segment should be created with PF_NOMPROTECT
yann@1614
   156
+     flags.  */
yann@1614
   157
+  unsigned int execheap: 1;
yann@1614
   158
+
yann@1614
   159
+  /* TRUE if PT_PAX_FLAGS segment should be created with PF_MPROTECT
yann@1614
   160
+     flags.  */
yann@1614
   161
+  unsigned int noexecheap: 1;
yann@1614
   162
+
yann@1614
   163
   /* TRUE if we should warn when adding a DT_TEXTREL to a shared object.  */
yann@1614
   164
   unsigned int warn_shared_textrel: 1;
yann@1614
   165
 
yann@2088
   166
diff -durN binutils-2.20.1.orig/include/elf/common.h binutils-2.20.1/include/elf/common.h
yann@2088
   167
--- binutils-2.20.1.orig/include/elf/common.h	2009-08-09 15:42:26.000000000 +0200
yann@2088
   168
+++ binutils-2.20.1/include/elf/common.h	2010-08-17 19:32:11.000000000 +0200
yann@1614
   169
@@ -422,6 +422,7 @@
yann@1614
   170
 #define PT_SUNW_EH_FRAME PT_GNU_EH_FRAME      /* Solaris uses the same value */
yann@1614
   171
 #define PT_GNU_STACK	(PT_LOOS + 0x474e551) /* Stack flags */
yann@1614
   172
 #define PT_GNU_RELRO	(PT_LOOS + 0x474e552) /* Read-only after relocation */
yann@1614
   173
+#define PT_PAX_FLAGS	(PT_LOOS + 0x5041580) /* PaX flags */
yann@1614
   174
 
yann@1614
   175
 /* Program segment permissions, in program header p_flags field.  */
yann@1614
   176
 
yann@1614
   177
@@ -432,6 +433,21 @@
yann@1614
   178
 #define PF_MASKOS	0x0FF00000	/* New value, Oct 4, 1999 Draft */
yann@1614
   179
 #define PF_MASKPROC	0xF0000000	/* Processor-specific reserved bits */
yann@1614
   180
 
yann@1614
   181
+/* Flags to control PaX behavior.  */
yann@1614
   182
+
yann@1614
   183
+#define PF_PAGEEXEC	(1 << 4)	/* Enable  PAGEEXEC */
yann@1614
   184
+#define PF_NOPAGEEXEC	(1 << 5)	/* Disable PAGEEXEC */
yann@1614
   185
+#define PF_SEGMEXEC	(1 << 6)	/* Enable  SEGMEXEC */
yann@1614
   186
+#define PF_NOSEGMEXEC	(1 << 7)	/* Disable SEGMEXEC */
yann@1614
   187
+#define PF_MPROTECT	(1 << 8)	/* Enable  MPROTECT */
yann@1614
   188
+#define PF_NOMPROTECT	(1 << 9)	/* Disable MPROTECT */
yann@1614
   189
+#define PF_RANDEXEC	(1 << 10)	/* Enable  RANDEXEC */
yann@1614
   190
+#define PF_NORANDEXEC	(1 << 11)	/* Disable RANDEXEC */
yann@1614
   191
+#define PF_EMUTRAMP	(1 << 12)	/* Enable  EMUTRAMP */
yann@1614
   192
+#define PF_NOEMUTRAMP	(1 << 13)	/* Disable EMUTRAMP */
yann@1614
   193
+#define PF_RANDMMAP	(1 << 14)	/* Enable  RANDMMAP */
yann@1614
   194
+#define PF_NORANDMMAP	(1 << 15)	/* Disable RANDMMAP */
yann@1614
   195
+
yann@1614
   196
 /* Values for section header, sh_type field.  */
yann@1614
   197
 
yann@1614
   198
 #define SHT_NULL	0		/* Section header table entry unused */
yann@2088
   199
diff -durN binutils-2.20.1.orig/ld/emultempl/elf32.em binutils-2.20.1/ld/emultempl/elf32.em
yann@2088
   200
--- binutils-2.20.1.orig/ld/emultempl/elf32.em	2010-08-17 19:32:09.000000000 +0200
yann@2088
   201
+++ binutils-2.20.1/ld/emultempl/elf32.em	2010-08-17 19:32:11.000000000 +0200
yann@2088
   202
@@ -2165,6 +2165,16 @@
yann@1614
   203
 	  link_info.noexecstack = TRUE;
yann@1614
   204
 	  link_info.execstack = FALSE;
yann@1614
   205
 	}
yann@1614
   206
+      else if (strcmp (optarg, "execheap") == 0)
yann@1614
   207
+	{
yann@1614
   208
+	  link_info.execheap = TRUE;
yann@1614
   209
+	  link_info.noexecheap = FALSE;
yann@1614
   210
+	}
yann@1614
   211
+      else if (strcmp (optarg, "noexecheap") == 0)
yann@1614
   212
+	{
yann@1614
   213
+	  link_info.noexecheap = TRUE;
yann@1614
   214
+	  link_info.execheap = FALSE;
yann@1614
   215
+	}
yann@1614
   216
 EOF
yann@1614
   217
 
yann@1614
   218
   if test -n "$COMMONPAGESIZE"; then
yann@2088
   219
@@ -2243,6 +2253,8 @@
yann@1614
   220
   fprintf (file, _("\
yann@1614
   221
   -z execstack                Mark executable as requiring executable stack\n"));
yann@1614
   222
   fprintf (file, _("\
yann@1614
   223
+  -z execheap                 Mark executable as requiring executable heap\n"));
yann@1614
   224
+  fprintf (file, _("\
yann@1614
   225
   -z initfirst                Mark DSO to be initialized first at runtime\n"));
yann@1614
   226
   fprintf (file, _("\
yann@1614
   227
   -z interpose                Mark object to interpose all DSOs but executable\n"));
yann@2088
   228
@@ -2266,6 +2278,8 @@
yann@1614
   229
   -z nodump                   Mark DSO not available to dldump\n"));
yann@1614
   230
   fprintf (file, _("\
yann@1614
   231
   -z noexecstack              Mark executable as not requiring executable stack\n"));
yann@1614
   232
+  fprintf (file, _("\
yann@1614
   233
+  -z noexecheap               Mark executable as not requiring executable heap\n"));
yann@1614
   234
 EOF
yann@1614
   235
 
yann@1614
   236
   if test -n "$COMMONPAGESIZE"; then
yann@2088
   237
diff -durN binutils-2.20.1.orig/ld/ldgram.y binutils-2.20.1/ld/ldgram.y
yann@2088
   238
--- binutils-2.20.1.orig/ld/ldgram.y	2009-09-02 09:25:35.000000000 +0200
yann@2088
   239
+++ binutils-2.20.1/ld/ldgram.y	2010-08-17 19:32:11.000000000 +0200
yann@2088
   240
@@ -1116,6 +1116,8 @@
yann@1614
   241
 			    $$ = exp_intop (0x6474e550);
yann@1614
   242
 			  else if (strcmp (s, "PT_GNU_STACK") == 0)
yann@1614
   243
 			    $$ = exp_intop (0x6474e551);
yann@1614
   244
+			  else if (strcmp (s, "PT_PAX_FLAGS") == 0)
yann@1614
   245
+			    $$ = exp_intop (0x65041580);
yann@1614
   246
 			  else
yann@1614
   247
 			    {
yann@1614
   248
 			      einfo (_("\