aboutsummaryrefslogtreecommitdiff
path: root/bfd/elflink.h
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2002-03-04 20:41:55 +0000
committerH.J. Lu <hjl.tools@gmail.com>2002-03-04 20:41:55 +0000
commit25e2787005c2139fd4d92b1c78ce170da77c1672 (patch)
tree133a6d0a7d55bbdde50dfe70a8a5368ca5c0cab8 /bfd/elflink.h
parente9682144c14fc809af72bd6c0b8c69731d38679c (diff)
downloadgdb-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.h46
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;