This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [David Mosberger <davidm@hpl.hp.com>] problem with unwind info for .init/.fini sections
- From: David Mosberger <davidm at napali dot hpl dot hp dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: "H . J . Lu" <hjl at lucon dot org>, Ulrich Drepper <drepper at redhat dot com>, GNU libc hacker <libc-hacker at sources dot redhat dot com>, binutils at sources dot redhat dot com
- Date: Fri, 1 Mar 2002 17:16:12 -0800
- Subject: Re: [David Mosberger <davidm@hpl.hp.com>] problem with unwind info for .init/.fini sections
- 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>
- Reply-to: davidm at hpl dot hp dot com
>>>>> 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} :
{