aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf-eh-frame.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2004-10-14 23:38:08 +0000
committerAlan Modra <amodra@gmail.com>2004-10-14 23:38:08 +0000
commit92e4ec35d9f6f98ed6b131b9be9cd548572874a1 (patch)
treed63f4a62e2c123a86bfca8d87f7713a431aeed36 /bfd/elf-eh-frame.c
parent40e7b7b9ef194e14ec5c2dee5e369c2ca6c9d5ea (diff)
downloadgdb-92e4ec35d9f6f98ed6b131b9be9cd548572874a1.zip
gdb-92e4ec35d9f6f98ed6b131b9be9cd548572874a1.tar.gz
gdb-92e4ec35d9f6f98ed6b131b9be9cd548572874a1.tar.bz2
* elf-eh-frame.c (_bfd_elf_eh_frame_section_offset): Add "info"
parameter. If called after _bfd_elf_write_section_eh_frame, don't allow a -2 return unless need_* bit is already set, and handle offsets adjusted for output_offset. * elf-bfd.h (_bfd_elf_eh_frame_section_offset): Update prototype. * elf.c (_bfd_elf_section_offset): Update call.
Diffstat (limited to 'bfd/elf-eh-frame.c')
-rw-r--r--bfd/elf-eh-frame.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 6302cf0..c4cf46f 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -713,10 +713,13 @@ _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
bfd_vma
_bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
+ struct bfd_link_info *info,
asection *sec,
bfd_vma offset)
{
struct eh_frame_sec_info *sec_info;
+ struct elf_link_hash_table *htab;
+ struct eh_frame_hdr_info *hdr_info;
unsigned int lo, hi, mid;
if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
@@ -726,6 +729,11 @@ _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
if (offset >= sec->rawsize)
return offset - sec->rawsize + sec->size;
+ htab = elf_hash_table (info);
+ hdr_info = &htab->eh_info;
+ if (hdr_info->offsets_adjusted)
+ offset += sec->output_offset;
+
lo = 0;
hi = sec_info->count;
mid = 0;
@@ -751,7 +759,9 @@ _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
relocation against FDE's initial_location field. */
if (!sec_info->entry[mid].cie
&& sec_info->entry[mid].cie_inf->make_relative
- && offset == sec_info->entry[mid].offset + 8)
+ && offset == sec_info->entry[mid].offset + 8
+ && (sec_info->entry[mid].cie_inf->need_relative
+ || !hdr_info->offsets_adjusted))
{
sec_info->entry[mid].cie_inf->need_relative = 1;
return (bfd_vma) -2;
@@ -762,12 +772,16 @@ _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
if (!sec_info->entry[mid].cie
&& sec_info->entry[mid].cie_inf->make_lsda_relative
&& (offset == (sec_info->entry[mid].offset + 8
- + sec_info->entry[mid].lsda_offset)))
+ + sec_info->entry[mid].lsda_offset))
+ && (sec_info->entry[mid].cie_inf->need_lsda_relative
+ || !hdr_info->offsets_adjusted))
{
sec_info->entry[mid].cie_inf->need_lsda_relative = 1;
return (bfd_vma) -2;
}
+ if (hdr_info->offsets_adjusted)
+ offset -= sec->output_offset;
return (offset + sec_info->entry[mid].new_offset
- sec_info->entry[mid].offset);
}