From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29432 invoked by alias); 2 Mar 2002 01:20:00 -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 29387 invoked from network); 2 Mar 2002 01:19:59 -0000 Received: from unknown (HELO deimos.hpl.hp.com) (192.6.19.190) by sources.redhat.com with SMTP; 2 Mar 2002 01:19:59 -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 RAA20153; Fri, 1 Mar 2002 17:16:17 -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 g221GG319451; Fri, 1 Mar 2002 17:16:16 -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 g221GGf7009288; Fri, 1 Mar 2002 17:16:16 -0800 Received: (from davidm@localhost) by napali.hpl.hp.com (8.12.1/8.12.1/Debian -5) id g221GCTA009284; Fri, 1 Mar 2002 17:16:12 -0800 From: David Mosberger MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15488.10204.283876.720829@napali.hpl.hp.com> Date: Fri, 01 Mar 2002 17:20:00 -0000 To: Richard Henderson Cc: "H . J . Lu" , Ulrich Drepper , GNU libc hacker , binutils@sources.redhat.com Subject: Re: [David Mosberger ] problem with unwind info for .init/.fini sections In-Reply-To: <20020301170010.A31610@redhat.com> References: <20020228165851.A26168@lucon.org> <15486.55079.333535.999190@napali.hpl.hp.com> <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> 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/msg00005.txt.bz2 >>>>> On Fri, 1 Mar 2002 17:00:10 -0800, Richard Henderson said: Richard> On Fri, Mar 01, 2002 at 04:52:55PM -0800, David Mosberger wrote: >> The reason I moved the labels outside is because >> otherwise the linker seems to insist on creating the sections, even if >> they're empty. Is there another way to avoid this? Richard> Not that I'm aware of. I suppose you could put Richard> ${RELOCATING+. = ALIGN(${ALIGNMENT})} Richard> before the first label, which should have the same effect. OK, that's what I did. Could this be applied to the relevant branches? Thanks, --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} : {