From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13872 invoked by alias); 24 May 2011 22:57:57 -0000 Received: (qmail 13856 invoked by uid 22791); 24 May 2011 22:57:53 -0000 X-SWARE-Spam-Status: No, hits=-0.0 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; Tue, 24 May 2011 22:57:35 +0000 Received: (qmail 19594 invoked from network); 24 May 2011 22:57:33 -0000 Received: from unknown (HELO ?10.0.2.15?) (clm@127.0.0.2) by mail.codesourcery.com with ESMTPA; 24 May 2011 22:57:33 -0000 Message-ID: <4DDC37D2.3030700@codesourcery.com> Date: Tue, 24 May 2011 22:57: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: Ian Lance Taylor CC: binutils@sourceware.org, Catherine Moore , Tristan Gingold Subject: Re: [RFA] Linker script extension SECTION_FLAGS References: <4DD41EB0.6040300@codesourcery.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------070304070404030603050306" 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/msg00342.txt.bz2 This is a multi-part message in MIME format. --------------070304070404030603050306 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 4967 On 05/18/2011 08:07 PM, Ian Lance Taylor wrote: > Catherine Moore writes: >> >> Does this look okay to install? > > I didn't look at the patch, but I think the documentation needs to use > some real section flags, and ideally the set of valid flags should be > defined somewhere. It's not obvious what the valid values are. > > I'm also not sure about the way it appears in a linker script. You have > SECTION_FLAGS, which describes a constraint on the input sections > attached to an output section, next to things like AT, ALIGN, and > SUBALIGN, which describe characteristics of the output section. That is > OK, but I think that somebody looking at a linker script is likely to > think that SECTION_FLAGS is setting flags for the output section, much > as ALIGN sets the alignment of the output section. But that's not what > happens at all. So perhaps the name should be something like > INPUT_SECTION_FLAGS or perhaps the constraint should be expressed > somehow inside the output section definition, in the list of input > sections, rather than outside. > A new patch that addresses these concerns plus a couple that were pointed out by Tristan is attached here. Tristan, I didn't incorporate your comment regarding the backend hook into the new patch. I have now filled in bfd_elf_lookup_section_flags to handle all of the ELF common section header flags. The backend hook is intended to handle the target-specific flags. Although, I'm not submitting it at this time, the backend hook that I am using for the PowerPC VLE target is attached as an example. Please let me know if there are additional concerns or comments and whether this is okay to commit. I've tested ppc-elf, mips-elf and arm-coff targets. Thanks, Catherine bfd/ 2011-05-24 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_bfd_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. include/ 2011-05-24 Catherine Moore * bfdlink.h (flag_type): New enumeration. (flag_info_list): New structure. (flag_info): New structure. ld/testsuite/ 2011-05-24 Catherine Moore * ld-scripts/section-flags-1.exp: New. * ld-scripts/section-flags-1.s: New. * ld-scripts/section-flags-1.t: New. ld/2011-05-23 Catherine Moore * ld.texinfo: Document usage of INPUT_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 (INPUT_SECTION_FLAGS): New token. * mri.c (mri_draw_tree): Update argument list for land_enter_output_section_statement. --------------070304070404030603050306 Content-Type: text/plain; name="sf.patch2" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="sf.patch2" Content-length: 40163 Index: bfd/bfd-in2.h =================================================================== RCS file: /cvs/src/src/bfd/bfd-in2.h,v retrieving revision 1.537 diff -p -u -r1.537 bfd-in2.h --- bfd/bfd-in2.h 9 May 2011 13:23:24 -0000 1.537 +++ bfd/bfd-in2.h 24 May 2011 22:28:19 -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(link_info, flag_info) \ + BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, 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,10 @@ 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) (struct bfd_link_info *, + 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 -p -u -r1.116 bfd.c --- bfd/bfd.c 17 Apr 2011 23:15:11 -0000 1.116 +++ bfd/bfd.c 24 May 2011 22:28:19 -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(link_info, flag_info) \ +. BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, 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 -p -u -r1.39 binary.c --- bfd/binary.c 23 Nov 2009 14:41:28 -0000 1.39 +++ bfd/binary.c 24 May 2011 22:28:19 -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 -p -u -r1.101 coff-rs6000.c --- bfd/coff-rs6000.c 18 May 2011 07:58:30 -0000 1.101 +++ bfd/coff-rs6000.c 24 May 2011 22:28:19 -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 -p -u -r1.178 coffcode.h --- bfd/coffcode.h 18 May 2011 07:58:31 -0000 1.178 +++ bfd/coffcode.h 24 May 2011 22:28:19 -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.319 diff -p -u -r1.319 elf-bfd.h --- bfd/elf-bfd.h 23 May 2011 06:22:50 -0000 1.319 +++ bfd/elf-bfd.h 24 May 2011 22:28:19 -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,9 @@ extern bfd_boolean _bfd_elf_is_function_ extern int bfd_elf_get_default_section_type (flagword); +extern void bfd_elf_lookup_section_flags + (struct bfd_link_info *, 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 -p -u -r1.405 elflink.c --- bfd/elflink.c 18 May 2011 14:04:31 -0000 1.405 +++ bfd/elflink.c 24 May 2011 22:28:20 -0000 @@ -12162,6 +12162,128 @@ bfd_elf_gc_record_vtentry (bfd *abfd ATT return TRUE; } +void +bfd_elf_lookup_section_flags (struct bfd_link_info *info, + struct flag_info *finfo) +{ + bfd *output_bfd = info->output_bfd; + const struct elf_backend_data *bed = get_elf_backend_data (output_bfd); + struct flag_info_list *tf = finfo->flag_list; + int with_hex = 0; + int without_hex = 0; + + if (bed->elf_backend_lookup_section_flags_hook) + (*bed->elf_backend_lookup_section_flags_hook) (finfo); + + while (tf) + { + if (!strcmp (tf->name, "SHF_WRITE")) + { + if (tf->with == with_flags) + with_hex |= SHF_WRITE; + else if (tf->with == without_flags) + without_hex |= SHF_WRITE; + } + else if (!strcmp (tf->name, "SHF_ALLOC")) + { + if (tf->with == with_flags) + with_hex |= SHF_ALLOC; + else if (tf->with == without_flags) + without_hex |= SHF_ALLOC; + } + else if (!strcmp (tf->name, "SHF_EXECINSTR")) + { + if (tf->with == with_flags) + with_hex |= SHF_EXECINSTR; + else if (tf->with == without_flags) + without_hex |= SHF_EXECINSTR; + } + else if (!strcmp (tf->name, "SHF_MERGE")) + { + if (tf->with == with_flags) + with_hex |= SHF_MERGE; + else if (tf->with == without_flags) + without_hex |= SHF_MERGE; + } + else if (!strcmp (tf->name, "SHF_STRINGS")) + { + if (tf->with == with_flags) + with_hex |= SHF_STRINGS; + else if (tf->with == without_flags) + without_hex |= SHF_STRINGS; + } + else if (!strcmp (tf->name, "SHF_INFO_LINK")) + { + if (tf->with == with_flags) + with_hex |= SHF_INFO_LINK; + else if (tf->with == without_flags) + without_hex |= SHF_INFO_LINK; + } + else if (!strcmp (tf->name, "SHF_LINK_ORDER")) + { + if (tf->with == with_flags) + with_hex |= SHF_LINK_ORDER; + else if (tf->with == without_flags) + without_hex |= SHF_LINK_ORDER; + } + else if (!strcmp (tf->name, "SHF_OS_NONCONFORMING")) + { + if (tf->with == with_flags) + with_hex |= SHF_OS_NONCONFORMING; + else if (tf->with == without_flags) + without_hex |= SHF_OS_NONCONFORMING; + } + else if (!strcmp (tf->name, "SHF_GROUP")) + { + if (tf->with == with_flags) + with_hex |= SHF_GROUP; + else if (tf->with == without_flags) + without_hex |= SHF_GROUP; + } + else if (!strcmp (tf->name, "SHF_TLS")) + { + if (tf->with == with_flags) + with_hex |= SHF_TLS; + else if (tf->with == without_flags) + without_hex |= SHF_TLS; + } + else if (!strcmp (tf->name, "SHF_MASKOS")) + { + if (tf->with == with_flags) + with_hex |= SHF_MASKOS; + else if (tf->with == without_flags) + without_hex |= SHF_MASKOS; + } + else if (!strcmp (tf->name, "SHF_MASKOS")) + { + if (tf->with == with_flags) + with_hex |= SHF_MASKOS; + else if (tf->with == without_flags) + without_hex |= SHF_MASKOS; + } + else if (!strcmp (tf->name, "SHF_EXCLUDE")) + { + if (tf->with == with_flags) + with_hex |= SHF_EXCLUDE; + else if (tf->with == without_flags) + without_hex |= SHF_EXCLUDE; + } + else + { + if (tf->valid == FALSE) + info->callbacks->einfo + (_("Unrecognized INPUT_SECTION_FLAG %s\n"), tf->name); + return; + } + tf = tf->next; + } + finfo->done = TRUE; + finfo->only_with_flags |= with_hex; + finfo->not_with_flags |= without_hex; + + 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 -p -u -r1.124 elfxx-target.h --- bfd/elfxx-target.h 4 Nov 2010 11:35:01 -0000 1.124 +++ bfd/elfxx-target.h 24 May 2011 22:28:20 -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 -p -u -r1.70 ieee.c --- bfd/ieee.c 27 Jun 2010 04:07:53 -0000 1.70 +++ bfd/ieee.c 24 May 2011 22:28:20 -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 -p -u -r1.40 ihex.c --- bfd/ihex.c 23 Nov 2009 14:41:30 -0000 1.40 +++ bfd/ihex.c 24 May 2011 22:28:20 -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 -p -u -r1.88 libbfd-in.h --- bfd/libbfd-in.h 28 Apr 2011 12:50:32 -0000 1.88 +++ bfd/libbfd-in.h 24 May 2011 22:28:20 -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 (*) (struct bfd_link_info *, 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 -p -u -r1.251 libbfd.h --- bfd/libbfd.h 28 Apr 2011 12:50:32 -0000 1.251 +++ bfd/libbfd.h 24 May 2011 22:28:20 -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 (*) (struct bfd_link_info *, 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 + (struct bfd_link_info *, 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 -p -u -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 24 May 2011 22:28:20 -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 -p -u -r1.41 mmo.c --- bfd/mmo.c 27 Jun 2010 04:07:53 -0000 1.41 +++ bfd/mmo.c 24 May 2011 22:28:20 -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_bfd_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 -p -u -r1.45 oasys.c --- bfd/oasys.c 24 Mar 2010 15:41:59 -0000 1.45 +++ bfd/oasys.c 24 May 2011 22:28:20 -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 -p -u -r1.31 pef.c --- bfd/pef.c 14 Jan 2011 12:35:56 -0000 1.31 +++ bfd/pef.c 24 May 2011 22:28:20 -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 -p -u -r1.12 plugin.c --- bfd/plugin.c 26 Feb 2011 00:03:09 -0000 1.12 +++ bfd/plugin.c 24 May 2011 22:28:20 -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 -p -u -r1.33 ppcboot.c --- bfd/ppcboot.c 23 Nov 2009 14:41:30 -0000 1.33 +++ bfd/ppcboot.c 24 May 2011 22:28:20 -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 -p -u -r1.213 reloc.c --- bfd/reloc.c 31 Mar 2011 08:58:20 -0000 1.213 +++ bfd/reloc.c 24 May 2011 22:28:20 -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 + (struct bfd_link_info *, struct flag_info *); + +DESCRIPTION + Provides default handling for section flags lookup + -- i.e., does nothing. +*/ + +void +bfd_generic_lookup_section_flags (struct bfd_link_info *info 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 -p -u -r1.83 som.c --- bfd/som.c 14 Jan 2011 12:35:55 -0000 1.83 +++ bfd/som.c 24 May 2011 22:28:20 -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 -p -u -r1.50 srec.c --- bfd/srec.c 23 Nov 2009 14:41:30 -0000 1.50 +++ bfd/srec.c 24 May 2011 22:28:20 -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 -p -u -r1.199 targets.c --- bfd/targets.c 13 May 2011 18:15:32 -0000 1.199 +++ bfd/targets.c 24 May 2011 22:28:20 -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,10 @@ 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) (struct bfd_link_info *, +. 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 -p -u -r1.39 tekhex.c --- bfd/tekhex.c 15 Dec 2009 16:59:20 -0000 1.39 +++ bfd/tekhex.c 24 May 2011 22:28:20 -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 -p -u -r1.39 versados.c --- bfd/versados.c 27 Jun 2010 04:07:53 -0000 1.39 +++ bfd/versados.c 24 May 2011 22:28:20 -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 -p -u -r1.44 vms-alpha.c --- bfd/vms-alpha.c 6 May 2011 10:41:11 -0000 1.44 +++ bfd/vms-alpha.c 24 May 2011 22:28:20 -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 -p -u -r1.28 xsym.c --- bfd/xsym.c 27 Jun 2010 04:07:53 -0000 1.28 +++ bfd/xsym.c 24 May 2011 22:28:20 -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 -p -u -r1.87 bfdlink.h --- include/bfdlink.h 17 May 2011 13:02:16 -0000 1.87 +++ include/bfdlink.h 24 May 2011 22:28:20 -0000 @@ -224,6 +224,26 @@ 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; + bfd_boolean valid; + 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 -p -u -r1.275 ld.texinfo --- ld/ld.texinfo 9 May 2011 13:23:25 -0000 1.275 +++ ld/ld.texinfo 24 May 2011 22:28:20 -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}] + [INPUT_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}] + [INPUT_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 Input Section Flags:: Output section input 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 Input Section Flags +@subsubsection Output Section Input Section Flags +@kindex INPUT_SECTION_FLAGS(@var{section_flag_list}) +@cindex input 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 for using Section header flags for ELF sections: +@smallexample +@group +SECTIONS @{ + .text : INPUT_SECTION_FLAGS (SHF_MERGE & SHF_STRINGS) @{ *(.text) @} + .text2 : INPUT_SECTION_FLAGS (!SHF_WRITE) @{ *(.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{SHF_MERGE} and @code{SHF_STRINGS} are set. +The output section @samp{.text2} will be comprised of any input text section +whose section header flag @code{SHF_WRITE} 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 -p -u -r1.65 ldgram.y --- ld/ldgram.y 13 Jan 2011 13:29:55 -0000 1.65 +++ ld/ldgram.y 24 May 2011 22:28:20 -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 INPUT_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)); + if ($1[0] == '!') + { + n->with = without_flags; + n->name = &$1[1]; + } + else + { + n->with = with_flags; + n->name = $1; + } + n->valid = FALSE; + n->next = NULL; + $$ = n; + } + | sect_flag_list '&' NAME + { + struct flag_info_list *n; + n = ((struct flag_info_list *) xmalloc (sizeof *n)); + if ($3[0] == '!') + { + n->with = without_flags; + n->name = &$3[1]; + } + else + { + n->with = with_flags; + n->name = $3; + } + n->valid = FALSE; + n->next = $1; + $$ = n; + } + ; + +sect_flags: + INPUT_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.370 diff -p -u -r1.370 ldlang.c --- ld/ldlang.c 23 May 2011 05:41:01 -0000 1.370 +++ ld/ldlang.c 24 May 2011 22:28:20 -0000 @@ -1799,7 +1799,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) @@ -2261,6 +2261,7 @@ lang_add_section (lang_statement_list_ty flagword flags = section->flags; bfd_boolean discard; lang_input_section_type *new_section; + bfd *abfd = link_info.output_bfd; /* Discard sections marked with SEC_EXCLUDE. */ discard = (flags & SEC_EXCLUDE) != 0; @@ -2286,6 +2287,20 @@ lang_add_section (lang_statement_list_ty return; } + if (output->sectflags) + { + if (output->sectflags->done == FALSE) + bfd_lookup_section_flags (&link_info, 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; @@ -6162,7 +6177,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; @@ -6181,6 +6197,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); @@ -7285,7 +7302,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 -p -u -r1.97 ldlang.h --- ld/ldlang.h 3 May 2011 14:56:14 -0000 1.97 +++ ld/ldlang.h 24 May 2011 22:28:20 -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 -p -u -r1.52 ldlex.l --- ld/ldlex.l 29 Mar 2011 02:52:36 -0000 1.52 +++ ld/ldlex.l 24 May 2011 22:28:21 -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); } +"INPUT_SECTION_FLAGS" { RTOKEN(INPUT_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 -p -u -r1.24 mri.c --- ld/mri.c 13 Jan 2011 13:06:22 -0000 1.24 +++ ld/mri.c 24 May 2011 22:28:21 -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 24 May 2011 22:28:21 -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 24 May 2011 22:28:21 -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 24 May 2011 22:28:21 -0000 @@ -0,0 +1,17 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x100000, LENGTH = 144M +} + +SECTIONS +{ + .text : INPUT_SECTION_FLAGS (!SHF_TLS) + { + *(.text .text.* .text_* .gnu.linkonce.t.*) + } >ram + + .text_vle : INPUT_SECTION_FLAGS (SHF_MERGE & SHF_STRINGS & SHF_LINK_ORDER) + { + *(.text .text.* .text_* .gnu.linkonce.t.*) + } >ram +} --------------070304070404030603050306 Content-Type: text/x-patch; name="ppc-backend.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="ppc-backend.patch" Content-length: 814 Index: elf32-ppc.c =================================================================== --- elf32-ppc.c (revision 326234) +++ elf32-ppc.c (working copy) @@ -2320,6 +2320,50 @@ ppc_elf_write_core_note (bfd *abfd, char } } +static void +ppc_elf_lookup_section_flags (struct flag_info *finfo) +{ + struct flag_info_list *tf = finfo->flag_list; + int with_hex = 0; + int without_hex = 0; + bfd_boolean valid_flag_found = FALSE; + + while (tf) + { + if (!strcmp (tf->name, "SHF_PPC_VLE")) + { + if (tf->with == with_flags) + with_hex |= SHF_PPC_VLE; + else if (tf->with == without_flags) + without_hex |= SHF_PPC_VLE; + valid_flag_found = TRUE; + } + tf = tf->next; + } + finfo->done = TRUE; + finfo->only_with_flags = with_hex; + finfo->not_with_flags = without_hex; +} + --------------070304070404030603050306--