]> git.pld-linux.org Git - packages/binutils.git/blob - binutils-pt_pax_flags.patch
- updated for 2.15.91.0.1
[packages/binutils.git] / binutils-pt_pax_flags.patch
1 diff -uNr binutils-2.15.90.0.1.1.orig/bfd/elf-bfd.h binutils-2.15.90.0.1.1/bfd/elf-bfd.h
2 --- binutils-2.15.90.0.1.1.orig/bfd/elf-bfd.h   2004-03-03 21:24:33.000000000 +0100
3 +++ binutils-2.15.90.0.1.1/bfd/elf-bfd.h        2004-03-17 11:51:20.951912544 +0100
4 @@ -1225,6 +1225,9 @@
5    /* Segment flags for the PT_GNU_STACK segment.  */
6    unsigned int stack_flags;  
7  
8 +  /* Segment flags for the PT_PAX_FLAGS segment.  */
9 +  unsigned int pax_flags;
10 +
11    /* Symbol version definitions in external objects.  */
12    Elf_Internal_Verdef *verdef;
13  
14 --- binutils-2.15.91.0.1/bfd/elf.c.orig 2004-05-27 20:26:02.000000000 +0200
15 +++ binutils-2.15.91.0.1/bfd/elf.c      2004-05-30 02:32:15.280667440 +0200
16 @@ -996,6 +996,7 @@
17             case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
18             case PT_GNU_STACK: pt = "STACK"; break;
19             case PT_GNU_RELRO: pt = "RELRO"; break;
20 +           case PT_PAX_FLAGS: pt = "PAX_FLAGS"; break;
21             default: sprintf (buf, "0x%lx", p->p_type); pt = buf; break;
22             }
23           fprintf (f, "%8s off    0x", pt);
24 @@ -2325,6 +2326,9 @@
25      case PT_GNU_RELRO:
26        return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "relro");
27  
28 +    case PT_PAX_FLAGS:
29 +      return _bfd_elf_make_section_from_phdr (abfd, hdr, index, "pax_flags");
30 +
31      default:
32        /* Check for any processor-specific program segment types.
33           If no handler for them, default to making "segment" sections.  */
34 @@ -3587,6 +3591,20 @@
35        pm = &m->next;
36      }
37  
38 +    {
39 +      amt = sizeof (struct elf_segment_map);
40 +      m = bfd_zalloc (abfd, amt);
41 +      if (m == NULL)
42 +       goto error_return;
43 +      m->next = NULL;
44 +      m->p_type = PT_PAX_FLAGS;
45 +      m->p_flags = elf_tdata (abfd)->pax_flags;
46 +      m->p_flags_valid = 1;
47 +
48 +      *pm = m;
49 +      pm = &m->next;
50 +    }
51 +
52    free (sections);
53    sections = NULL;
54  
55 @@ -4245,6 +4263,11 @@
56        ++segs;
57      }
58  
59 +    {
60 +      /* We need a PT_PAX_FLAGS segment.  */
61 +      ++segs;
62 +    }
63 +
64    for (s = abfd->sections; s != NULL; s = s->next)
65      {
66        if ((s->flags & SEC_LOAD) != 0
67 @@ -4794,6 +4817,7 @@
68      || IS_COREFILE_NOTE (segment, section))                            \
69     && section->output_section != NULL                                  \
70     && segment->p_type != PT_GNU_STACK                                  \
71 +   && segment->p_type != PT_PAX_FLAGS                                  \
72     && (segment->p_type != PT_TLS                                       \
73         || (section->flags & SEC_THREAD_LOCAL))                         \
74     && (segment->p_type == PT_LOAD                                      \
75 --- binutils-2.15.91.0.1/bfd/elflink.c.orig     2004-05-27 20:26:02.000000000 +0200
76 +++ binutils-2.15.91.0.1/bfd/elflink.c  2004-05-30 02:34:22.532322248 +0200
77 @@ -4628,16 +4628,30 @@
78      return TRUE;
79  
80    elf_tdata (output_bfd)->relro = info->relro;
81 +  elf_tdata (output_bfd)->pax_flags = PF_NORANDEXEC;
82 +
83 +  if (info->execheap)
84 +    elf_tdata (output_bfd)->pax_flags |= PF_NOMPROTECT;
85 +  else if (info->noexecheap)
86 +    elf_tdata (output_bfd)->pax_flags |= PF_MPROTECT;
87 +
88    if (info->execstack)
89 +  {
90      elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X;
91 +    elf_tdata (output_bfd)->pax_flags |= PF_EMUTRAMP;
92 +  }
93    else if (info->noexecstack)
94 +  {
95      elf_tdata (output_bfd)->stack_flags = PF_R | PF_W;
96 +    elf_tdata (output_bfd)->pax_flags |= PF_NOEMUTRAMP;
97 +  }
98    else
99      {
100        bfd *inputobj;
101        asection *notesec = NULL;
102        int exec = 0;
103  
104 +      elf_tdata (output_bfd)->pax_flags |= PF_NOEMUTRAMP;
105        for (inputobj = info->input_bfds;
106            inputobj;
107            inputobj = inputobj->link_next)
108 @@ -4650,7 +4664,11 @@
109           if (s)
110             {
111               if (s->flags & SEC_CODE)
112 -               exec = PF_X;
113 +               {
114 +                 elf_tdata (output_bfd)->pax_flags &= ~PF_NOEMUTRAMP;
115 +                 elf_tdata (output_bfd)->pax_flags |= PF_EMUTRAMP;
116 +                 exec = PF_X;
117 +               }
118               notesec = s;
119             }
120           else
121 --- binutils-2.15.91.0.1/binutils/readelf.c.orig        2004-05-27 20:26:02.000000000 +0200
122 +++ binutils-2.15.91.0.1/binutils/readelf.c     2004-05-30 02:34:52.746728960 +0200
123 @@ -2190,6 +2190,7 @@
124                         return "GNU_EH_FRAME";
125      case PT_GNU_STACK: return "STACK";
126      case PT_GNU_RELRO:  return "GNU_RELRO";
127 +    case PT_PAX_FLAGS: return "PAX_FLAGS";
128  
129      default:
130        if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
131 diff -uNr binutils-2.15.90.0.1.1.orig/include/bfdlink.h binutils-2.15.90.0.1.1/include/bfdlink.h
132 --- binutils-2.15.90.0.1.1.orig/include/bfdlink.h       2004-01-14 22:07:51.000000000 +0100
133 +++ binutils-2.15.90.0.1.1/include/bfdlink.h    2004-03-17 11:51:21.109888528 +0100
134 @@ -302,6 +302,14 @@
135       flags.  */
136    unsigned int noexecstack: 1;
137  
138 +  /* TRUE if PT_PAX_FLAGS segment should be created with PF_NOMPROTECT
139 +     flags.  */
140 +  unsigned int execheap: 1;
141 +
142 +  /* TRUE if PT_PAX_FLAGS segment should be created with PF_MPROTECT
143 +     flags.  */
144 +  unsigned int noexecheap: 1;
145 +
146    /* What to do with unresolved symbols in an object file.
147       When producing static binaries the default is GENERATE_ERROR.
148       When producing dynamic binaries the default is IGNORE.  The
149 --- binutils-2.15.91.0.1/include/elf/common.h.orig      2004-05-27 20:26:04.000000000 +0200
150 +++ binutils-2.15.91.0.1/include/elf/common.h   2004-05-30 02:36:25.633608008 +0200
151 @@ -291,12 +291,27 @@
152  #define PT_GNU_EH_FRAME        (PT_LOOS + 0x474e550) /* Frame unwind information */
153  #define PT_GNU_STACK   (PT_LOOS + 0x474e551) /* Stack flags */
154  #define PT_GNU_RELRO   (PT_LOOS + 0x474e552) /* Read-only after relocation */
155 +#define PT_PAX_FLAGS   (PT_LOOS + 0x5041580)
156  
157  /* Program segment permissions, in program header p_flags field.  */
158  
159  #define PF_X           (1 << 0)        /* Segment is executable */
160  #define PF_W           (1 << 1)        /* Segment is writable */
161  #define PF_R           (1 << 2)        /* Segment is readable */
162 +
163 +#define PF_PAGEEXEC    (1 << 4)        /* Enable  PAGEEXEC */
164 +#define PF_NOPAGEEXEC  (1 << 5)        /* Disable PAGEEXEC */
165 +#define PF_SEGMEXEC    (1 << 6)        /* Enable  SEGMEXEC */
166 +#define PF_NOSEGMEXEC  (1 << 7)        /* Disable SEGMEXEC */
167 +#define PF_MPROTECT    (1 << 8)        /* Enable  MPROTECT */
168 +#define PF_NOMPROTECT  (1 << 9)        /* Disable MPROTECT */
169 +#define PF_RANDEXEC    (1 << 10)       /* Enable  RANDEXEC */
170 +#define PF_NORANDEXEC  (1 << 11)       /* Disable RANDEXEC */
171 +#define PF_EMUTRAMP    (1 << 12)       /* Enable  EMUTRAMP */
172 +#define PF_NOEMUTRAMP  (1 << 13)       /* Disable EMUTRAMP */
173 +#define PF_RANDMMAP    (1 << 14)       /* Enable  RANDMMAP */
174 +#define PF_NORANDMMAP  (1 << 15)       /* Disable RANDMMAP */
175 +
176  /* #define PF_MASKOS   0x0F000000    *//* OS-specific reserved bits */
177  #define PF_MASKOS      0x0FF00000      /* New value, Oct 4, 1999 Draft */
178  #define PF_MASKPROC    0xF0000000      /* Processor-specific reserved bits */
179 --- binutils-2.15.91.0.1/ld/emultempl/elf32.em.orig     2004-05-27 20:26:05.000000000 +0200
180 +++ binutils-2.15.91.0.1/ld/emultempl/elf32.em  2004-05-30 02:37:57.317669912 +0200
181 @@ -1694,6 +1694,16 @@
182         link_info.relro = TRUE;
183        else if (strcmp (optarg, "norelro") == 0)
184         link_info.relro = FALSE;
185 +      else if (strcmp (optarg, "execheap") == 0)
186 +       {
187 +         link_info.execheap = TRUE;
188 +         link_info.noexecheap = FALSE;
189 +       }
190 +      else if (strcmp (optarg, "noexecheap") == 0)
191 +       {
192 +         link_info.noexecheap = TRUE;
193 +         link_info.execheap = FALSE;
194 +       }
195        /* What about the other Solaris -z options? FIXME.  */
196        break;
197  EOF
198 @@ -1730,6 +1740,7 @@
199    fprintf (file, _("  -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
200    fprintf (file, _("  -z defs\t\tReport unresolved symbols in object files.\n"));
201    fprintf (file, _("  -z execstack\t\tMark executable as requiring executable stack\n"));
202 +  fprintf (file, _("  -z execheap\t\tMark executable as requiring executable heap\n"));
203    fprintf (file, _("  -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
204    fprintf (file, _("  -z interpose\t\tMark object to interpose all DSOs but executable\n"));
205    fprintf (file, _("  -z loadfltr\t\tMark object requiring immediate process\n"));
206 @@ -1741,6 +1752,7 @@
207    fprintf (file, _("  -z nodlopen\t\tMark DSO not available to dlopen\n"));
208    fprintf (file, _("  -z nodump\t\tMark DSO not available to dldump\n"));
209    fprintf (file, _("  -z noexecstack\tMark executable as not requiring executable stack\n"));
210 +  fprintf (file, _("  -z noexecheap\t\tMark executable as not requiring executable heap\n"));
211    fprintf (file, _("  -z norelro\t\tDon't create RELRO program header\n"));
212    fprintf (file, _("  -z now\t\tMark object non-lazy runtime binding\n"));
213    fprintf (file, _("  -z origin\t\tMark object requiring immediate \$ORIGIN processing\n\t\t\t  at runtime\n"));
214 diff -uNr binutils-2.15.90.0.1.1.orig/ld/ldgram.y binutils-2.15.90.0.1.1/ld/ldgram.y
215 --- binutils-2.15.90.0.1.1.orig/ld/ldgram.y     2004-03-03 21:24:34.000000000 +0100
216 +++ binutils-2.15.90.0.1.1/ld/ldgram.y  2004-03-17 11:51:21.123886400 +0100
217 @@ -1019,6 +1019,8 @@
218                             $$ = exp_intop (0x6474e550);
219                           else if (strcmp (s, "PT_GNU_STACK") == 0)
220                             $$ = exp_intop (0x6474e551);
221 +                         else if (strcmp (s, "PT_PAX_FLAGS") == 0)
222 +                           $$ = exp_intop (0x65041580);
223                           else
224                             {
225                               einfo (_("\
This page took 0.044593 seconds and 4 git commands to generate.