diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2002-03-04 20:41:55 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2002-03-04 20:41:55 +0000 |
commit | 25e2787005c2139fd4d92b1c78ce170da77c1672 (patch) | |
tree | 133a6d0a7d55bbdde50dfe70a8a5368ca5c0cab8 /bfd/elflink.h | |
parent | e9682144c14fc809af72bd6c0b8c69731d38679c (diff) | |
download | gdb-25e2787005c2139fd4d92b1c78ce170da77c1672.zip gdb-25e2787005c2139fd4d92b1c78ce170da77c1672.tar.gz gdb-25e2787005c2139fd4d92b1c78ce170da77c1672.tar.bz2 |
2002-03-04 H.J. Lu <hjl@gnu.org>
* elf.c (bfd_section_from_shdr): Handle special sections,
.init_array, .fini_array and .preinit_array.
(elf_fake_sections): Likewise.
* elflink.h (NAME(bfd_elf,size_dynamic_sections)): Create the
DT entry only if the section is in output for .init_array,
.fini_array and .preinit_array. Complain about .preinit_array
section in DSO.
(elf_bfd_final_link): Warn zero size for .init_array,
.fini_array and .preinit_array sections.
* elfxx-ia64.c (elfNN_ia64_section_from_shdr): Remove
SHT_INIT_ARRAY, SHT_FINI_ARRAY and SHT_PREINIT_ARRAY.
(elfNN_ia64_fake_sections): Remove .init_array, .fini_array and
.preinit_array.
Diffstat (limited to 'bfd/elflink.h')
-rw-r--r-- | bfd/elflink.h | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/bfd/elflink.h b/bfd/elflink.h index 7fd8b53..9f8f5f6 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -3029,9 +3029,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, struct bfd_elf_version_tree *verdefs; { bfd_size_type soname_indx; - bfd *dynobj, *sub; - asection *o; - int need_preinit_array = 0, need_init_array = 0, need_fini_array = 0; + bfd *dynobj; struct elf_backend_data *bed; struct elf_assign_sym_version_info asvinfo; @@ -3202,27 +3200,36 @@ 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 (bfd_get_section_by_name (output_bfd, ".preinit_array") != NULL) { + /* DT_PREINIT_ARRAY is not allowed in shared library. */ + if (info->shared) + { + bfd *sub; + asection *o; + + for (sub = info->input_bfds; sub != NULL; + sub = sub->link_next) + for (o = sub->sections; o != NULL; o = o->next) + if (elf_section_data (o)->this_hdr.sh_type + == SHT_PREINIT_ARRAY) + { + (*_bfd_error_handler) + (_("%s: .preinit_array section is not allowed in DSO"), + bfd_archive_filename (sub)); + break; + } + + return false; + } + 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 (bfd_get_section_by_name (output_bfd, ".init_array") != NULL) { if (!elf_add_dynamic_entry (info, (bfd_vma) DT_INIT_ARRAY, (bfd_vma) 0) @@ -3230,7 +3237,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, (bfd_vma) 0)) return false; } - if (need_fini_array) + if (bfd_get_section_by_name (output_bfd, ".fini_array") != NULL) { if (!elf_add_dynamic_entry (info, (bfd_vma) DT_FINI_ARRAY, (bfd_vma) 0) @@ -5600,6 +5607,9 @@ elf_bfd_final_link (abfd, info) get_size: o = bfd_get_section_by_name (abfd, name); BFD_ASSERT (o != NULL); + if (o->_raw_size == 0) + (*_bfd_error_handler) + (_("warning: %s section has zero size"), name); dyn.d_un.d_val = o->_raw_size; elf_swap_dyn_out (dynobj, &dyn, dyncon); break; |