mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 15:18:37 +08:00
* 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:
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user