patches/binutils/2.20.1a/150-pt-pax-flags-20090909.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 17:54:21 2011 +0200 (2011-07-17)
changeset 2888 dd71df95903a
parent 2088 4f21ba5f8e91
permissions -rw-r--r--
cc/gcc: pass the companion libs prefix to cc_core

In case of canadian-cross, the companion libraries are not the same for
the core cc (they run on 'build') as they are for the final cc (they run
on 'host').

Prepare for this differentiation (coming later), while retaining the
current behavior (to use the same compblibs).

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 (_("\