From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24542 invoked by alias); 18 May 2011 19:32:29 -0000 Received: (qmail 24501 invoked by uid 22791); 18 May 2011 19:32:24 -0000 X-SWARE-Spam-Status: No, hits=-0.1 required=5.0 tests=AWL,BAYES_50,TW_FN,TW_FX,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 18 May 2011 19:32:06 +0000 Received: (qmail 7222 invoked from network); 18 May 2011 19:32:05 -0000 Received: from unknown (HELO ?10.0.2.15?) (clm@127.0.0.2) by mail.codesourcery.com with ESMTPA; 18 May 2011 19:32:05 -0000 Message-ID: <4DD41EB0.6040300@codesourcery.com> Date: Wed, 18 May 2011 19:32:00 -0000 From: Catherine Moore User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110419 Lightning/1.0b2 Thunderbird/3.1.9 MIME-Version: 1.0 To: binutils@sourceware.org CC: Catherine Moore Subject: [RFA] Linker script extension SECTION_FLAGS Content-Type: multipart/mixed; boundary="------------020201080605070900070109" Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2011-05/txt/msg00271.txt.bz2 This is a multi-part message in MIME format. --------------020201080605070900070109 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 3724 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 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 * 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. --------------020201080605070900070109 Content-Type: text/x-patch; name="sf.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="sf.patch" Content-length: 36545 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 +} --------------020201080605070900070109--