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 assign_op atype attributes_opt sect_constraint +%type sect_flag_list +%type sect_flags %type 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 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 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\[\]\-\!\^\\]([ "ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); } "ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); } "SPECIAL" { RTOKEN(SPECIAL); } +"SECTION_FLAGS" { RTOKEN(SECTION_FLAGS); } "o" { RTOKEN(ORIGIN);} "org" { RTOKEN(ORIGIN);} "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 +}