mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 05:47:26 +08:00
PR ld/12253
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Correct DW_EH_PE_datarel handling. Truncate .eh_frame_hdr address to ptr_size.
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
2010-11-24 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
PR ld/12253
|
||||||
|
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Correct
|
||||||
|
DW_EH_PE_datarel handling. Truncate .eh_frame_hdr address to
|
||||||
|
ptr_size.
|
||||||
|
|
||||||
2010-11-23 Mingming Sun <mingm.sun@gmail.com>
|
2010-11-23 Mingming Sun <mingm.sun@gmail.com>
|
||||||
|
|
||||||
* elfxx-mips.c (mips_set_isa_flags): Move bfd_mach_loongson_3a
|
* elfxx-mips.c (mips_set_isa_flags): Move bfd_mach_loongson_3a
|
||||||
|
@ -1572,10 +1572,31 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
|
|||||||
break;
|
break;
|
||||||
case DW_EH_PE_datarel:
|
case DW_EH_PE_datarel:
|
||||||
{
|
{
|
||||||
asection *got = bfd_get_section_by_name (abfd, ".got");
|
switch (abfd->arch_info->arch)
|
||||||
|
{
|
||||||
BFD_ASSERT (got != NULL);
|
case bfd_arch_ia64:
|
||||||
address += got->vma;
|
BFD_ASSERT (elf_gp (abfd) != 0);
|
||||||
|
address += elf_gp (abfd);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
(*info->callbacks->einfo)
|
||||||
|
(_("%P: DW_EH_PE_datarel unspecified"
|
||||||
|
" for this architecture.\n"));
|
||||||
|
/* Fall thru */
|
||||||
|
case bfd_arch_frv:
|
||||||
|
case bfd_arch_i386:
|
||||||
|
BFD_ASSERT (htab->hgot != NULL
|
||||||
|
&& ((htab->hgot->root.type
|
||||||
|
== bfd_link_hash_defined)
|
||||||
|
|| (htab->hgot->root.type
|
||||||
|
== bfd_link_hash_defweak)));
|
||||||
|
address
|
||||||
|
+= (htab->hgot->root.u.def.value
|
||||||
|
+ htab->hgot->root.u.def.section->output_offset
|
||||||
|
+ (htab->hgot->root.u.def.section->output_section
|
||||||
|
->vma));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DW_EH_PE_pcrel:
|
case DW_EH_PE_pcrel:
|
||||||
@ -1596,6 +1617,11 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
|
|||||||
|
|
||||||
if (hdr_info)
|
if (hdr_info)
|
||||||
{
|
{
|
||||||
|
/* The address calculation may overflow, giving us a
|
||||||
|
value greater than 4G on a 32-bit target when
|
||||||
|
dwarf_vma is 64-bit. */
|
||||||
|
if (sizeof (address) > 4 && ptr_size == 4)
|
||||||
|
address &= 0xffffffff;
|
||||||
hdr_info->array[hdr_info->array_count].initial_loc = address;
|
hdr_info->array[hdr_info->array_count].initial_loc = address;
|
||||||
hdr_info->array[hdr_info->array_count++].fde
|
hdr_info->array[hdr_info->array_count++].fde
|
||||||
= (sec->output_section->vma
|
= (sec->output_section->vma
|
||||||
|
Reference in New Issue
Block a user