| Index: bfd/elf-eh-frame.c
|
| diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
|
| index a75d806165ab4385d54d82f57dea45a4ac4f3865..832a99192deb6a0d172837a1804e116b32c0c3f2 100644
|
| --- a/bfd/elf-eh-frame.c
|
| +++ b/bfd/elf-eh-frame.c
|
| @@ -1243,7 +1243,7 @@ _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
|
| if (hdr_info->table)
|
| sec->size += 4 + hdr_info->fde_count * 8;
|
|
|
| - elf_tdata (abfd)->eh_frame_hdr = sec;
|
| + elf_eh_frame_hdr (abfd) = sec;
|
| return TRUE;
|
| }
|
|
|
| @@ -1770,74 +1770,81 @@ _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
|
| struct elf_link_hash_table *htab;
|
| struct eh_frame_hdr_info *hdr_info;
|
| asection *sec;
|
| - bfd_byte *contents;
|
| - asection *eh_frame_sec;
|
| - bfd_size_type size;
|
| - bfd_boolean retval;
|
| - bfd_vma encoded_eh_frame;
|
| + bfd_boolean retval = TRUE;
|
|
|
| htab = elf_hash_table (info);
|
| hdr_info = &htab->eh_info;
|
| sec = hdr_info->hdr_sec;
|
| - if (sec == NULL)
|
| - return TRUE;
|
| -
|
| - size = EH_FRAME_HDR_SIZE;
|
| - if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
|
| - size += 4 + hdr_info->fde_count * 8;
|
| - contents = (bfd_byte *) bfd_malloc (size);
|
| - if (contents == NULL)
|
| - return FALSE;
|
|
|
| - eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
|
| - if (eh_frame_sec == NULL)
|
| + if (info->eh_frame_hdr && sec != NULL)
|
| {
|
| - free (contents);
|
| - return FALSE;
|
| - }
|
| + bfd_byte *contents;
|
| + asection *eh_frame_sec;
|
| + bfd_size_type size;
|
| + bfd_vma encoded_eh_frame;
|
| +
|
| + size = EH_FRAME_HDR_SIZE;
|
| + if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
|
| + size += 4 + hdr_info->fde_count * 8;
|
| + contents = (bfd_byte *) bfd_malloc (size);
|
| + if (contents == NULL)
|
| + return FALSE;
|
|
|
| - memset (contents, 0, EH_FRAME_HDR_SIZE);
|
| - contents[0] = 1; /* Version. */
|
| - contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
|
| - (abfd, info, eh_frame_sec, 0, sec, 4,
|
| - &encoded_eh_frame); /* .eh_frame offset. */
|
| + eh_frame_sec = bfd_get_section_by_name (abfd, ".eh_frame");
|
| + if (eh_frame_sec == NULL)
|
| + {
|
| + free (contents);
|
| + return FALSE;
|
| + }
|
|
|
| - if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
|
| - {
|
| - contents[2] = DW_EH_PE_udata4; /* FDE count encoding. */
|
| - contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4; /* Search table enc. */
|
| - }
|
| - else
|
| - {
|
| - contents[2] = DW_EH_PE_omit;
|
| - contents[3] = DW_EH_PE_omit;
|
| - }
|
| - bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
|
| + memset (contents, 0, EH_FRAME_HDR_SIZE);
|
| + /* Version. */
|
| + contents[0] = 1;
|
| + /* .eh_frame offset. */
|
| + contents[1] = get_elf_backend_data (abfd)->elf_backend_encode_eh_address
|
| + (abfd, info, eh_frame_sec, 0, sec, 4, &encoded_eh_frame);
|
|
|
| - if (contents[2] != DW_EH_PE_omit)
|
| - {
|
| - unsigned int i;
|
| + if (hdr_info->array && hdr_info->array_count == hdr_info->fde_count)
|
| + {
|
| + /* FDE count encoding. */
|
| + contents[2] = DW_EH_PE_udata4;
|
| + /* Search table encoding. */
|
| + contents[3] = DW_EH_PE_datarel | DW_EH_PE_sdata4;
|
| + }
|
| + else
|
| + {
|
| + contents[2] = DW_EH_PE_omit;
|
| + contents[3] = DW_EH_PE_omit;
|
| + }
|
| + bfd_put_32 (abfd, encoded_eh_frame, contents + 4);
|
|
|
| - bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
|
| - qsort (hdr_info->array, hdr_info->fde_count, sizeof (*hdr_info->array),
|
| - vma_compare);
|
| - for (i = 0; i < hdr_info->fde_count; i++)
|
| + if (contents[2] != DW_EH_PE_omit)
|
| {
|
| - bfd_put_32 (abfd,
|
| - hdr_info->array[i].initial_loc
|
| - - sec->output_section->vma,
|
| - contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
|
| - bfd_put_32 (abfd,
|
| - hdr_info->array[i].fde - sec->output_section->vma,
|
| - contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
|
| + unsigned int i;
|
| +
|
| + bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
|
| + qsort (hdr_info->array, hdr_info->fde_count,
|
| + sizeof (*hdr_info->array), vma_compare);
|
| + for (i = 0; i < hdr_info->fde_count; i++)
|
| + {
|
| + bfd_put_32 (abfd,
|
| + hdr_info->array[i].initial_loc
|
| + - sec->output_section->vma,
|
| + contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
|
| + bfd_put_32 (abfd,
|
| + hdr_info->array[i].fde - sec->output_section->vma,
|
| + contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
|
| + }
|
| }
|
| - }
|
|
|
| - /* FIXME: octets_per_byte. */
|
| - retval = bfd_set_section_contents (abfd, sec->output_section,
|
| - contents, (file_ptr) sec->output_offset,
|
| - sec->size);
|
| - free (contents);
|
| + /* FIXME: octets_per_byte. */
|
| + retval = bfd_set_section_contents (abfd, sec->output_section, contents,
|
| + (file_ptr) sec->output_offset,
|
| + sec->size);
|
| + free (contents);
|
| + }
|
| + if (hdr_info->array != NULL)
|
| + free (hdr_info->array);
|
| return retval;
|
| }
|
|
|
|
|