From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16336 invoked by alias); 1 Aug 2006 17:43:58 -0000 Received: (qmail 16200 invoked by uid 22791); 1 Aug 2006 17:43:57 -0000 X-Spam-Check-By: sourceware.org Received: from smtp111.sbc.mail.mud.yahoo.com (HELO smtp111.sbc.mail.mud.yahoo.com) (68.142.198.210) by sourceware.org (qpsmtpd/0.31) with SMTP; Tue, 01 Aug 2006 17:43:54 +0000 Received: (qmail 59944 invoked from network); 1 Aug 2006 17:43:49 -0000 Received: from unknown (HELO lucon.org) (hjjean@sbcglobal.net@71.146.93.16 with login) by smtp111.sbc.mail.mud.yahoo.com with SMTP; 1 Aug 2006 17:43:48 -0000 Received: by lucon.org (Postfix, from userid 1000) id 0A26563EE2; Tue, 1 Aug 2006 10:43:48 -0700 (PDT) Date: Tue, 01 Aug 2006 17:43:00 -0000 From: "H. J. Lu" To: Ashutosh Yeole , binutils@sourceware.org, Ben Elliston Subject: Re: NOLOAD problem with binutils 2.16.92 Message-ID: <20060801174347.GA11068@lucon.org> References: <20060728073331.GB22431@ozlabs.au.ibm.com> <4A1BE23A7B777442B60F4B4916AE0F130D2059AB@sohm.kpit.com> <20060731200318.GA32717@lucon.org> <20060731234540.GA13447@bubble.grove.modra.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20060731234540.GA13447@bubble.grove.modra.org> User-Agent: Mutt/1.4.2.1i Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2006-08/txt/msg00008.txt.bz2 On Tue, Aug 01, 2006 at 09:15:40AM +0930, Alan Modra wrote: > On Mon, Jul 31, 2006 at 01:03:18PM -0700, H. J. Lu wrote: > > 2006-07-31 H.J. Lu > > > > * ldlang.c (init_os): Add flags. Replace bfd_make_section with > > bfd_make_section_with_flags. > > (exp_init_os): Updated. > > (lang_add_section): Call init_os with flags. > > (map_input_to_output_sections): Likewise. > > The idea looks OK to me. > I am checking this patch with a testcase. H.J. --- ld/ 2006-08-01 H.J. Lu * ldlang.c (init_os): Add flags. Replace bfd_make_section with bfd_make_section_with_flags. (exp_init_os): Updated. (lang_add_section): Call init_os with flags. (map_input_to_output_sections): Likewise. ld/testsuite/ 2006-08-01 H.J. Lu * ld-elf/noload-1.d: New. * ld-elf/noload-1.s: Likewise. * ld-elf/noload-1.t: Likewise. --- ld/ldlang.c.noload 2006-07-28 13:58:01.000000000 -0700 +++ ld/ldlang.c 2006-08-01 10:38:23.000000000 -0700 @@ -1859,7 +1859,8 @@ sort_def_symbol (hash_entry, info) /* Initialize an output section. */ static void -init_os (lang_output_section_statement_type *s, asection *isec) +init_os (lang_output_section_statement_type *s, asection *isec, + flagword flags) { if (s->bfd_section != NULL) return; @@ -1869,7 +1870,8 @@ init_os (lang_output_section_statement_t s->bfd_section = bfd_get_section_by_name (output_bfd, s->name); if (s->bfd_section == NULL) - s->bfd_section = bfd_make_section (output_bfd, s->name); + s->bfd_section = bfd_make_section_with_flags (output_bfd, s->name, + flags); if (s->bfd_section == NULL) { einfo (_("%P%F: output format %s cannot represent section called %s\n"), @@ -1947,7 +1949,7 @@ exp_init_os (etree_type *exp) os = lang_output_section_find (exp->name.name); if (os != NULL && os->bfd_section == NULL) - init_os (os, NULL); + init_os (os, NULL, 0); } } break; @@ -2022,8 +2024,32 @@ lang_add_section (lang_statement_list_ty lang_input_section_type *new; flagword flags; + flags = section->flags; + + /* We don't copy the SEC_NEVER_LOAD flag from an input section + to an output section, because we want to be able to include a + SEC_NEVER_LOAD section in the middle of an otherwise loaded + section (I don't know why we want to do this, but we do). + build_link_order in ldwrite.c handles this case by turning + the embedded SEC_NEVER_LOAD section into a fill. */ + + flags &= ~ SEC_NEVER_LOAD; + + switch (output->sectype) + { + case normal_section: + break; + case noalloc_section: + flags &= ~SEC_ALLOC; + break; + case noload_section: + flags &= ~SEC_LOAD; + flags |= SEC_NEVER_LOAD; + break; + } + if (output->bfd_section == NULL) - init_os (output, section); + init_os (output, section, flags); first = ! output->bfd_section->linker_has_input; output->bfd_section->linker_has_input = 1; @@ -2047,17 +2073,6 @@ lang_add_section (lang_statement_list_ty new->section = section; section->output_section = output->bfd_section; - flags = section->flags; - - /* We don't copy the SEC_NEVER_LOAD flag from an input section - to an output section, because we want to be able to include a - SEC_NEVER_LOAD section in the middle of an otherwise loaded - section (I don't know why we want to do this, but we do). - build_link_order in ldwrite.c handles this case by turning - the embedded SEC_NEVER_LOAD section into a fill. */ - - flags &= ~ SEC_NEVER_LOAD; - /* If final link, don't copy the SEC_LINK_ONCE flags, they've already been processed. One reason to do this is that on pe format targets, .text$foo sections go into .text and it's odd @@ -2094,19 +2109,6 @@ lang_add_section (lang_statement_list_ty if ((section->flags & SEC_READONLY) == 0) output->bfd_section->flags &= ~SEC_READONLY; - switch (output->sectype) - { - case normal_section: - break; - case noalloc_section: - output->bfd_section->flags &= ~SEC_ALLOC; - break; - case noload_section: - output->bfd_section->flags &= ~SEC_LOAD; - output->bfd_section->flags |= SEC_NEVER_LOAD; - break; - } - /* Copy over SEC_SMALL_DATA. */ if (section->flags & SEC_SMALL_DATA) output->bfd_section->flags |= SEC_SMALL_DATA; @@ -3202,6 +3204,8 @@ map_input_to_output_sections (lang_statement_union_type *s, const char *target, lang_output_section_statement_type *os) { + flagword flags; + for (; s != NULL; s = s->header.next) { switch (s->header.type) @@ -3251,13 +3255,15 @@ map_input_to_output_sections /* Make sure that any sections mentioned in the expression are initialized. */ exp_init_os (s->data_statement.exp); - if (os != NULL && os->bfd_section == NULL) - init_os (os, NULL); + flags = SEC_HAS_CONTENTS; /* The output section gets contents, and then we inspect for any flags set in the input script which override any ALLOC. */ - os->bfd_section->flags |= SEC_HAS_CONTENTS; if (!(os->flags & SEC_NEVER_LOAD)) - os->bfd_section->flags |= SEC_ALLOC | SEC_LOAD; + flags |= SEC_ALLOC | SEC_LOAD; + if (os->bfd_section == NULL) + init_os (os, NULL, flags); + else + os->bfd_section->flags |= flags; break; case lang_input_section_enum: break; @@ -3267,11 +3273,11 @@ map_input_to_output_sections case lang_padding_statement_enum: case lang_input_statement_enum: if (os != NULL && os->bfd_section == NULL) - init_os (os, NULL); + init_os (os, NULL, 0); break; case lang_assignment_statement_enum: if (os != NULL && os->bfd_section == NULL) - init_os (os, NULL); + init_os (os, NULL, 0); /* Make sure that any sections mentioned in the assignment are initialized. */ @@ -3299,7 +3305,7 @@ map_input_to_output_sections (s->address_statement.section_name)); if (aos->bfd_section == NULL) - init_os (aos, NULL); + init_os (aos, NULL, 0); aos->addr_tree = s->address_statement.address; } break; --- ld/testsuite/ld-elf/noload-1.d.noload 2006-08-01 10:34:41.000000000 -0700 +++ ld/testsuite/ld-elf/noload-1.d 2006-08-01 10:34:15.000000000 -0700 @@ -0,0 +1,7 @@ +#source: noload-1.s +#ld: -T noload-1.t +#readelf: -S --wide + +#... + \[[ 0-9]+\] TEST[ \t]+NOBITS[ \t0-9a-f]+WA.* +#pass --- ld/testsuite/ld-elf/noload-1.s.noload 2006-08-01 10:34:41.000000000 -0700 +++ ld/testsuite/ld-elf/noload-1.s 2006-08-01 10:28:24.000000000 -0700 @@ -0,0 +1,2 @@ + .section TEST,"aw",%progbits + .byte 0 --- ld/testsuite/ld-elf/noload-1.t.noload 2006-08-01 10:34:41.000000000 -0700 +++ ld/testsuite/ld-elf/noload-1.t 2006-08-01 10:30:04.000000000 -0700 @@ -0,0 +1,8 @@ +SECTIONS +{ + TEST (NOLOAD) : + { + *(TEST) + } + /DISCARD/ : { *(.*) } +}