From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3774 invoked by alias); 2 Mar 2002 01:36:45 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 3726 invoked from network); 2 Mar 2002 01:36:45 -0000 Received: from unknown (HELO deimos.hpl.hp.com) (192.6.19.190) by sources.redhat.com with SMTP; 2 Mar 2002 01:36:45 -0000 Received: from hplms2.hpl.hp.com (hplms2.hpl.hp.com [15.0.152.33]) by deimos.hpl.hp.com (8.9.3 (PHNE_24419)/HPL-PA Relay) with ESMTP id RAA21315; Fri, 1 Mar 2002 17:36:44 -0800 (PST) Received: from napali.hpl.hp.com (napali.hpl.hp.com [15.4.89.123]) by hplms2.hpl.hp.com (8.10.2/8.10.2 HPL-PA Hub) with ESMTP id g221ai320190; Fri, 1 Mar 2002 17:36:44 -0800 (PST) Received: from napali.hpl.hp.com (localhost [127.0.0.1]) by napali.hpl.hp.com (8.12.1/8.12.1/Debian -5) with ESMTP id g221ahf7009401; Fri, 1 Mar 2002 17:36:43 -0800 Received: (from davidm@localhost) by napali.hpl.hp.com (8.12.1/8.12.1/Debian -5) id g221ahuR009397; Fri, 1 Mar 2002 17:36:43 -0800 From: David Mosberger MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15488.11435.748938.966608@napali.hpl.hp.com> Date: Fri, 01 Mar 2002 17:36:00 -0000 To: Richard Henderson , drow@mvista.com Cc: GNU libc hacker , binutils@sources.redhat.com Subject: Re: [David Mosberger ] problem with unwind info for .init/.fini sections In-Reply-To: <20020301172558.A31648@redhat.com> References: <20020228173311.A26728@lucon.org> <15486.56491.696020.742674@napali.hpl.hp.com> <20020228175426.A30756@redhat.com> <15487.8879.719511.86715@napali.hpl.hp.com> <20020228225757.A30933@redhat.com> <15487.51034.573513.390031@napali.hpl.hp.com> <20020301164725.C31581@redhat.com> <15488.8807.791615.352587@napali.hpl.hp.com> <20020301170010.A31610@redhat.com> <15488.10204.283876.720829@napali.hpl.hp.com> <20020301172558.A31648@redhat.com> X-Mailer: VM 7.01 under Emacs 21.1.1 Reply-To: davidm@hpl.hp.com X-URL: http://www.hpl.hp.com/personal/David_Mosberger/ X-SW-Source: 2002-03/txt/msg00006.txt.bz2 >>>>> On Fri, 1 Mar 2002 17:25:58 -0800, Richard Henderson said: Rich> On Fri, Mar 01, 2002 at 05:16:12PM -0800, David Mosberger wrote: >> OK, that's what I did. Could this be applied to the relevant branches? Rich> Applied to mainline. Thanks! Rich> IIRC, the 2.12 branch is closed. Daniel, are you overseeing the 2.12 branch? If so, any chance to make an exception for this change? My hope is the patch is trivial enough to be considered safe and it would certainly help getting the remaining unwind-related bugs ironed out of ia64 linux. It should also help freebsd/ia64 to get this right from the start. --david --- bfd/ChangeLog: 2002-02-28 David Mosberger * elflink.h (size_dynamic_sections): If section named ".preinit_array" exists, create DT_PREINIT_ARRAY and DT_PREINIT_ARRAYSZ entries in dynamic table. Analogously for ".init_array" and ".fini_array". (elf_bfd_final_link): Handle DT_PREINIT_ARRAYSZ, DT_INIT_ARRAYSZ, DT_FINI_ARRAYSZ, DT_PREINIT_ARRAY, DT_INIT_ARRAY, and DT_FINI_ARRAY. --- ld/ChangeLog 2002-02-28 David Mosberger * scripttempl/elf.sc (SECTIONS): Add entries for .preinit_array, .init_array, and .fini_array. Index: bfd/elflink.h =================================================================== RCS file: /cvs/src/src/bfd/elflink.h,v retrieving revision 1.141 diff -u -r1.141 elflink.h --- bfd/elflink.h 2002/01/21 10:29:07 1.141 +++ bfd/elflink.h 2002/03/02 01:12:38 @@ -3029,7 +3029,9 @@ struct bfd_elf_version_tree *verdefs; { bfd_size_type soname_indx; - bfd *dynobj; + bfd *dynobj, *sub; + asection *o; + int need_preinit_array = 0, need_init_array = 0, need_fini_array = 0; struct elf_backend_data *bed; struct elf_assign_sym_version_info asvinfo; @@ -3200,6 +3202,43 @@ return false; } + for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) + for (o = sub->sections; o != NULL; o = o->next) + { + /* yuck, more matching by name... */ + + if (strcmp (bfd_section_name (sub, o), ".preinit_array") == 0) + need_preinit_array = 1; + if (strcmp (bfd_section_name (sub, o), ".init_array") == 0) + need_init_array = 1; + if (strcmp (bfd_section_name (sub, o), ".fini_array") == 0) + need_fini_array = 1; + } + if (need_preinit_array) + { + if (!elf_add_dynamic_entry (info, (bfd_vma) DT_PREINIT_ARRAY, + (bfd_vma) 0) + || !elf_add_dynamic_entry (info, (bfd_vma) DT_PREINIT_ARRAYSZ, + (bfd_vma) 0)) + return false; + } + if (need_init_array) + { + if (!elf_add_dynamic_entry (info, (bfd_vma) DT_INIT_ARRAY, + (bfd_vma) 0) + || !elf_add_dynamic_entry (info, (bfd_vma) DT_INIT_ARRAYSZ, + (bfd_vma) 0)) + return false; + } + if (need_fini_array) + { + if (!elf_add_dynamic_entry (info, (bfd_vma) DT_FINI_ARRAY, + (bfd_vma) 0) + || !elf_add_dynamic_entry (info, (bfd_vma) DT_FINI_ARRAYSZ, + (bfd_vma) 0)) + return false; + } + dynstr = bfd_get_section_by_name (dynobj, ".dynstr"); /* If .dynstr is excluded from the link, we don't want any of these tags. Strictly, we should be checking each section @@ -5548,6 +5587,31 @@ } } break; + + case DT_PREINIT_ARRAYSZ: + name = ".preinit_array"; + goto get_size; + case DT_INIT_ARRAYSZ: + name = ".init_array"; + goto get_size; + case DT_FINI_ARRAYSZ: + name = ".fini_array"; + get_size: + o = bfd_get_section_by_name (abfd, name); + BFD_ASSERT (o != NULL); + dyn.d_un.d_val = o->_raw_size; + elf_swap_dyn_out (dynobj, &dyn, dyncon); + break; + + case DT_PREINIT_ARRAY: + name = ".preinit_array"; + goto get_vma; + case DT_INIT_ARRAY: + name = ".init_array"; + goto get_vma; + case DT_FINI_ARRAY: + name = ".fini_array"; + goto get_vma; case DT_HASH: name = ".hash"; Index: ld/scripttempl/elf.sc =================================================================== RCS file: /cvs/src/src/ld/scripttempl/elf.sc,v retrieving revision 1.26 diff -u -r1.26 elf.sc --- ld/scripttempl/elf.sc 2002/02/12 14:50:08 1.26 +++ ld/scripttempl/elf.sc 2002/03/02 01:12:39 @@ -246,6 +246,23 @@ ${RELOCATING+${INIT_END}} } =${NOP-0} + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but + the linker would then create the section even if it turns out to + be empty, which isn't pretty. */ + ${RELOCATING+. = ALIGN(${ALIGNMENT})} + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_start = .);}} + .preinit_array ${RELOCATING-0} : { *(.preinit_array) } + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}} + + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .)}}; + .init_array ${RELOCATING-0} : { *(.init_array) } + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}} + + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}} + .fini_array ${RELOCATING-0} : { *(.fini_array) } + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}} + ${DATA_PLT-${BSS_PLT-${PLT}}} .text ${RELOCATING-0} : {