aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2009-01-03 04:53:13 +0000
committerHans-Peter Nilsson <hp@axis.com>2009-01-03 04:53:13 +0000
commit0bdf8d408feea806ed4f377bae0cfb60915d51fa (patch)
tree2ae1ec24773a89cdda36268f53def4491a71baba
parent485440b750ee2895382b69ccdc236c2821c48931 (diff)
downloadgdb-0bdf8d408feea806ed4f377bae0cfb60915d51fa.zip
gdb-0bdf8d408feea806ed4f377bae0cfb60915d51fa.tar.gz
gdb-0bdf8d408feea806ed4f377bae0cfb60915d51fa.tar.bz2
* elf32-cris.c (elf_cris_finish_dynamic_symbol): Rename
gotplt_index to rela_plt_index. Adjust for R_CRIS_DTPMOD entry.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-cris.c24
2 files changed, 20 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 79fb7b2..dfb5d9d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2009-01-03 Hans-Peter Nilsson <hp@axis.com>
+
+ * elf32-cris.c (elf_cris_finish_dynamic_symbol): Rename
+ gotplt_index to rela_plt_index. Adjust for R_CRIS_DTPMOD entry.
+
2009-01-02 H.J. Lu <hongjiu.lu@intel.com>
PR ld/9679
diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c
index c297689..67816ea 100644
--- a/bfd/elf32-cris.c
+++ b/bfd/elf32-cris.c
@@ -2146,13 +2146,19 @@ elf_cris_finish_dynamic_symbol (output_bfd, info, h, sym)
bfd_byte *loc;
bfd_boolean has_gotplt = gotplt_offset != 0;
- /* Get the index in the procedure linkage table which
- corresponds to this symbol. This is the index of this symbol
- in all the symbols for which we are making plt entries. The
- first entry in the procedure linkage table is reserved. */
- /* We have to count backwards here, and the result is only valid as
- an index into .got.plt and its relocations. FIXME: Constants... */
- bfd_vma gotplt_index = gotplt_offset/4 - 3;
+ /* Get the index in the .rela.plt relocations for the .got.plt
+ entry that corresponds to this symbol.
+ We have to count backwards here, and the result is only valid
+ as an index into .rela.plt. We also have to undo the effect
+ of the R_CRIS_DTPMOD entry at .got index 3 (offset 12 into
+ .got.plt) for which gotplt_offset is adjusted, because while
+ that entry goes into .got.plt, its relocation goes into
+ .rela.got, not .rela.plt. (It's not PLT-specific; not to be
+ processed as part of the runtime lazy .rela.plt relocation).
+ FIXME: There be literal constants here... */
+ bfd_vma rela_plt_index
+ = (elf_cris_hash_table (info)->dtpmod_refcount != 0
+ ? gotplt_offset/4 - 2 - 3 : gotplt_offset/4 - 3);
/* Get the offset into the .got table of the entry that corresponds
to this function. Note that we embed knowledge that "incoming"
@@ -2202,7 +2208,7 @@ elf_cris_finish_dynamic_symbol (output_bfd, info, h, sym)
{
/* Fill in the offset to the reloc table. */
bfd_put_32 (output_bfd,
- gotplt_index * sizeof (Elf32_External_Rela),
+ rela_plt_index * sizeof (Elf32_External_Rela),
splt->contents + h->plt.offset + plt_off2);
/* Fill in the offset to the first PLT entry, where to "jump". */
@@ -2225,7 +2231,7 @@ elf_cris_finish_dynamic_symbol (output_bfd, info, h, sym)
+ got_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_JUMP_SLOT);
rela.r_addend = 0;
- loc = srela->contents + gotplt_index * sizeof (Elf32_External_Rela);
+ loc = srela->contents + rela_plt_index * sizeof (Elf32_External_Rela);
bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
}