]> git.pld-linux.org Git - packages/binutils.git/blame - binutils-eh-frame-ro.patch
- cleanup
[packages/binutils.git] / binutils-eh-frame-ro.patch
CommitLineData
c03ba38c 12002-11-22 Jakub Jelinek <jakub@redhat.com>
2
3 * ldgram.y (sect_constraint): New.
4 (ONLY_IF_RO, ONLY_IF_RW): New tokens.
5 (section): Add sect_constraint. Pass additional argument
6 to lang_enter_output_section_statement.
7 * mri.c (mri_draw_tree): Pass additional argument to
8 lang_enter_output_section_statement.
9 * emultempl/pe.em (place_orphan): Likewise.
10 (output_prev_sec_find): Disregard output section statements with
11 constraint == -1.
12 * emultempl/mmo.em (output_prev_sec_find): Likewise.
13 (mmo_place_orphan): Pass additional argument to
14 lang_enter_output_section_statement.
15 * emultempl/elf32.em (output_prev_sec_find): Disregard output section
16 statements with constraint == -1.
17 (place_orphan): Pass additional argument to
18 lang_enter_output_section_statement.
19 * ldlang.c (lang_enter_overlay_section): Likewise.
20 (lang_output_section_find_1): New.
21 (lang_output_section_find): Use it.
22 (lang_output_section_statement_lookup_1): New.
23 (lang_output_section_statement_lookup): Use it.
24 (check_section_callback, check_input_sections): New.
25 (map_input_to_output_sections): Check if all input sections
26 are readonly if ONLY_IF_RO or ONLY_IF_RW was seen.
27 (strip_excluded_output_sections): Disregard output section statements
28 with constraint == -1.
29 (lang_record_phdrs): Likewise.
30 (lang_enter_output_section_statement): Add constraint argument.
31 Use lang_output_section_statement_lookup_1.
32 * ldlang.h (lang_output_section_statement_type): Add constraint
33 and all_input_readonly fields.
34 (lang_enter_output_section_statement): Adjust prototype.
35 * ldlex.l (ONLY_IF_RO, ONLY_IF_RW): New tokens.
36 * scripttempl/elf.sc (.eh_frame, .gcc_except_table): Move into text
37 segment if all input sections are readonly.
38
39--- binutils-2.13.90.0.16/ld/ldgram.y.jj 2002-10-14 13:30:34.000000000 +0200
40+++ binutils-2.13.90.0.16/ld/ldgram.y 2002-11-22 22:27:18.000000000 +0100
41@@ -143,14 +143,14 @@ static int error_index;
42 %token ORIGIN FILL
43 %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
44 %token ALIGNMOD AT PROVIDE
45-%type <token> assign_op atype attributes_opt
46+%type <token> assign_op atype attributes_opt sect_constraint
47 %type <name> filename
48 %token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
49 %token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
50 %token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
51 %token <name> VERS_TAG VERS_IDENTIFIER
52 %token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
53-%token KEEP
54+%token KEEP ONLY_IF_RO ONLY_IF_RW
55 %token EXCLUDE_FILE
56 %type <versyms> vers_defns
57 %type <versnode> vers_tag
58@@ -828,21 +828,28 @@ opt_at:
59 | { $$ = 0; }
60 ;
61
62+sect_constraint:
63+ ONLY_IF_RO { $$ = ONLY_IF_RO; }
64+ | ONLY_IF_RW { $$ = ONLY_IF_RW; }
65+ | { $$ = 0; }
66+ ;
67+
68 section: NAME { ldlex_expression(); }
69 opt_exp_with_type
70 opt_at { ldlex_popstate (); ldlex_script (); }
71+ sect_constraint
72 '{'
73 {
74 lang_enter_output_section_statement($1, $3,
75 sectype,
76- 0, 0, 0, $4);
77+ 0, 0, 0, $4, $6);
78 }
79 statement_list_opt
80 '}' { ldlex_popstate (); ldlex_expression (); }
81 memspec_opt memspec_at_opt phdr_opt fill_opt
82 {
83 ldlex_popstate ();
84- lang_leave_output_section_statement ($14, $11, $13, $12);
85+ lang_leave_output_section_statement ($15, $12, $14, $13);
86 }
87 opt_comma
88 {}
89--- binutils-2.13.90.0.16/ld/mri.c.jj 2002-10-31 19:10:42.000000000 +0100
90+++ binutils-2.13.90.0.16/ld/mri.c 2002-11-22 18:38:27.000000000 +0100
91@@ -237,7 +237,7 @@ mri_draw_tree ()
92 lang_enter_output_section_statement (p->name, base,
93 p->ok_to_load ? 0 : noload_section,
94 1, align, subalign,
95- (etree_type *) NULL);
96+ (etree_type *) NULL, 0);
97 base = 0;
98 tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
99 tmp->next = NULL;
100--- binutils-2.13.90.0.16/ld/emultempl/mmo.em.jj 2002-07-30 16:20:15.000000000 +0200
101+++ binutils-2.13.90.0.16/ld/emultempl/mmo.em 2002-11-22 22:42:44.000000000 +0100
102@@ -56,6 +56,8 @@ output_prev_sec_find (os)
103 u = lookup->next)
104 {
105 lookup = &u->output_section_statement;
106+ if (lookup->constraint == -1)
107+ continue;
108 if (lookup == os)
109 break;
110 if (lookup->bfd_section != NULL
111@@ -141,7 +143,7 @@ mmo_place_orphan (file, s)
112 (bfd_vma) 0,
113 (etree_type *) NULL,
114 (etree_type *) NULL,
115- (etree_type *) NULL);
116+ (etree_type *) NULL, 0);
117
118 lang_add_section (&os->children, s, os, file);
119
120--- binutils-2.13.90.0.16/ld/emultempl/pe.em.jj 2002-11-21 15:58:51.000000000 +0100
121+++ binutils-2.13.90.0.16/ld/emultempl/pe.em 2002-11-22 22:43:02.000000000 +0100
122@@ -1489,6 +1489,8 @@ output_prev_sec_find (os)
123 u = lookup->next)
124 {
125 lookup = &u->output_section_statement;
126+ if (lookup->constraint == -1)
127+ continue;
128 if (lookup == os)
129 return s;
130
131@@ -1655,7 +1657,7 @@ gld_${EMULATION_NAME}_place_orphan (file
132 (bfd_vma) 0,
133 (etree_type *) NULL,
134 (etree_type *) NULL,
135- (etree_type *) NULL);
136+ (etree_type *) NULL, 0);
137
138 lang_add_section (&add_child, s, os, file);
139
140--- binutils-2.13.90.0.16/ld/emultempl/elf32.em.jj 2002-10-31 19:10:44.000000000 +0100
141+++ binutils-2.13.90.0.16/ld/emultempl/elf32.em 2002-11-22 22:42:16.000000000 +0100
142@@ -1009,7 +1009,8 @@ output_rel_find (sec)
143 for (u = lang_output_section_statement.head; u; u = lookup->next)
144 {
145 lookup = &u->output_section_statement;
146- if (strncmp (".rel", lookup->name, 4) == 0)
147+ if (lookup->constraint != -1
148+ && strncmp (".rel", lookup->name, 4) == 0)
149 {
150 /* Don't place after .rel.plt as doing so results in wrong
151 dynamic tags. Also, place allocated reloc sections before
152@@ -1236,7 +1237,7 @@ gld${EMULATION_NAME}_place_orphan (file,
153 (bfd_vma) 0,
154 (etree_type *) NULL,
155 (etree_type *) NULL,
156- (etree_type *) NULL);
157+ (etree_type *) NULL, 0);
158
159 lang_add_section (&os->children, s, os, file);
160
161--- binutils-2.13.90.0.16/ld/scripttempl/elf.sc.jj 2002-09-25 11:21:42.000000000 +0200
162+++ binutils-2.13.90.0.16/ld/scripttempl/elf.sc 2002-11-22 22:35:47.000000000 +0100
163@@ -280,6 +280,8 @@ cat <<EOF
164 ${CREATE_SHLIB-${SBSS2}}
165 ${OTHER_READONLY_SECTIONS}
166 .eh_frame_hdr : { *(.eh_frame_hdr) }
167+ .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
168+ .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table) }
169
170 /* Adjust the address for the data segment. We want to adjust up to
171 the same address within the page on the next page up. */
172@@ -312,8 +314,8 @@ cat <<EOF
173 .data1 ${RELOCATING-0} : { *(.data1) }
174 .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
175 .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
176- .eh_frame ${RELOCATING-0} : { KEEP (*(.eh_frame)) }
177- .gcc_except_table ${RELOCATING-0} : { *(.gcc_except_table) }
178+ .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
179+ .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { *(.gcc_except_table) }
180 ${WRITABLE_RODATA+${RODATA}}
181 ${OTHER_READWRITE_SECTIONS}
182 ${TEXT_DYNAMIC-${DYNAMIC}}
183--- binutils-2.13.90.0.16/ld/ldlang.h.jj 2002-10-10 00:53:07.000000000 +0200
184+++ binutils-2.13.90.0.16/ld/ldlang.h 2002-11-22 22:27:37.000000000 +0100
185@@ -132,6 +132,8 @@ typedef struct lang_output_section_state
186
187 int subsection_alignment; /* alignment of components */
188 int section_alignment; /* alignment of start of section */
189+ int constraint;
190+ boolean all_input_readonly;
191
192 union etree_union *load_base;
193
194@@ -385,7 +387,7 @@ extern lang_output_section_statement_typ
195 bfd_vma block_value,
196 etree_type *align,
197 etree_type *subalign,
198- etree_type *));
199+ etree_type *, int));
200 extern void lang_final PARAMS ((void));
201 extern void lang_process PARAMS ((void));
202 extern void lang_section_start PARAMS ((const char *, union etree_union *));
203--- binutils-2.13.90.0.16/ld/ldlang.c.jj 2002-11-14 14:06:22.000000000 +0100
204+++ binutils-2.13.90.0.16/ld/ldlang.c 2002-11-22 22:41:51.000000000 +0100
205@@ -71,6 +71,10 @@ static void lang_for_each_statement_work
206 static lang_input_statement_type *new_afile
207 PARAMS ((const char *, lang_input_file_enum_type, const char *, boolean));
208 static lang_memory_region_type *lang_memory_default PARAMS ((asection *));
209+static lang_output_section_statement_type * lang_output_section_find_1
210+ PARAMS ((const char *, int));
211+static lang_output_section_statement_type *
212+ lang_output_section_statement_lookup_1 PARAMS ((const char *, int));
213 static void lang_map_flags PARAMS ((flagword));
214 static void init_os PARAMS ((lang_output_section_statement_type *));
215 static void exp_init_os PARAMS ((etree_type *));
216@@ -86,6 +90,9 @@ static lang_statement_union_type *wild_s
217 static void output_section_callback
218 PARAMS ((lang_wild_statement_type *, struct wildcard_list *, asection *,
219 lang_input_statement_type *, PTR));
220+static void check_section_callback
221+ PARAMS ((lang_wild_statement_type *, struct wildcard_list *, asection *,
222+ lang_input_statement_type *, PTR));
223 static lang_input_statement_type *lookup_name PARAMS ((const char *));
224 static boolean load_symbols
225 PARAMS ((lang_input_statement_type *, lang_statement_list_type *));
226@@ -98,6 +105,9 @@ static void open_input_bfds PARAMS ((lan
227 static void lang_reasonable_defaults PARAMS ((void));
228 static void insert_undefined PARAMS ((const char *));
229 static void lang_place_undefineds PARAMS ((void));
230+static void check_input_sections
231+ PARAMS ((lang_statement_union_type *,
232+ lang_output_section_statement_type *));
233 static void map_input_to_output_sections
234 PARAMS ((lang_statement_union_type *, const char *,
235 lang_output_section_statement_type *));
236@@ -700,9 +710,10 @@ lang_memory_default (section)
237 return lang_memory_region_lookup ("*default*");
238 }
239
240-lang_output_section_statement_type *
241-lang_output_section_find (name)
242+static lang_output_section_statement_type *
243+lang_output_section_find_1 (name, constraint)
244 const char *const name;
245+ int constraint;
246 {
247 lang_statement_union_type *u;
248 lang_output_section_statement_type *lookup;
249@@ -712,7 +723,9 @@ lang_output_section_find (name)
250 u = lookup->next)
251 {
252 lookup = &u->output_section_statement;
253- if (strcmp (name, lookup->name) == 0)
254+ if (strcmp (name, lookup->name) == 0
255+ && lookup->constraint != -1
256+ && (constraint == 0 || constraint == lookup->constraint))
257 {
258 return lookup;
259 }
260@@ -721,12 +734,20 @@ lang_output_section_find (name)
261 }
262
263 lang_output_section_statement_type *
264-lang_output_section_statement_lookup (name)
265+lang_output_section_find (name)
266+ const char *const name;
267+{
268+ return lang_output_section_find_1 (name, 0);
269+}
270+
271+static lang_output_section_statement_type *
272+lang_output_section_statement_lookup_1 (name, constraint)
273 const char *const name;
274+ int constraint;
275 {
276 lang_output_section_statement_type *lookup;
277
278- lookup = lang_output_section_find (name);
279+ lookup = lang_output_section_find_1 (name, constraint);
280 if (lookup == (lang_output_section_statement_type *) NULL)
281 {
282
283@@ -741,6 +762,7 @@ lang_output_section_statement_lookup (na
284 lookup->next = (lang_statement_union_type *) NULL;
285 lookup->bfd_section = (asection *) NULL;
286 lookup->processed = false;
287+ lookup->constraint = constraint;
288 lookup->sectype = normal_section;
289 lookup->addr_tree = (etree_type *) NULL;
290 lang_list_init (&lookup->children);
291@@ -760,6 +782,13 @@ lang_output_section_statement_lookup (na
292 return lookup;
293 }
294
295+lang_output_section_statement_type *
296+lang_output_section_statement_lookup (name)
297+ const char *const name;
298+{
299+ return lang_output_section_statement_lookup_1 (name, 0);
300+}
301+
302 static void
303 lang_map_flags (flag)
304 flagword flag;
305@@ -1434,6 +1463,31 @@ output_section_callback (ptr, sec, secti
306 }
307 }
308
309+/* Check if all sections in a wild statement for a particular FILE
310+ are readonly. */
311+
312+static void
313+check_section_callback (ptr, sec, section, file, output)
314+ lang_wild_statement_type *ptr ATTRIBUTE_UNUSED;
315+ struct wildcard_list *sec ATTRIBUTE_UNUSED;
316+ asection *section;
317+ lang_input_statement_type *file ATTRIBUTE_UNUSED;
318+ PTR output;
319+{
320+ /* Exclude sections that match UNIQUE_SECTION_LIST. */
321+ if (unique_section_p (bfd_get_section_name (file->the_bfd, section)))
322+ return;
323+
324+ if (section->output_section == NULL)
325+ {
326+ flagword flags = bfd_get_section_flags (section->owner, section);
327+
328+ if ((flags & SEC_READONLY) == 0)
329+ ((lang_output_section_statement_type *) output)->all_input_readonly
330+ = false;
331+ }
332+}
333+
334 /* This is passed a file name which must have been seen already and
335 added to the statement tree. We will see if it has been opened
336 already and had its symbols read. If not then we'll read it. */
337@@ -2099,6 +2153,41 @@ lang_place_undefineds ()
338 }
339 }
340
341+/* Check for all readonly or some readwrite sections. */
342+
343+static void
344+check_input_sections (s, output_section_statement)
345+ lang_statement_union_type *s;
346+ lang_output_section_statement_type *output_section_statement;
347+{
348+ for (; s != (lang_statement_union_type *) NULL; s = s->header.next)
349+ {
350+ switch (s->header.type)
351+ {
352+ case lang_wild_statement_enum:
353+ walk_wild (&s->wild_statement, check_section_callback,
354+ output_section_statement);
355+ if (! output_section_statement->all_input_readonly)
356+ return;
357+ break;
358+ case lang_constructors_statement_enum:
359+ check_input_sections (constructor_list.head,
360+ output_section_statement);
361+ if (! output_section_statement->all_input_readonly)
362+ return;
363+ break;
364+ case lang_group_statement_enum:
365+ check_input_sections (s->group_statement.children.head,
366+ output_section_statement);
367+ if (! output_section_statement->all_input_readonly)
368+ return;
369+ break;
370+ default:
371+ break;
372+ }
373+ }
374+}
375+
376 /* Open input files and attatch to output sections. */
377
378 static void
379@@ -2120,6 +2209,23 @@ map_input_to_output_sections (s, target,
380 output_section_statement);
381 break;
382 case lang_output_section_statement_enum:
383+ if (s->output_section_statement.constraint)
384+ {
385+ if (s->output_section_statement.constraint == -1)
386+ break;
387+ s->output_section_statement.all_input_readonly = true;
388+ check_input_sections (s->output_section_statement.children.head,
389+ &s->output_section_statement);
390+ if ((s->output_section_statement.all_input_readonly
391+ && s->output_section_statement.constraint == ONLY_IF_RW)
392+ || (!s->output_section_statement.all_input_readonly
393+ && s->output_section_statement.constraint == ONLY_IF_RO))
394+ {
395+ s->output_section_statement.constraint = -1;
396+ break;
397+ }
398+ }
399+
400 map_input_to_output_sections (s->output_section_statement.children.head,
401 target,
402 &s->output_section_statement);
403@@ -2190,6 +2296,8 @@ strip_excluded_output_sections ()
404 asection *s;
405
406 os = &u->output_section_statement;
407+ if (os->constraint == -1)
408+ continue;
409 s = os->bfd_section;
410 if (s != NULL && (s->flags & SEC_EXCLUDE) != 0)
411 {
412@@ -4056,7 +4164,7 @@ topower (x)
413 lang_output_section_statement_type *
414 lang_enter_output_section_statement (output_section_statement_name,
415 address_exp, sectype, block_value,
416- align, subalign, ebase)
417+ align, subalign, ebase, constraint)
418 const char *output_section_statement_name;
419 etree_type *address_exp;
420 enum section_type sectype;
421@@ -4064,12 +4172,14 @@ lang_enter_output_section_statement (out
422 etree_type *align;
423 etree_type *subalign;
424 etree_type *ebase;
425+ int constraint;
426 {
427 lang_output_section_statement_type *os;
428
429 current_section =
430 os =
431- lang_output_section_statement_lookup (output_section_statement_name);
432+ lang_output_section_statement_lookup_1 (output_section_statement_name,
433+ constraint);
434
435 /* Add this statement to tree. */
436 #if 0
437@@ -4784,6 +4894,8 @@ lang_record_phdrs ()
438 struct lang_output_section_phdr_list *pl;
439
440 os = &u->output_section_statement;
441+ if (os->constraint == -1)
442+ continue;
443
444 pl = os->phdrs;
445 if (pl != NULL)
446@@ -4844,7 +4956,8 @@ lang_record_phdrs ()
447 {
448 struct lang_output_section_phdr_list *pl;
449
450- if (u->output_section_statement.bfd_section == NULL)
451+ if (u->output_section_statement.constraint == -1
452+ || u->output_section_statement.bfd_section == NULL)
453 continue;
454
455 for (pl = u->output_section_statement.phdrs;
456@@ -4914,7 +5027,7 @@ lang_enter_overlay_section (name)
457 etree_type *size;
458
459 lang_enter_output_section_statement (name, overlay_vma, normal_section,
460- 0, 0, 0, 0);
461+ 0, 0, 0, 0, 0);
462
463 /* If this is the first section, then base the VMA of future
464 sections on this one. This will work correctly even if `.' is
465--- binutils-2.13.90.0.16/ld/ldlex.l.jj 2002-10-31 19:10:42.000000000 +0100
466+++ binutils-2.13.90.0.16/ld/ldlex.l 2002-11-22 17:29:14.000000000 +0100
467@@ -303,6 +303,8 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^]([*?
468 <EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
469 <EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
470 <EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
471+<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
472+<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
473 <BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
474 <BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
475 <BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
This page took 0.117842 seconds and 4 git commands to generate.