Jakub Jelinek <jj@ultra.linux.cz>
authorRichard Henderson <rth@redhat.com>
Fri, 30 Jul 1999 21:42:21 +0000 (21:42 +0000)
committerRichard Henderson <rth@redhat.com>
Fri, 30 Jul 1999 21:42:21 +0000 (21:42 +0000)
        * elf64-sparc.c (sparc64_elf_build_plt): Cosmetic change - ABI
        wants ba,a,pt %xcc instead of %icc.
        Emit correct .PLT0-(.PLTN+4) initial value into the pointer slots
        of large PLT entries.
        (sparc64_elf_plt_ptr_offset): Fix calculation.
        (sparc64_elf_finish_dynamic_symbol): Negative value of R_SPARC_JMP_SLOT
        addend should be relative to load address, not .plt section start.
        (sparc64_elf_size_info): Sparc64 uses 32bit .hash entries.

bfd/ChangeLog
bfd/elf64-sparc.c

index a6ce276..b995110 100644 (file)
@@ -1,5 +1,16 @@
 1999-07-30  Jakub Jelinek  <jj@ultra.linux.cz>
 
+       * elf64-sparc.c (sparc64_elf_build_plt): Cosmetic change - ABI
+       wants ba,a,pt %xcc instead of %icc.
+       Emit correct .PLT0-(.PLTN+4) initial value into the pointer slots
+       of large PLT entries.
+       (sparc64_elf_plt_ptr_offset): Fix calculation.
+       (sparc64_elf_finish_dynamic_symbol): Negative value of R_SPARC_JMP_SLOT
+       addend should be relative to load address, not .plt section start.
+       (sparc64_elf_size_info): Sparc64 uses 32bit .hash entries.
+
+1999-07-30  Jakub Jelinek  <jj@ultra.linux.cz>
+
        * elf-bfd.h (struct elf_backend_data): Add
        print_symbol_all and output_arch_syms backend methods.
        * elfxx-target.h: Likewise.
index 107f371..733ea5e 100644 (file)
@@ -875,8 +875,8 @@ sparc64_elf_build_plt (output_bfd, contents, nentries)
       /* sethi (. - plt0), %g1 */
       sethi = 0x03000000 | (i * PLT_ENTRY_SIZE);
 
-      /* ba,a,pt %icc, plt1 */
-      ba = 0x30480000 | (((contents+PLT_ENTRY_SIZE) - (entry+4)) / 4 & 0x7ffff);
+      /* ba,a,pt %xcc, plt1 */
+      ba = 0x30680000 | (((contents+PLT_ENTRY_SIZE) - (entry+4)) / 4 & 0x7ffff);
 
       bfd_put_32 (output_bfd, sethi, entry);
       bfd_put_32 (output_bfd, ba, entry+4);
@@ -913,7 +913,7 @@ sparc64_elf_build_plt (output_bfd, contents, nentries)
          bfd_put_32 (output_bfd, 0x83c3c001, entry+16); /* jmpl %o7+%g1,%g1 */
          bfd_put_32 (output_bfd, 0x9e100005, entry+20); /* mov %g5,%o7 */
 
-         bfd_put_64 (output_bfd, contents - entry+4, ptr);
+         bfd_put_64 (output_bfd, contents - (entry+4), ptr);
        }
     }
 }
@@ -948,11 +948,15 @@ sparc64_elf_plt_ptr_offset (index, max)
 
   /* See above for details.  */
 
-  block = (index - LARGE_PLT_THRESHOLD) / 160;
-  ofs = (index - LARGE_PLT_THRESHOLD) % 160;
-  last = (max - LARGE_PLT_THRESHOLD) % 160;
+  block = (((index - LARGE_PLT_THRESHOLD) / 160) * 160)
+         + LARGE_PLT_THRESHOLD;
+  ofs = index - block;
+  if (block + 160 > max)
+    last = (max - LARGE_PLT_THRESHOLD) % 160;
+  else
+    last = 160;
 
-  return ((LARGE_PLT_THRESHOLD + block*160) * PLT_ENTRY_SIZE
+  return (block * PLT_ENTRY_SIZE
          + last * 6*4
          + ofs * 8);
 }
@@ -2566,7 +2570,8 @@ sparc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
        {
          int max = splt->_raw_size / PLT_ENTRY_SIZE;
          rela.r_offset = sparc64_elf_plt_ptr_offset (h->plt.offset, max);
-         rela.r_addend = -(sparc64_elf_plt_entry_offset (h->plt.offset) + 4);
+         rela.r_addend = -(sparc64_elf_plt_entry_offset (h->plt.offset) + 4)
+                         -(splt->output_section->vma + splt->output_offset);
        }
       rela.r_offset += (splt->output_section->vma + splt->output_offset);
       rela.r_info = ELF64_R_INFO (h->dynindx, R_SPARC_JMP_SLOT);
@@ -2896,7 +2901,7 @@ const struct elf_size_info sparc64_elf_size_info =
   sizeof (Elf64_External_Sym),
   sizeof (Elf64_External_Dyn),
   sizeof (Elf_External_Note),
-  8,           /* hash-table entry size */
+  4,           /* hash-table entry size */
   /* internal relocations per external relocations.
      For link purposes we use just 1 internal per
      1 external, for assembly and slurp symbol table