* elflink.h (size_dynamic_sections): If section named
authorRichard Henderson <rth@redhat.com>
Sat, 2 Mar 2002 01:24:50 +0000 (01:24 +0000)
committerRichard Henderson <rth@redhat.com>
Sat, 2 Mar 2002 01:24:50 +0000 (01:24 +0000)
        ".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.

bfd/ChangeLog
bfd/elflink.h

index a381bfc63b6a3a8cc83514e460ee3caeae6b2b44..09dea78ca251eef7c93a30a91e1a35882b32ddda 100644 (file)
@@ -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
index 76dbb195b5184d6885dfbe2084b47441d684d9aa..7fd8b531d7e1ff0ce4a45ad3543276a95c0227db 100644 (file)
@@ -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;
This page took 0.030334 seconds and 4 git commands to generate.