/* Common code for PA ELF implementations.
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
#define ELF_R_SYM(X) ELF64_R_SYM(X)
#define elf_hppa_internal_shdr Elf64_Internal_Shdr
+#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
#define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
#define elf_hppa_relocate_section elf64_hppa_relocate_section
#define bfd_elf_bfd_final_link bfd_elf64_bfd_final_link
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
#define ELF_R_SYM(X) ELF32_R_SYM(X)
#define elf_hppa_internal_shdr Elf32_Internal_Shdr
+#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
#define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
#define elf_hppa_relocate_section elf32_hppa_relocate_section
#define bfd_elf_bfd_final_link bfd_elf32_bfd_final_link
#define elf_hppa_final_link elf32_hppa_final_link
#endif
-elf_hppa_reloc_type ** _bfd_elf_hppa_gen_reloc_type
- PARAMS ((bfd *, elf_hppa_reloc_type, int, unsigned int, int, asymbol *));
-
static void elf_hppa_info_to_howto
PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
static boolean elf_hppa_fake_sections
PARAMS ((bfd *abfd, elf_hppa_internal_shdr *, asection *));
-#if ARCH_SIZE == 64
static void elf_hppa_final_write_processing
PARAMS ((bfd *, boolean));
+static int hppa_unwind_entry_compare
+ PARAMS ((const PTR, const PTR));
+
+static boolean elf_hppa_sort_unwind
+ PARAMS ((bfd *));
+
+#if ARCH_SIZE == 64
static boolean elf_hppa_add_symbol_hook
PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
const char **, flagword *, asection **, bfd_vma *));
static boolean elf_hppa_remark_useless_dynamic_symbols
PARAMS ((struct elf_link_hash_entry *, PTR));
+static boolean elf_hppa_is_dynamic_loader_symbol
+ PARAMS ((const char *));
+
static void elf_hppa_record_segment_addrs
PARAMS ((bfd *, asection *, PTR));
static boolean elf_hppa_relocate_section
PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
- bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
+ bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
static bfd_reloc_status_type elf_hppa_final_link_relocate
PARAMS ((Elf_Internal_Rela *, bfd *, bfd *, asection *,
- bfd_byte *, bfd_vma, struct bfd_link_info *,
- asection *, struct elf_link_hash_entry *,
+ bfd_byte *, bfd_vma, struct bfd_link_info *,
+ asection *, struct elf_link_hash_entry *,
struct elf64_hppa_dyn_hash_entry *));
-static unsigned int elf_hppa_relocate_insn
- PARAMS ((unsigned int, unsigned int, unsigned int));
+static int elf_hppa_relocate_insn
+ PARAMS ((int, int, unsigned int));
#endif
-
/* ELF/PA relocation howto entries. */
static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DIR14R", false, 0, 0, false },
- { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
- bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
- bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ { R_PARISC_DIR14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
+ bfd_elf_generic_reloc, "R_PARISC_DIR14F", false, 0, 0, false },
+ /* 8 */
+ { R_PARISC_PCREL12F, 0, 0, 12, true, 0, complain_overflow_bitfield,
+ bfd_elf_generic_reloc, "R_PARISC_PCREL12F", false, 0, 0, false },
{ R_PARISC_PCREL32, 0, 0, 32, true, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL32", false, 0, 0, false },
-
{ R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL21L", false, 0, 0, false },
{ R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL14R", false, 0, 0, false },
{ R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL14F", false, 0, 0, false },
+ /* 16 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DPREL21L", false, 0, 0, false },
- { R_PARISC_DPREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DPREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", false, 0, 0, false },
-
- { R_PARISC_DPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DPREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
bfd_elf_generic_reloc, "R_PARISC_DPREL14R", false, 0, 0, false },
{ R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DPREL14F", false, 0, 0, false },
+ /* 24 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", false, 0, 0, false },
{ R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", false, 0, 0, false },
+ /* 32 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", false, 0, 0, false },
{ R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", false, 0, 0, false },
-
+ /* 40 */
{ R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_SETBASE", false, 0, 0, false },
- { R_PARISC_SECREL32, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_SECREL32, 0, 0, 32, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_SECREL32", false, 0, 0, false },
{ R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", false, 0, 0, false },
bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", false, 0, 0, false },
{ R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", false, 0, 0, false },
+ /* 48 */
{ R_PARISC_SEGBASE, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_SEGBASE", false, 0, 0, false },
- { R_PARISC_SEGREL32, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_SEGREL32, 0, 0, 32, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_SEGREL32", false, 0, 0, false },
-
- { R_PARISC_PLTOFF21L, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_PLTOFF14R, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", false, 0, 0, false },
- { R_PARISC_PLTOFF14F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", false, 0, 0, false },
+ /* 56 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR32, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR32, 0, 0, 32, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR21L, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR14R, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 64 */
+ { R_PARISC_FPTR64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_FPTR64", false, 0, 0, false },
{ R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLABEL32", false, 0, 0, false },
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_PCREL64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 72 */
+ { R_PARISC_PCREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL64", false, 0, 0, false },
- { R_PARISC_PCREL22C, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PCREL22C, 0, 0, 22, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL22C", false, 0, 0, false },
- { R_PARISC_PCREL22F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PCREL22F, 0, 0, 22, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL22F", false, 0, 0, false },
- { R_PARISC_PCREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PCREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", false, 0, 0, false },
- { R_PARISC_PCREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PCREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", false, 0, 0, false },
- { R_PARISC_PCREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PCREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL16F", false, 0, 0, false },
- { R_PARISC_PCREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PCREL16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", false, 0, 0, false },
- { R_PARISC_PCREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PCREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", false, 0, 0, false },
-
- { R_PARISC_DIR64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 80 */
+ { R_PARISC_DIR64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DIR64", false, 0, 0, false },
- { R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
- bfd_elf_generic_reloc, "R_PARISC_NONE", false, 0, 0, false },
- { R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
- bfd_elf_generic_reloc, "R_PARISC_NONE", false, 0, 0, false },
- { R_PARISC_DIR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ { R_PARISC_DIR14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DIR14WR", false, 0, 0, false },
- { R_PARISC_DIR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DIR14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DIR14DR", false, 0, 0, false },
- { R_PARISC_DIR16F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DIR16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DIR16F", false, 0, 0, false },
- { R_PARISC_DIR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DIR16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DIR16WF", false, 0, 0, false },
- { R_PARISC_DIR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DIR16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DIR16DF", false, 0, 0, false },
- { R_PARISC_GPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 88 */
+ { R_PARISC_GPREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_GPREL64", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_DLTREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DLTREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", false, 0, 0, false },
- { R_PARISC_DLTREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DLTREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", false, 0, 0, false },
- { R_PARISC_GPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_GPREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_GPREL16F", false, 0, 0, false },
- { R_PARISC_GPREL16WF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_GPREL16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", false, 0, 0, false },
- { R_PARISC_GPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_GPREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", false, 0, 0, false },
- { R_PARISC_LTOFF64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 96 */
+ { R_PARISC_LTOFF64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF64", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_DLTIND14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DLTIND14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", false, 0, 0, false },
-
- { R_PARISC_DLTIND14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_DLTIND14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", false, 0, 0, false },
- { R_PARISC_LTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", false, 0, 0, false },
- { R_PARISC_LTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", false, 0, 0, false },
- { R_PARISC_LTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", false, 0, 0, false },
+ /* 104 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_BASEREL14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
- bfd_elf_generic_reloc, "R_PARISC_BSEREL14WR", false, 0, 0, false },
- { R_PARISC_BASEREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_BASEREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
+ bfd_elf_generic_reloc, "R_PARISC_BASEREL14WR", false, 0, 0, false },
+ { R_PARISC_BASEREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_SEGREL64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 112 */
+ { R_PARISC_SEGREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_SEGREL64", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_PLTOFF14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", false, 0, 0, false },
- { R_PARISC_PLTOFF14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", false, 0, 0, false },
- { R_PARISC_PLTOFF16F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", false, 0, 0, false },
- { R_PARISC_PLTOFF16WF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", false, 0, 0, false },
- { R_PARISC_PLTOFF16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_PLTOFF16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", false, 0, 0, false },
-
- { R_PARISC_LTOFF_FPTR64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 120 */
+ { R_PARISC_LTOFF_FPTR64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR16F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR16WF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", false, 0, 0, false },
- { R_PARISC_LTOFF_FPTR16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_FPTR16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 128 */
{ R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_COPY", false, 0, 0, false },
{ R_PARISC_IPLT, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_IPLT", false, 0, 0, false },
-
{ R_PARISC_EPLT, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_EPLT", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 136 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 144 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 152 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_TPREL32, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_TPREL32", false, 0, 0, false },
- { R_PARISC_TPREL21L, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_TPREL21L", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ { R_PARISC_TPREL32, 0, 0, 32, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_TPREL32", false, 0, 0, false },
+ { R_PARISC_TPREL21L, 0, 0, 21, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_TPREL21L", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_TPREL14R, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_TPREL14R", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ { R_PARISC_TPREL14R, 0, 0, 14, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_TPREL14R", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 160 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_LTOFF_TP21L, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ { R_PARISC_LTOFF_TP21L, 0, 0, 21, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_LTOFF_TP14R, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_TP14R, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_LTOFF_TP14F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_TP14F, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", false, 0, 0, false },
+ /* 168 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 176 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 184 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 192 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
+ /* 200 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ /* 208 */
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
-
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
+ bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_TPREL64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 216 */
+ { R_PARISC_TPREL64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_TPREL64", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_TPREL14WR, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_TPREL14WR", false, 0, 0, false },
-
- { R_PARISC_TPREL14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_TPREL14WR, 0, 0, 14, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_TPREL14WR", false, 0, 0, false },
+ { R_PARISC_TPREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", false, 0, 0, false },
- { R_PARISC_TPREL16F, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_TPREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_TPREL16F", false, 0, 0, false },
- { R_PARISC_TPREL16WF, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_TPREL16WF", false, 0, 0, false },
- { R_PARISC_TPREL16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_TPREL16WF, 0, 0, 16, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_TPREL16WF", false, 0, 0, false },
+ { R_PARISC_TPREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", false, 0, 0, false },
- { R_PARISC_LTOFF_TP64, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ /* 224 */
+ { R_PARISC_LTOFF_TP64, 0, 0, 64, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
{ R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false },
- { R_PARISC_LTOFF_TP14WR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_TP14WR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", false, 0, 0, false },
- { R_PARISC_LTOFF_TP14DR, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_TP14DR, 0, 0, 14, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", false, 0, 0, false },
- { R_PARISC_LTOFF_TP16F, 0, 0, 0, false, 0, complain_overflow_dont,
- NULL, "R_PARISC_LTOFF_TP16F", false, 0, 0, false },
-
- { R_PARISC_LTOFF_TP16WF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_TP16F, 0, 0, 16, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16F", false, 0, 0, false },
+ { R_PARISC_LTOFF_TP16WF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", false, 0, 0, false },
- { R_PARISC_LTOFF_TP16DF, 0, 0, 0, false, 0, complain_overflow_bitfield,
+ { R_PARISC_LTOFF_TP16DF, 0, 0, 16, false, 0, complain_overflow_bitfield,
bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", false, 0, 0, false },
+ /* 232 */
+ { R_PARISC_GNU_VTENTRY, 0, 0, 0, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_GNU_VTENTRY", false, 0, 0, false },
+ { R_PARISC_GNU_VTINHERIT, 0, 0, 0, false, 0, complain_overflow_dont,
+ bfd_elf_generic_reloc, "R_PARISC_GNU_VTINHERIT", false, 0, 0, false },
};
#define OFFSET_14R_FROM_21L 4
#define OFFSET_14F_FROM_21L 5
-/* Return one (or more) BFD relocations which implement the base
- relocation with modifications based on format and field. */
+/* Return the final relocation type for the given base type, instruction
+ format, and field selector. */
-elf_hppa_reloc_type **
-_bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
+elf_hppa_reloc_type
+elf_hppa_reloc_final_type (abfd, base_type, format, field)
bfd *abfd;
elf_hppa_reloc_type base_type;
int format;
unsigned int field;
- int ignore ATTRIBUTE_UNUSED;
- asymbol *sym ATTRIBUTE_UNUSED;
{
- elf_hppa_reloc_type *finaltype;
- elf_hppa_reloc_type **final_types;
-
- /* Allocate slots for the BFD relocation. */
- final_types = ((elf_hppa_reloc_type **)
- bfd_alloc (abfd, sizeof (elf_hppa_reloc_type *) * 2));
- if (final_types == NULL)
- return NULL;
-
- /* Allocate space for the relocation itself. */
- finaltype = ((elf_hppa_reloc_type *)
- bfd_alloc (abfd, sizeof (elf_hppa_reloc_type)));
- if (finaltype == NULL)
- return NULL;
-
- /* Some reasonable defaults. */
- final_types[0] = finaltype;
- final_types[1] = NULL;
-
-#define final_type finaltype[0]
-
- final_type = base_type;
+ elf_hppa_reloc_type final_type = base_type;
/* Just a tangle of nested switch statements to deal with the braindamage
that a different field selector means a completely different relocation
case 14:
switch (field)
{
+ case e_fsel:
+ final_type = R_PARISC_DIR14F;
+ break;
case e_rsel:
case e_rrsel:
+ case e_rdsel:
final_type = R_PARISC_DIR14R;
break;
case e_rtsel:
final_type = R_PARISC_PLABEL14R;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
break;
case e_rsel:
case e_rrsel:
+ case e_rdsel:
final_type = R_PARISC_DIR17R;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
{
case e_lsel:
case e_lrsel:
+ case e_ldsel:
case e_nlsel:
case e_nlrsel:
final_type = R_PARISC_DIR21L;
final_type = R_PARISC_PLABEL21L;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
be a section relative relocation. Dwarf2 (for example)
uses 32bit section relative relocations. */
if (bfd_get_arch_info (abfd)->bits_per_address != 32)
- final_type = R_PARISC_SECREL32;
+ final_type = R_PARISC_SECREL32;
break;
case e_psel:
final_type = R_PARISC_PLABEL32;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
final_type = R_PARISC_FPTR64;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
-
case R_HPPA_GOTOFF:
switch (format)
{
{
case e_rsel:
case e_rrsel:
+ case e_rdsel:
/* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32 */
final_type = base_type + OFFSET_14R_FROM_21L;
break;
final_type = base_type + OFFSET_14F_FROM_21L;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
{
case e_lsel:
case e_lrsel:
+ case e_ldsel:
case e_nlsel:
case e_nlrsel:
/* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32 */
final_type = base_type;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
-
case R_HPPA_PCREL_CALL:
switch (format)
{
+ case 12:
+ switch (field)
+ {
+ case e_fsel:
+ final_type = R_PARISC_PCREL12F;
+ break;
+ default:
+ return R_PARISC_NONE;
+ }
+ break;
+
case 14:
+ /* Contrary to appearances, these are not calls of any sort.
+ Rather, they are loads/stores with a pcrel reloc. */
switch (field)
{
case e_rsel:
case e_rrsel:
+ case e_rdsel:
final_type = R_PARISC_PCREL14R;
break;
case e_fsel:
final_type = R_PARISC_PCREL14F;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
{
case e_rsel:
case e_rrsel:
+ case e_rdsel:
final_type = R_PARISC_PCREL17R;
break;
case e_fsel:
final_type = R_PARISC_PCREL17F;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
{
case e_lsel:
case e_lrsel:
+ case e_ldsel:
case e_nlsel:
case e_nlrsel:
final_type = R_PARISC_PCREL21L;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
final_type = R_PARISC_PCREL22F;
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
break;
+ case R_PARISC_GNU_VTENTRY:
+ case R_PARISC_GNU_VTINHERIT:
case R_PARISC_SEGREL32:
case R_PARISC_SEGBASE:
/* The defaults are fine for these cases. */
break;
default:
- return NULL;
+ return R_PARISC_NONE;
}
+ return final_type;
+}
+
+/* Return one (or more) BFD relocations which implement the base
+ relocation with modifications based on format and field. */
+
+elf_hppa_reloc_type **
+_bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
+ bfd *abfd;
+ elf_hppa_reloc_type base_type;
+ int format;
+ unsigned int field;
+ int ignore ATTRIBUTE_UNUSED;
+ asymbol *sym ATTRIBUTE_UNUSED;
+{
+ elf_hppa_reloc_type *finaltype;
+ elf_hppa_reloc_type **final_types;
+ bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
+
+ /* Allocate slots for the BFD relocation. */
+ final_types = (elf_hppa_reloc_type **) bfd_alloc (abfd, amt);
+ if (final_types == NULL)
+ return NULL;
+
+ /* Allocate space for the relocation itself. */
+ amt = sizeof (elf_hppa_reloc_type);
+ finaltype = (elf_hppa_reloc_type *) bfd_alloc (abfd, amt);
+ if (finaltype == NULL)
+ return NULL;
+
+ /* Some reasonable defaults. */
+ final_types[0] = finaltype;
+ final_types[1] = NULL;
+
+ *finaltype = elf_hppa_reloc_final_type (abfd, base_type, format, field);
+
return final_types;
}
bfd *abfd ATTRIBUTE_UNUSED;
const char *name;
{
- return (name[0] == 'L' && name[1] == '$');
+ if (name[0] == 'L' && name[1] == '$')
+ return 1;
+ return _bfd_elf_is_local_label_name (abfd, name);
}
/* Set the correct type for an ELF section. We do this by the
return true;
}
-#if ARCH_SIZE == 64
static void
elf_hppa_final_write_processing (abfd, linker)
bfd *abfd;
| EF_PARISC_TRAPNIL);
}
+/* Comparison function for qsort to sort unwind section during a
+ final link. */
+
+static int
+hppa_unwind_entry_compare (a, b)
+ const PTR a;
+ const PTR b;
+{
+ const bfd_byte *ap, *bp;
+ unsigned long av, bv;
+
+ ap = (const bfd_byte *) a;
+ av = (unsigned long) ap[0] << 24;
+ av |= (unsigned long) ap[1] << 16;
+ av |= (unsigned long) ap[2] << 8;
+ av |= (unsigned long) ap[3];
+
+ bp = (const bfd_byte *) b;
+ bv = (unsigned long) bp[0] << 24;
+ bv |= (unsigned long) bp[1] << 16;
+ bv |= (unsigned long) bp[2] << 8;
+ bv |= (unsigned long) bp[3];
+
+ return av < bv ? -1 : av > bv ? 1 : 0;
+}
+
+static boolean elf_hppa_sort_unwind (abfd)
+ bfd *abfd;
+{
+ asection *s;
+
+ /* Magic section names, but this is much safer than having
+ relocate_section remember where SEGREL32 relocs occurred.
+ Consider what happens if someone inept creates a linker script
+ that puts unwind information in .text. */
+ s = bfd_get_section_by_name (abfd, ".PARISC.unwind");
+ if (s != NULL)
+ {
+ bfd_size_type size;
+ char *contents;
+
+ size = s->_raw_size;
+ contents = bfd_malloc (size);
+ if (contents == NULL)
+ return false;
+
+ if (! bfd_get_section_contents (abfd, s, contents, (file_ptr) 0, size))
+ return false;
+
+ qsort (contents, (size_t) (size / 16), 16, hppa_unwind_entry_compare);
+
+ if (! bfd_set_section_contents (abfd, s, contents, (file_ptr) 0, size))
+ return false;
+ }
+
+ return true;
+}
+
+#if ARCH_SIZE == 64
/* Hook called by the linker routine which adds symbols from an object
file. HP's libraries define symbols with HP specific section
indices, which we have to handle. */
{
struct bfd_link_info *info = (struct bfd_link_info *)data;
+ if (h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
/* If we are not creating a shared library, and this symbol is
referenced by a shared library but is not defined anywhere, then
the generic code will warn that it is undefined.
return true;
}
-
static boolean
elf_hppa_remark_useless_dynamic_symbols (h, data)
struct elf_link_hash_entry *h;
{
struct bfd_link_info *info = (struct bfd_link_info *)data;
+ if (h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
/* If we are not creating a shared library, and this symbol is
referenced by a shared library but is not defined anywhere, then
the generic code will warn that it is undefined.
return true;
}
+static boolean
+elf_hppa_is_dynamic_loader_symbol (name)
+ const char * name;
+{
+ return (! strcmp (name, "__CPU_REVISION")
+ || ! strcmp (name, "__CPU_KEYBITS_1")
+ || ! strcmp (name, "__SYSTEM_ID_D")
+ || ! strcmp (name, "__FPU_MODEL")
+ || ! strcmp (name, "__FPU_REVISION")
+ || ! strcmp (name, "__ARGC")
+ || ! strcmp (name, "__ARGV")
+ || ! strcmp (name, "__ENVP")
+ || ! strcmp (name, "__TLS_SIZE_D")
+ || ! strcmp (name, "__LOAD_INFO")
+ || ! strcmp (name, "__systab"));
+}
+
/* Record the lowest address for the data and text segments. */
static void
elf_hppa_record_segment_addrs (abfd, section, data)
{
struct elf64_hppa_link_hash_table *hppa_info;
bfd_vma value;
-
+
hppa_info = (struct elf64_hppa_link_hash_table *)data;
value = section->vma - section->filepos;
else
{
asection *sec;
-
/* First look for a .plt section. If found, then __gp is the
address of the .plt + gp_offset.
elf_hppa_remark_useless_dynamic_symbols,
info);
+ /* If we're producing a final executable, sort the contents of the
+ unwind section. */
+ if (retval)
+ retval = elf_hppa_sort_unwind (abfd);
+
return retval;
}
/* This is a local symbol. */
sym = local_syms + r_symndx;
sym_sec = local_sections[r_symndx];
- relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION
- ? 0 : sym->st_value)
- + sym_sec->output_offset
- + sym_sec->output_section->vma);
+ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel);
/* If this symbol has an entry in the PA64 dynamic hash
table, then get it. */
- dyn_name = get_dyn_name (input_bfd, h, rel,
+ dyn_name = get_dyn_name (input_section, h, rel,
&dynh_buf, &dynh_buflen);
dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
dyn_name, false, false);
/* If this symbol has an entry in the PA64 dynamic hash
table, then get it. */
- dyn_name = get_dyn_name (input_bfd, h, rel,
+ dyn_name = get_dyn_name (input_section, h, rel,
&dynh_buf, &dynh_buflen);
dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
dyn_name, false, false);
{
(*_bfd_error_handler)
(_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
- bfd_get_filename (input_bfd), h->root.root.string,
+ bfd_archive_filename (input_bfd), h->root.root.string,
bfd_get_section_name (input_bfd, input_section));
relocation = 0;
}
relocation = 0;
}
/* Allow undefined symbols in shared libraries. */
- else if (info->shared && !info->no_undefined
+ else if (info->shared && !info->no_undefined
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
{
if (info->symbolic)
/* If this symbol has an entry in the PA64 dynamic hash
table, then get it. */
- dyn_name = get_dyn_name (input_bfd, h, rel,
+ dyn_name = get_dyn_name (input_section, h, rel,
&dynh_buf, &dynh_buflen);
dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table,
dyn_name, false, false);
{
(*_bfd_error_handler)
(_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
- bfd_get_filename (input_bfd), h->root.root.string,
+ bfd_archive_filename (input_bfd), h->root.root.string,
bfd_get_section_name (input_bfd, input_section));
relocation = 0;
}
relocation = 0;
else
{
- if (!((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, true)))
- return false;
- break;
+ /* Ignore dynamic loader defined symbols. */
+ if (elf_hppa_is_dynamic_loader_symbol (h->root.root.string))
+ relocation = 0;
+ else
+ {
+ if (!((*info->callbacks->undefined_symbol)
+ (info, h->root.root.string, input_bfd,
+ input_section, rel->r_offset, true)))
+ return false;
+ break;
+ }
}
}
return true;
}
-
/* Compute the value for a relocation (REL) during a final link stage,
- then insert the value into the proper location in CONTENTS.
+ then insert the value into the proper location in CONTENTS.
VALUE is a tentative value for the relocation and may be overridden
and modified here based on the specific relocation to be performed.
For example we do conversions for PC-relative branches in this routine
- or redirection of calls to external routines to stubs.
+ or redirection of calls to external routines to stubs.
The work of actually applying the relocation is left to a helper
routine in an attempt to reduce the complexity and size of this
struct elf_link_hash_entry *h ATTRIBUTE_UNUSED;
struct elf64_hppa_dyn_hash_entry *dyn_h;
{
- unsigned int insn;
+ int insn;
bfd_vma offset = rel->r_offset;
- bfd_vma addend = rel->r_addend;
+ bfd_signed_vma addend = rel->r_addend;
reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
unsigned int r_type = howto->type;
bfd_byte *hit_data = contents + offset;
if (sym_sec == NULL || sym_sec->output_section == NULL)
value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
+ hppa_info->stub_sec->output_section->vma);
-
+
/* Turn VALUE into a proper PC relative address. */
value -= (offset + input_section->output_offset
+ input_section->output_section->vma);
value = hppa_field_adjust (value, -8 + addend, e_rsel);
/* Apply the relocation to the given instruction. */
- insn = elf_hppa_relocate_insn (insn, value, r_type);
+ insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
break;
}
+ case R_PARISC_PCREL12F:
case R_PARISC_PCREL22F:
case R_PARISC_PCREL17F:
case R_PARISC_PCREL22C:
if (sym_sec == NULL || sym_sec->output_section == NULL)
value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
+ hppa_info->stub_sec->output_section->vma);
-
+
/* Turn VALUE into a proper PC relative address. */
value -= (offset + input_section->output_offset
+ input_section->output_section->vma);
value >>= 2;
/* Apply the relocation to the given instruction. */
- insn = elf_hppa_relocate_insn (insn, value, r_type);
+ insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
break;
}
to the local symbol's value).
So, if this is a local symbol (h == NULL), then we need to
- fill in its DLT entry.
+ fill in its DLT entry.
Similarly we may still need to set up an entry in .opd for
a local function which had its address taken. */
if (dyn_h->h == NULL)
{
- bfd_put_64 (hppa_info->dlt_sec->owner,
- value,
- hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
-
- /* Now handle .opd creation if needed. */
+ /* Now do .opd creation if needed. */
if (r_type == R_PARISC_LTOFF_FPTR14R
|| r_type == R_PARISC_LTOFF_FPTR14DR
|| r_type == R_PARISC_LTOFF_FPTR14WR
0, 16);
/* The next word is the address of the function. */
- bfd_put_64 (hppa_info->opd_sec->owner, value,
+ bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
(hppa_info->opd_sec->contents
+ dyn_h->opd_offset + 16));
bfd_put_64 (hppa_info->opd_sec->owner, value,
(hppa_info->opd_sec->contents
+ dyn_h->opd_offset + 24));
+
+ /* The DLT value is the address of the .opd entry. */
+ value = (dyn_h->opd_offset
+ + hppa_info->opd_sec->output_offset
+ + hppa_info->opd_sec->output_section->vma);
+ addend = 0;
}
+
+ bfd_put_64 (hppa_info->dlt_sec->owner,
+ value + addend,
+ hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
}
/* We want the value of the DLT offset for this symbol, not
if (r_type == R_PARISC_DLTIND21L
|| r_type == R_PARISC_LTOFF_FPTR21L
|| r_type == R_PARISC_LTOFF_TP21L)
- value = hppa_field_adjust (value, addend, e_lrsel);
+ value = hppa_field_adjust (value, 0, e_lsel);
else if (r_type == R_PARISC_DLTIND14F
|| r_type == R_PARISC_LTOFF_FPTR16F
|| r_type == R_PARISC_LTOFF_FPTR16WF
|| r_type == R_PARISC_LTOFF_TP16F
|| r_type == R_PARISC_LTOFF_TP16WF
|| r_type == R_PARISC_LTOFF_TP16DF)
- value = hppa_field_adjust (value, addend, e_fsel);
+ value = hppa_field_adjust (value, 0, e_fsel);
else
- value = hppa_field_adjust (value, addend, e_rrsel);
+ value = hppa_field_adjust (value, 0, e_rsel);
- insn = elf_hppa_relocate_insn (insn, value, r_type);
+ insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
break;
}
else
value = hppa_field_adjust (value, addend, e_rrsel);
- insn = elf_hppa_relocate_insn (insn, value, r_type);
+ insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
break;
}
case R_PARISC_DIR17R:
case R_PARISC_DIR17F:
case R_PARISC_DIR14R:
+ case R_PARISC_DIR14F:
case R_PARISC_DIR14WR:
case R_PARISC_DIR14DR:
case R_PARISC_DIR16F:
else if (r_type == R_PARISC_DIR17F
|| r_type == R_PARISC_DIR16F
|| r_type == R_PARISC_DIR16WF
- || r_type == R_PARISC_DIR16DF)
+ || r_type == R_PARISC_DIR16DF
+ || r_type == R_PARISC_DIR14F)
value = hppa_field_adjust (value, addend, e_fsel);
else
value = hppa_field_adjust (value, addend, e_rrsel);
value >>= 2;
}
- insn = elf_hppa_relocate_insn (insn, value, r_type);
+ insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
break;
}
else
value = hppa_field_adjust (value, addend, e_rrsel);
- insn = elf_hppa_relocate_insn (insn, value, r_type);
+ insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
break;
}
memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
/* The next word is the address of the function. */
- bfd_put_64 (hppa_info->opd_sec->owner, value,
+ bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
(hppa_info->opd_sec->contents
+ dyn_h->opd_offset + 16));
(hppa_info->opd_sec->output_section->owner);
bfd_put_64 (hppa_info->opd_sec->owner, value,
hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
+
+ /* The DLT value is the address of the .opd entry. */
+ value = (dyn_h->opd_offset
+ + hppa_info->opd_sec->output_offset
+ + hppa_info->opd_sec->output_section->vma);
+
+ bfd_put_64 (hppa_info->dlt_sec->owner,
+ value,
+ hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
}
/* We want the value of the DLT offset for this symbol, not
memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
/* The next word is the address of the function. */
- bfd_put_64 (hppa_info->opd_sec->owner, value,
+ bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
(hppa_info->opd_sec->contents
+ dyn_h->opd_offset + 16));
(hppa_info->opd_sec->output_section->owner);
bfd_put_64 (hppa_info->opd_sec->owner, value,
hppa_info->opd_sec->contents + dyn_h->opd_offset + 24);
+
+ /* The DLT value is the address of the .opd entry. */
+ value = (dyn_h->opd_offset
+ + hppa_info->opd_sec->output_offset
+ + hppa_info->opd_sec->output_section->vma);
+
+ bfd_put_64 (hppa_info->dlt_sec->owner,
+ value,
+ hppa_info->dlt_sec->contents + dyn_h->dlt_offset);
}
/* We want the value of the DLT offset for this symbol, not
if (sym_sec == NULL || sym_sec->output_section == NULL)
value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
+ hppa_info->stub_sec->output_section->vma);
-
+
/* Turn VALUE into a proper PC relative address. */
value -= (offset + input_section->output_offset
+ input_section->output_section->vma);
if (sym_sec == NULL || sym_sec->output_section == NULL)
value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset
+ hppa_info->stub_sec->output_section->vma);
-
-
+
/* Turn VALUE into a proper PC relative address. */
value -= (offset + input_section->output_offset
+ input_section->output_section->vma);
return bfd_reloc_ok;
}
-
case R_PARISC_FPTR64:
{
/* We may still need to create the FPTR itself if it was for
memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16);
/* The next word is the address of the function. */
- bfd_put_64 (hppa_info->opd_sec->owner, value,
+ bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
(hppa_info->opd_sec->contents
+ dyn_h->opd_offset + 16));
}
/* We want the value of the OPD offset for this symbol, not
- the symbol's actual address. */
+ the symbol's actual address. */
value = (dyn_h->opd_offset
+ hppa_info->opd_sec->output_offset
+ hppa_info->opd_sec->output_section->vma);
-
- bfd_put_64 (input_bfd, value + addend, hit_data);
+
+ bfd_put_64 (input_bfd, value, hit_data);
return bfd_reloc_ok;
}
bfd_put_32 (input_bfd, value, hit_data);
else
bfd_put_64 (input_bfd, value, hit_data);
- return bfd_reloc_ok;
+ return bfd_reloc_ok;
}
-
/* Something we don't know how to handle. */
default:
}
/* Update the instruction word. */
- bfd_put_32 (input_bfd, insn, hit_data);
+ bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
return bfd_reloc_ok;
}
Instead this routine is meant to handle the bit manipulations needed
to insert the relocation into the given instruction. */
-static unsigned int
+static int
elf_hppa_relocate_insn (insn, sym_value, r_type)
- unsigned int insn;
- unsigned int sym_value;
+ int insn;
+ int sym_value;
unsigned int r_type;
{
switch (r_type)
{
- /* This is any 22bit branch. In PA2.0 syntax it corresponds to
+ /* This is any 22 bit branch. In PA2.0 syntax it corresponds to
the "B" instruction. */
case R_PARISC_PCREL22F:
case R_PARISC_PCREL22C:
- return (insn & ~ 0x3ff1ffd) | re_assemble_22 (sym_value);
+ return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
+
+ /* This is any 12 bit branch. */
+ case R_PARISC_PCREL12F:
+ return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
- /* This is any 17bit branch. In PA2.0 syntax it also corresponds to
- the "B" instruction as well as BE. */
+ /* This is any 17 bit branch. In PA2.0 syntax it also corresponds
+ to the "B" instruction as well as BE. */
case R_PARISC_PCREL17F:
case R_PARISC_DIR17F:
case R_PARISC_DIR17R:
case R_PARISC_PCREL17C:
case R_PARISC_PCREL17R:
- return (insn & ~ 0x1f1ffd) | re_assemble_17 (sym_value);
+ return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
/* ADDIL or LDIL instructions. */
case R_PARISC_DLTREL21L:
case R_PARISC_DPREL21L:
case R_PARISC_PLTOFF21L:
case R_PARISC_DIR21L:
- return (insn & ~ 0x1fffff) | re_assemble_21 (sym_value);
+ return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
- /* LDO and integer loads/stores with 14bit displacements. */
+ /* LDO and integer loads/stores with 14 bit displacements. */
case R_PARISC_DLTREL14R:
case R_PARISC_DLTREL14F:
case R_PARISC_DLTIND14R:
case R_PARISC_PLTOFF14F:
case R_PARISC_PLTOFF16F:
case R_PARISC_DIR14R:
+ case R_PARISC_DIR14F:
case R_PARISC_DIR16F:
case R_PARISC_LTOFF16F:
- return (insn & ~ 0x3fff) | low_sign_unext (sym_value, 14);
+ return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
- /* Doubleword loads and stores with a 14bit displacement. */
+ /* Doubleword loads and stores with a 14 bit displacement. */
case R_PARISC_DLTREL14DR:
case R_PARISC_DLTIND14DR:
case R_PARISC_LTOFF_FPTR14DR:
case R_PARISC_DIR14DR:
case R_PARISC_DIR16DF:
case R_PARISC_LTOFF16DF:
- return (insn & ~ 0x3ff1) | (((sym_value & 0x2000) >> 13)
- | ((sym_value & 0x1ff8) << 1));
+ return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
+ | ((sym_value & 0x1ff8) << 1));
/* Floating point single word load/store instructions. */
case R_PARISC_DLTREL14WR:
case R_PARISC_DIR16WF:
case R_PARISC_DIR14WR:
case R_PARISC_LTOFF16WF:
- return (insn & ~ 0x3ff9) | (((sym_value & 0x2000) >> 13)
- | ((sym_value & 0x1ffc) << 1));
+ return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
+ | ((sym_value & 0x1ffc) << 1));
default:
return insn;