From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30354 invoked by alias); 29 Mar 2005 11:08:20 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 29242 invoked from network); 29 Mar 2005 11:07:45 -0000 Received: from unknown (HELO gizmo01bw.bigpond.com) (144.140.70.11) by sourceware.org with SMTP; 29 Mar 2005 11:07:45 -0000 Received: (qmail 24944 invoked from network); 29 Mar 2005 11:07:42 -0000 Received: from unknown (HELO bwmam12.bigpond.com) (144.135.24.103) by gizmo01bw.bigpond.com with SMTP; 29 Mar 2005 11:07:42 -0000 Received: from cpe-144-136-221-26.sa.bigpond.net.au ([144.136.221.26]) by bwmam12.bigpond.com(MAM REL_3_4_2a 189/42256725) with SMTP id 42256725; Tue, 29 Mar 2005 21:07:42 +1000 Received: by bubble.modra.org (Postfix, from userid 500) id 033E71A01F6; Tue, 29 Mar 2005 20:37:41 +0930 Date: Tue, 29 Mar 2005 15:43:00 -0000 From: Alan Modra To: Ben Elliston , Anton Blanchard , binutils@sources.redhat.com Subject: Re: cvs binutils+gcc4.0 build fail Message-ID: <20050329110741.GK14407@bubble.modra.org> Mail-Followup-To: Ben Elliston , Anton Blanchard , binutils@sources.redhat.com References: <20050322212341.GD4980@krispykreme> <20050323083219.A21240@mailhub.air.net.au> <20050322222308.GE30711@bubble.modra.org> <20050329065139.GG14407@bubble.modra.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050329065139.GG14407@bubble.modra.org> User-Agent: Mutt/1.4i X-SW-Source: 2005-03/txt/msg00854.txt.bz2 On Tue, Mar 29, 2005 at 04:21:39PM +0930, Alan Modra wrote: > Something was indeed going wrong with eh_frame editing. It was being > done twice due to my 2005-03-21 ppc64elf.em change. Oops. Blah, it's worse than that. .eh_frame needs to be edited before stubs and suchlike are built. If the section layout changes after we're done adding stubs, then some of the stubs will have incorrect offsets. * emultempl/elf32.em (gld${EMULATION_NAME}_layout_sections_again): New function, extracted from static void gld${EMULATION_NAME}_finish. (gld${EMULATION_NAME}_strip_empty_sections): Likewise. (gld${EMULATION_NAME}_provide_init_fini_syms): Likewise. * emultempl/ppc64elf.em: Revert last change. (ppc_layout_sections_again): Use gld${EMULATION_NAME}_layout_sections_again. (ppc_finish): Don't call gld${EMULATION_NAME}_finish. Instead call gld${EMULATION_NAME}_strip_empty_sections and gld${EMULATION_NAME}_provide_init_fini_syms. * emultempl/hppaelf.em: Similarly. Index: ld/emultempl/elf32.em =================================================================== RCS file: /cvs/src/src/ld/emultempl/elf32.em,v retrieving revision 1.136 diff -c -p -r1.136 elf32.em *** ld/emultempl/elf32.em 23 Mar 2005 15:35:50 -0000 1.136 --- ld/emultempl/elf32.em 29 Mar 2005 10:53:24 -0000 *************** static void gld${EMULATION_NAME}_after_o *** 59,65 **** static void gld${EMULATION_NAME}_before_allocation (void); static bfd_boolean gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s); ! static void gld${EMULATION_NAME}_finish (void); EOF --- 59,68 ---- static void gld${EMULATION_NAME}_before_allocation (void); static bfd_boolean gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s); ! static void gld${EMULATION_NAME}_layout_sections_again (void); ! static void gld${EMULATION_NAME}_strip_empty_sections (void); ! static void gld${EMULATION_NAME}_provide_init_fini_syms (void); ! static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED; EOF *************** gld${EMULATION_NAME}_provide_bound_symbo *** 1450,1474 **** _bfd_elf_provide_symbol (&link_info, end, end_val); } static void ! gld${EMULATION_NAME}_finish (void) { ! if (bfd_elf_discard_info (output_bfd, &link_info)) { ! lang_reset_memory_regions (); ! ! /* Resize the sections. */ ! lang_size_sections (stat_ptr->head, abs_output_section, ! &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); ! ! /* Redo special stuff. */ ! ldemul_after_allocation (); ! ! /* Do the assignments again. */ ! lang_do_assignments (stat_ptr->head, abs_output_section, ! (fill_type *) 0, (bfd_vma) 0); } if (!link_info.relocatable) { lang_output_section_statement_type *os; --- 1453,1510 ---- _bfd_elf_provide_symbol (&link_info, end, end_val); } + /* If not building a shared library, provide + + __preinit_array_start + __preinit_array_end + __init_array_start + __init_array_end + __fini_array_start + __fini_array_end + + They are set here rather than via PROVIDE in the linker + script, because using PROVIDE inside an output section + statement results in unnecessary output sections. Using + PROVIDE outside an output section statement runs the risk of + section alignment affecting where the section starts. */ + static void ! gld${EMULATION_NAME}_provide_init_fini_syms (void) { ! if (!link_info.relocatable && !link_info.shared) { ! gld${EMULATION_NAME}_provide_bound_symbols (".preinit_array", ! "__preinit_array_start", ! "__preinit_array_end"); ! gld${EMULATION_NAME}_provide_bound_symbols (".init_array", ! "__init_array_start", ! "__init_array_end"); ! gld${EMULATION_NAME}_provide_bound_symbols (".fini_array", ! "__fini_array_start", ! "__fini_array_end"); } + } + static void + gld${EMULATION_NAME}_layout_sections_again (void) + { + lang_reset_memory_regions (); + + /* Resize the sections. */ + lang_size_sections (stat_ptr->head, abs_output_section, + &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); + + /* Redo special stuff. */ + ldemul_after_allocation (); + + /* Do the assignments again. */ + lang_do_assignments (stat_ptr->head, abs_output_section, + (fill_type *) 0, (bfd_vma) 0); + } + + static void + gld${EMULATION_NAME}_strip_empty_sections (void) + { if (!link_info.relocatable) { lang_output_section_statement_type *os; *************** gld${EMULATION_NAME}_finish (void) *** 1495,1529 **** } } } ! /* If not building shared library, provide ! __preinit_array_start ! __preinit_array_end ! __init_array_start ! __init_array_end ! __fini_array_start ! __fini_array_end ! ! They are set here rather than via PROVIDE in the linker ! script, because using PROVIDE inside an output section ! statement results in unnecessary output sections. Using ! PROVIDE outside an output section statement runs the risk of ! section alignment affecting where the section starts. */ ! ! if (!link_info.shared) ! { ! gld${EMULATION_NAME}_provide_bound_symbols ! (".preinit_array", "__preinit_array_start", ! "__preinit_array_end"); ! gld${EMULATION_NAME}_provide_bound_symbols ! (".init_array", "__init_array_start", ! "__init_array_end"); ! gld${EMULATION_NAME}_provide_bound_symbols ! (".fini_array", "__fini_array_start", ! "__fini_array_end"); ! } ! } } EOF fi --- 1531,1547 ---- } } } + } + } ! static void ! gld${EMULATION_NAME}_finish (void) ! { ! if (bfd_elf_discard_info (output_bfd, &link_info)) ! gld${EMULATION_NAME}_layout_sections_again (); ! gld${EMULATION_NAME}_strip_empty_sections (); ! gld${EMULATION_NAME}_provide_init_fini_syms (); } EOF fi Index: ld/emultempl/ppc64elf.em =================================================================== RCS file: /cvs/src/src/ld/emultempl/ppc64elf.em,v retrieving revision 1.41 diff -u -p -r1.41 ppc64elf.em --- ld/emultempl/ppc64elf.em 29 Mar 2005 06:52:22 -0000 1.41 +++ ld/emultempl/ppc64elf.em 29 Mar 2005 10:33:56 -0000 @@ -32,6 +32,9 @@ cat >>e${EMULATION_NAME}.c <head, abs_output_section, - &stat_ptr->head, 0, 0, NULL, TRUE); - - /* Recalculate TOC base. */ - ldemul_after_allocation (); + need_laying_out = 0; - /* Do the assignments again. */ - lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0); + gld${EMULATION_NAME}_layout_sections_again (); } @@ -316,6 +311,13 @@ ppc_finish (void) descriptor in the .opd section. */ entry_section = ".opd"; + /* bfd_elf_discard_info just plays with debugging sections, + ie. doesn't affect any code, so we can delay resizing the + sections. It's likely we'll resize everything in the process of + adding stubs. */ + if (bfd_elf_discard_info (output_bfd, &link_info)) + need_laying_out = 1; + /* If generating a relocatable output file, then we don't have any stubs. */ if (stub_file != NULL && !link_info.relocatable) @@ -344,6 +346,9 @@ ppc_finish (void) } } + if (need_laying_out) + ppc_layout_sections_again (); + if (link_info.relocatable) { asection *toc = bfd_get_section_by_name (output_bfd, ".toc"); @@ -374,7 +379,8 @@ ppc_finish (void) } ppc64_elf_restore_symbols (&link_info); - gld${EMULATION_NAME}_finish (); + gld${EMULATION_NAME}_strip_empty_sections (); + gld${EMULATION_NAME}_provide_init_fini_syms (); } Index: ld/emultempl/hppaelf.em =================================================================== RCS file: /cvs/src/src/ld/emultempl/hppaelf.em,v retrieving revision 1.39 diff -u -p -r1.39 hppaelf.em --- ld/emultempl/hppaelf.em 29 Mar 2005 06:52:22 -0000 1.39 +++ ld/emultempl/hppaelf.em 29 Mar 2005 10:33:56 -0000 @@ -36,6 +35,9 @@ static lang_input_statement_type *stub_f stubs. */ static int multi_subspace = 0; +/* Whether we need to call hppa_layout_sections_again. */ +static int need_laying_out = 0; + /* Maximum size of a group of input sections that can be handled by one stub section. A value of +/-1 indicates the bfd back-end should use a suitable default size. */ @@ -217,18 +219,9 @@ hppaelf_layout_sections_again (void) /* If we have changed sizes of the stub sections, then we need to recalculate all the section offsets. This may mean we need to add even more stubs. */ - lang_reset_memory_regions (); + need_laying_out = 0; - /* Resize the sections. */ - lang_size_sections (stat_ptr->head, abs_output_section, - &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE); - - /* Redo special stuff. */ - ldemul_after_allocation (); - - /* Do the assignments again. */ - lang_do_assignments (stat_ptr->head, abs_output_section, - (fill_type *) 0, (bfd_vma) 0); + gld${EMULATION_NAME}_layout_sections_again (); } @@ -253,6 +246,13 @@ build_section_lists (lang_statement_unio static void hppaelf_finish (void) { + /* bfd_elf_discard_info just plays with debugging sections, + ie. doesn't affect any code, so we can delay resizing the + sections. It's likely we'll resize everything in the process of + adding stubs. */ + if (bfd_elf_discard_info (output_bfd, &link_info)) + need_laying_out = 1; + /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (stub_file != NULL && !link_info.relocatable) @@ -284,6 +284,9 @@ hppaelf_finish (void) } } + if (need_laying_out) + hppaelf_layout_sections_again (); + if (! link_info.relocatable) { /* Set the global data pointer. */ @@ -297,14 +300,12 @@ hppaelf_finish (void) if (stub_file != NULL && stub_file->the_bfd->sections != NULL) { if (! elf32_hppa_build_stubs (&link_info)) - { - einfo ("%X%P: can not build stubs: %E\n"); - return; - } + einfo ("%X%P: can not build stubs: %E\n"); } } - gld${EMULATION_NAME}_finish (); + gld${EMULATION_NAME}_strip_empty_sections (); + gld${EMULATION_NAME}_provide_init_fini_syms (); } -- Alan Modra IBM OzLabs - Linux Technology Centre