* 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.
This commit is contained in:
parent
841ac7901d
commit
30831527a4
2 changed files with 75 additions and 1 deletions
|
@ -1,3 +1,13 @@
|
|||
2002-03-01 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.
|
||||
|
||||
2002-02-26 Andrew Macleod <amacleod@cygnus.com>
|
||||
|
||||
* elflink.h (elf_bfd_final_link): Don't crash on SHN_UNDEF local
|
||||
|
|
|
@ -3029,7 +3029,9 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
|
|||
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 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
|
|||
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
|
||||
|
@ -5550,6 +5589,31 @@ elf_bfd_final_link (abfd, info)
|
|||
}
|
||||
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";
|
||||
goto get_vma;
|
||||
|
|
Loading…
Add table
Reference in a new issue