* elfcode.h (NAME(bfd_elf,size_dynamic_sections)): Create DT_INIT
authorIan Lance Taylor <ian@airs.com>
Mon, 31 Oct 1994 00:04:03 +0000 (00:04 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 31 Oct 1994 00:04:03 +0000 (00:04 +0000)
and DT_FINI dynamic entries based on the existence of _init and
_fini symbols, not on the .init and .fini sections.  This is
compatible with some SVR4 linkers.
(elf_bfd_final_link): Corresponding change.

bfd/ChangeLog
bfd/elfcode.h

index b09244255fbcd4ef8aa07c564026a548f382fc23..98cb44bd18eb41a80f0a1e6d2b93058f06d56669 100644 (file)
@@ -1,3 +1,11 @@
+Sun Oct 30 18:56:58 1994  Ian Lance Taylor  <ian@sanguine.cygnus.com>
+
+       * elfcode.h (NAME(bfd_elf,size_dynamic_sections)): Create DT_INIT
+       and DT_FINI dynamic entries based on the existence of _init and
+       _fini symbols, not on the .init and .fini sections.  This is
+       compatible with some SVR4 linkers.
+       (elf_bfd_final_link): Corresponding change.
+
 Sat Oct 29 12:18:10 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
        * elf32-i386.c (elf_i386_adjust_dynamic_symbol): Don't move a
index d3b477f68103aa6c9158a1bd6a5696fb4b08e421..0e4a252f7dee8b88788419e55a676137b4722442 100644 (file)
@@ -4858,12 +4858,14 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, info,
       /* Add some entries to the .dynamic section.  We fill in some of the
         values later, in elf_bfd_final_link, but we must add the entries
         now so that we know the final size of the .dynamic section.  */
-      if (bfd_get_section_by_name (output_bfd, ".init") != NULL)
+      if (elf_link_hash_lookup (elf_hash_table (info), "_init", false,
+                               false, false) != NULL)
        {
          if (! elf_add_dynamic_entry (info, DT_INIT, 0))
            return false;
        }
-      if (bfd_get_section_by_name (output_bfd, ".fini") != NULL)
+      if (elf_link_hash_lookup (elf_hash_table (info), "_fini", false,
+                               false, false) != NULL)
        {
          if (! elf_add_dynamic_entry (info, DT_FINI, 0))
            return false;
@@ -5568,12 +5570,35 @@ elf_bfd_final_link (abfd, info)
            default:
              break;
 
+             /* SVR4 linkers seem to set DT_INIT and DT_FINI based on
+                 magic _init and _fini symbols.  This is pretty ugly,
+                 but we are compatible.  */
            case DT_INIT:
-             name = ".init";
-             goto get_vma;
+             name = "_init";
+             goto get_sym;
            case DT_FINI:
-             name = ".fini";
-             goto get_vma;
+             name = "_fini";
+           get_sym:
+             {
+               struct elf_link_hash_entry *h;
+
+               h = elf_link_hash_lookup (elf_hash_table (info), name,
+                                         false, false, true);
+               BFD_ASSERT (h != NULL);
+               if (h->root.type == bfd_link_hash_defined)
+                 {
+                   dyn.d_un.d_val = h->root.u.def.value;
+                   o = h->root.u.def.section;
+                   if (o->output_section != NULL)
+                     dyn.d_un.d_val += (o->output_section->vma
+                                        + o->output_offset);
+                   else
+                     dyn.d_un.d_val += o->vma;
+                 }
+               elf_swap_dyn_out (dynobj, &dyn, dyncon);
+             }
+             break;
+
            case DT_HASH:
              name = ".hash";
              goto get_vma;
@@ -5883,8 +5908,8 @@ elf_link_output_extsym (h, data)
          }
        else
          {
-           BFD_ASSERT (bfd_get_flavour (input_sec->owner)
-                       == bfd_target_elf_flavour
+           BFD_ASSERT ((bfd_get_flavour (input_sec->owner)
+                        == bfd_target_elf_flavour)
                        && elf_elfheader (input_sec->owner)->e_type == ET_DYN);
            sym.st_shndx = SHN_UNDEF;
            input_sec = bfd_und_section_ptr;