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