diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2004-02-28 00:35:45 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@redhat.com> | 2004-02-28 00:35:45 +0000 |
commit | ec3391e7041b496624293844c9746433b79d7562 (patch) | |
tree | f623d5ccc4c3df603aba588ffcd9c7ad191e7d1d /bfd/elf32-frv.c | |
parent | * elf32-frv.c (elf32_frv_howto_table) <R_FRV_LABEL16>: Set (diff) | |
download | binutils-gdb-ec3391e7041b496624293844c9746433b79d7562.tar.gz binutils-gdb-ec3391e7041b496624293844c9746433b79d7562.tar.bz2 binutils-gdb-ec3391e7041b496624293844c9746433b79d7562.zip |
* elf-bfd.h (struct elf_backend_data): Added
elf_backend_can_make_relative_eh_frame,
elf_backend_can_make_lsda_relative_eh_frame and
elf_backend_encode_eh_address.
(_bfd_elf_encode_eh_address): Declare.
(_bfd_elf_can_make_relative): Declare.
* elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Use new
hooks to decide whether to attempt to make_relative and
make_lsda_relative.
(_bfd_elf_write_section_eh_frame_hdr): Call encode_eh_address.
(_bfd_elf_can_make_relative): New.
(_bfd_elf_encode_eh_address): New.
* elf32-frv.c (frv_elf_use_relative_eh_frame): New.
(frv_elf_encode_eh_address): New.
(elf_backend_can_make_relative_eh_frame): Define.
(elf_backend_can_make_lsda_relative_eh_frame): Define.
(elf_backend_encode_eh_address): Define.
* elfxx-target.h
(elf_backend_can_make_relative_eh_frame): Define.
(elf_backend_can_make_lsda_relative_eh_frame): Define.
(elf_backend_encode_eh_address): Define.
(elfNN_bed): Add them.
Diffstat (limited to 'bfd/elf32-frv.c')
-rw-r--r-- | bfd/elf32-frv.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c index 78a4a4c129f..a813ddcd8cc 100644 --- a/bfd/elf32-frv.c +++ b/bfd/elf32-frv.c @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "libbfd.h" #include "elf-bfd.h" #include "elf/frv.h" +#include "elf/dwarf2.h" #include "hashtab.h" /* Forward declarations. */ @@ -3700,6 +3701,57 @@ elf32_frv_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED, return TRUE; } +/* Decide whether to attempt to turn absptr or lsda encodings in + shared libraries into pcrel within the given input section. */ + +static bfd_boolean +frv_elf_use_relative_eh_frame (bfd *input_bfd, + struct bfd_link_info *info ATTRIBUTE_UNUSED, + asection *eh_frame_section ATTRIBUTE_UNUSED) +{ + /* We can't use PC-relative encodings in FDPIC binaries, in general. */ + if (elf_elfheader (input_bfd)->e_flags & EF_FRV_FDPIC) + return FALSE; + + return TRUE; +} + +/* Adjust the contents of an eh_frame_hdr section before they're output. */ + +static bfd_byte +frv_elf_encode_eh_address (bfd *abfd, + struct bfd_link_info *info, + asection *osec, bfd_vma offset, + asection *loc_sec, bfd_vma loc_offset, + bfd_vma *encoded) +{ + struct elf_link_hash_entry *h; + + /* Non-FDPIC binaries can use PC-relative encodings. */ + if (! (elf_elfheader (abfd)->e_flags & EF_FRV_FDPIC)) + return _bfd_elf_encode_eh_address (abfd, info, osec, offset, + loc_sec, loc_offset, encoded); + + h = elf_hash_table (info)->hgot; + BFD_ASSERT (h && h->root.type == bfd_link_hash_defined); + + if (! h || (_frv_osec_to_segment (abfd, osec) + == _frv_osec_to_segment (abfd, loc_sec->output_section))) + return _bfd_elf_encode_eh_address (abfd, info, osec, offset, + loc_sec, loc_offset, encoded); + + BFD_ASSERT (_frv_osec_to_segment (abfd, osec) + == _frv_osec_to_segment (abfd, + h->root.u.def.section->output_section)); + + *encoded = osec->vma + offset + - (h->root.u.def.value + + h->root.u.def.section->output_section->vma + + h->root.u.def.section->output_offset); + + return DW_EH_PE_datarel | DW_EH_PE_sdata4; +} + /* Look through the relocs for a section during the first phase. Besides handling virtual table relocs for gc, we have to deal with @@ -4419,6 +4471,12 @@ frv_elf_print_private_bfd_data (abfd, ptr) #define elf_backend_want_plt_sym 0 #define elf_backend_plt_header_size 0 +#define elf_backend_can_make_relative_eh_frame \ + frv_elf_use_relative_eh_frame +#define elf_backend_can_make_lsda_relative_eh_frame \ + frv_elf_use_relative_eh_frame +#define elf_backend_encode_eh_address frv_elf_encode_eh_address + #define elf_backend_may_use_rel_p 1 #define elf_backend_may_use_rela_p 1 /* We use REL for dynamic relocations only. */ |