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