aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2004-02-28 00:35:45 +0000
committerAlexandre Oliva <aoliva@redhat.com>2004-02-28 00:35:45 +0000
commitec3391e7041b496624293844c9746433b79d7562 (patch)
treef623d5ccc4c3df603aba588ffcd9c7ad191e7d1d /bfd/elf32-frv.c
parent* elf32-frv.c (elf32_frv_howto_table) <R_FRV_LABEL16>: Set (diff)
downloadbinutils-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.c58
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. */