1 /* Common code for PA ELF implementations. 2 Copyright 1999, 2000, 2001 Free Software Foundation, Inc. 3 4 This file is part of BFD, the Binary File Descriptor library. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 19 20 #define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1 21 22 /* This file is included by multiple PA ELF BFD backends with different 23 sizes. 24 25 Most of the routines are written to be size independent, but sometimes 26 external constraints require 32 or 64 bit specific code. We remap 27 the definitions/functions as necessary here. */ 28 #if ARCH_SIZE == 64 29 #define ELF_R_TYPE(X) ELF64_R_TYPE(X) 30 #define ELF_R_SYM(X) ELF64_R_SYM(X) 31 #define elf_hppa_internal_shdr Elf64_Internal_Shdr 32 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type 33 #define elf_hppa_relocate_section elf64_hppa_relocate_section 34 #define bfd_elf_bfd_final_link bfd_elf64_bfd_final_link 35 #define elf_hppa_final_link elf64_hppa_final_link 36 #endif 37 #if ARCH_SIZE == 32 38 #define ELF_R_TYPE(X) ELF32_R_TYPE(X) 39 #define ELF_R_SYM(X) ELF32_R_SYM(X) 40 #define elf_hppa_internal_shdr Elf32_Internal_Shdr 41 #define _bfd_elf_hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type 42 #define elf_hppa_relocate_section elf32_hppa_relocate_section 43 #define bfd_elf_bfd_final_link bfd_elf32_bfd_final_link 44 #define elf_hppa_final_link elf32_hppa_final_link 45 #endif 46 47 elf_hppa_reloc_type ** _bfd_elf_hppa_gen_reloc_type 48 PARAMS ((bfd *, elf_hppa_reloc_type, int, unsigned int, int, asymbol *)); 49 50 static void elf_hppa_info_to_howto 51 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); 52 53 static void elf_hppa_info_to_howto_rel 54 PARAMS ((bfd *, arelent *, Elf_Internal_Rel *)); 55 56 static reloc_howto_type * elf_hppa_reloc_type_lookup 57 PARAMS ((bfd *, bfd_reloc_code_real_type)); 58 59 static boolean elf_hppa_is_local_label_name 60 PARAMS ((bfd *, const char *)); 61 62 static boolean elf_hppa_fake_sections 63 PARAMS ((bfd *abfd, elf_hppa_internal_shdr *, asection *)); 64 65 static void elf_hppa_final_write_processing 66 PARAMS ((bfd *, boolean)); 67 68 #if ARCH_SIZE == 64 69 static boolean elf_hppa_add_symbol_hook 70 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, 71 const char **, flagword *, asection **, bfd_vma *)); 72 73 static boolean elf_hppa_unmark_useless_dynamic_symbols 74 PARAMS ((struct elf_link_hash_entry *, PTR)); 75 76 static boolean elf_hppa_remark_useless_dynamic_symbols 77 PARAMS ((struct elf_link_hash_entry *, PTR)); 78 79 static void elf_hppa_record_segment_addrs 80 PARAMS ((bfd *, asection *, PTR)); 81 82 static boolean elf_hppa_final_link 83 PARAMS ((bfd *, struct bfd_link_info *)); 84 85 static boolean elf_hppa_relocate_section 86 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, 87 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); 88 89 static bfd_reloc_status_type elf_hppa_final_link_relocate 90 PARAMS ((Elf_Internal_Rela *, bfd *, bfd *, asection *, 91 bfd_byte *, bfd_vma, struct bfd_link_info *, 92 asection *, struct elf_link_hash_entry *, 93 struct elf64_hppa_dyn_hash_entry *)); 94 95 static unsigned int elf_hppa_relocate_insn 96 PARAMS ((unsigned int, unsigned int, unsigned int)); 97 #endif 98 99 /* ELF/PA relocation howto entries. */ 100 101 static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] = 102 { 103 { R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, 104 bfd_elf_generic_reloc, "R_PARISC_NONE", false, 0, 0, false }, 105 106 /* The values in DIR32 are to placate the check in 107 _bfd_stab_section_find_nearest_line. */ 108 { R_PARISC_DIR32, 0, 2, 32, false, 0, complain_overflow_bitfield, 109 bfd_elf_generic_reloc, "R_PARISC_DIR32", false, 0, 0xffffffff, false }, 110 { R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 111 bfd_elf_generic_reloc, "R_PARISC_DIR21L", false, 0, 0, false }, 112 { R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, 113 bfd_elf_generic_reloc, "R_PARISC_DIR17R", false, 0, 0, false }, 114 { R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, 115 bfd_elf_generic_reloc, "R_PARISC_DIR17F", false, 0, 0, false }, 116 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 117 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 118 { R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 119 bfd_elf_generic_reloc, "R_PARISC_DIR14R", false, 0, 0, false }, 120 { R_PARISC_DIR14F, 0, 0, 14, false, 0, complain_overflow_bitfield, 121 bfd_elf_generic_reloc, "R_PARISC_DIR14F", false, 0, 0, false }, 122 /* 8 */ 123 { R_PARISC_PCREL12F, 0, 0, 12, true, 0, complain_overflow_bitfield, 124 bfd_elf_generic_reloc, "R_PARISC_PCREL12F", false, 0, 0, false }, 125 { R_PARISC_PCREL32, 0, 0, 32, true, 0, complain_overflow_bitfield, 126 bfd_elf_generic_reloc, "R_PARISC_PCREL32", false, 0, 0, false }, 127 { R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, 128 bfd_elf_generic_reloc, "R_PARISC_PCREL21L", false, 0, 0, false }, 129 { R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, 130 bfd_elf_generic_reloc, "R_PARISC_PCREL17R", false, 0, 0, false }, 131 { R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, 132 bfd_elf_generic_reloc, "R_PARISC_PCREL17F", false, 0, 0, false }, 133 { R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, 134 bfd_elf_generic_reloc, "R_PARISC_PCREL17C", false, 0, 0, false }, 135 { R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, 136 bfd_elf_generic_reloc, "R_PARISC_PCREL14R", false, 0, 0, false }, 137 { R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, 138 bfd_elf_generic_reloc, "R_PARISC_PCREL14F", false, 0, 0, false }, 139 /* 16 */ 140 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 141 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 142 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 143 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 144 { R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 145 bfd_elf_generic_reloc, "R_PARISC_DPREL21L", false, 0, 0, false }, 146 { R_PARISC_DPREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 147 bfd_elf_generic_reloc, "R_PARISC_DPREL14WR", false, 0, 0, false }, 148 { R_PARISC_DPREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 149 bfd_elf_generic_reloc, "R_PARISC_DPREL14DR", false, 0, 0, false }, 150 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 151 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 152 { R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 153 bfd_elf_generic_reloc, "R_PARISC_DPREL14R", false, 0, 0, false }, 154 { R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, 155 bfd_elf_generic_reloc, "R_PARISC_DPREL14F", false, 0, 0, false }, 156 /* 24 */ 157 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 158 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 159 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 160 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 161 { R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 162 bfd_elf_generic_reloc, "R_PARISC_DLTREL21L", false, 0, 0, false }, 163 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 164 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 165 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 166 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 167 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 168 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 169 { R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 170 bfd_elf_generic_reloc, "R_PARISC_DLTREL14R", false, 0, 0, false }, 171 { R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, 172 bfd_elf_generic_reloc, "R_PARISC_DLTREL14F", false, 0, 0, false }, 173 /* 32 */ 174 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 175 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 176 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 177 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 178 { R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 179 bfd_elf_generic_reloc, "R_PARISC_DLTIND21L", false, 0, 0, false }, 180 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 181 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 182 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 183 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 184 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 185 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 186 { R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 187 bfd_elf_generic_reloc, "R_PARISC_DLTIND14R", false, 0, 0, false }, 188 { R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, 189 bfd_elf_generic_reloc, "R_PARISC_DLTIND14F", false, 0, 0, false }, 190 /* 40 */ 191 { R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, 192 bfd_elf_generic_reloc, "R_PARISC_SETBASE", false, 0, 0, false }, 193 { R_PARISC_SECREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, 194 bfd_elf_generic_reloc, "R_PARISC_SECREL32", false, 0, 0, false }, 195 { R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 196 bfd_elf_generic_reloc, "R_PARISC_BASEREL21L", false, 0, 0, false }, 197 { R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, 198 bfd_elf_generic_reloc, "R_PARISC_BASEREL17R", false, 0, 0, false }, 199 { R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, 200 bfd_elf_generic_reloc, "R_PARISC_BASEREL17F", false, 0, 0, false }, 201 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 202 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 203 { R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 204 bfd_elf_generic_reloc, "R_PARISC_BASEREL14R", false, 0, 0, false }, 205 { R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, 206 bfd_elf_generic_reloc, "R_PARISC_BASEREL14F", false, 0, 0, false }, 207 /* 48 */ 208 { R_PARISC_SEGBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, 209 bfd_elf_generic_reloc, "R_PARISC_SEGBASE", false, 0, 0, false }, 210 { R_PARISC_SEGREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, 211 bfd_elf_generic_reloc, "R_PARISC_SEGREL32", false, 0, 0, false }, 212 { R_PARISC_PLTOFF21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 213 bfd_elf_generic_reloc, "R_PARISC_PLTOFF21L", false, 0, 0, false }, 214 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 215 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 216 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 217 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 218 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 219 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 220 { R_PARISC_PLTOFF14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 221 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14R", false, 0, 0, false }, 222 { R_PARISC_PLTOFF14F, 0, 0, 14, false, 0, complain_overflow_bitfield, 223 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14F", false, 0, 0, false }, 224 /* 56 */ 225 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 226 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 227 { R_PARISC_LTOFF_FPTR32, 0, 0, 32, false, 0, complain_overflow_bitfield, 228 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR32", false, 0, 0, false }, 229 { R_PARISC_LTOFF_FPTR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 230 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR21L", false, 0, 0, false }, 231 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 232 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 233 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 234 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 235 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 236 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 237 { R_PARISC_LTOFF_FPTR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 238 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14R", false, 0, 0, false }, 239 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 240 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 241 /* 64 */ 242 { R_PARISC_FPTR64, 0, 0, 64, false, 0, complain_overflow_bitfield, 243 bfd_elf_generic_reloc, "R_PARISC_FPTR64", false, 0, 0, false }, 244 { R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, 245 bfd_elf_generic_reloc, "R_PARISC_PLABEL32", false, 0, 0, false }, 246 { R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 247 bfd_elf_generic_reloc, "R_PARISC_PLABEL21L", false, 0, 0, false }, 248 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 249 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 250 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 251 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 252 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 253 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 254 { R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 255 bfd_elf_generic_reloc, "R_PARISC_PLABEL14R", false, 0, 0, false }, 256 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 257 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 258 /* 72 */ 259 { R_PARISC_PCREL64, 0, 0, 64, false, 0, complain_overflow_bitfield, 260 bfd_elf_generic_reloc, "R_PARISC_PCREL64", false, 0, 0, false }, 261 { R_PARISC_PCREL22C, 0, 0, 22, false, 0, complain_overflow_bitfield, 262 bfd_elf_generic_reloc, "R_PARISC_PCREL22C", false, 0, 0, false }, 263 { R_PARISC_PCREL22F, 0, 0, 22, false, 0, complain_overflow_bitfield, 264 bfd_elf_generic_reloc, "R_PARISC_PCREL22F", false, 0, 0, false }, 265 { R_PARISC_PCREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 266 bfd_elf_generic_reloc, "R_PARISC_PCREL14WR", false, 0, 0, false }, 267 { R_PARISC_PCREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 268 bfd_elf_generic_reloc, "R_PARISC_PCREL14DR", false, 0, 0, false }, 269 { R_PARISC_PCREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield, 270 bfd_elf_generic_reloc, "R_PARISC_PCREL16F", false, 0, 0, false }, 271 { R_PARISC_PCREL16WF, 0, 0, 16, false, 0, complain_overflow_bitfield, 272 bfd_elf_generic_reloc, "R_PARISC_PCREL16WF", false, 0, 0, false }, 273 { R_PARISC_PCREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 274 bfd_elf_generic_reloc, "R_PARISC_PCREL16DF", false, 0, 0, false }, 275 /* 80 */ 276 { R_PARISC_DIR64, 0, 0, 64, false, 0, complain_overflow_bitfield, 277 bfd_elf_generic_reloc, "R_PARISC_DIR64", false, 0, 0, false }, 278 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 279 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 280 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 281 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 282 { R_PARISC_DIR14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 283 bfd_elf_generic_reloc, "R_PARISC_DIR14WR", false, 0, 0, false }, 284 { R_PARISC_DIR14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 285 bfd_elf_generic_reloc, "R_PARISC_DIR14DR", false, 0, 0, false }, 286 { R_PARISC_DIR16F, 0, 0, 16, false, 0, complain_overflow_bitfield, 287 bfd_elf_generic_reloc, "R_PARISC_DIR16F", false, 0, 0, false }, 288 { R_PARISC_DIR16WF, 0, 0, 16, false, 0, complain_overflow_bitfield, 289 bfd_elf_generic_reloc, "R_PARISC_DIR16WF", false, 0, 0, false }, 290 { R_PARISC_DIR16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 291 bfd_elf_generic_reloc, "R_PARISC_DIR16DF", false, 0, 0, false }, 292 /* 88 */ 293 { R_PARISC_GPREL64, 0, 0, 64, false, 0, complain_overflow_bitfield, 294 bfd_elf_generic_reloc, "R_PARISC_GPREL64", false, 0, 0, false }, 295 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 296 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 297 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 298 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 299 { R_PARISC_DLTREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 300 bfd_elf_generic_reloc, "R_PARISC_DLTREL14WR", false, 0, 0, false }, 301 { R_PARISC_DLTREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 302 bfd_elf_generic_reloc, "R_PARISC_DLTREL14DR", false, 0, 0, false }, 303 { R_PARISC_GPREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield, 304 bfd_elf_generic_reloc, "R_PARISC_GPREL16F", false, 0, 0, false }, 305 { R_PARISC_GPREL16WF, 0, 0, 16, false, 0, complain_overflow_bitfield, 306 bfd_elf_generic_reloc, "R_PARISC_GPREL16WF", false, 0, 0, false }, 307 { R_PARISC_GPREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 308 bfd_elf_generic_reloc, "R_PARISC_GPREL16DF", false, 0, 0, false }, 309 /* 96 */ 310 { R_PARISC_LTOFF64, 0, 0, 64, false, 0, complain_overflow_bitfield, 311 bfd_elf_generic_reloc, "R_PARISC_LTOFF64", false, 0, 0, false }, 312 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 313 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 314 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 315 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 316 { R_PARISC_DLTIND14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 317 bfd_elf_generic_reloc, "R_PARISC_DLTIND14WR", false, 0, 0, false }, 318 { R_PARISC_DLTIND14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 319 bfd_elf_generic_reloc, "R_PARISC_DLTIND14DR", false, 0, 0, false }, 320 { R_PARISC_LTOFF16F, 0, 0, 16, false, 0, complain_overflow_bitfield, 321 bfd_elf_generic_reloc, "R_PARISC_LTOFF16F", false, 0, 0, false }, 322 { R_PARISC_LTOFF16WF, 0, 0, 16, false, 0, complain_overflow_bitfield, 323 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", false, 0, 0, false }, 324 { R_PARISC_LTOFF16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 325 bfd_elf_generic_reloc, "R_PARISC_LTOFF16DF", false, 0, 0, false }, 326 /* 104 */ 327 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 328 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 329 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 330 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 331 { R_PARISC_BASEREL14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 332 bfd_elf_generic_reloc, "R_PARISC_BASEREL14WR", false, 0, 0, false }, 333 { R_PARISC_BASEREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 334 bfd_elf_generic_reloc, "R_PARISC_BASEREL14DR", false, 0, 0, false }, 335 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 336 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 337 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 338 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 339 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 340 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 341 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 342 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 343 /* 112 */ 344 { R_PARISC_SEGREL64, 0, 0, 64, false, 0, complain_overflow_bitfield, 345 bfd_elf_generic_reloc, "R_PARISC_SEGREL64", false, 0, 0, false }, 346 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 347 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 348 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 349 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 350 { R_PARISC_PLTOFF14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 351 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14WR", false, 0, 0, false }, 352 { R_PARISC_PLTOFF14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 353 bfd_elf_generic_reloc, "R_PARISC_PLTOFF14DR", false, 0, 0, false }, 354 { R_PARISC_PLTOFF16F, 0, 0, 16, false, 0, complain_overflow_bitfield, 355 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16F", false, 0, 0, false }, 356 { R_PARISC_PLTOFF16WF, 0, 0, 16, false, 0, complain_overflow_bitfield, 357 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16WF", false, 0, 0, false }, 358 { R_PARISC_PLTOFF16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 359 bfd_elf_generic_reloc, "R_PARISC_PLTOFF16DF", false, 0, 0, false }, 360 /* 120 */ 361 { R_PARISC_LTOFF_FPTR64, 0, 0, 64, false, 0, complain_overflow_bitfield, 362 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 363 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 364 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 365 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 366 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 367 { R_PARISC_LTOFF_FPTR14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 368 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14WR", false, 0, 0, false }, 369 { R_PARISC_LTOFF_FPTR14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 370 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR14DR", false, 0, 0, false }, 371 { R_PARISC_LTOFF_FPTR16F, 0, 0, 16, false, 0, complain_overflow_bitfield, 372 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16F", false, 0, 0, false }, 373 { R_PARISC_LTOFF_FPTR16WF, 0, 0, 16, false, 0, complain_overflow_bitfield, 374 bfd_elf_generic_reloc, "R_PARISC_LTOFF_FPTR16WF", false, 0, 0, false }, 375 { R_PARISC_LTOFF_FPTR16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 376 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 377 /* 128 */ 378 { R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, 379 bfd_elf_generic_reloc, "R_PARISC_COPY", false, 0, 0, false }, 380 { R_PARISC_IPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, 381 bfd_elf_generic_reloc, "R_PARISC_IPLT", false, 0, 0, false }, 382 { R_PARISC_EPLT, 0, 0, 0, false, 0, complain_overflow_bitfield, 383 bfd_elf_generic_reloc, "R_PARISC_EPLT", false, 0, 0, false }, 384 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 385 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 386 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 387 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 388 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 389 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 390 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 391 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 392 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 393 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 394 /* 136 */ 395 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 396 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 397 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 398 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 399 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 400 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 401 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 402 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 403 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 404 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 405 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 406 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 407 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 408 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 409 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 410 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 411 /* 144 */ 412 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 413 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 414 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 415 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 416 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 417 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 418 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 419 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 420 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 421 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 422 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 423 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 424 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 425 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 426 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 427 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 428 /* 152 */ 429 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 430 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 431 { R_PARISC_TPREL32, 0, 0, 32, false, 0, complain_overflow_dont, 432 bfd_elf_generic_reloc, "R_PARISC_TPREL32", false, 0, 0, false }, 433 { R_PARISC_TPREL21L, 0, 0, 21, false, 0, complain_overflow_dont, 434 bfd_elf_generic_reloc, "R_PARISC_TPREL21L", false, 0, 0, false }, 435 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 436 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 437 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 438 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 439 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 440 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 441 { R_PARISC_TPREL14R, 0, 0, 14, false, 0, complain_overflow_dont, 442 bfd_elf_generic_reloc, "R_PARISC_TPREL14R", false, 0, 0, false }, 443 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 444 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 445 /* 160 */ 446 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 447 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 448 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 449 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 450 { R_PARISC_LTOFF_TP21L, 0, 0, 21, false, 0, complain_overflow_bitfield, 451 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP21L", false, 0, 0, false }, 452 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 453 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 454 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 455 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 456 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 457 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 458 { R_PARISC_LTOFF_TP14R, 0, 0, 14, false, 0, complain_overflow_bitfield, 459 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 460 { R_PARISC_LTOFF_TP14F, 0, 0, 14, false, 0, complain_overflow_bitfield, 461 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14F", false, 0, 0, false }, 462 /* 168 */ 463 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 464 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 465 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 466 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 467 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 468 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 469 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 470 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 471 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 472 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 473 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 474 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 475 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 476 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 477 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 478 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 479 /* 176 */ 480 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 481 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 482 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 483 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 484 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 485 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 486 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 487 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 488 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 489 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 490 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 491 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 492 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 493 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 494 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 495 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 496 /* 184 */ 497 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 498 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 499 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 500 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 501 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 502 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 503 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 504 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 505 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 506 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 507 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 508 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 509 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 510 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 511 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 512 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 513 /* 192 */ 514 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 515 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 516 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 517 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 518 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 519 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 520 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 521 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 522 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 523 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 524 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 525 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 526 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 527 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 528 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 529 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 530 /* 200 */ 531 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 532 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 533 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 534 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 535 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 536 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 537 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 538 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 539 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 540 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 541 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 542 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 543 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 544 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 545 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 546 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 547 /* 208 */ 548 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 549 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 550 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 551 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 552 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 553 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 554 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 555 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 556 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, 557 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 558 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 559 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 560 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 561 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 562 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 563 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 564 /* 216 */ 565 { R_PARISC_TPREL64, 0, 0, 64, false, 0, complain_overflow_bitfield, 566 bfd_elf_generic_reloc, "R_PARISC_TPREL64", false, 0, 0, false }, 567 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 568 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 569 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 570 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 571 { R_PARISC_TPREL14WR, 0, 0, 14, false, 0, complain_overflow_dont, 572 bfd_elf_generic_reloc, "R_PARISC_TPREL14WR", false, 0, 0, false }, 573 { R_PARISC_TPREL14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 574 bfd_elf_generic_reloc, "R_PARISC_TPREL14DR", false, 0, 0, false }, 575 { R_PARISC_TPREL16F, 0, 0, 16, false, 0, complain_overflow_bitfield, 576 bfd_elf_generic_reloc, "R_PARISC_TPREL16F", false, 0, 0, false }, 577 { R_PARISC_TPREL16WF, 0, 0, 16, false, 0, complain_overflow_dont, 578 bfd_elf_generic_reloc, "R_PARISC_TPREL16WF", false, 0, 0, false }, 579 { R_PARISC_TPREL16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 580 bfd_elf_generic_reloc, "R_PARISC_TPREL16DF", false, 0, 0, false }, 581 /* 224 */ 582 { R_PARISC_LTOFF_TP64, 0, 0, 64, false, 0, complain_overflow_bitfield, 583 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP64", false, 0, 0, false }, 584 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 585 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 586 { R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, 587 bfd_elf_generic_reloc, "R_PARISC_UNIMPLEMENTED", false, 0, 0, false }, 588 { R_PARISC_LTOFF_TP14WR, 0, 0, 14, false, 0, complain_overflow_bitfield, 589 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14WR", false, 0, 0, false }, 590 { R_PARISC_LTOFF_TP14DR, 0, 0, 14, false, 0, complain_overflow_bitfield, 591 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP14DR", false, 0, 0, false }, 592 { R_PARISC_LTOFF_TP16F, 0, 0, 16, false, 0, complain_overflow_dont, 593 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16F", false, 0, 0, false }, 594 { R_PARISC_LTOFF_TP16WF, 0, 0, 16, false, 0, complain_overflow_bitfield, 595 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16WF", false, 0, 0, false }, 596 { R_PARISC_LTOFF_TP16DF, 0, 0, 16, false, 0, complain_overflow_bitfield, 597 bfd_elf_generic_reloc, "R_PARISC_LTOFF_TP16DF", false, 0, 0, false }, 598 /* 232 */ 599 { R_PARISC_GNU_VTENTRY, 0, 0, 0, false, 0, complain_overflow_dont, 600 bfd_elf_generic_reloc, "R_PARISC_GNU_VTENTRY", false, 0, 0, false }, 601 { R_PARISC_GNU_VTINHERIT, 0, 0, 0, false, 0, complain_overflow_dont, 602 bfd_elf_generic_reloc, "R_PARISC_GNU_VTINHERIT", false, 0, 0, false }, 603 }; 604 605 #define OFFSET_14R_FROM_21L 4 606 #define OFFSET_14F_FROM_21L 5 607 608 /* Return one (or more) BFD relocations which implement the base 609 relocation with modifications based on format and field. */ 610 611 elf_hppa_reloc_type ** 612 _bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym) 613 bfd *abfd; 614 elf_hppa_reloc_type base_type; 615 int format; 616 unsigned int field; 617 int ignore ATTRIBUTE_UNUSED; 618 asymbol *sym ATTRIBUTE_UNUSED; 619 { 620 elf_hppa_reloc_type *finaltype; 621 elf_hppa_reloc_type **final_types; 622 623 /* Allocate slots for the BFD relocation. */ 624 final_types = ((elf_hppa_reloc_type **) 625 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type *) * 2)); 626 if (final_types == NULL) 627 return NULL; 628 629 /* Allocate space for the relocation itself. */ 630 finaltype = ((elf_hppa_reloc_type *) 631 bfd_alloc (abfd, sizeof (elf_hppa_reloc_type))); 632 if (finaltype == NULL) 633 return NULL; 634 635 /* Some reasonable defaults. */ 636 final_types[0] = finaltype; 637 final_types[1] = NULL; 638 639 #define final_type finaltype[0] 640 641 final_type = base_type; 642 643 /* Just a tangle of nested switch statements to deal with the braindamage 644 that a different field selector means a completely different relocation 645 for PA ELF. */ 646 switch (base_type) 647 { 648 /* We have been using generic relocation types. However, that may not 649 really make sense. Anyway, we need to support both R_PARISC_DIR64 650 and R_PARISC_DIR32 here. */ 651 case R_PARISC_DIR32: 652 case R_PARISC_DIR64: 653 case R_HPPA_ABS_CALL: 654 switch (format) 655 { 656 case 14: 657 switch (field) 658 { 659 case e_fsel: 660 final_type = R_PARISC_DIR14F; 661 break; 662 case e_rsel: 663 case e_rrsel: 664 case e_rdsel: 665 final_type = R_PARISC_DIR14R; 666 break; 667 case e_rtsel: 668 final_type = R_PARISC_DLTIND14R; 669 break; 670 case e_rtpsel: 671 final_type = R_PARISC_LTOFF_FPTR14DR; 672 break; 673 case e_tsel: 674 final_type = R_PARISC_DLTIND14F; 675 break; 676 case e_rpsel: 677 final_type = R_PARISC_PLABEL14R; 678 break; 679 default: 680 return NULL; 681 } 682 break; 683 684 case 17: 685 switch (field) 686 { 687 case e_fsel: 688 final_type = R_PARISC_DIR17F; 689 break; 690 case e_rsel: 691 case e_rrsel: 692 case e_rdsel: 693 final_type = R_PARISC_DIR17R; 694 break; 695 default: 696 return NULL; 697 } 698 break; 699 700 case 21: 701 switch (field) 702 { 703 case e_lsel: 704 case e_lrsel: 705 case e_ldsel: 706 case e_nlsel: 707 case e_nlrsel: 708 final_type = R_PARISC_DIR21L; 709 break; 710 case e_ltsel: 711 final_type = R_PARISC_DLTIND21L; 712 break; 713 case e_ltpsel: 714 final_type = R_PARISC_LTOFF_FPTR21L; 715 break; 716 case e_lpsel: 717 final_type = R_PARISC_PLABEL21L; 718 break; 719 default: 720 return NULL; 721 } 722 break; 723 724 case 32: 725 switch (field) 726 { 727 case e_fsel: 728 final_type = R_PARISC_DIR32; 729 /* When in 64bit mode, a 32bit relocation is supposed to 730 be a section relative relocation. Dwarf2 (for example) 731 uses 32bit section relative relocations. */ 732 if (bfd_get_arch_info (abfd)->bits_per_address != 32) 733 final_type = R_PARISC_SECREL32; 734 break; 735 case e_psel: 736 final_type = R_PARISC_PLABEL32; 737 break; 738 default: 739 return NULL; 740 } 741 break; 742 743 case 64: 744 switch (field) 745 { 746 case e_fsel: 747 final_type = R_PARISC_DIR64; 748 break; 749 case e_psel: 750 final_type = R_PARISC_FPTR64; 751 break; 752 default: 753 return NULL; 754 } 755 break; 756 757 default: 758 return NULL; 759 } 760 break; 761 762 case R_HPPA_GOTOFF: 763 switch (format) 764 { 765 case 14: 766 switch (field) 767 { 768 case e_rsel: 769 case e_rrsel: 770 case e_rdsel: 771 /* R_PARISC_DLTREL14R for elf64, R_PARISC_DPREL14R for elf32 */ 772 final_type = base_type + OFFSET_14R_FROM_21L; 773 break; 774 case e_fsel: 775 /* R_PARISC_DLTREL14F for elf64, R_PARISC_DPREL14F for elf32 */ 776 final_type = base_type + OFFSET_14F_FROM_21L; 777 break; 778 default: 779 return NULL; 780 } 781 break; 782 783 case 21: 784 switch (field) 785 { 786 case e_lsel: 787 case e_lrsel: 788 case e_ldsel: 789 case e_nlsel: 790 case e_nlrsel: 791 /* R_PARISC_DLTREL21L for elf64, R_PARISC_DPREL21L for elf32 */ 792 final_type = base_type; 793 break; 794 default: 795 return NULL; 796 } 797 break; 798 799 default: 800 return NULL; 801 } 802 break; 803 804 case R_HPPA_PCREL_CALL: 805 switch (format) 806 { 807 case 12: 808 switch (field) 809 { 810 case e_fsel: 811 final_type = R_PARISC_PCREL12F; 812 break; 813 default: 814 return NULL; 815 } 816 break; 817 818 case 14: 819 /* Contrary to appearances, these are not calls of any sort. 820 Rather, they are loads/stores with a pcrel reloc. */ 821 switch (field) 822 { 823 case e_rsel: 824 case e_rrsel: 825 case e_rdsel: 826 final_type = R_PARISC_PCREL14R; 827 break; 828 case e_fsel: 829 final_type = R_PARISC_PCREL14F; 830 break; 831 default: 832 return NULL; 833 } 834 break; 835 836 case 17: 837 switch (field) 838 { 839 case e_rsel: 840 case e_rrsel: 841 case e_rdsel: 842 final_type = R_PARISC_PCREL17R; 843 break; 844 case e_fsel: 845 final_type = R_PARISC_PCREL17F; 846 break; 847 default: 848 return NULL; 849 } 850 break; 851 852 case 21: 853 switch (field) 854 { 855 case e_lsel: 856 case e_lrsel: 857 case e_ldsel: 858 case e_nlsel: 859 case e_nlrsel: 860 final_type = R_PARISC_PCREL21L; 861 break; 862 default: 863 return NULL; 864 } 865 break; 866 867 case 22: 868 switch (field) 869 { 870 case e_fsel: 871 final_type = R_PARISC_PCREL22F; 872 break; 873 default: 874 return NULL; 875 } 876 break; 877 878 default: 879 return NULL; 880 } 881 break; 882 883 case R_PARISC_GNU_VTENTRY: 884 case R_PARISC_GNU_VTINHERIT: 885 case R_PARISC_SEGREL32: 886 case R_PARISC_SEGBASE: 887 /* The defaults are fine for these cases. */ 888 break; 889 890 default: 891 return NULL; 892 } 893 894 return final_types; 895 } 896 897 /* Translate from an elf into field into a howto relocation pointer. */ 898 899 static void 900 elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc) 901 bfd *abfd ATTRIBUTE_UNUSED; 902 arelent *bfd_reloc; 903 Elf_Internal_Rela *elf_reloc; 904 { 905 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info) 906 < (unsigned int) R_PARISC_UNIMPLEMENTED); 907 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)]; 908 } 909 910 /* Translate from an elf into field into a howto relocation pointer. */ 911 912 static void 913 elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc) 914 bfd *abfd ATTRIBUTE_UNUSED; 915 arelent *bfd_reloc; 916 Elf_Internal_Rel *elf_reloc; 917 { 918 BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info) 919 < (unsigned int) R_PARISC_UNIMPLEMENTED); 920 bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)]; 921 } 922 923 /* Return the address of the howto table entry to perform the CODE 924 relocation for an ARCH machine. */ 925 926 static reloc_howto_type * 927 elf_hppa_reloc_type_lookup (abfd, code) 928 bfd *abfd ATTRIBUTE_UNUSED; 929 bfd_reloc_code_real_type code; 930 { 931 if ((int) code < (int) R_PARISC_UNIMPLEMENTED) 932 { 933 BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code); 934 return &elf_hppa_howto_table[(int) code]; 935 } 936 return NULL; 937 } 938 939 /* Return true if SYM represents a local label symbol. */ 940 941 static boolean 942 elf_hppa_is_local_label_name (abfd, name) 943 bfd *abfd ATTRIBUTE_UNUSED; 944 const char *name; 945 { 946 if (name[0] == 'L' && name[1] == '$') 947 return 1; 948 return _bfd_elf_is_local_label_name (abfd, name); 949 } 950 951 /* Set the correct type for an ELF section. We do this by the 952 section name, which is a hack, but ought to work. */ 953 954 static boolean 955 elf_hppa_fake_sections (abfd, hdr, sec) 956 bfd *abfd; 957 elf_hppa_internal_shdr *hdr; 958 asection *sec; 959 { 960 register const char *name; 961 962 name = bfd_get_section_name (abfd, sec); 963 964 if (strcmp (name, ".PARISC.unwind") == 0) 965 { 966 int indx; 967 asection *asec; 968 #if ARCH_SIZE == 64 969 hdr->sh_type = SHT_LOPROC + 1; 970 #else 971 hdr->sh_type = 1; 972 #endif 973 /* ?!? How are unwinds supposed to work for symbols in arbitrary 974 sections? Or what if we have multiple .text sections in a single 975 .o file? HP really messed up on this one. 976 977 Ugh. We can not use elf_section_data (sec)->this_idx at this 978 point because it is not initialized yet. 979 980 So we (gasp) recompute it here. Hopefully nobody ever changes the 981 way sections are numbered in elf.c! */ 982 for (asec = abfd->sections, indx = 1; asec; asec = asec->next, indx++) 983 { 984 if (asec->name && strcmp (asec->name, ".text") == 0) 985 { 986 hdr->sh_info = indx; 987 break; 988 } 989 } 990 991 /* I have no idea if this is really necessary or what it means. */ 992 hdr->sh_entsize = 4; 993 } 994 return true; 995 } 996 997 static void 998 elf_hppa_final_write_processing (abfd, linker) 999 bfd *abfd; 1000 boolean linker ATTRIBUTE_UNUSED; 1001 { 1002 int mach = bfd_get_mach (abfd); 1003 1004 elf_elfheader (abfd)->e_flags &= ~(EF_PARISC_ARCH | EF_PARISC_TRAPNIL 1005 | EF_PARISC_EXT | EF_PARISC_LSB 1006 | EF_PARISC_WIDE | EF_PARISC_NO_KABP 1007 | EF_PARISC_LAZYSWAP); 1008 1009 if (mach == 10) 1010 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_0; 1011 else if (mach == 11) 1012 elf_elfheader (abfd)->e_flags |= EFA_PARISC_1_1; 1013 else if (mach == 20) 1014 elf_elfheader (abfd)->e_flags |= EFA_PARISC_2_0; 1015 else if (mach == 25) 1016 elf_elfheader (abfd)->e_flags |= (EF_PARISC_WIDE 1017 | EFA_PARISC_2_0 1018 /* The GNU tools have trapped without 1019 option since 1993, so need to take 1020 a step backwards with the ELF 1021 based toolchains. */ 1022 | EF_PARISC_TRAPNIL); 1023 } 1024 1025 #if ARCH_SIZE == 64 1026 /* Hook called by the linker routine which adds symbols from an object 1027 file. HP's libraries define symbols with HP specific section 1028 indices, which we have to handle. */ 1029 1030 static boolean 1031 elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp) 1032 bfd *abfd; 1033 struct bfd_link_info *info ATTRIBUTE_UNUSED; 1034 const Elf_Internal_Sym *sym; 1035 const char **namep ATTRIBUTE_UNUSED; 1036 flagword *flagsp ATTRIBUTE_UNUSED; 1037 asection **secp; 1038 bfd_vma *valp; 1039 { 1040 int index = sym->st_shndx; 1041 1042 switch (index) 1043 { 1044 case SHN_PARISC_ANSI_COMMON: 1045 *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common"); 1046 (*secp)->flags |= SEC_IS_COMMON; 1047 *valp = sym->st_size; 1048 break; 1049 1050 case SHN_PARISC_HUGE_COMMON: 1051 *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common"); 1052 (*secp)->flags |= SEC_IS_COMMON; 1053 *valp = sym->st_size; 1054 break; 1055 } 1056 1057 return true; 1058 } 1059 1060 static boolean 1061 elf_hppa_unmark_useless_dynamic_symbols (h, data) 1062 struct elf_link_hash_entry *h; 1063 PTR data; 1064 { 1065 struct bfd_link_info *info = (struct bfd_link_info *)data; 1066 1067 /* If we are not creating a shared library, and this symbol is 1068 referenced by a shared library but is not defined anywhere, then 1069 the generic code will warn that it is undefined. 1070 1071 This behavior is undesirable on HPs since the standard shared 1072 libraries contain references to undefined symbols. 1073 1074 So we twiddle the flags associated with such symbols so that they 1075 will not trigger the warning. ?!? FIXME. This is horribly fragile. 1076 1077 Ultimately we should have better controls over the generic ELF BFD 1078 linker code. */ 1079 if (! info->relocateable 1080 && ! (info->shared 1081 && !info->no_undefined) 1082 && h->root.type == bfd_link_hash_undefined 1083 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0 1084 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0) 1085 { 1086 h->elf_link_hash_flags &= ~ELF_LINK_HASH_REF_DYNAMIC; 1087 h->elf_link_hash_flags |= 0x8000; 1088 } 1089 1090 return true; 1091 } 1092 1093 static boolean 1094 elf_hppa_remark_useless_dynamic_symbols (h, data) 1095 struct elf_link_hash_entry *h; 1096 PTR data; 1097 { 1098 struct bfd_link_info *info = (struct bfd_link_info *)data; 1099 1100 /* If we are not creating a shared library, and this symbol is 1101 referenced by a shared library but is not defined anywhere, then 1102 the generic code will warn that it is undefined. 1103 1104 This behavior is undesirable on HPs since the standard shared 1105 libraries contain reerences to undefined symbols. 1106 1107 So we twiddle the flags associated with such symbols so that they 1108 will not trigger the warning. ?!? FIXME. This is horribly fragile. 1109 1110 Ultimately we should have better controls over the generic ELF BFD 1111 linker code. */ 1112 if (! info->relocateable 1113 && ! (info->shared 1114 && !info->no_undefined) 1115 && h->root.type == bfd_link_hash_undefined 1116 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0 1117 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0 1118 && (h->elf_link_hash_flags & 0x8000) != 0) 1119 { 1120 h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC; 1121 h->elf_link_hash_flags &= ~0x8000; 1122 } 1123 1124 return true; 1125 } 1126 1127 /* Record the lowest address for the data and text segments. */ 1128 static void 1129 elf_hppa_record_segment_addrs (abfd, section, data) 1130 bfd *abfd ATTRIBUTE_UNUSED; 1131 asection *section; 1132 PTR data; 1133 { 1134 struct elf64_hppa_link_hash_table *hppa_info; 1135 bfd_vma value; 1136 1137 hppa_info = (struct elf64_hppa_link_hash_table *)data; 1138 1139 value = section->vma - section->filepos; 1140 1141 if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) 1142 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) 1143 && value < hppa_info->text_segment_base) 1144 hppa_info->text_segment_base = value; 1145 else if (((section->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) 1146 == (SEC_ALLOC | SEC_LOAD)) 1147 && value < hppa_info->data_segment_base) 1148 hppa_info->data_segment_base = value; 1149 } 1150 1151 /* Called after we have seen all the input files/sections, but before 1152 final symbol resolution and section placement has been determined. 1153 1154 We use this hook to (possibly) provide a value for __gp, then we 1155 fall back to the generic ELF final link routine. */ 1156 1157 static boolean 1158 elf_hppa_final_link (abfd, info) 1159 bfd *abfd; 1160 struct bfd_link_info *info; 1161 { 1162 boolean retval; 1163 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info); 1164 1165 if (! info->relocateable) 1166 { 1167 struct elf_link_hash_entry *gp; 1168 bfd_vma gp_val; 1169 1170 /* The linker script defines a value for __gp iff it was referenced 1171 by one of the objects being linked. First try to find the symbol 1172 in the hash table. If that fails, just compute the value __gp 1173 should have had. */ 1174 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false, 1175 false, false); 1176 1177 if (gp) 1178 { 1179 1180 /* Adjust the value of __gp as we may want to slide it into the 1181 .plt section so that the stubs can access PLT entries without 1182 using an addil sequence. */ 1183 gp->root.u.def.value += hppa_info->gp_offset; 1184 1185 gp_val = (gp->root.u.def.section->output_section->vma 1186 + gp->root.u.def.section->output_offset 1187 + gp->root.u.def.value); 1188 } 1189 else 1190 { 1191 asection *sec; 1192 1193 /* First look for a .plt section. If found, then __gp is the 1194 address of the .plt + gp_offset. 1195 1196 If no .plt is found, then look for .dlt, .opd and .data (in 1197 that order) and set __gp to the base address of whichever section 1198 is found first. */ 1199 1200 sec = hppa_info->plt_sec; 1201 if (sec) 1202 gp_val = (sec->output_offset 1203 + sec->output_section->vma 1204 + hppa_info->gp_offset); 1205 else 1206 { 1207 sec = hppa_info->dlt_sec; 1208 if (!sec) 1209 sec = hppa_info->opd_sec; 1210 if (!sec) 1211 sec = bfd_get_section_by_name (abfd, ".data"); 1212 if (!sec) 1213 return false; 1214 1215 gp_val = sec->output_offset + sec->output_section->vma; 1216 } 1217 } 1218 1219 /* Install whatever value we found/computed for __gp. */ 1220 _bfd_set_gp_value (abfd, gp_val); 1221 } 1222 1223 /* We need to know the base of the text and data segments so that we 1224 can perform SEGREL relocations. We will record the base addresses 1225 when we encounter the first SEGREL relocation. */ 1226 hppa_info->text_segment_base = (bfd_vma)-1; 1227 hppa_info->data_segment_base = (bfd_vma)-1; 1228 1229 /* HP's shared libraries have references to symbols that are not 1230 defined anywhere. The generic ELF BFD linker code will complaim 1231 about such symbols. 1232 1233 So we detect the losing case and arrange for the flags on the symbol 1234 to indicate that it was never referenced. This keeps the generic 1235 ELF BFD link code happy and appears to not create any secondary 1236 problems. Ultimately we need a way to control the behavior of the 1237 generic ELF BFD link code better. */ 1238 elf_link_hash_traverse (elf_hash_table (info), 1239 elf_hppa_unmark_useless_dynamic_symbols, 1240 info); 1241 1242 /* Invoke the regular ELF backend linker to do all the work. */ 1243 retval = bfd_elf_bfd_final_link (abfd, info); 1244 1245 elf_link_hash_traverse (elf_hash_table (info), 1246 elf_hppa_remark_useless_dynamic_symbols, 1247 info); 1248 1249 return retval; 1250 } 1251 1252 /* Relocate an HPPA ELF section. */ 1253 1254 static boolean 1255 elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section, 1256 contents, relocs, local_syms, local_sections) 1257 bfd *output_bfd; 1258 struct bfd_link_info *info; 1259 bfd *input_bfd; 1260 asection *input_section; 1261 bfd_byte *contents; 1262 Elf_Internal_Rela *relocs; 1263 Elf_Internal_Sym *local_syms; 1264 asection **local_sections; 1265 { 1266 Elf_Internal_Shdr *symtab_hdr; 1267 Elf_Internal_Rela *rel; 1268 Elf_Internal_Rela *relend; 1269 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info); 1270 1271 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 1272 1273 rel = relocs; 1274 relend = relocs + input_section->reloc_count; 1275 for (; rel < relend; rel++) 1276 { 1277 int r_type; 1278 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info); 1279 unsigned long r_symndx; 1280 struct elf_link_hash_entry *h; 1281 Elf_Internal_Sym *sym; 1282 asection *sym_sec; 1283 bfd_vma relocation; 1284 bfd_reloc_status_type r; 1285 const char *sym_name; 1286 const char *dyn_name; 1287 char *dynh_buf = NULL; 1288 size_t dynh_buflen = 0; 1289 struct elf64_hppa_dyn_hash_entry *dyn_h = NULL; 1290 1291 r_type = ELF_R_TYPE (rel->r_info); 1292 if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED) 1293 { 1294 bfd_set_error (bfd_error_bad_value); 1295 return false; 1296 } 1297 1298 r_symndx = ELF_R_SYM (rel->r_info); 1299 1300 if (info->relocateable) 1301 { 1302 /* This is a relocateable link. We don't have to change 1303 anything, unless the reloc is against a section symbol, 1304 in which case we have to adjust according to where the 1305 section symbol winds up in the output section. */ 1306 if (r_symndx < symtab_hdr->sh_info) 1307 { 1308 sym = local_syms + r_symndx; 1309 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) 1310 { 1311 sym_sec = local_sections[r_symndx]; 1312 rel->r_addend += sym_sec->output_offset; 1313 } 1314 } 1315 1316 continue; 1317 } 1318 1319 /* This is a final link. */ 1320 h = NULL; 1321 sym = NULL; 1322 sym_sec = NULL; 1323 if (r_symndx < symtab_hdr->sh_info) 1324 { 1325 /* This is a local symbol. */ 1326 sym = local_syms + r_symndx; 1327 sym_sec = local_sections[r_symndx]; 1328 relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION 1329 ? 0 : sym->st_value) 1330 + sym_sec->output_offset 1331 + sym_sec->output_section->vma); 1332 1333 /* If this symbol has an entry in the PA64 dynamic hash 1334 table, then get it. */ 1335 dyn_name = get_dyn_name (input_section, h, rel, 1336 &dynh_buf, &dynh_buflen); 1337 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, 1338 dyn_name, false, false); 1339 1340 } 1341 else 1342 { 1343 /* This is not a local symbol. */ 1344 long indx; 1345 1346 indx = r_symndx - symtab_hdr->sh_info; 1347 h = elf_sym_hashes (input_bfd)[indx]; 1348 while (h->root.type == bfd_link_hash_indirect 1349 || h->root.type == bfd_link_hash_warning) 1350 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1351 if (h->root.type == bfd_link_hash_defined 1352 || h->root.type == bfd_link_hash_defweak) 1353 { 1354 sym_sec = h->root.u.def.section; 1355 1356 /* If this symbol has an entry in the PA64 dynamic hash 1357 table, then get it. */ 1358 dyn_name = get_dyn_name (input_section, h, rel, 1359 &dynh_buf, &dynh_buflen); 1360 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, 1361 dyn_name, false, false); 1362 1363 /* If we have a relocation against a symbol defined in a 1364 shared library and we have not created an entry in the 1365 PA64 dynamic symbol hash table for it, then we lose. */ 1366 if (sym_sec->output_section == NULL && dyn_h == NULL) 1367 { 1368 (*_bfd_error_handler) 1369 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"), 1370 bfd_get_filename (input_bfd), h->root.root.string, 1371 bfd_get_section_name (input_bfd, input_section)); 1372 relocation = 0; 1373 } 1374 else if (sym_sec->output_section) 1375 relocation = (h->root.u.def.value 1376 + sym_sec->output_offset 1377 + sym_sec->output_section->vma); 1378 /* Value will be provided via one of the offsets in the 1379 dyn_h hash table entry. */ 1380 else 1381 relocation = 0; 1382 } 1383 /* Allow undefined symbols in shared libraries. */ 1384 else if (info->shared && !info->no_undefined 1385 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 1386 { 1387 if (info->symbolic) 1388 (*info->callbacks->undefined_symbol) 1389 (info, h->root.root.string, input_bfd, 1390 input_section, rel->r_offset, false); 1391 1392 /* If this symbol has an entry in the PA64 dynamic hash 1393 table, then get it. */ 1394 dyn_name = get_dyn_name (input_section, h, rel, 1395 &dynh_buf, &dynh_buflen); 1396 dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, 1397 dyn_name, false, false); 1398 1399 if (dyn_h == NULL) 1400 { 1401 (*_bfd_error_handler) 1402 (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"), 1403 bfd_get_filename (input_bfd), h->root.root.string, 1404 bfd_get_section_name (input_bfd, input_section)); 1405 relocation = 0; 1406 } 1407 relocation = 0; 1408 } 1409 else if (h->root.type == bfd_link_hash_undefweak) 1410 relocation = 0; 1411 else 1412 { 1413 if (!((*info->callbacks->undefined_symbol) 1414 (info, h->root.root.string, input_bfd, 1415 input_section, rel->r_offset, true))) 1416 return false; 1417 break; 1418 } 1419 } 1420 1421 if (h != NULL) 1422 sym_name = h->root.root.string; 1423 else 1424 { 1425 sym_name = bfd_elf_string_from_elf_section (input_bfd, 1426 symtab_hdr->sh_link, 1427 sym->st_name); 1428 if (sym_name == NULL) 1429 return false; 1430 if (*sym_name == '\0') 1431 sym_name = bfd_section_name (input_bfd, sym_sec); 1432 } 1433 1434 r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd, 1435 input_section, contents, 1436 relocation, info, sym_sec, 1437 h, dyn_h); 1438 1439 if (r != bfd_reloc_ok) 1440 { 1441 switch (r) 1442 { 1443 default: 1444 abort (); 1445 case bfd_reloc_overflow: 1446 { 1447 if (!((*info->callbacks->reloc_overflow) 1448 (info, sym_name, howto->name, (bfd_vma) 0, 1449 input_bfd, input_section, rel->r_offset))) 1450 return false; 1451 } 1452 break; 1453 } 1454 } 1455 } 1456 return true; 1457 } 1458 1459 /* Compute the value for a relocation (REL) during a final link stage, 1460 then insert the value into the proper location in CONTENTS. 1461 1462 VALUE is a tentative value for the relocation and may be overridden 1463 and modified here based on the specific relocation to be performed. 1464 1465 For example we do conversions for PC-relative branches in this routine 1466 or redirection of calls to external routines to stubs. 1467 1468 The work of actually applying the relocation is left to a helper 1469 routine in an attempt to reduce the complexity and size of this 1470 function. */ 1471 1472 static bfd_reloc_status_type 1473 elf_hppa_final_link_relocate (rel, input_bfd, output_bfd, 1474 input_section, contents, value, 1475 info, sym_sec, h, dyn_h) 1476 Elf_Internal_Rela *rel; 1477 bfd *input_bfd; 1478 bfd *output_bfd; 1479 asection *input_section; 1480 bfd_byte *contents; 1481 bfd_vma value; 1482 struct bfd_link_info *info; 1483 asection *sym_sec; 1484 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED; 1485 struct elf64_hppa_dyn_hash_entry *dyn_h; 1486 { 1487 unsigned int insn; 1488 bfd_vma offset = rel->r_offset; 1489 bfd_vma addend = rel->r_addend; 1490 reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info); 1491 unsigned int r_type = howto->type; 1492 bfd_byte *hit_data = contents + offset; 1493 struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info); 1494 1495 insn = bfd_get_32 (input_bfd, hit_data); 1496 1497 switch (r_type) 1498 { 1499 case R_PARISC_NONE: 1500 break; 1501 1502 /* Basic function call support. I'm not entirely sure if PCREL14F is 1503 actually needed or even handled correctly. 1504 1505 Note for a call to a function defined in another dynamic library 1506 we want to redirect the call to a stub. */ 1507 1508 /* Random PC relative relocs. */ 1509 case R_PARISC_PCREL21L: 1510 case R_PARISC_PCREL14R: 1511 case R_PARISC_PCREL14F: 1512 case R_PARISC_PCREL14WR: 1513 case R_PARISC_PCREL14DR: 1514 case R_PARISC_PCREL16F: 1515 case R_PARISC_PCREL16WF: 1516 case R_PARISC_PCREL16DF: 1517 { 1518 /* If this is a call to a function defined in another dynamic 1519 library, then redirect the call to the local stub for this 1520 function. */ 1521 if (sym_sec == NULL || sym_sec->output_section == NULL) 1522 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset 1523 + hppa_info->stub_sec->output_section->vma); 1524 1525 /* Turn VALUE into a proper PC relative address. */ 1526 value -= (offset + input_section->output_offset 1527 + input_section->output_section->vma); 1528 1529 /* Adjust for any field selectors. */ 1530 if (r_type == R_PARISC_PCREL21L) 1531 value = hppa_field_adjust (value, -8 + addend, e_lsel); 1532 else if (r_type == R_PARISC_PCREL14F 1533 || r_type == R_PARISC_PCREL16F 1534 || r_type == R_PARISC_PCREL16WF 1535 || r_type == R_PARISC_PCREL16DF) 1536 value = hppa_field_adjust (value, -8 + addend, e_fsel); 1537 else 1538 value = hppa_field_adjust (value, -8 + addend, e_rsel); 1539 1540 /* Apply the relocation to the given instruction. */ 1541 insn = elf_hppa_relocate_insn (insn, value, r_type); 1542 break; 1543 } 1544 1545 case R_PARISC_PCREL12F: 1546 case R_PARISC_PCREL22F: 1547 case R_PARISC_PCREL17F: 1548 case R_PARISC_PCREL22C: 1549 case R_PARISC_PCREL17C: 1550 case R_PARISC_PCREL17R: 1551 { 1552 /* If this is a call to a function defined in another dynamic 1553 library, then redirect the call to the local stub for this 1554 function. */ 1555 if (sym_sec == NULL || sym_sec->output_section == NULL) 1556 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset 1557 + hppa_info->stub_sec->output_section->vma); 1558 1559 /* Turn VALUE into a proper PC relative address. */ 1560 value -= (offset + input_section->output_offset 1561 + input_section->output_section->vma); 1562 1563 /* Adjust for any field selectors. */ 1564 if (r_type == R_PARISC_PCREL17R) 1565 value = hppa_field_adjust (value, -8 + addend, e_rsel); 1566 else 1567 value = hppa_field_adjust (value, -8 + addend, e_fsel); 1568 1569 /* All branches are implicitly shifted by 2 places. */ 1570 value >>= 2; 1571 1572 /* Apply the relocation to the given instruction. */ 1573 insn = elf_hppa_relocate_insn (insn, value, r_type); 1574 break; 1575 } 1576 1577 /* Indirect references to data through the DLT. */ 1578 case R_PARISC_DLTIND14R: 1579 case R_PARISC_DLTIND14F: 1580 case R_PARISC_DLTIND14DR: 1581 case R_PARISC_DLTIND14WR: 1582 case R_PARISC_DLTIND21L: 1583 case R_PARISC_LTOFF_FPTR14R: 1584 case R_PARISC_LTOFF_FPTR14DR: 1585 case R_PARISC_LTOFF_FPTR14WR: 1586 case R_PARISC_LTOFF_FPTR21L: 1587 case R_PARISC_LTOFF_FPTR16F: 1588 case R_PARISC_LTOFF_FPTR16WF: 1589 case R_PARISC_LTOFF_FPTR16DF: 1590 case R_PARISC_LTOFF_TP21L: 1591 case R_PARISC_LTOFF_TP14R: 1592 case R_PARISC_LTOFF_TP14F: 1593 case R_PARISC_LTOFF_TP14WR: 1594 case R_PARISC_LTOFF_TP14DR: 1595 case R_PARISC_LTOFF_TP16F: 1596 case R_PARISC_LTOFF_TP16WF: 1597 case R_PARISC_LTOFF_TP16DF: 1598 case R_PARISC_LTOFF16F: 1599 case R_PARISC_LTOFF16WF: 1600 case R_PARISC_LTOFF16DF: 1601 { 1602 /* If this relocation was against a local symbol, then we still 1603 have not set up the DLT entry (it's not convenient to do so 1604 in the "finalize_dlt" routine because it is difficult to get 1605 to the local symbol's value). 1606 1607 So, if this is a local symbol (h == NULL), then we need to 1608 fill in its DLT entry. 1609 1610 Similarly we may still need to set up an entry in .opd for 1611 a local function which had its address taken. */ 1612 if (dyn_h->h == NULL) 1613 { 1614 bfd_put_64 (hppa_info->dlt_sec->owner, 1615 value, 1616 hppa_info->dlt_sec->contents + dyn_h->dlt_offset); 1617 1618 /* Now handle .opd creation if needed. */ 1619 if (r_type == R_PARISC_LTOFF_FPTR14R 1620 || r_type == R_PARISC_LTOFF_FPTR14DR 1621 || r_type == R_PARISC_LTOFF_FPTR14WR 1622 || r_type == R_PARISC_LTOFF_FPTR21L 1623 || r_type == R_PARISC_LTOFF_FPTR16F 1624 || r_type == R_PARISC_LTOFF_FPTR16WF 1625 || r_type == R_PARISC_LTOFF_FPTR16DF) 1626 { 1627 /* The first two words of an .opd entry are zero. */ 1628 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 1629 0, 16); 1630 1631 /* The next word is the address of the function. */ 1632 bfd_put_64 (hppa_info->opd_sec->owner, value, 1633 (hppa_info->opd_sec->contents 1634 + dyn_h->opd_offset + 16)); 1635 1636 /* The last word is our local __gp value. */ 1637 value = _bfd_get_gp_value 1638 (hppa_info->opd_sec->output_section->owner); 1639 bfd_put_64 (hppa_info->opd_sec->owner, value, 1640 (hppa_info->opd_sec->contents 1641 + dyn_h->opd_offset + 24)); 1642 } 1643 } 1644 1645 /* We want the value of the DLT offset for this symbol, not 1646 the symbol's actual address. Note that __gp may not point 1647 to the start of the DLT, so we have to compute the absolute 1648 address, then subtract out the value of __gp. */ 1649 value = (dyn_h->dlt_offset 1650 + hppa_info->dlt_sec->output_offset 1651 + hppa_info->dlt_sec->output_section->vma); 1652 value -= _bfd_get_gp_value (output_bfd); 1653 1654 /* All DLTIND relocations are basically the same at this point, 1655 except that we need different field selectors for the 21bit 1656 version vs the 14bit versions. */ 1657 if (r_type == R_PARISC_DLTIND21L 1658 || r_type == R_PARISC_LTOFF_FPTR21L 1659 || r_type == R_PARISC_LTOFF_TP21L) 1660 value = hppa_field_adjust (value, addend, e_lrsel); 1661 else if (r_type == R_PARISC_DLTIND14F 1662 || r_type == R_PARISC_LTOFF_FPTR16F 1663 || r_type == R_PARISC_LTOFF_FPTR16WF 1664 || r_type == R_PARISC_LTOFF_FPTR16DF 1665 || r_type == R_PARISC_LTOFF16F 1666 || r_type == R_PARISC_LTOFF16DF 1667 || r_type == R_PARISC_LTOFF16WF 1668 || r_type == R_PARISC_LTOFF_TP16F 1669 || r_type == R_PARISC_LTOFF_TP16WF 1670 || r_type == R_PARISC_LTOFF_TP16DF) 1671 value = hppa_field_adjust (value, addend, e_fsel); 1672 else 1673 value = hppa_field_adjust (value, addend, e_rrsel); 1674 1675 insn = elf_hppa_relocate_insn (insn, value, r_type); 1676 break; 1677 } 1678 1679 case R_PARISC_DLTREL14R: 1680 case R_PARISC_DLTREL14F: 1681 case R_PARISC_DLTREL14DR: 1682 case R_PARISC_DLTREL14WR: 1683 case R_PARISC_DLTREL21L: 1684 case R_PARISC_DPREL21L: 1685 case R_PARISC_DPREL14WR: 1686 case R_PARISC_DPREL14DR: 1687 case R_PARISC_DPREL14R: 1688 case R_PARISC_DPREL14F: 1689 case R_PARISC_GPREL16F: 1690 case R_PARISC_GPREL16WF: 1691 case R_PARISC_GPREL16DF: 1692 { 1693 /* Subtract out the global pointer value to make value a DLT 1694 relative address. */ 1695 value -= _bfd_get_gp_value (output_bfd); 1696 1697 /* All DLTREL relocations are basically the same at this point, 1698 except that we need different field selectors for the 21bit 1699 version vs the 14bit versions. */ 1700 if (r_type == R_PARISC_DLTREL21L 1701 || r_type == R_PARISC_DPREL21L) 1702 value = hppa_field_adjust (value, addend, e_lrsel); 1703 else if (r_type == R_PARISC_DLTREL14F 1704 || r_type == R_PARISC_DPREL14F 1705 || r_type == R_PARISC_GPREL16F 1706 || r_type == R_PARISC_GPREL16WF 1707 || r_type == R_PARISC_GPREL16DF) 1708 value = hppa_field_adjust (value, addend, e_fsel); 1709 else 1710 value = hppa_field_adjust (value, addend, e_rrsel); 1711 1712 insn = elf_hppa_relocate_insn (insn, value, r_type); 1713 break; 1714 } 1715 1716 case R_PARISC_DIR21L: 1717 case R_PARISC_DIR17R: 1718 case R_PARISC_DIR17F: 1719 case R_PARISC_DIR14R: 1720 case R_PARISC_DIR14F: 1721 case R_PARISC_DIR14WR: 1722 case R_PARISC_DIR14DR: 1723 case R_PARISC_DIR16F: 1724 case R_PARISC_DIR16WF: 1725 case R_PARISC_DIR16DF: 1726 { 1727 /* All DIR relocations are basically the same at this point, 1728 except that branch offsets need to be divided by four, and 1729 we need different field selectors. Note that we don't 1730 redirect absolute calls to local stubs. */ 1731 1732 if (r_type == R_PARISC_DIR21L) 1733 value = hppa_field_adjust (value, addend, e_lrsel); 1734 else if (r_type == R_PARISC_DIR17F 1735 || r_type == R_PARISC_DIR16F 1736 || r_type == R_PARISC_DIR16WF 1737 || r_type == R_PARISC_DIR16DF 1738 || r_type == R_PARISC_DIR14F) 1739 value = hppa_field_adjust (value, addend, e_fsel); 1740 else 1741 value = hppa_field_adjust (value, addend, e_rrsel); 1742 1743 if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F) 1744 { 1745 /* All branches are implicitly shifted by 2 places. */ 1746 value >>= 2; 1747 } 1748 1749 insn = elf_hppa_relocate_insn (insn, value, r_type); 1750 break; 1751 } 1752 1753 case R_PARISC_PLTOFF21L: 1754 case R_PARISC_PLTOFF14R: 1755 case R_PARISC_PLTOFF14F: 1756 case R_PARISC_PLTOFF14WR: 1757 case R_PARISC_PLTOFF14DR: 1758 case R_PARISC_PLTOFF16F: 1759 case R_PARISC_PLTOFF16WF: 1760 case R_PARISC_PLTOFF16DF: 1761 { 1762 /* We want the value of the PLT offset for this symbol, not 1763 the symbol's actual address. Note that __gp may not point 1764 to the start of the DLT, so we have to compute the absolute 1765 address, then subtract out the value of __gp. */ 1766 value = (dyn_h->plt_offset 1767 + hppa_info->plt_sec->output_offset 1768 + hppa_info->plt_sec->output_section->vma); 1769 value -= _bfd_get_gp_value (output_bfd); 1770 1771 /* All PLTOFF relocations are basically the same at this point, 1772 except that we need different field selectors for the 21bit 1773 version vs the 14bit versions. */ 1774 if (r_type == R_PARISC_PLTOFF21L) 1775 value = hppa_field_adjust (value, addend, e_lrsel); 1776 else if (r_type == R_PARISC_PLTOFF14F 1777 || r_type == R_PARISC_PLTOFF16F 1778 || r_type == R_PARISC_PLTOFF16WF 1779 || r_type == R_PARISC_PLTOFF16DF) 1780 value = hppa_field_adjust (value, addend, e_fsel); 1781 else 1782 value = hppa_field_adjust (value, addend, e_rrsel); 1783 1784 insn = elf_hppa_relocate_insn (insn, value, r_type); 1785 break; 1786 } 1787 1788 case R_PARISC_LTOFF_FPTR32: 1789 { 1790 /* We may still need to create the FPTR itself if it was for 1791 a local symbol. */ 1792 if (dyn_h->h == NULL) 1793 { 1794 /* The first two words of an .opd entry are zero. */ 1795 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16); 1796 1797 /* The next word is the address of the function. */ 1798 bfd_put_64 (hppa_info->opd_sec->owner, value, 1799 (hppa_info->opd_sec->contents 1800 + dyn_h->opd_offset + 16)); 1801 1802 /* The last word is our local __gp value. */ 1803 value = _bfd_get_gp_value 1804 (hppa_info->opd_sec->output_section->owner); 1805 bfd_put_64 (hppa_info->opd_sec->owner, value, 1806 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24); 1807 } 1808 1809 /* We want the value of the DLT offset for this symbol, not 1810 the symbol's actual address. Note that __gp may not point 1811 to the start of the DLT, so we have to compute the absolute 1812 address, then subtract out the value of __gp. */ 1813 value = (dyn_h->dlt_offset 1814 + hppa_info->dlt_sec->output_offset 1815 + hppa_info->dlt_sec->output_section->vma); 1816 value -= _bfd_get_gp_value (output_bfd); 1817 bfd_put_32 (input_bfd, value, hit_data); 1818 return bfd_reloc_ok; 1819 } 1820 1821 case R_PARISC_LTOFF_FPTR64: 1822 case R_PARISC_LTOFF_TP64: 1823 { 1824 /* We may still need to create the FPTR itself if it was for 1825 a local symbol. */ 1826 if (dyn_h->h == NULL && r_type == R_PARISC_LTOFF_FPTR64) 1827 { 1828 /* The first two words of an .opd entry are zero. */ 1829 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16); 1830 1831 /* The next word is the address of the function. */ 1832 bfd_put_64 (hppa_info->opd_sec->owner, value, 1833 (hppa_info->opd_sec->contents 1834 + dyn_h->opd_offset + 16)); 1835 1836 /* The last word is our local __gp value. */ 1837 value = _bfd_get_gp_value 1838 (hppa_info->opd_sec->output_section->owner); 1839 bfd_put_64 (hppa_info->opd_sec->owner, value, 1840 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24); 1841 } 1842 1843 /* We want the value of the DLT offset for this symbol, not 1844 the symbol's actual address. Note that __gp may not point 1845 to the start of the DLT, so we have to compute the absolute 1846 address, then subtract out the value of __gp. */ 1847 value = (dyn_h->dlt_offset 1848 + hppa_info->dlt_sec->output_offset 1849 + hppa_info->dlt_sec->output_section->vma); 1850 value -= _bfd_get_gp_value (output_bfd); 1851 bfd_put_64 (input_bfd, value, hit_data); 1852 return bfd_reloc_ok; 1853 } 1854 1855 case R_PARISC_DIR32: 1856 bfd_put_32 (input_bfd, value + addend, hit_data); 1857 return bfd_reloc_ok; 1858 1859 case R_PARISC_DIR64: 1860 bfd_put_64 (input_bfd, value + addend, hit_data); 1861 return bfd_reloc_ok; 1862 1863 case R_PARISC_GPREL64: 1864 /* Subtract out the global pointer value to make value a DLT 1865 relative address. */ 1866 value -= _bfd_get_gp_value (output_bfd); 1867 1868 bfd_put_64 (input_bfd, value + addend, hit_data); 1869 return bfd_reloc_ok; 1870 1871 case R_PARISC_LTOFF64: 1872 /* We want the value of the DLT offset for this symbol, not 1873 the symbol's actual address. Note that __gp may not point 1874 to the start of the DLT, so we have to compute the absolute 1875 address, then subtract out the value of __gp. */ 1876 value = (dyn_h->dlt_offset 1877 + hppa_info->dlt_sec->output_offset 1878 + hppa_info->dlt_sec->output_section->vma); 1879 value -= _bfd_get_gp_value (output_bfd); 1880 1881 bfd_put_64 (input_bfd, value + addend, hit_data); 1882 return bfd_reloc_ok; 1883 1884 case R_PARISC_PCREL32: 1885 { 1886 /* If this is a call to a function defined in another dynamic 1887 library, then redirect the call to the local stub for this 1888 function. */ 1889 if (sym_sec == NULL || sym_sec->output_section == NULL) 1890 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset 1891 + hppa_info->stub_sec->output_section->vma); 1892 1893 /* Turn VALUE into a proper PC relative address. */ 1894 value -= (offset + input_section->output_offset 1895 + input_section->output_section->vma); 1896 1897 value += addend; 1898 value -= 8; 1899 bfd_put_32 (input_bfd, value, hit_data); 1900 return bfd_reloc_ok; 1901 } 1902 1903 case R_PARISC_PCREL64: 1904 { 1905 /* If this is a call to a function defined in another dynamic 1906 library, then redirect the call to the local stub for this 1907 function. */ 1908 if (sym_sec == NULL || sym_sec->output_section == NULL) 1909 value = (dyn_h->stub_offset + hppa_info->stub_sec->output_offset 1910 + hppa_info->stub_sec->output_section->vma); 1911 1912 /* Turn VALUE into a proper PC relative address. */ 1913 value -= (offset + input_section->output_offset 1914 + input_section->output_section->vma); 1915 1916 value += addend; 1917 value -= 8; 1918 bfd_put_64 (input_bfd, value, hit_data); 1919 return bfd_reloc_ok; 1920 } 1921 1922 case R_PARISC_FPTR64: 1923 { 1924 /* We may still need to create the FPTR itself if it was for 1925 a local symbol. */ 1926 if (dyn_h->h == NULL) 1927 { 1928 /* The first two words of an .opd entry are zero. */ 1929 memset (hppa_info->opd_sec->contents + dyn_h->opd_offset, 0, 16); 1930 1931 /* The next word is the address of the function. */ 1932 bfd_put_64 (hppa_info->opd_sec->owner, value, 1933 (hppa_info->opd_sec->contents 1934 + dyn_h->opd_offset + 16)); 1935 1936 /* The last word is our local __gp value. */ 1937 value = _bfd_get_gp_value 1938 (hppa_info->opd_sec->output_section->owner); 1939 bfd_put_64 (hppa_info->opd_sec->owner, value, 1940 hppa_info->opd_sec->contents + dyn_h->opd_offset + 24); 1941 } 1942 1943 /* We want the value of the OPD offset for this symbol, not 1944 the symbol's actual address. */ 1945 value = (dyn_h->opd_offset 1946 + hppa_info->opd_sec->output_offset 1947 + hppa_info->opd_sec->output_section->vma); 1948 1949 bfd_put_64 (input_bfd, value + addend, hit_data); 1950 return bfd_reloc_ok; 1951 } 1952 1953 case R_PARISC_SECREL32: 1954 bfd_put_32 (input_bfd, 1955 value + addend - sym_sec->output_section->vma, 1956 hit_data); 1957 return bfd_reloc_ok; 1958 1959 case R_PARISC_SEGREL32: 1960 case R_PARISC_SEGREL64: 1961 { 1962 /* If this is the first SEGREL relocation, then initialize 1963 the segment base values. */ 1964 if (hppa_info->text_segment_base == (bfd_vma) -1) 1965 bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs, 1966 hppa_info); 1967 1968 /* VALUE holds the absolute address. We want to include the 1969 addend, then turn it into a segment relative address. 1970 1971 The segment is derived from SYM_SEC. We assume that there are 1972 only two segments of note in the resulting executable/shlib. 1973 A readonly segment (.text) and a readwrite segment (.data). */ 1974 value += addend; 1975 1976 if (sym_sec->flags & SEC_CODE) 1977 value -= hppa_info->text_segment_base; 1978 else 1979 value -= hppa_info->data_segment_base; 1980 1981 if (r_type == R_PARISC_SEGREL32) 1982 bfd_put_32 (input_bfd, value, hit_data); 1983 else 1984 bfd_put_64 (input_bfd, value, hit_data); 1985 return bfd_reloc_ok; 1986 } 1987 1988 /* Something we don't know how to handle. */ 1989 default: 1990 return bfd_reloc_notsupported; 1991 } 1992 1993 /* Update the instruction word. */ 1994 bfd_put_32 (input_bfd, insn, hit_data); 1995 return bfd_reloc_ok; 1996 } 1997 1998 /* Relocate the given INSN. VALUE should be the actual value we want 1999 to insert into the instruction, ie by this point we should not be 2000 concerned with computing an offset relative to the DLT, PC, etc. 2001 Instead this routine is meant to handle the bit manipulations needed 2002 to insert the relocation into the given instruction. */ 2003 2004 static unsigned int 2005 elf_hppa_relocate_insn (insn, sym_value, r_type) 2006 unsigned int insn; 2007 unsigned int sym_value; 2008 unsigned int r_type; 2009 { 2010 switch (r_type) 2011 { 2012 /* This is any 22 bit branch. In PA2.0 syntax it corresponds to 2013 the "B" instruction. */ 2014 case R_PARISC_PCREL22F: 2015 case R_PARISC_PCREL22C: 2016 return (insn & ~ 0x3ff1ffd) | re_assemble_22 (sym_value); 2017 2018 /* This is any 12 bit branch. */ 2019 case R_PARISC_PCREL12F: 2020 return (insn & ~ 0x1ffd) | re_assemble_12 (sym_value); 2021 2022 /* This is any 17 bit branch. In PA2.0 syntax it also corresponds 2023 to the "B" instruction as well as BE. */ 2024 case R_PARISC_PCREL17F: 2025 case R_PARISC_DIR17F: 2026 case R_PARISC_DIR17R: 2027 case R_PARISC_PCREL17C: 2028 case R_PARISC_PCREL17R: 2029 return (insn & ~ 0x1f1ffd) | re_assemble_17 (sym_value); 2030 2031 /* ADDIL or LDIL instructions. */ 2032 case R_PARISC_DLTREL21L: 2033 case R_PARISC_DLTIND21L: 2034 case R_PARISC_LTOFF_FPTR21L: 2035 case R_PARISC_PCREL21L: 2036 case R_PARISC_LTOFF_TP21L: 2037 case R_PARISC_DPREL21L: 2038 case R_PARISC_PLTOFF21L: 2039 case R_PARISC_DIR21L: 2040 return (insn & ~ 0x1fffff) | re_assemble_21 (sym_value); 2041 2042 /* LDO and integer loads/stores with 14 bit displacements. */ 2043 case R_PARISC_DLTREL14R: 2044 case R_PARISC_DLTREL14F: 2045 case R_PARISC_DLTIND14R: 2046 case R_PARISC_DLTIND14F: 2047 case R_PARISC_LTOFF_FPTR14R: 2048 case R_PARISC_LTOFF_FPTR16F: 2049 case R_PARISC_PCREL14R: 2050 case R_PARISC_PCREL14F: 2051 case R_PARISC_PCREL16F: 2052 case R_PARISC_LTOFF_TP14R: 2053 case R_PARISC_LTOFF_TP14F: 2054 case R_PARISC_LTOFF_TP16F: 2055 case R_PARISC_DPREL14R: 2056 case R_PARISC_DPREL14F: 2057 case R_PARISC_GPREL16F: 2058 case R_PARISC_PLTOFF14R: 2059 case R_PARISC_PLTOFF14F: 2060 case R_PARISC_PLTOFF16F: 2061 case R_PARISC_DIR14R: 2062 case R_PARISC_DIR14F: 2063 case R_PARISC_DIR16F: 2064 case R_PARISC_LTOFF16F: 2065 return (insn & ~ 0x3fff) | low_sign_unext (sym_value, 14); 2066 2067 /* Doubleword loads and stores with a 14 bit displacement. */ 2068 case R_PARISC_DLTREL14DR: 2069 case R_PARISC_DLTIND14DR: 2070 case R_PARISC_LTOFF_FPTR14DR: 2071 case R_PARISC_LTOFF_FPTR16DF: 2072 case R_PARISC_PCREL14DR: 2073 case R_PARISC_PCREL16DF: 2074 case R_PARISC_LTOFF_TP14DR: 2075 case R_PARISC_LTOFF_TP16DF: 2076 case R_PARISC_DPREL14DR: 2077 case R_PARISC_GPREL16DF: 2078 case R_PARISC_PLTOFF14DR: 2079 case R_PARISC_PLTOFF16DF: 2080 case R_PARISC_DIR14DR: 2081 case R_PARISC_DIR16DF: 2082 case R_PARISC_LTOFF16DF: 2083 return (insn & ~ 0x3ff1) | (((sym_value & 0x2000) >> 13) 2084 | ((sym_value & 0x1ff8) << 1)); 2085 2086 /* Floating point single word load/store instructions. */ 2087 case R_PARISC_DLTREL14WR: 2088 case R_PARISC_DLTIND14WR: 2089 case R_PARISC_LTOFF_FPTR14WR: 2090 case R_PARISC_LTOFF_FPTR16WF: 2091 case R_PARISC_PCREL14WR: 2092 case R_PARISC_PCREL16WF: 2093 case R_PARISC_LTOFF_TP14WR: 2094 case R_PARISC_LTOFF_TP16WF: 2095 case R_PARISC_DPREL14WR: 2096 case R_PARISC_GPREL16WF: 2097 case R_PARISC_PLTOFF14WR: 2098 case R_PARISC_PLTOFF16WF: 2099 case R_PARISC_DIR16WF: 2100 case R_PARISC_DIR14WR: 2101 case R_PARISC_LTOFF16WF: 2102 return (insn & ~ 0x3ff9) | (((sym_value & 0x2000) >> 13) 2103 | ((sym_value & 0x1ffc) << 1)); 2104 2105 default: 2106 return insn; 2107 } 2108 } 2109 #endif 2110