This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] Linker script extension SECTION_FLAGS


This patch extends the linker script language to include SECTION_FLAGS on an output section statement. The purpose of the flags is to ensure that all input sections assigned to the output section either have the flags set or cleared.

This version of the patch sets the infrastructure but does not define a backend implementation. I will provide that along with additional testcases when I contribute the Powerpc VLE port.

This patch was originally discussed in the thread beginning here:
http://sourceware.org/ml/binutils/2011-04/msg00428.html

Does this look okay to install?

Thanks,
Catherine


2011-05-18 Catherine Moore <clm@codesourcery.com>


      	include/
  	* bfdlink.h (flag_type): New enumeration.
        (flag_info_list): New structure.
        (flag_info): New structure.

	ld/
	* ld.texinfo: Document usage of SECTION_FLAGS.
	* ldgram.y (section): Recognize sect_flags.
	(sect_flags): New rule.
	(sect_flag_list): New rule.
	* ldlang.c (lang_add_section): Check section flags.
	(lang_enter_output_section_statement): Add argument sflags.
	Initialize sflags field in output statement.
	* ldlang.h (lang_output_section_statement_type): Add flag_info field.
	(lang_enter_output_section_statement): New argument sflags.  Update
	all callers.
	* ldlex.l (SECTION_FLAGS): New token.A
	* mri.c (mri_draw_tree): Update argument list for
	land_enter_output_section_statement.

	ld/testsuite/
	* ld-scripts/section-flags-1.exp: New.
        * ld-scripts/section-flags-1.s: New.
        * ld-scripts/section-flags-1.t: New.

	bfd/
	2011-05-18  Catherine Moore  <clm@codesourcery.com>

        * bfd-in2.h: Regenerated.
        * bfd.c (bfd_lookup_section_flags): New definition.
        * binary.c (binary_bfd_lookup_section_flags): New definition.
        * coff-rs6000.c (rs6000coff_vec): Include
        bfd_generic_lookup_section_flags.
        (pmac_xcoff_vec): Likewise.
        * coffcode.h (coff_bfd_lookup_section_flags): New definition.
        * elf-bfd.h (elf_backend_lookup_section_flags_hook): Declare.
        (bfd_elf_lookup_section_flags): Declare.
        * elflink.c (bfd_elf_lookup_section_flags): New function.
        * elfxx-target.h (bfd_elfNN_bfd_lookup_section_flags): Define.
        (elf_backend_lookup_section_flags_hook): Define.
        (elf_backend_data): Add elf_backend_lookup_section_flags_hook.
        * ieee.c (ieee_bfd_lookup_section_flags): New define.
        * ihex.c (ihex_bfd_lookup_section_flags): New define.
        * libbfd-in.h (_bfd_nolink_bfd_lookup_section_flags): Declare.
        (bfd_generic_lookup_section_flags): Declare.
        * libbfd.h: Regenerated.
        * mach-o-target.c (bfd_mach_o_bfd_lookup_section_flags): New.
        * mmo.c (mmo_fd_lookup_section_flags): New definition.
        * oasys.c (oasys_bfd_lookup_section_flags): New definition.
        * pef.c (bfd_pef_bfd_lookup_section_flags): New definition.
        * plugin.c (bfd_plugin_bfd_lookup_section_flags): New definition.
        * ppcboot.c (ppcboot_bfd_lookup_section_flags): New definition.
        * reloc.c (bfd_generic_lookup_section_flags): New function.
        * som.c (som_bfd_lookup_section_flags): New definition.
        * srec.c (srec_bfd_lookup_section_flags): New definition.
        * targets.c (flag_info): Declare.
        (NAME##_bfd_lookup_section_flags): Add to LINK jump table.
        (_bfd_lookup_section_flags): New.
        * tekhex.c (tekhex_bfd_lookup_section_flags): New definition.
        * versados.c (versados_bfd_lookup_section_flags): New definition.
        * vms-alpha.c (alpha_vms_bfd_lookup_section_flag): New definition.
        * xsym.c (bfd_sym_bfd_lookup_section_flags): New definition.




Index: bfd/bfd-in2.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in2.h,v
retrieving revision 1.537
diff -u -p -r1.537 bfd-in2.h
--- bfd/bfd-in2.h	9 May 2011 13:23:24 -0000	1.537
+++ bfd/bfd-in2.h	18 May 2011 19:14:52 -0000
@@ -5394,6 +5394,9 @@ bfd_boolean bfd_set_private_flags (bfd *
 #define bfd_gc_sections(abfd, link_info) \
        BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info))
 
+#define bfd_lookup_section_flags(abfd, flag_info) \
+       BFD_SEND (abfd, _bfd_lookup_section_flags, (abfd, flag_info))
+
 #define bfd_merge_sections(abfd, link_info) \
        BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info))
 
@@ -5550,6 +5553,9 @@ enum bfd_endian { BFD_ENDIAN_BIG, BFD_EN
 /* Forward declaration.  */
 typedef struct bfd_link_info _bfd_link_info;
 
+/* Forward declaration.  */
+typedef struct flag_info flag_info;
+
 typedef struct bfd_target
 {
   /* Identifies the kind of target, e.g., SunOS4, Ultrix, etc.  */
@@ -5815,6 +5821,7 @@ typedef struct bfd_target
   NAME##_bfd_final_link, \
   NAME##_bfd_link_split_section, \
   NAME##_bfd_gc_sections, \
+  NAME##_bfd_lookup_section_flags, \
   NAME##_bfd_merge_sections, \
   NAME##_bfd_is_group_section, \
   NAME##_bfd_discard_group, \
@@ -5859,6 +5866,9 @@ typedef struct bfd_target
   /* Remove sections that are not referenced from the output.  */
   bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
 
+  /* Remove sections with incorrect flags.  */
+  void (*_bfd_lookup_section_flags) (bfd *, struct flag_info *);
+
   /* Attempt to merge SEC_MERGE sections.  */
   bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
 
Index: bfd/bfd.c
===================================================================
RCS file: /cvs/src/src/bfd/bfd.c,v
retrieving revision 1.116
diff -u -p -r1.116 bfd.c
--- bfd/bfd.c	17 Apr 2011 23:15:11 -0000	1.116
+++ bfd/bfd.c	18 May 2011 19:14:52 -0000
@@ -1373,6 +1373,9 @@ DESCRIPTION
 .#define bfd_gc_sections(abfd, link_info) \
 .	BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info))
 .
+.#define bfd_lookup_section_flags(abfd, flag_info) \
+.	BFD_SEND (abfd, _bfd_lookup_section_flags, (abfd, flag_info))
+.
 .#define bfd_merge_sections(abfd, link_info) \
 .	BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info))
 .
Index: bfd/binary.c
===================================================================
RCS file: /cvs/src/src/bfd/binary.c,v
retrieving revision 1.39
diff -u -p -r1.39 binary.c
--- bfd/binary.c	23 Nov 2009 14:41:28 -0000	1.39
+++ bfd/binary.c	18 May 2011 19:14:52 -0000
@@ -299,6 +299,7 @@ binary_sizeof_headers (bfd *abfd ATTRIBU
 #define binary_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
 #define binary_bfd_relax_section                   bfd_generic_relax_section
 #define binary_bfd_gc_sections                     bfd_generic_gc_sections
+#define binary_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
 #define binary_bfd_merge_sections                  bfd_generic_merge_sections
 #define binary_bfd_is_group_section                bfd_generic_is_group_section
 #define binary_bfd_discard_group                   bfd_generic_discard_group
Index: bfd/coff-rs6000.c
===================================================================
RCS file: /cvs/src/src/bfd/coff-rs6000.c,v
retrieving revision 1.101
diff -u -p -r1.101 coff-rs6000.c
--- bfd/coff-rs6000.c	18 May 2011 07:58:30 -0000	1.101
+++ bfd/coff-rs6000.c	18 May 2011 19:14:53 -0000
@@ -4101,6 +4101,7 @@ const bfd_target rs6000coff_vec =
     _bfd_xcoff_bfd_final_link,
     _bfd_generic_link_split_section,
     bfd_generic_gc_sections,
+    bfd_generic_lookup_section_flags,
     bfd_generic_merge_sections,
     bfd_generic_is_group_section,
     bfd_generic_discard_group,
@@ -4354,6 +4355,7 @@ const bfd_target pmac_xcoff_vec =
     _bfd_xcoff_bfd_final_link,
     _bfd_generic_link_split_section,
     bfd_generic_gc_sections,
+    bfd_generic_lookup_section_flags,
     bfd_generic_merge_sections,
     bfd_generic_is_group_section,
     bfd_generic_discard_group,
Index: bfd/coffcode.h
===================================================================
RCS file: /cvs/src/src/bfd/coffcode.h,v
retrieving revision 1.178
diff -u -p -r1.178 coffcode.h
--- bfd/coffcode.h	18 May 2011 07:58:31 -0000	1.178
+++ bfd/coffcode.h	18 May 2011 19:14:53 -0000
@@ -5652,6 +5652,10 @@ static bfd_coff_backend_data ticoff1_swa
 #define coff_bfd_gc_sections		    bfd_generic_gc_sections
 #endif
 
+#ifndef coff_bfd_lookup_section_flags
+#define coff_bfd_lookup_section_flags	    bfd_generic_lookup_section_flags
+#endif
+
 #ifndef coff_bfd_merge_sections
 #define coff_bfd_merge_sections		    bfd_generic_merge_sections
 #endif
Index: bfd/elf-bfd.h
===================================================================
RCS file: /cvs/src/src/bfd/elf-bfd.h,v
retrieving revision 1.318
diff -u -p -r1.318 elf-bfd.h
--- bfd/elf-bfd.h	20 Apr 2011 08:51:56 -0000	1.318
+++ bfd/elf-bfd.h	18 May 2011 19:14:53 -0000
@@ -1114,6 +1114,10 @@ struct elf_backend_data
   char *(*elf_backend_write_core_note)
     (bfd *abfd, char *buf, int *bufsiz, int note_type, ...);
 
+  /* This function, if defined, is called to the section flag hex value.  */
+  void (*elf_backend_lookup_section_flags_hook)
+    (struct flag_info *);
+
   /* This function returns class of a reloc type.  */
   enum elf_reloc_type_class (*elf_backend_reloc_type_class)
     (const Elf_Internal_Rela *);
@@ -2192,6 +2196,8 @@ extern bfd_boolean _bfd_elf_is_function_
 
 extern int bfd_elf_get_default_section_type (flagword);
 
+extern void bfd_elf_lookup_section_flags (bfd *, struct flag_info *);
+
 extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section
   (bfd * abfd, asection * section);
 
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.405
diff -u -p -r1.405 elflink.c
--- bfd/elflink.c	18 May 2011 14:04:31 -0000	1.405
+++ bfd/elflink.c	18 May 2011 19:14:53 -0000
@@ -12162,6 +12162,17 @@ bfd_elf_gc_record_vtentry (bfd *abfd ATT
   return TRUE;
 }
 
+void
+bfd_elf_lookup_section_flags (bfd *output_bfd, struct flag_info *finfo)
+{
+  const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
+
+  if (bed->elf_backend_lookup_section_flags_hook)
+    return (*bed->elf_backend_lookup_section_flags_hook) (finfo);
+
+  return;
+}
+
 struct alloc_got_off_arg {
   bfd_vma gotoff;
   struct bfd_link_info *info;
Index: bfd/elfxx-target.h
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-target.h,v
retrieving revision 1.124
diff -u -p -r1.124 elfxx-target.h
--- bfd/elfxx-target.h	4 Nov 2010 11:35:01 -0000	1.124
+++ bfd/elfxx-target.h	18 May 2011 19:14:53 -0000
@@ -173,6 +173,10 @@
 #define bfd_elfNN_bfd_define_common_symbol bfd_generic_define_common_symbol
 #endif
 
+#ifndef bfd_elfNN_bfd_lookup_section_flags
+#define bfd_elfNN_bfd_lookup_section_flags bfd_elf_lookup_section_flags
+#endif
+
 #ifndef bfd_elfNN_bfd_make_debug_symbol
 #define bfd_elfNN_bfd_make_debug_symbol \
   ((asymbol * (*) (bfd *, void *, unsigned long)) bfd_nullvoidptr)
@@ -528,6 +532,9 @@
 #ifndef elf_backend_write_core_note
 #define elf_backend_write_core_note		NULL
 #endif
+#ifndef elf_backend_lookup_section_flags_hook
+#define elf_backend_lookup_section_flags_hook	NULL
+#endif
 #ifndef elf_backend_reloc_type_class
 #define elf_backend_reloc_type_class		_bfd_elf_reloc_type_class
 #endif
@@ -711,6 +718,7 @@ static struct elf_backend_data elfNN_bed
   elf_backend_grok_prstatus,
   elf_backend_grok_psinfo,
   elf_backend_write_core_note,
+  elf_backend_lookup_section_flags_hook,
   elf_backend_reloc_type_class,
   elf_backend_discard_info,
   elf_backend_ignore_discarded_relocs,
Index: bfd/ieee.c
===================================================================
RCS file: /cvs/src/src/bfd/ieee.c,v
retrieving revision 1.70
diff -u -p -r1.70 ieee.c
--- bfd/ieee.c	27 Jun 2010 04:07:53 -0000	1.70
+++ bfd/ieee.c	18 May 2011 19:14:53 -0000
@@ -3772,6 +3772,7 @@ ieee_sizeof_headers (bfd *abfd ATTRIBUTE
   bfd_generic_get_relocated_section_contents
 #define ieee_bfd_relax_section bfd_generic_relax_section
 #define ieee_bfd_gc_sections bfd_generic_gc_sections
+#define ieee_bfd_lookup_section_flags bfd_generic_lookup_section_flags
 #define ieee_bfd_merge_sections bfd_generic_merge_sections
 #define ieee_bfd_is_group_section bfd_generic_is_group_section
 #define ieee_bfd_discard_group bfd_generic_discard_group
Index: bfd/ihex.c
===================================================================
RCS file: /cvs/src/src/bfd/ihex.c,v
retrieving revision 1.40
diff -u -p -r1.40 ihex.c
--- bfd/ihex.c	23 Nov 2009 14:41:30 -0000	1.40
+++ bfd/ihex.c	18 May 2011 19:14:53 -0000
@@ -930,6 +930,7 @@ ihex_sizeof_headers (bfd *abfd ATTRIBUTE
 #define ihex_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
 #define ihex_bfd_relax_section                    bfd_generic_relax_section
 #define ihex_bfd_gc_sections                      bfd_generic_gc_sections
+#define ihex_bfd_lookup_section_flags             bfd_generic_lookup_section_flags
 #define ihex_bfd_merge_sections                   bfd_generic_merge_sections
 #define ihex_bfd_is_group_section                 bfd_generic_is_group_section
 #define ihex_bfd_discard_group                    bfd_generic_discard_group
Index: bfd/libbfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd-in.h,v
retrieving revision 1.88
diff -u -p -r1.88 libbfd-in.h
--- bfd/libbfd-in.h	28 Apr 2011 12:50:32 -0000	1.88
+++ bfd/libbfd-in.h	18 May 2011 19:14:53 -0000
@@ -453,6 +453,9 @@ extern bfd_boolean _bfd_generic_set_sect
 #define _bfd_nolink_bfd_gc_sections \
   ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) \
    bfd_false)
+#define _bfd_nolink_bfd_lookup_section_flags \
+  ((void (*) (bfd *, struct flag_info *)) \
+   bfd_0)
 #define _bfd_nolink_bfd_merge_sections \
   ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) \
    bfd_false)
Index: bfd/libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.251
diff -u -p -r1.251 libbfd.h
--- bfd/libbfd.h	28 Apr 2011 12:50:32 -0000	1.251
+++ bfd/libbfd.h	18 May 2011 19:14:53 -0000
@@ -458,6 +458,9 @@ extern bfd_boolean _bfd_generic_set_sect
 #define _bfd_nolink_bfd_gc_sections \
   ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) \
    bfd_false)
+#define _bfd_nolink_bfd_lookup_section_flags \
+  ((void (*) (bfd *, struct flag_info *)) \
+   bfd_0)
 #define _bfd_nolink_bfd_merge_sections \
   ((bfd_boolean (*) (bfd *, struct bfd_link_info *)) \
    bfd_false)
@@ -2284,6 +2287,9 @@ bfd_boolean bfd_generic_relax_section
 bfd_boolean bfd_generic_gc_sections
    (bfd *, struct bfd_link_info *);
 
+void bfd_generic_lookup_section_flags
+   (bfd *, struct flag_info *);
+
 bfd_boolean bfd_generic_merge_sections
    (bfd *, struct bfd_link_info *);
 
Index: bfd/mach-o-target.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o-target.c,v
retrieving revision 1.16
diff -u -p -r1.16 mach-o-target.c
--- bfd/mach-o-target.c	18 Aug 2010 12:24:07 -0000	1.16
+++ bfd/mach-o-target.c	18 May 2011 19:14:53 -0000
@@ -51,6 +51,7 @@
 #define bfd_mach_o_bfd_set_private_flags              _bfd_generic_bfd_set_private_flags
 #define bfd_mach_o_get_section_contents               _bfd_generic_get_section_contents
 #define bfd_mach_o_bfd_gc_sections                    bfd_generic_gc_sections
+#define bfd_mach_o_bfd_lookup_section_flags           bfd_generic_lookup_section_flags
 #define bfd_mach_o_bfd_merge_sections                 bfd_generic_merge_sections
 #define bfd_mach_o_bfd_is_group_section               bfd_generic_is_group_section
 #define bfd_mach_o_bfd_discard_group                  bfd_generic_discard_group
Index: bfd/mmo.c
===================================================================
RCS file: /cvs/src/src/bfd/mmo.c,v
retrieving revision 1.41
diff -u -p -r1.41 mmo.c
--- bfd/mmo.c	27 Jun 2010 04:07:53 -0000	1.41
+++ bfd/mmo.c	18 May 2011 19:14:53 -0000
@@ -3190,6 +3190,7 @@ mmo_write_object_contents (bfd *abfd)
 #define mmo_bfd_get_relocated_section_contents \
   bfd_generic_get_relocated_section_contents
 #define mmo_bfd_gc_sections bfd_generic_gc_sections
+#define mmo_fd_lookup_section_flags bfd_generic_lookup_section_flags
 #define mmo_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
 #define mmo_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
 #define mmo_bfd_link_add_symbols _bfd_generic_link_add_symbols
Index: bfd/oasys.c
===================================================================
RCS file: /cvs/src/src/bfd/oasys.c,v
retrieving revision 1.45
diff -u -p -r1.45 oasys.c
--- bfd/oasys.c	24 Mar 2010 15:41:59 -0000	1.45
+++ bfd/oasys.c	18 May 2011 19:14:53 -0000
@@ -1196,6 +1196,7 @@ oasys_sizeof_headers (bfd *abfd ATTRIBUT
 #define oasys_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
 #define oasys_bfd_relax_section                    bfd_generic_relax_section
 #define oasys_bfd_gc_sections                      bfd_generic_gc_sections
+#define oasys_bfd_lookup_section_flags             bfd_generic_lookup_section_flags
 #define oasys_bfd_merge_sections                   bfd_generic_merge_sections
 #define oasys_bfd_is_group_section                 bfd_generic_is_group_section
 #define oasys_bfd_discard_group                    bfd_generic_discard_group
Index: bfd/pef.c
===================================================================
RCS file: /cvs/src/src/bfd/pef.c,v
retrieving revision 1.31
diff -u -p -r1.31 pef.c
--- bfd/pef.c	14 Jan 2011 12:35:56 -0000	1.31
+++ bfd/pef.c	18 May 2011 19:14:53 -0000
@@ -48,6 +48,7 @@
 #define bfd_pef_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
 #define bfd_pef_bfd_relax_section                   bfd_generic_relax_section
 #define bfd_pef_bfd_gc_sections                     bfd_generic_gc_sections
+#define bfd_pef_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
 #define bfd_pef_bfd_merge_sections                  bfd_generic_merge_sections
 #define bfd_pef_bfd_is_group_section		    bfd_generic_is_group_section
 #define bfd_pef_bfd_discard_group                   bfd_generic_discard_group
Index: bfd/plugin.c
===================================================================
RCS file: /cvs/src/src/bfd/plugin.c,v
retrieving revision 1.12
diff -u -p -r1.12 plugin.c
--- bfd/plugin.c	26 Feb 2011 00:03:09 -0000	1.12
+++ bfd/plugin.c	18 May 2011 19:14:53 -0000
@@ -63,6 +63,7 @@
 #define bfd_plugin_bfd_final_link                     _bfd_generic_final_link
 #define bfd_plugin_bfd_link_split_section             _bfd_generic_link_split_section
 #define bfd_plugin_bfd_gc_sections                    bfd_generic_gc_sections
+#define bfd_plugin_bfd_lookup_section_flags           bfd_generic_lookup_section_flags
 #define bfd_plugin_bfd_merge_sections                 bfd_generic_merge_sections
 #define bfd_plugin_bfd_is_group_section               bfd_generic_is_group_section
 #define bfd_plugin_bfd_discard_group                  bfd_generic_discard_group
Index: bfd/ppcboot.c
===================================================================
RCS file: /cvs/src/src/bfd/ppcboot.c,v
retrieving revision 1.33
diff -u -p -r1.33 ppcboot.c
--- bfd/ppcboot.c	23 Nov 2009 14:41:30 -0000	1.33
+++ bfd/ppcboot.c	18 May 2011 19:14:53 -0000
@@ -470,6 +470,7 @@ ppcboot_bfd_print_private_bfd_data (abfd
   bfd_generic_get_relocated_section_contents
 #define ppcboot_bfd_relax_section bfd_generic_relax_section
 #define ppcboot_bfd_gc_sections bfd_generic_gc_sections
+#define ppcboot_bfd_lookup_section_flags bfd_generic_lookup_section_flags
 #define ppcboot_bfd_merge_sections bfd_generic_merge_sections
 #define ppcboot_bfd_is_group_section bfd_generic_is_group_section
 #define ppcboot_bfd_discard_group bfd_generic_discard_group
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.213
diff -u -p -r1.213 reloc.c
--- bfd/reloc.c	31 Mar 2011 08:58:20 -0000	1.213
+++ bfd/reloc.c	18 May 2011 19:14:54 -0000
@@ -5702,6 +5702,26 @@ bfd_generic_gc_sections (bfd *abfd ATTRI
 
 /*
 INTERNAL_FUNCTION
+	bfd_generic_lookup_section_flags
+
+SYNOPSIS
+	void bfd_generic_lookup_section_flags
+	  (bfd *, struct flag_info *);
+
+DESCRIPTION
+	Provides default handling for section flags lookup
+	-- i.e., does nothing.
+*/
+
+void
+bfd_generic_lookup_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
+				  struct flag_info *finfo) 
+{
+  finfo->done = TRUE;
+}
+
+/*
+INTERNAL_FUNCTION
 	bfd_generic_merge_sections
 
 SYNOPSIS
Index: bfd/som.c
===================================================================
RCS file: /cvs/src/src/bfd/som.c,v
retrieving revision 1.83
diff -u -p -r1.83 som.c
--- bfd/som.c	14 Jan 2011 12:35:55 -0000	1.83
+++ bfd/som.c	18 May 2011 19:14:54 -0000
@@ -6741,6 +6741,7 @@ som_bfd_link_split_section (bfd *abfd AT
   _bfd_generic_copy_link_hash_symbol_type
 #define som_bfd_final_link                      _bfd_generic_final_link
 #define som_bfd_gc_sections		        bfd_generic_gc_sections
+#define som_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
 #define som_bfd_merge_sections		        bfd_generic_merge_sections
 #define som_bfd_is_group_section	        bfd_generic_is_group_section
 #define som_bfd_discard_group		        bfd_generic_discard_group
Index: bfd/srec.c
===================================================================
RCS file: /cvs/src/src/bfd/srec.c,v
retrieving revision 1.50
diff -u -p -r1.50 srec.c
--- bfd/srec.c	23 Nov 2009 14:41:30 -0000	1.50
+++ bfd/srec.c	18 May 2011 19:14:54 -0000
@@ -1252,6 +1252,7 @@ srec_print_symbol (bfd *abfd,
 #define srec_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
 #define srec_bfd_relax_section                    bfd_generic_relax_section
 #define srec_bfd_gc_sections                      bfd_generic_gc_sections
+#define srec_bfd_lookup_section_flags             bfd_generic_lookup_section_flags
 #define srec_bfd_merge_sections                   bfd_generic_merge_sections
 #define srec_bfd_is_group_section                 bfd_generic_is_group_section
 #define srec_bfd_discard_group                    bfd_generic_discard_group
Index: bfd/targets.c
===================================================================
RCS file: /cvs/src/src/bfd/targets.c,v
retrieving revision 1.199
diff -u -p -r1.199 targets.c
--- bfd/targets.c	13 May 2011 18:15:32 -0000	1.199
+++ bfd/targets.c	18 May 2011 19:14:54 -0000
@@ -177,6 +177,9 @@ DESCRIPTION
 .{* Forward declaration.  *}
 .typedef struct bfd_link_info _bfd_link_info;
 .
+.{* Forward declaration.  *}
+.typedef struct flag_info flag_info;
+.
 .typedef struct bfd_target
 .{
 .  {* Identifies the kind of target, e.g., SunOS4, Ultrix, etc.  *}
@@ -444,6 +447,7 @@ BFD_JUMP_TABLE macros.
 .  NAME##_bfd_final_link, \
 .  NAME##_bfd_link_split_section, \
 .  NAME##_bfd_gc_sections, \
+.  NAME##_bfd_lookup_section_flags, \
 .  NAME##_bfd_merge_sections, \
 .  NAME##_bfd_is_group_section, \
 .  NAME##_bfd_discard_group, \
@@ -488,6 +492,9 @@ BFD_JUMP_TABLE macros.
 .  {* Remove sections that are not referenced from the output.  *}
 .  bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *);
 .
+.  {* Remove sections with incorrect flags.  *}
+.  void (*_bfd_lookup_section_flags) (bfd *, struct flag_info *);
+.
 .  {* Attempt to merge SEC_MERGE sections.  *}
 .  bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
 .
Index: bfd/tekhex.c
===================================================================
RCS file: /cvs/src/src/bfd/tekhex.c,v
retrieving revision 1.39
diff -u -p -r1.39 tekhex.c
--- bfd/tekhex.c	15 Dec 2009 16:59:20 -0000	1.39
+++ bfd/tekhex.c	18 May 2011 19:14:54 -0000
@@ -943,6 +943,7 @@ tekhex_print_symbol (bfd *abfd,
 #define tekhex_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
 #define tekhex_bfd_relax_section                    bfd_generic_relax_section
 #define tekhex_bfd_gc_sections                      bfd_generic_gc_sections
+#define tekhex_bfd_lookup_section_flags		    bfd_generic_lookup_section_flags
 #define tekhex_bfd_merge_sections                   bfd_generic_merge_sections
 #define tekhex_bfd_is_group_section                 bfd_generic_is_group_section
 #define tekhex_bfd_discard_group                    bfd_generic_discard_group
Index: bfd/versados.c
===================================================================
RCS file: /cvs/src/src/bfd/versados.c,v
retrieving revision 1.39
diff -u -p -r1.39 versados.c
--- bfd/versados.c	27 Jun 2010 04:07:53 -0000	1.39
+++ bfd/versados.c	18 May 2011 19:14:54 -0000
@@ -806,6 +806,7 @@ versados_canonicalize_reloc (bfd *abfd,
 #define versados_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
 #define versados_bfd_relax_section                    bfd_generic_relax_section
 #define versados_bfd_gc_sections                      bfd_generic_gc_sections
+#define versados_bfd_lookup_section_flags             bfd_generic_lookup_section_flags
 #define versados_bfd_merge_sections                   bfd_generic_merge_sections
 #define versados_bfd_is_group_section                 bfd_generic_is_group_section
 #define versados_bfd_discard_group                    bfd_generic_discard_group
Index: bfd/vms-alpha.c
===================================================================
RCS file: /cvs/src/src/bfd/vms-alpha.c,v
retrieving revision 1.44
diff -u -p -r1.44 vms-alpha.c
--- bfd/vms-alpha.c	6 May 2011 10:41:11 -0000	1.44
+++ bfd/vms-alpha.c	18 May 2011 19:14:54 -0000
@@ -9324,6 +9324,7 @@ bfd_vms_get_data (bfd *abfd)
 
 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
+#define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
Index: bfd/xsym.c
===================================================================
RCS file: /cvs/src/src/bfd/xsym.c,v
retrieving revision 1.28
diff -u -p -r1.28 xsym.c
--- bfd/xsym.c	27 Jun 2010 04:07:53 -0000	1.28
+++ bfd/xsym.c	18 May 2011 19:14:54 -0000
@@ -42,6 +42,7 @@
 #define bfd_sym_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
 #define bfd_sym_bfd_relax_section                   bfd_generic_relax_section
 #define bfd_sym_bfd_gc_sections                     bfd_generic_gc_sections
+#define bfd_sym_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
 #define bfd_sym_bfd_merge_sections                  bfd_generic_merge_sections
 #define bfd_sym_bfd_is_group_section                bfd_generic_is_group_section
 #define bfd_sym_bfd_discard_group                   bfd_generic_discard_group
Index: include/bfdlink.h
===================================================================
RCS file: /cvs/src/src/include/bfdlink.h,v
retrieving revision 1.87
diff -u -p -r1.87 bfdlink.h
--- include/bfdlink.h	17 May 2011 13:02:16 -0000	1.87
+++ include/bfdlink.h	18 May 2011 19:14:54 -0000
@@ -224,6 +224,25 @@ enum report_method
   RM_GENERATE_ERROR
 };
 
+typedef enum {with_flags, without_flags} flag_type;
+
+/* A section flag list.  */
+struct flag_info_list
+{
+  flag_type with; 
+  const char *name;
+  struct flag_info_list *next;
+};
+
+/* Section flag info.  */
+struct flag_info
+{
+  unsigned only_with_flags;
+  unsigned not_with_flags;
+  struct flag_info_list *flag_list;
+  int done;
+};
+
 struct bfd_elf_dynamic_list;
 
 /* This structure holds all the information needed to communicate
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.275
diff -u -p -r1.275 ld.texinfo
--- ld/ld.texinfo	9 May 2011 13:23:25 -0000	1.275
+++ ld/ld.texinfo	18 May 2011 19:14:55 -0000
@@ -1,4 +1,4 @@
-\input texinfo
+@samp{\input exinfo
 @setfilename ld.info
 @c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
 @c 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
@@ -3673,6 +3673,7 @@ The full description of an output sectio
   [ALIGN(@var{section_align})]
   [SUBALIGN(@var{subsection_align})]
   [@var{constraint}]
+  [SECTION_FLAGS(@var{section_flag_list})]
   @{
     @var{output-section-command}
     @var{output-section-command}
@@ -4310,6 +4311,7 @@ like this:
   [ALIGN(@var{section_align})]
   [SUBALIGN(@var{subsection_align})]
   [@var{constraint}]
+  [SECTION_FLAGS(@var{section_flag_list})]
   @{
     @var{output-section-command}
     @var{output-section-command}
@@ -4328,6 +4330,7 @@ remaining section attributes.
 * Forced Output Alignment::	Forced Output Alignment
 * Forced Input Alignment::	Forced Input Alignment
 * Output Section Constraint::   Output section constraint
+* Output Section Flags::	Output section flags
 * Output Section Region::	Output section region
 * Output Section Phdr::		Output section phdr
 * Output Section Fill::		Output section fill
@@ -4488,6 +4491,29 @@ of its input sections are read-only or a
 read-write by using the keyword @code{ONLY_IF_RO} and
 @code{ONLY_IF_RW} respectively.
 
+@node Output Section Flags
+@subsubsection Output Section Flags
+@kindex SECTION_FLAGS(@var{section_flag_list})
+@cindex section flags on output sections
+You can specify that an output section should include only those input
+sections with certain section flags or that the output section should
+exclude input sections with the specified flags.
+
+Here is a simple example:
+@smallexample
+@group
+SECTIONS @{
+  .text : SECTION_FLAGS (Anyflag, Betterflag) @{ *(.text) @}
+  .text2 : SECTION_FLAGS (!Otherflag) @{ *(.text) @}
+@}
+@end group
+@end smallexample
+
+In this example, the output section @samp{.text} will be comprised of any input text
+section whose section header flags @code{Anyflag} and @code{Betterflag} are set.
+The output section @samp{.text2} will be comprised of any input text section
+whose section header flag @code{Otherflag} is clear.
+
 @node Output Section Region
 @subsubsection Output Section Region
 @kindex >@var{region}
Index: ld/ldgram.y
===================================================================
RCS file: /cvs/src/src/ld/ldgram.y,v
retrieving revision 1.65
diff -u -p -r1.65 ldgram.y
--- ld/ldgram.y	13 Jan 2011 13:29:55 -0000	1.65
+++ ld/ldgram.y	18 May 2011 19:14:55 -0000
@@ -74,6 +74,8 @@ static int error_index;
   struct name_list *name_list;
   int token;
   union etree_union *etree;
+  struct flag_info_list *flag_info_list;
+  struct flag_info *flag_info;
   struct phdr_info
     {
       bfd_boolean filehdr;
@@ -144,13 +146,15 @@ static int error_index;
 %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
 %token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
 %type <token> assign_op atype attributes_opt sect_constraint
+%type <flag_info_list> sect_flag_list
+%type <flag_info> sect_flags
 %type <name>  filename
 %token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
 %token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
 %token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
 %token <name> VERS_TAG VERS_IDENTIFIER
 %token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
-%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL
+%token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL SECTION_FLAGS
 %token EXCLUDE_FILE
 %token CONSTANT
 %type <versyms> vers_defns
@@ -939,24 +943,77 @@ sect_constraint:
 	|	{ $$ = 0; }
 	;
 
+sect_flag_list:	NAME
+		{
+		  struct flag_info_list *n;
+		  n = ((struct flag_info_list *) xmalloc (sizeof *n));
+		  n->with = with_flags;
+		  n->name = $1;
+		  n->next = NULL;
+		  $$ = n;
+		}
+	|	sect_flag_list opt_comma NAME
+		{
+		  struct flag_info_list *n;
+		  n = ((struct flag_info_list *) xmalloc (sizeof *n));
+		  n->with = with_flags;
+		  n->name = $3;
+		  n->next = $1;
+		  $$ = n;
+		}
+	|	'!' NAME
+		{
+		  struct flag_info_list *n;
+		  n = ((struct flag_info_list *) xmalloc (sizeof *n));
+		  n->with = without_flags;
+		  n->name = $2;
+		  n->next = NULL;
+		  $$ = n;
+		}
+	|	sect_flag_list opt_comma '!' NAME
+		{
+		  struct flag_info_list *n;
+		  n = ((struct flag_info_list *) xmalloc (sizeof *n));
+		  n->with = without_flags;
+		  n->name = $4;
+		  n->next = $1;
+		  $$ = n;
+		}
+	;
+
+sect_flags:
+		SECTION_FLAGS '(' sect_flag_list ')'
+		{
+		  struct flag_info *n;
+		  n = ((struct flag_info *) xmalloc (sizeof *n));
+		  n->flag_list = $3;
+		  n->done = FALSE;
+		  n->not_with_flags = 0;
+		  n->only_with_flags = 0;
+		  $$ = n;
+		}
+	|	{ $$ = 0; }
+	;
+
 section:	NAME 		{ ldlex_expression(); }
 		opt_exp_with_type
 		opt_at
 		opt_align
 		opt_subalign	{ ldlex_popstate (); ldlex_script (); }
 		sect_constraint
+		sect_flags
 		'{'
 			{
 			  lang_enter_output_section_statement($1, $3,
 							      sectype,
-							      $5, $6, $4, $8);
+							      $5, $6, $4, $8, $9);
 			}
 		statement_list_opt
  		'}' { ldlex_popstate (); ldlex_expression (); }
 		memspec_opt memspec_at_opt phdr_opt fill_opt
 		{
 		  ldlex_popstate ();
-		  lang_leave_output_section_statement ($17, $14, $16, $15);
+		  lang_leave_output_section_statement ($18, $15, $17, $16);
 		}
 		opt_comma
 		{}
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.369
diff -u -p -r1.369 ldlang.c
--- ld/ldlang.c	16 May 2011 11:34:48 -0000	1.369
+++ ld/ldlang.c	18 May 2011 19:14:55 -0000
@@ -1793,7 +1793,7 @@ lang_insert_orphan (asection *s,
   os_tail = ((lang_output_section_statement_type **)
 	     lang_output_section_statement.tail);
   os = lang_enter_output_section_statement (secname, address, normal_section,
-                                            NULL, NULL, NULL, constraint);
+                                            NULL, NULL, NULL, constraint, NULL);
 
   ps = NULL;
   if (config.build_constructors && *os_tail == os)
@@ -2280,6 +2280,20 @@ lang_add_section (lang_statement_list_ty
       return;
     }
 
+  if (output->sectflags)
+    {
+      if (output->sectflags->done == FALSE)
+	bfd_lookup_section_flags (link_info.output_bfd, output->sectflags);
+
+      if (output->sectflags->only_with_flags != 0
+	  && (output->sectflags->only_with_flags & section->flags) == 0)
+	return;
+
+      if (output->sectflags->not_with_flags != 0
+          && (output->sectflags->not_with_flags & section->flags) != 0)
+	return;
+    }
+
   if (section->output_section != NULL)
     return;
 
@@ -6156,7 +6170,8 @@ lang_enter_output_section_statement (con
 				     etree_type *align,
 				     etree_type *subalign,
 				     etree_type *ebase,
-				     int constraint)
+				     int constraint,
+				     flag_info *sflags)
 {
   lang_output_section_statement_type *os;
 
@@ -6175,6 +6190,7 @@ lang_enter_output_section_statement (con
     os->flags = SEC_NEVER_LOAD;
   os->block_value = 1;
 
+  os->sectflags = sflags;
   /* Make next things chain into subchain of this.  */
   push_stat_ptr (&os->children);
 
@@ -7279,7 +7295,7 @@ lang_enter_overlay_section (const char *
   etree_type *size;
 
   lang_enter_output_section_statement (name, overlay_vma, overlay_section,
-				       0, overlay_subalign, 0, 0);
+				       0, overlay_subalign, 0, 0, 0);
 
   /* If this is the first section, then base the VMA of future
      sections on this one.  This will work correctly even if `.' is
Index: ld/ldlang.h
===================================================================
RCS file: /cvs/src/src/ld/ldlang.h,v
retrieving revision 1.97
diff -u -p -r1.97 ldlang.h
--- ld/ldlang.h	3 May 2011 14:56:14 -0000	1.97
+++ ld/ldlang.h	18 May 2011 19:14:55 -0000
@@ -157,6 +157,7 @@ typedef struct lang_output_section_state
   int section_alignment;	/* Alignment of start of section.  */
   int constraint;
   flagword flags;
+  flag_info *sectflags;
   enum section_type sectype;
   unsigned int processed_vma : 1;
   unsigned int processed_lma : 1;
@@ -497,7 +498,8 @@ extern lang_output_section_statement_typ
    enum section_type sectype,
    etree_type *align,
    etree_type *subalign,
-   etree_type *, int);
+   etree_type *, int,
+   flag_info *sflags);
 extern void lang_final
   (void);
 extern void lang_relax_sections
Index: ld/ldlex.l
===================================================================
RCS file: /cvs/src/src/ld/ldlex.l,v
retrieving revision 1.52
diff -u -p -r1.52 ldlex.l
--- ld/ldlex.l	29 Mar 2011 02:52:36 -0000	1.52
+++ ld/ldlex.l	18 May 2011 19:14:55 -0000
@@ -309,6 +309,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([
 <EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO"	{ RTOKEN(ONLY_IF_RO); }
 <EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW"	{ RTOKEN(ONLY_IF_RW); }
 <EXPRESSION,BOTH,SCRIPT>"SPECIAL"	{ RTOKEN(SPECIAL); }
+<EXPRESSION,BOTH,SCRIPT>"SECTION_FLAGS"	{ RTOKEN(SECTION_FLAGS); }
 <BOTH,SCRIPT>"o"			{ RTOKEN(ORIGIN);}
 <BOTH,SCRIPT>"org"			{ RTOKEN(ORIGIN);}
 <BOTH,SCRIPT>"l"			{ RTOKEN( LENGTH);}
Index: ld/mri.c
===================================================================
RCS file: /cvs/src/src/ld/mri.c,v
retrieving revision 1.24
diff -u -p -r1.24 mri.c
--- ld/mri.c	13 Jan 2011 13:06:22 -0000	1.24
+++ ld/mri.c	18 May 2011 19:14:55 -0000
@@ -208,7 +208,7 @@ mri_draw_tree (void)
 
 	  lang_enter_output_section_statement (p->name, base,
 					       p->ok_to_load ? normal_section : noload_section,
-					       align, subalign, NULL, 0);
+					       align, subalign, NULL, 0, NULL);
 	  base = 0;
 	  tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
 	  tmp->next = NULL;
Index: ld/testsuite/ld-scripts/section-flags-1.exp
===================================================================
RCS file: ld/testsuite/ld-scripts/section-flags-1.exp
diff -N ld/testsuite/ld-scripts/section-flags-1.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-scripts/section-flags-1.exp	18 May 2011 19:14:55 -0000
@@ -0,0 +1,32 @@
+# Test SECTION_FLAGS in a linker script.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+set testname "SECTION_FLAGS"
+
+if ![ld_assemble $as $srcdir/$subdir/section-flags-1.s tmpdir/section-flags-1.o] {
+    unresolved $testname
+    return
+}
+
+if ![ld_simple_link $ld tmpdir/section-flags-1 "-T $srcdir/$subdir/section-flags-1.t tmpdir/section-flags-1.o"] {
+    fail $testname
+    return
+}
+
+pass $testname
Index: ld/testsuite/ld-scripts/section-flags-1.s
===================================================================
RCS file: ld/testsuite/ld-scripts/section-flags-1.s
diff -N ld/testsuite/ld-scripts/section-flags-1.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-scripts/section-flags-1.s	18 May 2011 19:14:55 -0000
@@ -0,0 +1,2 @@
+	.text
+	.space 16
Index: ld/testsuite/ld-scripts/section-flags-1.t
===================================================================
RCS file: ld/testsuite/ld-scripts/section-flags-1.t
diff -N ld/testsuite/ld-scripts/section-flags-1.t
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-scripts/section-flags-1.t	18 May 2011 19:14:55 -0000
@@ -0,0 +1,17 @@
+MEMORY
+{
+  ram (rwx) : ORIGIN = 0x100000, LENGTH = 144M
+}
+
+SECTIONS
+{
+  .text : SECTION_FLAGS (!anyflag)
+  {
+    *(.text .text.* .text_* .gnu.linkonce.t.*)
+  } >ram
+
+  .text_vle : SECTION_FLAGS (anyflag, otherflag, thirdflag)
+  {
+    *(.text .text.* .text_* .gnu.linkonce.t.*)
+  } >ram
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]