patches/binutils/2.19.1/140-pt-pax-flags-20081101.patch
author Arnaud Lacombe <lacombar@gmail.com>
Tue Aug 03 06:17:51 2010 +0200 (2010-08-03)
changeset 2064 f5ebe8c429dc
permissions -rw-r--r--
libc/uClibc: add uClibc 0.9.30.3

This version has been released a couple of month ago, but it never reached
crosstool-ng tree. This may be linked to the fact that the current 0.9.30.2,
once patched, has nothing much different from 0.9.30.3, released.

I'm not including any patch with this upgrade, on purpose.

Signed-off-by: Arnaud Lacombe <lacombar@gmail.com>
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 (_("\