This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
>>>>> On Fri, 1 Mar 2002 17:00:10 -0800, Richard Henderson <rth@redhat.com> 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 <davidm@hpl.hp.com> * 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 <davidm@hpl.hp.com> * 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} : {
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |