* elf32-cris.c (elf_cris_finish_dynamic_symbol): Rename

gotplt_index to rela_plt_index.  Adjust for R_CRIS_DTPMOD entry.
This commit is contained in:
Hans-Peter Nilsson
2009-01-03 04:53:13 +00:00
parent 485440b750
commit 0bdf8d408f
2 changed files with 20 additions and 9 deletions

View File

@ -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> 2009-01-02 H.J. Lu <hongjiu.lu@intel.com>
PR ld/9679 PR ld/9679

View File

@ -2146,13 +2146,19 @@ elf_cris_finish_dynamic_symbol (output_bfd, info, h, sym)
bfd_byte *loc; bfd_byte *loc;
bfd_boolean has_gotplt = gotplt_offset != 0; bfd_boolean has_gotplt = gotplt_offset != 0;
/* Get the index in the procedure linkage table which /* Get the index in the .rela.plt relocations for the .got.plt
corresponds to this symbol. This is the index of this symbol entry that corresponds to this symbol.
in all the symbols for which we are making plt entries. The We have to count backwards here, and the result is only valid
first entry in the procedure linkage table is reserved. */ as an index into .rela.plt. We also have to undo the effect
/* We have to count backwards here, and the result is only valid as of the R_CRIS_DTPMOD entry at .got index 3 (offset 12 into
an index into .got.plt and its relocations. FIXME: Constants... */ .got.plt) for which gotplt_offset is adjusted, because while
bfd_vma gotplt_index = gotplt_offset/4 - 3; 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 /* Get the offset into the .got table of the entry that corresponds
to this function. Note that we embed knowledge that "incoming" 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. */ /* Fill in the offset to the reloc table. */
bfd_put_32 (output_bfd, 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); splt->contents + h->plt.offset + plt_off2);
/* Fill in the offset to the first PLT entry, where to "jump". */ /* 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); + got_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_JUMP_SLOT); rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_JUMP_SLOT);
rela.r_addend = 0; 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); bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
} }