* elf32-sh.c (sh_elf_finish_dynamic_sections): Set LSB of DT_INIT
authorAlan Modra <amodra@gmail.com>
Fri, 23 Aug 2002 08:13:12 +0000 (08:13 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 23 Aug 2002 08:13:12 +0000 (08:13 +0000)
value if .init is an SHmedia function.  Similarly for DT_FINI.
* elf64-sh64.c (sh64_elf64_finish_dynamic_sections): Likewise.

bfd/ChangeLog
bfd/elf32-sh.c
bfd/elf64-sh64.c

index 5b95fe9..015dec4 100644 (file)
@@ -1,8 +1,15 @@
+2002-08-23  Stephen Clarke <stephen.clarke@superh.com>,
+           Richard Shann <richard.shann@superh.com>
+
+       * elf32-sh.c (sh_elf_finish_dynamic_sections): Set LSB of DT_INIT
+       value if .init is an SHmedia function.  Similarly for DT_FINI.
+       * elf64-sh64.c (sh64_elf64_finish_dynamic_sections): Likewise.
+       
 2002-08-23  Stephen Clarke <stephen.clarke@superh.com>
 
-       * bfd/elf32-sh.c (sh_elf_size_dynamic_sections): Zero initialize
+       * elf32-sh.c (sh_elf_size_dynamic_sections): Zero initialize
        dynamic section.
-       * bfd/elf64-sh64.c (sh64_elf64_size_dynamic_sections): Likewise.
+       * elf64-sh64.c (sh64_elf64_size_dynamic_sections): Likewise.
 
 2002-08-22  Kaz Kojima <kkojima@rr.iij4u.or.jp>
 
index b31a2a6..295fe0b 100644 (file)
@@ -5697,6 +5697,7 @@ sh_elf_finish_dynamic_sections (output_bfd, info)
          Elf_Internal_Dyn dyn;
          const char *name;
          asection *s;
+         struct elf_link_hash_entry *h;
 
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
 
@@ -5705,6 +5706,27 @@ sh_elf_finish_dynamic_sections (output_bfd, info)
            default:
              break;
 
+#ifdef INCLUDE_SHMEDIA
+           case DT_INIT:
+             name = info->init_function;
+             goto get_sym;
+
+           case DT_FINI:
+             name = info->fini_function;
+           get_sym:
+             if (dyn.d_un.d_val != 0)
+               {
+                 h = elf_link_hash_lookup (elf_hash_table (info), name,
+                                           false, false, true);
+                 if (h != NULL && (h->other & STO_SH5_ISA32))
+                   {
+                     dyn.d_un.d_val |= 1;
+                     bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
+                   }
+               }
+             break;
+#endif
+
            case DT_PLTGOT:
              name = ".got";
              goto get_vma;
index 48e7e49..9db6301 100644 (file)
@@ -3990,6 +3990,7 @@ sh64_elf64_finish_dynamic_sections (output_bfd, info)
          Elf_Internal_Dyn dyn;
          const char *name;
          asection *s;
+         struct elf_link_hash_entry *h;
 
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
 
@@ -3998,6 +3999,25 @@ sh64_elf64_finish_dynamic_sections (output_bfd, info)
            default:
              break;
 
+           case DT_INIT:
+             name = info->init_function;
+             goto get_sym;
+
+           case DT_FINI:
+             name = info->fini_function;
+           get_sym:
+             if (dyn.d_un.d_val != 0)
+               {
+                 h = elf_link_hash_lookup (elf_hash_table (info), name,
+                                           false, false, true);
+                 if (h != NULL && (h->other & STO_SH5_ISA32))
+                   {
+                     dyn.d_un.d_val |= 1;
+                     bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
+                   }
+               }
+             break;
+
            case DT_PLTGOT:
              name = ".got";
              goto get_vma;