* elf64-alpha.c (elf64_alpha_relax_section): Use the proper section
authorRichard Henderson <rth@redhat.com>
Sat, 25 Apr 1998 21:10:01 +0000 (21:10 +0000)
committerRichard Henderson <rth@redhat.com>
Sat, 25 Apr 1998 21:10:01 +0000 (21:10 +0000)
        for calculating a local symbol's address.
        (elf64_alpha_calc_got_offsets): Skip entries with 0 use count.
        Set the .got's cooked size as well as the raw size.

bfd/ChangeLog
bfd/elf64-alpha.c

index 08bd9f7..c1f1ab5 100644 (file)
@@ -1,3 +1,10 @@
+Sat Apr 25 14:07:29 1998  Richard Henderson  <rth@cygnus.com>
+
+       * elf64-alpha.c (elf64_alpha_relax_section): Use the proper section
+       for calculating a local symbol's address.
+       (elf64_alpha_calc_got_offsets): Skip entries with 0 use count.
+       Set the .got's cooked size as well as the raw size.
+
 Fri Apr 24 09:16:00 1998  Nick Clifton  <nickc@cygnus.com>
 
        * elf32-v850.c (v850_elf_print_private_bfd_data): Add
index 54cb033..3103081 100644 (file)
@@ -1462,17 +1462,28 @@ elf64_alpha_relax_section (abfd, sec, link_info, again)
       if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
        {
          Elf_Internal_Sym isym;
+         asection *lsec;
 
          /* A local symbol.  */
          bfd_elf64_swap_symbol_in (abfd,
                                    extsyms + ELF64_R_SYM (irel->r_info),
                                    &isym);
+         if (isym.st_shndx == SHN_UNDEF)
+           lsec = bfd_und_section_ptr;
+         else if (isym.st_shndx > 0 && isym.st_shndx < SHN_LORESERVE)
+           lsec = bfd_section_from_elf_index (abfd, isym.st_shndx);
+         else if (isym.st_shndx == SHN_ABS)
+           lsec = bfd_abs_section_ptr;
+         else if (isym.st_shndx == SHN_COMMON)
+           lsec = bfd_com_section_ptr;
+         else 
+           continue;   /* who knows. */
 
          info.h = NULL;
          info.gotent = local_got_entries[ELF64_R_SYM(irel->r_info)];
          symval = (isym.st_value
-                   + sec->output_section->vma
-                   + sec->output_offset);
+                   + lsec->output_section->vma
+                   + lsec->output_offset);
        }
       else
        {
@@ -2892,13 +2903,15 @@ elf64_alpha_calc_got_offsets (info)
 
          for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
            for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
-             {
-               gotent->got_offset = got_offset;
-               got_offset += 8;
-             }
+             if (gotent->use_count > 0)
+               {
+                 gotent->got_offset = got_offset;
+                 got_offset += 8;
+               }
        }
 
       alpha_elf_tdata(i)->got->_raw_size = got_offset;
+      alpha_elf_tdata(i)->got->_cooked_size = got_offset;
     }
 }