aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>1998-04-25 21:10:01 +0000
committerRichard Henderson <rth@redhat.com>1998-04-25 21:10:01 +0000
commit986c3691f2fbae75e9d2b314e000b46d3aa393a3 (patch)
treef178c28df96102ca15d5ff67674d0b05796fb605 /bfd
parentad7302a08151e15626b420b70c60c6d5e3a5f327 (diff)
downloadfsf-binutils-gdb-986c3691f2fbae75e9d2b314e000b46d3aa393a3.zip
fsf-binutils-gdb-986c3691f2fbae75e9d2b314e000b46d3aa393a3.tar.gz
fsf-binutils-gdb-986c3691f2fbae75e9d2b314e000b46d3aa393a3.tar.bz2
* 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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf64-alpha.c25
2 files changed, 26 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 08bd9f7..c1f1ab5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
index 54cb033..3103081 100644
--- a/bfd/elf64-alpha.c
+++ b/bfd/elf64-alpha.c
@@ -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;
}
}