1 /* MIPS-specific support for 64-bit ELF 2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 3 Free Software Foundation, Inc. 4 Ian Lance Taylor, Cygnus Support 5 Linker support added by Mark Mitchell, CodeSourcery, LLC. 6 <mark@codesourcery.com> 7 8 This file is part of BFD, the Binary File Descriptor library. 9 10 This program is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2 of the License, or 13 (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the Free Software 22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 23 24 /* This file supports the 64-bit MIPS ELF ABI. 25 26 The MIPS 64-bit ELF ABI uses an unusual reloc format. This file 27 overrides the usual ELF reloc handling, and handles reading and 28 writing the relocations here. */ 29 30 /* TODO: Many things are unsupported, even if there is some code for it 31 . (which was mostly stolen from elf32-mips.c and slightly adapted). 32 . 33 . - Relocation handling for REL relocs is wrong in many cases and 34 . generally untested. 35 . - Relocation handling for RELA relocs related to GOT support are 36 . also likely to be wrong. 37 . - Support for MIPS16 is untested. 38 . - Combined relocs with RSS_* entries are unsupported. 39 . - The whole GOT handling for NewABI is missing, some parts of 40 . the OldABI version is still lying around and should be removed. 41 */ 42 43 #include "bfd.h" 44 #include "sysdep.h" 45 #include "libbfd.h" 46 #include "aout/ar.h" 47 #include "bfdlink.h" 48 #include "genlink.h" 49 #include "elf-bfd.h" 50 #include "elfxx-mips.h" 51 #include "elf/mips.h" 52 53 /* Get the ECOFF swapping routines. The 64-bit ABI is not supposed to 54 use ECOFF. However, we support it anyhow for an easier changeover. */ 55 #include "coff/sym.h" 56 #include "coff/symconst.h" 57 #include "coff/internal.h" 58 #include "coff/ecoff.h" 59 /* The 64 bit versions of the mdebug data structures are in alpha.h. */ 60 #include "coff/alpha.h" 61 #define ECOFF_SIGNED_64 62 #include "ecoffswap.h" 63 64 static void mips_elf64_swap_reloc_in 65 (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *); 66 static void mips_elf64_swap_reloca_in 67 (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *); 68 static void mips_elf64_swap_reloc_out 69 (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *); 70 static void mips_elf64_swap_reloca_out 71 (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *); 72 static void mips_elf64_be_swap_reloc_in 73 (bfd *, const bfd_byte *, Elf_Internal_Rela *); 74 static void mips_elf64_be_swap_reloc_out 75 (bfd *, const Elf_Internal_Rela *, bfd_byte *); 76 static void mips_elf64_be_swap_reloca_in 77 (bfd *, const bfd_byte *, Elf_Internal_Rela *); 78 static void mips_elf64_be_swap_reloca_out 79 (bfd *, const Elf_Internal_Rela *, bfd_byte *); 80 static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup 81 (bfd *, bfd_reloc_code_real_type); 82 static reloc_howto_type *mips_elf64_rtype_to_howto 83 (unsigned int, bfd_boolean); 84 static void mips_elf64_info_to_howto_rel 85 (bfd *, arelent *, Elf_Internal_Rela *); 86 static void mips_elf64_info_to_howto_rela 87 (bfd *, arelent *, Elf_Internal_Rela *); 88 static long mips_elf64_get_reloc_upper_bound 89 (bfd *, asection *); 90 static long mips_elf64_canonicalize_reloc 91 (bfd *, asection *, arelent **, asymbol **); 92 static long mips_elf64_get_dynamic_reloc_upper_bound 93 (bfd *); 94 static long mips_elf64_canonicalize_dynamic_reloc 95 (bfd *, arelent **, asymbol **); 96 static bfd_boolean mips_elf64_slurp_one_reloc_table 97 (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *, 98 asymbol **, bfd_boolean); 99 static bfd_boolean mips_elf64_slurp_reloc_table 100 (bfd *, asection *, asymbol **, bfd_boolean); 101 static void mips_elf64_write_relocs 102 (bfd *, asection *, void *); 103 static void mips_elf64_write_rel 104 (bfd *, asection *, Elf_Internal_Shdr *, int *, void *); 105 static void mips_elf64_write_rela 106 (bfd *, asection *, Elf_Internal_Shdr *, int *, void *); 107 static bfd_reloc_status_type mips_elf64_gprel16_reloc 108 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 109 static bfd_reloc_status_type mips_elf64_literal_reloc 110 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 111 static bfd_reloc_status_type mips_elf64_gprel32_reloc 112 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 113 static bfd_reloc_status_type mips_elf64_shift6_reloc 114 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 115 static bfd_reloc_status_type mips16_jump_reloc 116 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 117 static bfd_reloc_status_type mips16_gprel_reloc 118 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 119 static bfd_boolean mips_elf64_assign_gp 120 (bfd *, bfd_vma *); 121 static bfd_reloc_status_type mips_elf64_final_gp 122 (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *); 123 static bfd_boolean mips_elf64_object_p 124 (bfd *); 125 static irix_compat_t elf64_mips_irix_compat 126 (bfd *); 127 static bfd_boolean elf64_mips_grok_prstatus 128 (bfd *, Elf_Internal_Note *); 129 static bfd_boolean elf64_mips_grok_psinfo 130 (bfd *, Elf_Internal_Note *); 131 132 extern const bfd_target bfd_elf64_bigmips_vec; 133 extern const bfd_target bfd_elf64_littlemips_vec; 134 135 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value 136 from smaller values. Start with zero, widen, *then* decrement. */ 137 #define MINUS_ONE (((bfd_vma)0) - 1) 138 139 /* The number of local .got entries we reserve. */ 140 #define MIPS_RESERVED_GOTNO (2) 141 142 /* The relocation table used for SHT_REL sections. */ 143 144 static reloc_howto_type mips_elf64_howto_table_rel[] = 145 { 146 /* No relocation. */ 147 HOWTO (R_MIPS_NONE, /* type */ 148 0, /* rightshift */ 149 0, /* size (0 = byte, 1 = short, 2 = long) */ 150 0, /* bitsize */ 151 FALSE, /* pc_relative */ 152 0, /* bitpos */ 153 complain_overflow_dont, /* complain_on_overflow */ 154 _bfd_mips_elf_generic_reloc, /* special_function */ 155 "R_MIPS_NONE", /* name */ 156 FALSE, /* partial_inplace */ 157 0, /* src_mask */ 158 0, /* dst_mask */ 159 FALSE), /* pcrel_offset */ 160 161 /* 16 bit relocation. */ 162 HOWTO (R_MIPS_16, /* type */ 163 0, /* rightshift */ 164 2, /* size (0 = byte, 1 = short, 2 = long) */ 165 16, /* bitsize */ 166 FALSE, /* pc_relative */ 167 0, /* bitpos */ 168 complain_overflow_signed, /* complain_on_overflow */ 169 _bfd_mips_elf_generic_reloc, /* special_function */ 170 "R_MIPS_16", /* name */ 171 TRUE, /* partial_inplace */ 172 0x0000ffff, /* src_mask */ 173 0x0000ffff, /* dst_mask */ 174 FALSE), /* pcrel_offset */ 175 176 /* 32 bit relocation. */ 177 HOWTO (R_MIPS_32, /* type */ 178 0, /* rightshift */ 179 2, /* size (0 = byte, 1 = short, 2 = long) */ 180 32, /* bitsize */ 181 FALSE, /* pc_relative */ 182 0, /* bitpos */ 183 complain_overflow_dont, /* complain_on_overflow */ 184 _bfd_mips_elf_generic_reloc, /* special_function */ 185 "R_MIPS_32", /* name */ 186 TRUE, /* partial_inplace */ 187 0xffffffff, /* src_mask */ 188 0xffffffff, /* dst_mask */ 189 FALSE), /* pcrel_offset */ 190 191 /* 32 bit symbol relative relocation. */ 192 HOWTO (R_MIPS_REL32, /* type */ 193 0, /* rightshift */ 194 2, /* size (0 = byte, 1 = short, 2 = long) */ 195 32, /* bitsize */ 196 FALSE, /* pc_relative */ 197 0, /* bitpos */ 198 complain_overflow_dont, /* complain_on_overflow */ 199 _bfd_mips_elf_generic_reloc, /* special_function */ 200 "R_MIPS_REL32", /* name */ 201 TRUE, /* partial_inplace */ 202 0xffffffff, /* src_mask */ 203 0xffffffff, /* dst_mask */ 204 FALSE), /* pcrel_offset */ 205 206 /* 26 bit jump address. */ 207 HOWTO (R_MIPS_26, /* type */ 208 2, /* rightshift */ 209 2, /* size (0 = byte, 1 = short, 2 = long) */ 210 26, /* bitsize */ 211 FALSE, /* pc_relative */ 212 0, /* bitpos */ 213 complain_overflow_dont, /* complain_on_overflow */ 214 /* This needs complex overflow 215 detection, because the upper 36 216 bits must match the PC + 4. */ 217 _bfd_mips_elf_generic_reloc, /* special_function */ 218 "R_MIPS_26", /* name */ 219 TRUE, /* partial_inplace */ 220 0x03ffffff, /* src_mask */ 221 0x03ffffff, /* dst_mask */ 222 FALSE), /* pcrel_offset */ 223 224 /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL. 225 However, the native IRIX6 tools use them, so we try our best. */ 226 227 /* High 16 bits of symbol value. */ 228 HOWTO (R_MIPS_HI16, /* type */ 229 16, /* rightshift */ 230 2, /* size (0 = byte, 1 = short, 2 = long) */ 231 16, /* bitsize */ 232 FALSE, /* pc_relative */ 233 0, /* bitpos */ 234 complain_overflow_dont, /* complain_on_overflow */ 235 _bfd_mips_elf_hi16_reloc, /* special_function */ 236 "R_MIPS_HI16", /* name */ 237 TRUE, /* partial_inplace */ 238 0x0000ffff, /* src_mask */ 239 0x0000ffff, /* dst_mask */ 240 FALSE), /* pcrel_offset */ 241 242 /* Low 16 bits of symbol value. */ 243 HOWTO (R_MIPS_LO16, /* type */ 244 0, /* rightshift */ 245 2, /* size (0 = byte, 1 = short, 2 = long) */ 246 16, /* bitsize */ 247 FALSE, /* pc_relative */ 248 0, /* bitpos */ 249 complain_overflow_dont, /* complain_on_overflow */ 250 _bfd_mips_elf_lo16_reloc, /* special_function */ 251 "R_MIPS_LO16", /* name */ 252 TRUE, /* partial_inplace */ 253 0x0000ffff, /* src_mask */ 254 0x0000ffff, /* dst_mask */ 255 FALSE), /* pcrel_offset */ 256 257 /* GP relative reference. */ 258 HOWTO (R_MIPS_GPREL16, /* type */ 259 0, /* rightshift */ 260 2, /* size (0 = byte, 1 = short, 2 = long) */ 261 16, /* bitsize */ 262 FALSE, /* pc_relative */ 263 0, /* bitpos */ 264 complain_overflow_signed, /* complain_on_overflow */ 265 mips_elf64_gprel16_reloc, /* special_function */ 266 "R_MIPS_GPREL16", /* name */ 267 TRUE, /* partial_inplace */ 268 0x0000ffff, /* src_mask */ 269 0x0000ffff, /* dst_mask */ 270 FALSE), /* pcrel_offset */ 271 272 /* Reference to literal section. */ 273 HOWTO (R_MIPS_LITERAL, /* type */ 274 0, /* rightshift */ 275 2, /* size (0 = byte, 1 = short, 2 = long) */ 276 16, /* bitsize */ 277 FALSE, /* pc_relative */ 278 0, /* bitpos */ 279 complain_overflow_signed, /* complain_on_overflow */ 280 mips_elf64_literal_reloc, /* special_function */ 281 "R_MIPS_LITERAL", /* name */ 282 TRUE, /* partial_inplace */ 283 0x0000ffff, /* src_mask */ 284 0x0000ffff, /* dst_mask */ 285 FALSE), /* pcrel_offset */ 286 287 /* Reference to global offset table. */ 288 HOWTO (R_MIPS_GOT16, /* type */ 289 0, /* rightshift */ 290 2, /* size (0 = byte, 1 = short, 2 = long) */ 291 16, /* bitsize */ 292 FALSE, /* pc_relative */ 293 0, /* bitpos */ 294 complain_overflow_signed, /* complain_on_overflow */ 295 _bfd_mips_elf_got16_reloc, /* special_function */ 296 "R_MIPS_GOT16", /* name */ 297 TRUE, /* partial_inplace */ 298 0x0000ffff, /* src_mask */ 299 0x0000ffff, /* dst_mask */ 300 FALSE), /* pcrel_offset */ 301 302 /* 16 bit PC relative reference. Note that the ABI document has a typo 303 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless. 304 We do the right thing here. */ 305 HOWTO (R_MIPS_PC16, /* type */ 306 2, /* rightshift */ 307 2, /* size (0 = byte, 1 = short, 2 = long) */ 308 16, /* bitsize */ 309 TRUE, /* pc_relative */ 310 0, /* bitpos */ 311 complain_overflow_signed, /* complain_on_overflow */ 312 _bfd_mips_elf_generic_reloc, /* special_function */ 313 "R_MIPS_PC16", /* name */ 314 TRUE, /* partial_inplace */ 315 0x0000ffff, /* src_mask */ 316 0x0000ffff, /* dst_mask */ 317 TRUE), /* pcrel_offset */ 318 319 /* 16 bit call through global offset table. */ 320 HOWTO (R_MIPS_CALL16, /* type */ 321 0, /* rightshift */ 322 2, /* size (0 = byte, 1 = short, 2 = long) */ 323 16, /* bitsize */ 324 FALSE, /* pc_relative */ 325 0, /* bitpos */ 326 complain_overflow_signed, /* complain_on_overflow */ 327 _bfd_mips_elf_generic_reloc, /* special_function */ 328 "R_MIPS_CALL16", /* name */ 329 TRUE, /* partial_inplace */ 330 0x0000ffff, /* src_mask */ 331 0x0000ffff, /* dst_mask */ 332 FALSE), /* pcrel_offset */ 333 334 /* 32 bit GP relative reference. */ 335 HOWTO (R_MIPS_GPREL32, /* type */ 336 0, /* rightshift */ 337 2, /* size (0 = byte, 1 = short, 2 = long) */ 338 32, /* bitsize */ 339 FALSE, /* pc_relative */ 340 0, /* bitpos */ 341 complain_overflow_dont, /* complain_on_overflow */ 342 mips_elf64_gprel32_reloc, /* special_function */ 343 "R_MIPS_GPREL32", /* name */ 344 TRUE, /* partial_inplace */ 345 0xffffffff, /* src_mask */ 346 0xffffffff, /* dst_mask */ 347 FALSE), /* pcrel_offset */ 348 349 EMPTY_HOWTO (13), 350 EMPTY_HOWTO (14), 351 EMPTY_HOWTO (15), 352 353 /* A 5 bit shift field. */ 354 HOWTO (R_MIPS_SHIFT5, /* type */ 355 0, /* rightshift */ 356 2, /* size (0 = byte, 1 = short, 2 = long) */ 357 5, /* bitsize */ 358 FALSE, /* pc_relative */ 359 6, /* bitpos */ 360 complain_overflow_bitfield, /* complain_on_overflow */ 361 _bfd_mips_elf_generic_reloc, /* special_function */ 362 "R_MIPS_SHIFT5", /* name */ 363 TRUE, /* partial_inplace */ 364 0x000007c0, /* src_mask */ 365 0x000007c0, /* dst_mask */ 366 FALSE), /* pcrel_offset */ 367 368 /* A 6 bit shift field. */ 369 HOWTO (R_MIPS_SHIFT6, /* type */ 370 0, /* rightshift */ 371 2, /* size (0 = byte, 1 = short, 2 = long) */ 372 6, /* bitsize */ 373 FALSE, /* pc_relative */ 374 6, /* bitpos */ 375 complain_overflow_bitfield, /* complain_on_overflow */ 376 mips_elf64_shift6_reloc, /* special_function */ 377 "R_MIPS_SHIFT6", /* name */ 378 TRUE, /* partial_inplace */ 379 0x000007c4, /* src_mask */ 380 0x000007c4, /* dst_mask */ 381 FALSE), /* pcrel_offset */ 382 383 /* 64 bit relocation. */ 384 HOWTO (R_MIPS_64, /* type */ 385 0, /* rightshift */ 386 4, /* size (0 = byte, 1 = short, 2 = long) */ 387 64, /* bitsize */ 388 FALSE, /* pc_relative */ 389 0, /* bitpos */ 390 complain_overflow_dont, /* complain_on_overflow */ 391 _bfd_mips_elf_generic_reloc, /* special_function */ 392 "R_MIPS_64", /* name */ 393 TRUE, /* partial_inplace */ 394 MINUS_ONE, /* src_mask */ 395 MINUS_ONE, /* dst_mask */ 396 FALSE), /* pcrel_offset */ 397 398 /* Displacement in the global offset table. */ 399 HOWTO (R_MIPS_GOT_DISP, /* type */ 400 0, /* rightshift */ 401 2, /* size (0 = byte, 1 = short, 2 = long) */ 402 16, /* bitsize */ 403 FALSE, /* pc_relative */ 404 0, /* bitpos */ 405 complain_overflow_signed, /* complain_on_overflow */ 406 _bfd_mips_elf_generic_reloc, /* special_function */ 407 "R_MIPS_GOT_DISP", /* name */ 408 TRUE, /* partial_inplace */ 409 0x0000ffff, /* src_mask */ 410 0x0000ffff, /* dst_mask */ 411 FALSE), /* pcrel_offset */ 412 413 /* Displacement to page pointer in the global offset table. */ 414 HOWTO (R_MIPS_GOT_PAGE, /* type */ 415 0, /* rightshift */ 416 2, /* size (0 = byte, 1 = short, 2 = long) */ 417 16, /* bitsize */ 418 FALSE, /* pc_relative */ 419 0, /* bitpos */ 420 complain_overflow_signed, /* complain_on_overflow */ 421 _bfd_mips_elf_generic_reloc, /* special_function */ 422 "R_MIPS_GOT_PAGE", /* name */ 423 TRUE, /* partial_inplace */ 424 0x0000ffff, /* src_mask */ 425 0x0000ffff, /* dst_mask */ 426 FALSE), /* pcrel_offset */ 427 428 /* Offset from page pointer in the global offset table. */ 429 HOWTO (R_MIPS_GOT_OFST, /* type */ 430 0, /* rightshift */ 431 2, /* size (0 = byte, 1 = short, 2 = long) */ 432 16, /* bitsize */ 433 FALSE, /* pc_relative */ 434 0, /* bitpos */ 435 complain_overflow_signed, /* complain_on_overflow */ 436 _bfd_mips_elf_generic_reloc, /* special_function */ 437 "R_MIPS_GOT_OFST", /* name */ 438 TRUE, /* partial_inplace */ 439 0x0000ffff, /* src_mask */ 440 0x0000ffff, /* dst_mask */ 441 FALSE), /* pcrel_offset */ 442 443 /* High 16 bits of displacement in global offset table. */ 444 HOWTO (R_MIPS_GOT_HI16, /* type */ 445 0, /* rightshift */ 446 2, /* size (0 = byte, 1 = short, 2 = long) */ 447 16, /* bitsize */ 448 FALSE, /* pc_relative */ 449 0, /* bitpos */ 450 complain_overflow_dont, /* complain_on_overflow */ 451 _bfd_mips_elf_generic_reloc, /* special_function */ 452 "R_MIPS_GOT_HI16", /* name */ 453 TRUE, /* partial_inplace */ 454 0x0000ffff, /* src_mask */ 455 0x0000ffff, /* dst_mask */ 456 FALSE), /* pcrel_offset */ 457 458 /* Low 16 bits of displacement in global offset table. */ 459 HOWTO (R_MIPS_GOT_LO16, /* type */ 460 0, /* rightshift */ 461 2, /* size (0 = byte, 1 = short, 2 = long) */ 462 16, /* bitsize */ 463 FALSE, /* pc_relative */ 464 0, /* bitpos */ 465 complain_overflow_dont, /* complain_on_overflow */ 466 _bfd_mips_elf_generic_reloc, /* special_function */ 467 "R_MIPS_GOT_LO16", /* name */ 468 TRUE, /* partial_inplace */ 469 0x0000ffff, /* src_mask */ 470 0x0000ffff, /* dst_mask */ 471 FALSE), /* pcrel_offset */ 472 473 /* 64 bit subtraction. */ 474 HOWTO (R_MIPS_SUB, /* type */ 475 0, /* rightshift */ 476 4, /* size (0 = byte, 1 = short, 2 = long) */ 477 64, /* bitsize */ 478 FALSE, /* pc_relative */ 479 0, /* bitpos */ 480 complain_overflow_dont, /* complain_on_overflow */ 481 _bfd_mips_elf_generic_reloc, /* special_function */ 482 "R_MIPS_SUB", /* name */ 483 TRUE, /* partial_inplace */ 484 MINUS_ONE, /* src_mask */ 485 MINUS_ONE, /* dst_mask */ 486 FALSE), /* pcrel_offset */ 487 488 /* Insert the addend as an instruction. */ 489 /* FIXME: Not handled correctly. */ 490 HOWTO (R_MIPS_INSERT_A, /* type */ 491 0, /* rightshift */ 492 2, /* size (0 = byte, 1 = short, 2 = long) */ 493 32, /* bitsize */ 494 FALSE, /* pc_relative */ 495 0, /* bitpos */ 496 complain_overflow_dont, /* complain_on_overflow */ 497 _bfd_mips_elf_generic_reloc, /* special_function */ 498 "R_MIPS_INSERT_A", /* name */ 499 TRUE, /* partial_inplace */ 500 0xffffffff, /* src_mask */ 501 0xffffffff, /* dst_mask */ 502 FALSE), /* pcrel_offset */ 503 504 /* Insert the addend as an instruction, and change all relocations 505 to refer to the old instruction at the address. */ 506 /* FIXME: Not handled correctly. */ 507 HOWTO (R_MIPS_INSERT_B, /* type */ 508 0, /* rightshift */ 509 2, /* size (0 = byte, 1 = short, 2 = long) */ 510 32, /* bitsize */ 511 FALSE, /* pc_relative */ 512 0, /* bitpos */ 513 complain_overflow_dont, /* complain_on_overflow */ 514 _bfd_mips_elf_generic_reloc, /* special_function */ 515 "R_MIPS_INSERT_B", /* name */ 516 TRUE, /* partial_inplace */ 517 0xffffffff, /* src_mask */ 518 0xffffffff, /* dst_mask */ 519 FALSE), /* pcrel_offset */ 520 521 /* Delete a 32 bit instruction. */ 522 /* FIXME: Not handled correctly. */ 523 HOWTO (R_MIPS_DELETE, /* type */ 524 0, /* rightshift */ 525 2, /* size (0 = byte, 1 = short, 2 = long) */ 526 32, /* bitsize */ 527 FALSE, /* pc_relative */ 528 0, /* bitpos */ 529 complain_overflow_dont, /* complain_on_overflow */ 530 _bfd_mips_elf_generic_reloc, /* special_function */ 531 "R_MIPS_DELETE", /* name */ 532 TRUE, /* partial_inplace */ 533 0xffffffff, /* src_mask */ 534 0xffffffff, /* dst_mask */ 535 FALSE), /* pcrel_offset */ 536 537 /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations. 538 We don't, because 539 a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/ 540 R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using 541 fallable heuristics. 542 b) No other NewABI toolchain actually emits such relocations. */ 543 EMPTY_HOWTO (R_MIPS_HIGHER), 544 EMPTY_HOWTO (R_MIPS_HIGHEST), 545 546 /* High 16 bits of displacement in global offset table. */ 547 HOWTO (R_MIPS_CALL_HI16, /* type */ 548 0, /* rightshift */ 549 2, /* size (0 = byte, 1 = short, 2 = long) */ 550 16, /* bitsize */ 551 FALSE, /* pc_relative */ 552 0, /* bitpos */ 553 complain_overflow_dont, /* complain_on_overflow */ 554 _bfd_mips_elf_generic_reloc, /* special_function */ 555 "R_MIPS_CALL_HI16", /* name */ 556 TRUE, /* partial_inplace */ 557 0x0000ffff, /* src_mask */ 558 0x0000ffff, /* dst_mask */ 559 FALSE), /* pcrel_offset */ 560 561 /* Low 16 bits of displacement in global offset table. */ 562 HOWTO (R_MIPS_CALL_LO16, /* type */ 563 0, /* rightshift */ 564 2, /* size (0 = byte, 1 = short, 2 = long) */ 565 16, /* bitsize */ 566 FALSE, /* pc_relative */ 567 0, /* bitpos */ 568 complain_overflow_dont, /* complain_on_overflow */ 569 _bfd_mips_elf_generic_reloc, /* special_function */ 570 "R_MIPS_CALL_LO16", /* name */ 571 TRUE, /* partial_inplace */ 572 0x0000ffff, /* src_mask */ 573 0x0000ffff, /* dst_mask */ 574 FALSE), /* pcrel_offset */ 575 576 /* Section displacement, used by an associated event location section. */ 577 HOWTO (R_MIPS_SCN_DISP, /* type */ 578 0, /* rightshift */ 579 2, /* size (0 = byte, 1 = short, 2 = long) */ 580 32, /* bitsize */ 581 FALSE, /* pc_relative */ 582 0, /* bitpos */ 583 complain_overflow_dont, /* complain_on_overflow */ 584 _bfd_mips_elf_generic_reloc, /* special_function */ 585 "R_MIPS_SCN_DISP", /* name */ 586 TRUE, /* partial_inplace */ 587 0xffffffff, /* src_mask */ 588 0xffffffff, /* dst_mask */ 589 FALSE), /* pcrel_offset */ 590 591 HOWTO (R_MIPS_REL16, /* type */ 592 0, /* rightshift */ 593 1, /* size (0 = byte, 1 = short, 2 = long) */ 594 16, /* bitsize */ 595 FALSE, /* pc_relative */ 596 0, /* bitpos */ 597 complain_overflow_signed, /* complain_on_overflow */ 598 _bfd_mips_elf_generic_reloc, /* special_function */ 599 "R_MIPS_REL16", /* name */ 600 TRUE, /* partial_inplace */ 601 0xffff, /* src_mask */ 602 0xffff, /* dst_mask */ 603 FALSE), /* pcrel_offset */ 604 605 /* These two are obsolete. */ 606 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE), 607 EMPTY_HOWTO (R_MIPS_PJUMP), 608 609 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section. 610 It must be used for multigot GOT's (and only there). */ 611 HOWTO (R_MIPS_RELGOT, /* type */ 612 0, /* rightshift */ 613 2, /* size (0 = byte, 1 = short, 2 = long) */ 614 32, /* bitsize */ 615 FALSE, /* pc_relative */ 616 0, /* bitpos */ 617 complain_overflow_dont, /* complain_on_overflow */ 618 _bfd_mips_elf_generic_reloc, /* special_function */ 619 "R_MIPS_RELGOT", /* name */ 620 TRUE, /* partial_inplace */ 621 0xffffffff, /* src_mask */ 622 0xffffffff, /* dst_mask */ 623 FALSE), /* pcrel_offset */ 624 625 /* Protected jump conversion. This is an optimization hint. No 626 relocation is required for correctness. */ 627 HOWTO (R_MIPS_JALR, /* type */ 628 0, /* rightshift */ 629 2, /* size (0 = byte, 1 = short, 2 = long) */ 630 32, /* bitsize */ 631 FALSE, /* pc_relative */ 632 0, /* bitpos */ 633 complain_overflow_dont, /* complain_on_overflow */ 634 _bfd_mips_elf_generic_reloc, /* special_function */ 635 "R_MIPS_JALR", /* name */ 636 FALSE, /* partial_inplace */ 637 0, /* src_mask */ 638 0x00000000, /* dst_mask */ 639 FALSE), /* pcrel_offset */ 640 641 /* TLS relocations. */ 642 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32), 643 EMPTY_HOWTO (R_MIPS_TLS_DTPREL32), 644 645 HOWTO (R_MIPS_TLS_DTPMOD64, /* type */ 646 0, /* rightshift */ 647 4, /* size (0 = byte, 1 = short, 2 = long) */ 648 64, /* bitsize */ 649 FALSE, /* pc_relative */ 650 0, /* bitpos */ 651 complain_overflow_dont, /* complain_on_overflow */ 652 _bfd_mips_elf_generic_reloc, /* special_function */ 653 "R_MIPS_TLS_DTPMOD64", /* name */ 654 TRUE, /* partial_inplace */ 655 MINUS_ONE, /* src_mask */ 656 MINUS_ONE, /* dst_mask */ 657 FALSE), /* pcrel_offset */ 658 659 HOWTO (R_MIPS_TLS_DTPREL64, /* type */ 660 0, /* rightshift */ 661 4, /* size (0 = byte, 1 = short, 2 = long) */ 662 64, /* bitsize */ 663 FALSE, /* pc_relative */ 664 0, /* bitpos */ 665 complain_overflow_dont, /* complain_on_overflow */ 666 _bfd_mips_elf_generic_reloc, /* special_function */ 667 "R_MIPS_TLS_DTPREL64", /* name */ 668 TRUE, /* partial_inplace */ 669 MINUS_ONE, /* src_mask */ 670 MINUS_ONE, /* dst_mask */ 671 FALSE), /* pcrel_offset */ 672 673 /* TLS general dynamic variable reference. */ 674 HOWTO (R_MIPS_TLS_GD, /* type */ 675 0, /* rightshift */ 676 2, /* size (0 = byte, 1 = short, 2 = long) */ 677 16, /* bitsize */ 678 FALSE, /* pc_relative */ 679 0, /* bitpos */ 680 complain_overflow_signed, /* complain_on_overflow */ 681 _bfd_mips_elf_generic_reloc, /* special_function */ 682 "R_MIPS_TLS_GD", /* name */ 683 TRUE, /* partial_inplace */ 684 0x0000ffff, /* src_mask */ 685 0x0000ffff, /* dst_mask */ 686 FALSE), /* pcrel_offset */ 687 688 /* TLS local dynamic variable reference. */ 689 HOWTO (R_MIPS_TLS_LDM, /* type */ 690 0, /* rightshift */ 691 2, /* size (0 = byte, 1 = short, 2 = long) */ 692 16, /* bitsize */ 693 FALSE, /* pc_relative */ 694 0, /* bitpos */ 695 complain_overflow_signed, /* complain_on_overflow */ 696 _bfd_mips_elf_generic_reloc, /* special_function */ 697 "R_MIPS_TLS_LDM", /* name */ 698 TRUE, /* partial_inplace */ 699 0x0000ffff, /* src_mask */ 700 0x0000ffff, /* dst_mask */ 701 FALSE), /* pcrel_offset */ 702 703 /* TLS local dynamic offset. */ 704 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */ 705 0, /* rightshift */ 706 2, /* size (0 = byte, 1 = short, 2 = long) */ 707 16, /* bitsize */ 708 FALSE, /* pc_relative */ 709 0, /* bitpos */ 710 complain_overflow_signed, /* complain_on_overflow */ 711 _bfd_mips_elf_generic_reloc, /* special_function */ 712 "R_MIPS_TLS_DTPREL_HI16", /* name */ 713 TRUE, /* partial_inplace */ 714 0x0000ffff, /* src_mask */ 715 0x0000ffff, /* dst_mask */ 716 FALSE), /* pcrel_offset */ 717 718 /* TLS local dynamic offset. */ 719 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */ 720 0, /* rightshift */ 721 2, /* size (0 = byte, 1 = short, 2 = long) */ 722 16, /* bitsize */ 723 FALSE, /* pc_relative */ 724 0, /* bitpos */ 725 complain_overflow_signed, /* complain_on_overflow */ 726 _bfd_mips_elf_generic_reloc, /* special_function */ 727 "R_MIPS_TLS_DTPREL_LO16", /* name */ 728 TRUE, /* partial_inplace */ 729 0x0000ffff, /* src_mask */ 730 0x0000ffff, /* dst_mask */ 731 FALSE), /* pcrel_offset */ 732 733 /* TLS thread pointer offset. */ 734 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */ 735 0, /* rightshift */ 736 2, /* size (0 = byte, 1 = short, 2 = long) */ 737 16, /* bitsize */ 738 FALSE, /* pc_relative */ 739 0, /* bitpos */ 740 complain_overflow_signed, /* complain_on_overflow */ 741 _bfd_mips_elf_generic_reloc, /* special_function */ 742 "R_MIPS_TLS_GOTTPREL", /* name */ 743 TRUE, /* partial_inplace */ 744 0x0000ffff, /* src_mask */ 745 0x0000ffff, /* dst_mask */ 746 FALSE), /* pcrel_offset */ 747 748 /* TLS IE dynamic relocations. */ 749 EMPTY_HOWTO (R_MIPS_TLS_TPREL32), 750 751 HOWTO (R_MIPS_TLS_TPREL64, /* type */ 752 0, /* rightshift */ 753 4, /* size (0 = byte, 1 = short, 2 = long) */ 754 64, /* bitsize */ 755 FALSE, /* pc_relative */ 756 0, /* bitpos */ 757 complain_overflow_dont, /* complain_on_overflow */ 758 _bfd_mips_elf_generic_reloc, /* special_function */ 759 "R_MIPS_TLS_TPREL64", /* name */ 760 TRUE, /* partial_inplace */ 761 MINUS_ONE, /* src_mask */ 762 MINUS_ONE, /* dst_mask */ 763 FALSE), /* pcrel_offset */ 764 765 /* TLS thread pointer offset. */ 766 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */ 767 0, /* rightshift */ 768 2, /* size (0 = byte, 1 = short, 2 = long) */ 769 16, /* bitsize */ 770 FALSE, /* pc_relative */ 771 0, /* bitpos */ 772 complain_overflow_signed, /* complain_on_overflow */ 773 _bfd_mips_elf_generic_reloc, /* special_function */ 774 "R_MIPS_TLS_TPREL_HI16", /* name */ 775 TRUE, /* partial_inplace */ 776 0x0000ffff, /* src_mask */ 777 0x0000ffff, /* dst_mask */ 778 FALSE), /* pcrel_offset */ 779 780 /* TLS thread pointer offset. */ 781 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */ 782 0, /* rightshift */ 783 2, /* size (0 = byte, 1 = short, 2 = long) */ 784 16, /* bitsize */ 785 FALSE, /* pc_relative */ 786 0, /* bitpos */ 787 complain_overflow_signed, /* complain_on_overflow */ 788 _bfd_mips_elf_generic_reloc, /* special_function */ 789 "R_MIPS_TLS_TPREL_LO16", /* name */ 790 TRUE, /* partial_inplace */ 791 0x0000ffff, /* src_mask */ 792 0x0000ffff, /* dst_mask */ 793 FALSE), /* pcrel_offset */ 794 }; 795 796 /* The relocation table used for SHT_RELA sections. */ 797 798 static reloc_howto_type mips_elf64_howto_table_rela[] = 799 { 800 /* No relocation. */ 801 HOWTO (R_MIPS_NONE, /* type */ 802 0, /* rightshift */ 803 0, /* size (0 = byte, 1 = short, 2 = long) */ 804 0, /* bitsize */ 805 FALSE, /* pc_relative */ 806 0, /* bitpos */ 807 complain_overflow_dont, /* complain_on_overflow */ 808 _bfd_mips_elf_generic_reloc, /* special_function */ 809 "R_MIPS_NONE", /* name */ 810 FALSE, /* partial_inplace */ 811 0, /* src_mask */ 812 0, /* dst_mask */ 813 FALSE), /* pcrel_offset */ 814 815 /* 16 bit relocation. */ 816 HOWTO (R_MIPS_16, /* type */ 817 0, /* rightshift */ 818 2, /* size (0 = byte, 1 = short, 2 = long) */ 819 16, /* bitsize */ 820 FALSE, /* pc_relative */ 821 0, /* bitpos */ 822 complain_overflow_signed, /* complain_on_overflow */ 823 _bfd_mips_elf_generic_reloc, /* special_function */ 824 "R_MIPS_16", /* name */ 825 FALSE, /* partial_inplace */ 826 0, /* src_mask */ 827 0x0000ffff, /* dst_mask */ 828 FALSE), /* pcrel_offset */ 829 830 /* 32 bit relocation. */ 831 HOWTO (R_MIPS_32, /* type */ 832 0, /* rightshift */ 833 2, /* size (0 = byte, 1 = short, 2 = long) */ 834 32, /* bitsize */ 835 FALSE, /* pc_relative */ 836 0, /* bitpos */ 837 complain_overflow_dont, /* complain_on_overflow */ 838 _bfd_mips_elf_generic_reloc, /* special_function */ 839 "R_MIPS_32", /* name */ 840 FALSE, /* partial_inplace */ 841 0, /* src_mask */ 842 0xffffffff, /* dst_mask */ 843 FALSE), /* pcrel_offset */ 844 845 /* 32 bit symbol relative relocation. */ 846 HOWTO (R_MIPS_REL32, /* type */ 847 0, /* rightshift */ 848 2, /* size (0 = byte, 1 = short, 2 = long) */ 849 32, /* bitsize */ 850 FALSE, /* pc_relative */ 851 0, /* bitpos */ 852 complain_overflow_dont, /* complain_on_overflow */ 853 _bfd_mips_elf_generic_reloc, /* special_function */ 854 "R_MIPS_REL32", /* name */ 855 FALSE, /* partial_inplace */ 856 0, /* src_mask */ 857 0xffffffff, /* dst_mask */ 858 FALSE), /* pcrel_offset */ 859 860 /* 26 bit jump address. */ 861 HOWTO (R_MIPS_26, /* type */ 862 2, /* rightshift */ 863 2, /* size (0 = byte, 1 = short, 2 = long) */ 864 26, /* bitsize */ 865 FALSE, /* pc_relative */ 866 0, /* bitpos */ 867 complain_overflow_dont, /* complain_on_overflow */ 868 /* This needs complex overflow 869 detection, because the upper 36 870 bits must match the PC + 4. */ 871 _bfd_mips_elf_generic_reloc, /* special_function */ 872 "R_MIPS_26", /* name */ 873 FALSE, /* partial_inplace */ 874 0, /* src_mask */ 875 0x03ffffff, /* dst_mask */ 876 FALSE), /* pcrel_offset */ 877 878 /* High 16 bits of symbol value. */ 879 HOWTO (R_MIPS_HI16, /* type */ 880 0, /* rightshift */ 881 2, /* size (0 = byte, 1 = short, 2 = long) */ 882 16, /* bitsize */ 883 FALSE, /* pc_relative */ 884 0, /* bitpos */ 885 complain_overflow_dont, /* complain_on_overflow */ 886 _bfd_mips_elf_generic_reloc, /* special_function */ 887 "R_MIPS_HI16", /* name */ 888 FALSE, /* partial_inplace */ 889 0, /* src_mask */ 890 0x0000ffff, /* dst_mask */ 891 FALSE), /* pcrel_offset */ 892 893 /* Low 16 bits of symbol value. */ 894 HOWTO (R_MIPS_LO16, /* type */ 895 0, /* rightshift */ 896 2, /* size (0 = byte, 1 = short, 2 = long) */ 897 16, /* bitsize */ 898 FALSE, /* pc_relative */ 899 0, /* bitpos */ 900 complain_overflow_dont, /* complain_on_overflow */ 901 _bfd_mips_elf_generic_reloc, /* special_function */ 902 "R_MIPS_LO16", /* name */ 903 FALSE, /* partial_inplace */ 904 0, /* src_mask */ 905 0x0000ffff, /* dst_mask */ 906 FALSE), /* pcrel_offset */ 907 908 /* GP relative reference. */ 909 HOWTO (R_MIPS_GPREL16, /* type */ 910 0, /* rightshift */ 911 2, /* size (0 = byte, 1 = short, 2 = long) */ 912 16, /* bitsize */ 913 FALSE, /* pc_relative */ 914 0, /* bitpos */ 915 complain_overflow_signed, /* complain_on_overflow */ 916 mips_elf64_gprel16_reloc, /* special_function */ 917 "R_MIPS_GPREL16", /* name */ 918 FALSE, /* partial_inplace */ 919 0, /* src_mask */ 920 0x0000ffff, /* dst_mask */ 921 FALSE), /* pcrel_offset */ 922 923 /* Reference to literal section. */ 924 HOWTO (R_MIPS_LITERAL, /* type */ 925 0, /* rightshift */ 926 2, /* size (0 = byte, 1 = short, 2 = long) */ 927 16, /* bitsize */ 928 FALSE, /* pc_relative */ 929 0, /* bitpos */ 930 complain_overflow_signed, /* complain_on_overflow */ 931 mips_elf64_literal_reloc, /* special_function */ 932 "R_MIPS_LITERAL", /* name */ 933 FALSE, /* partial_inplace */ 934 0, /* src_mask */ 935 0x0000ffff, /* dst_mask */ 936 FALSE), /* pcrel_offset */ 937 938 /* Reference to global offset table. */ 939 HOWTO (R_MIPS_GOT16, /* type */ 940 0, /* rightshift */ 941 2, /* size (0 = byte, 1 = short, 2 = long) */ 942 16, /* bitsize */ 943 FALSE, /* pc_relative */ 944 0, /* bitpos */ 945 complain_overflow_signed, /* complain_on_overflow */ 946 _bfd_mips_elf_generic_reloc, /* special_function */ 947 "R_MIPS_GOT16", /* name */ 948 FALSE, /* partial_inplace */ 949 0, /* src_mask */ 950 0x0000ffff, /* dst_mask */ 951 FALSE), /* pcrel_offset */ 952 953 /* 16 bit PC relative reference. Note that the ABI document has a typo 954 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless. 955 We do the right thing here. */ 956 HOWTO (R_MIPS_PC16, /* type */ 957 2, /* rightshift */ 958 2, /* size (0 = byte, 1 = short, 2 = long) */ 959 16, /* bitsize */ 960 TRUE, /* pc_relative */ 961 0, /* bitpos */ 962 complain_overflow_signed, /* complain_on_overflow */ 963 _bfd_mips_elf_generic_reloc, /* special_function */ 964 "R_MIPS_PC16", /* name */ 965 FALSE, /* partial_inplace */ 966 0, /* src_mask */ 967 0x0000ffff, /* dst_mask */ 968 TRUE), /* pcrel_offset */ 969 970 /* 16 bit call through global offset table. */ 971 HOWTO (R_MIPS_CALL16, /* type */ 972 0, /* rightshift */ 973 2, /* size (0 = byte, 1 = short, 2 = long) */ 974 16, /* bitsize */ 975 FALSE, /* pc_relative */ 976 0, /* bitpos */ 977 complain_overflow_signed, /* complain_on_overflow */ 978 _bfd_mips_elf_generic_reloc, /* special_function */ 979 "R_MIPS_CALL16", /* name */ 980 FALSE, /* partial_inplace */ 981 0, /* src_mask */ 982 0x0000ffff, /* dst_mask */ 983 FALSE), /* pcrel_offset */ 984 985 /* 32 bit GP relative reference. */ 986 HOWTO (R_MIPS_GPREL32, /* type */ 987 0, /* rightshift */ 988 2, /* size (0 = byte, 1 = short, 2 = long) */ 989 32, /* bitsize */ 990 FALSE, /* pc_relative */ 991 0, /* bitpos */ 992 complain_overflow_dont, /* complain_on_overflow */ 993 mips_elf64_gprel32_reloc, /* special_function */ 994 "R_MIPS_GPREL32", /* name */ 995 FALSE, /* partial_inplace */ 996 0, /* src_mask */ 997 0xffffffff, /* dst_mask */ 998 FALSE), /* pcrel_offset */ 999 1000 EMPTY_HOWTO (13), 1001 EMPTY_HOWTO (14), 1002 EMPTY_HOWTO (15), 1003 1004 /* A 5 bit shift field. */ 1005 HOWTO (R_MIPS_SHIFT5, /* type */ 1006 0, /* rightshift */ 1007 2, /* size (0 = byte, 1 = short, 2 = long) */ 1008 5, /* bitsize */ 1009 FALSE, /* pc_relative */ 1010 6, /* bitpos */ 1011 complain_overflow_bitfield, /* complain_on_overflow */ 1012 _bfd_mips_elf_generic_reloc, /* special_function */ 1013 "R_MIPS_SHIFT5", /* name */ 1014 FALSE, /* partial_inplace */ 1015 0, /* src_mask */ 1016 0x000007c0, /* dst_mask */ 1017 FALSE), /* pcrel_offset */ 1018 1019 /* A 6 bit shift field. */ 1020 HOWTO (R_MIPS_SHIFT6, /* type */ 1021 0, /* rightshift */ 1022 2, /* size (0 = byte, 1 = short, 2 = long) */ 1023 6, /* bitsize */ 1024 FALSE, /* pc_relative */ 1025 6, /* bitpos */ 1026 complain_overflow_bitfield, /* complain_on_overflow */ 1027 mips_elf64_shift6_reloc, /* special_function */ 1028 "R_MIPS_SHIFT6", /* name */ 1029 FALSE, /* partial_inplace */ 1030 0, /* src_mask */ 1031 0x000007c4, /* dst_mask */ 1032 FALSE), /* pcrel_offset */ 1033 1034 /* 64 bit relocation. */ 1035 HOWTO (R_MIPS_64, /* type */ 1036 0, /* rightshift */ 1037 4, /* size (0 = byte, 1 = short, 2 = long) */ 1038 64, /* bitsize */ 1039 FALSE, /* pc_relative */ 1040 0, /* bitpos */ 1041 complain_overflow_dont, /* complain_on_overflow */ 1042 _bfd_mips_elf_generic_reloc, /* special_function */ 1043 "R_MIPS_64", /* name */ 1044 FALSE, /* partial_inplace */ 1045 0, /* src_mask */ 1046 MINUS_ONE, /* dst_mask */ 1047 FALSE), /* pcrel_offset */ 1048 1049 /* Displacement in the global offset table. */ 1050 HOWTO (R_MIPS_GOT_DISP, /* type */ 1051 0, /* rightshift */ 1052 2, /* size (0 = byte, 1 = short, 2 = long) */ 1053 16, /* bitsize */ 1054 FALSE, /* pc_relative */ 1055 0, /* bitpos */ 1056 complain_overflow_signed, /* complain_on_overflow */ 1057 _bfd_mips_elf_generic_reloc, /* special_function */ 1058 "R_MIPS_GOT_DISP", /* name */ 1059 FALSE, /* partial_inplace */ 1060 0, /* src_mask */ 1061 0x0000ffff, /* dst_mask */ 1062 FALSE), /* pcrel_offset */ 1063 1064 /* Displacement to page pointer in the global offset table. */ 1065 HOWTO (R_MIPS_GOT_PAGE, /* type */ 1066 0, /* rightshift */ 1067 2, /* size (0 = byte, 1 = short, 2 = long) */ 1068 16, /* bitsize */ 1069 FALSE, /* pc_relative */ 1070 0, /* bitpos */ 1071 complain_overflow_signed, /* complain_on_overflow */ 1072 _bfd_mips_elf_generic_reloc, /* special_function */ 1073 "R_MIPS_GOT_PAGE", /* name */ 1074 FALSE, /* partial_inplace */ 1075 0, /* src_mask */ 1076 0x0000ffff, /* dst_mask */ 1077 FALSE), /* pcrel_offset */ 1078 1079 /* Offset from page pointer in the global offset table. */ 1080 HOWTO (R_MIPS_GOT_OFST, /* type */ 1081 0, /* rightshift */ 1082 2, /* size (0 = byte, 1 = short, 2 = long) */ 1083 16, /* bitsize */ 1084 FALSE, /* pc_relative */ 1085 0, /* bitpos */ 1086 complain_overflow_signed, /* complain_on_overflow */ 1087 _bfd_mips_elf_generic_reloc, /* special_function */ 1088 "R_MIPS_GOT_OFST", /* name */ 1089 FALSE, /* partial_inplace */ 1090 0, /* src_mask */ 1091 0x0000ffff, /* dst_mask */ 1092 FALSE), /* pcrel_offset */ 1093 1094 /* High 16 bits of displacement in global offset table. */ 1095 HOWTO (R_MIPS_GOT_HI16, /* type */ 1096 0, /* rightshift */ 1097 2, /* size (0 = byte, 1 = short, 2 = long) */ 1098 16, /* bitsize */ 1099 FALSE, /* pc_relative */ 1100 0, /* bitpos */ 1101 complain_overflow_dont, /* complain_on_overflow */ 1102 _bfd_mips_elf_generic_reloc, /* special_function */ 1103 "R_MIPS_GOT_HI16", /* name */ 1104 FALSE, /* partial_inplace */ 1105 0, /* src_mask */ 1106 0x0000ffff, /* dst_mask */ 1107 FALSE), /* pcrel_offset */ 1108 1109 /* Low 16 bits of displacement in global offset table. */ 1110 HOWTO (R_MIPS_GOT_LO16, /* type */ 1111 0, /* rightshift */ 1112 2, /* size (0 = byte, 1 = short, 2 = long) */ 1113 16, /* bitsize */ 1114 FALSE, /* pc_relative */ 1115 0, /* bitpos */ 1116 complain_overflow_dont, /* complain_on_overflow */ 1117 _bfd_mips_elf_generic_reloc, /* special_function */ 1118 "R_MIPS_GOT_LO16", /* name */ 1119 FALSE, /* partial_inplace */ 1120 0, /* src_mask */ 1121 0x0000ffff, /* dst_mask */ 1122 FALSE), /* pcrel_offset */ 1123 1124 /* 64 bit subtraction. */ 1125 HOWTO (R_MIPS_SUB, /* type */ 1126 0, /* rightshift */ 1127 4, /* size (0 = byte, 1 = short, 2 = long) */ 1128 64, /* bitsize */ 1129 FALSE, /* pc_relative */ 1130 0, /* bitpos */ 1131 complain_overflow_dont, /* complain_on_overflow */ 1132 _bfd_mips_elf_generic_reloc, /* special_function */ 1133 "R_MIPS_SUB", /* name */ 1134 FALSE, /* partial_inplace */ 1135 0, /* src_mask */ 1136 MINUS_ONE, /* dst_mask */ 1137 FALSE), /* pcrel_offset */ 1138 1139 /* Insert the addend as an instruction. */ 1140 /* FIXME: Not handled correctly. */ 1141 HOWTO (R_MIPS_INSERT_A, /* type */ 1142 0, /* rightshift */ 1143 2, /* size (0 = byte, 1 = short, 2 = long) */ 1144 32, /* bitsize */ 1145 FALSE, /* pc_relative */ 1146 0, /* bitpos */ 1147 complain_overflow_dont, /* complain_on_overflow */ 1148 _bfd_mips_elf_generic_reloc, /* special_function */ 1149 "R_MIPS_INSERT_A", /* name */ 1150 FALSE, /* partial_inplace */ 1151 0, /* src_mask */ 1152 0xffffffff, /* dst_mask */ 1153 FALSE), /* pcrel_offset */ 1154 1155 /* Insert the addend as an instruction, and change all relocations 1156 to refer to the old instruction at the address. */ 1157 /* FIXME: Not handled correctly. */ 1158 HOWTO (R_MIPS_INSERT_B, /* type */ 1159 0, /* rightshift */ 1160 2, /* size (0 = byte, 1 = short, 2 = long) */ 1161 32, /* bitsize */ 1162 FALSE, /* pc_relative */ 1163 0, /* bitpos */ 1164 complain_overflow_dont, /* complain_on_overflow */ 1165 _bfd_mips_elf_generic_reloc, /* special_function */ 1166 "R_MIPS_INSERT_B", /* name */ 1167 FALSE, /* partial_inplace */ 1168 0, /* src_mask */ 1169 0xffffffff, /* dst_mask */ 1170 FALSE), /* pcrel_offset */ 1171 1172 /* Delete a 32 bit instruction. */ 1173 /* FIXME: Not handled correctly. */ 1174 HOWTO (R_MIPS_DELETE, /* type */ 1175 0, /* rightshift */ 1176 2, /* size (0 = byte, 1 = short, 2 = long) */ 1177 32, /* bitsize */ 1178 FALSE, /* pc_relative */ 1179 0, /* bitpos */ 1180 complain_overflow_dont, /* complain_on_overflow */ 1181 _bfd_mips_elf_generic_reloc, /* special_function */ 1182 "R_MIPS_DELETE", /* name */ 1183 FALSE, /* partial_inplace */ 1184 0, /* src_mask */ 1185 0xffffffff, /* dst_mask */ 1186 FALSE), /* pcrel_offset */ 1187 1188 /* Get the higher value of a 64 bit addend. */ 1189 HOWTO (R_MIPS_HIGHER, /* type */ 1190 0, /* rightshift */ 1191 2, /* size (0 = byte, 1 = short, 2 = long) */ 1192 16, /* bitsize */ 1193 FALSE, /* pc_relative */ 1194 0, /* bitpos */ 1195 complain_overflow_dont, /* complain_on_overflow */ 1196 _bfd_mips_elf_generic_reloc, /* special_function */ 1197 "R_MIPS_HIGHER", /* name */ 1198 FALSE, /* partial_inplace */ 1199 0, /* src_mask */ 1200 0x0000ffff, /* dst_mask */ 1201 FALSE), /* pcrel_offset */ 1202 1203 /* Get the highest value of a 64 bit addend. */ 1204 HOWTO (R_MIPS_HIGHEST, /* type */ 1205 0, /* rightshift */ 1206 2, /* size (0 = byte, 1 = short, 2 = long) */ 1207 16, /* bitsize */ 1208 FALSE, /* pc_relative */ 1209 0, /* bitpos */ 1210 complain_overflow_dont, /* complain_on_overflow */ 1211 _bfd_mips_elf_generic_reloc, /* special_function */ 1212 "R_MIPS_HIGHEST", /* name */ 1213 FALSE, /* partial_inplace */ 1214 0, /* src_mask */ 1215 0x0000ffff, /* dst_mask */ 1216 FALSE), /* pcrel_offset */ 1217 1218 /* High 16 bits of displacement in global offset table. */ 1219 HOWTO (R_MIPS_CALL_HI16, /* type */ 1220 0, /* rightshift */ 1221 2, /* size (0 = byte, 1 = short, 2 = long) */ 1222 16, /* bitsize */ 1223 FALSE, /* pc_relative */ 1224 0, /* bitpos */ 1225 complain_overflow_dont, /* complain_on_overflow */ 1226 _bfd_mips_elf_generic_reloc, /* special_function */ 1227 "R_MIPS_CALL_HI16", /* name */ 1228 FALSE, /* partial_inplace */ 1229 0, /* src_mask */ 1230 0x0000ffff, /* dst_mask */ 1231 FALSE), /* pcrel_offset */ 1232 1233 /* Low 16 bits of displacement in global offset table. */ 1234 HOWTO (R_MIPS_CALL_LO16, /* type */ 1235 0, /* rightshift */ 1236 2, /* size (0 = byte, 1 = short, 2 = long) */ 1237 16, /* bitsize */ 1238 FALSE, /* pc_relative */ 1239 0, /* bitpos */ 1240 complain_overflow_dont, /* complain_on_overflow */ 1241 _bfd_mips_elf_generic_reloc, /* special_function */ 1242 "R_MIPS_CALL_LO16", /* name */ 1243 FALSE, /* partial_inplace */ 1244 0, /* src_mask */ 1245 0x0000ffff, /* dst_mask */ 1246 FALSE), /* pcrel_offset */ 1247 1248 /* Section displacement, used by an associated event location section. */ 1249 HOWTO (R_MIPS_SCN_DISP, /* type */ 1250 0, /* rightshift */ 1251 2, /* size (0 = byte, 1 = short, 2 = long) */ 1252 32, /* bitsize */ 1253 FALSE, /* pc_relative */ 1254 0, /* bitpos */ 1255 complain_overflow_dont, /* complain_on_overflow */ 1256 _bfd_mips_elf_generic_reloc, /* special_function */ 1257 "R_MIPS_SCN_DISP", /* name */ 1258 FALSE, /* partial_inplace */ 1259 0, /* src_mask */ 1260 0xffffffff, /* dst_mask */ 1261 FALSE), /* pcrel_offset */ 1262 1263 HOWTO (R_MIPS_REL16, /* type */ 1264 0, /* rightshift */ 1265 1, /* size (0 = byte, 1 = short, 2 = long) */ 1266 16, /* bitsize */ 1267 FALSE, /* pc_relative */ 1268 0, /* bitpos */ 1269 complain_overflow_signed, /* complain_on_overflow */ 1270 _bfd_mips_elf_generic_reloc, /* special_function */ 1271 "R_MIPS_REL16", /* name */ 1272 FALSE, /* partial_inplace */ 1273 0, /* src_mask */ 1274 0xffff, /* dst_mask */ 1275 FALSE), /* pcrel_offset */ 1276 1277 /* These two are obsolete. */ 1278 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE), 1279 EMPTY_HOWTO (R_MIPS_PJUMP), 1280 1281 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section. 1282 It must be used for multigot GOT's (and only there). */ 1283 HOWTO (R_MIPS_RELGOT, /* type */ 1284 0, /* rightshift */ 1285 2, /* size (0 = byte, 1 = short, 2 = long) */ 1286 32, /* bitsize */ 1287 FALSE, /* pc_relative */ 1288 0, /* bitpos */ 1289 complain_overflow_dont, /* complain_on_overflow */ 1290 _bfd_mips_elf_generic_reloc, /* special_function */ 1291 "R_MIPS_RELGOT", /* name */ 1292 FALSE, /* partial_inplace */ 1293 0, /* src_mask */ 1294 0xffffffff, /* dst_mask */ 1295 FALSE), /* pcrel_offset */ 1296 1297 /* Protected jump conversion. This is an optimization hint. No 1298 relocation is required for correctness. */ 1299 HOWTO (R_MIPS_JALR, /* type */ 1300 0, /* rightshift */ 1301 2, /* size (0 = byte, 1 = short, 2 = long) */ 1302 32, /* bitsize */ 1303 FALSE, /* pc_relative */ 1304 0, /* bitpos */ 1305 complain_overflow_dont, /* complain_on_overflow */ 1306 _bfd_mips_elf_generic_reloc, /* special_function */ 1307 "R_MIPS_JALR", /* name */ 1308 FALSE, /* partial_inplace */ 1309 0, /* src_mask */ 1310 0x00000000, /* dst_mask */ 1311 FALSE), /* pcrel_offset */ 1312 1313 /* TLS relocations. */ 1314 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32), 1315 EMPTY_HOWTO (R_MIPS_TLS_DTPREL32), 1316 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64), 1317 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64), 1318 1319 /* TLS general dynamic variable reference. */ 1320 HOWTO (R_MIPS_TLS_GD, /* type */ 1321 0, /* rightshift */ 1322 2, /* size (0 = byte, 1 = short, 2 = long) */ 1323 16, /* bitsize */ 1324 FALSE, /* pc_relative */ 1325 0, /* bitpos */ 1326 complain_overflow_signed, /* complain_on_overflow */ 1327 _bfd_mips_elf_generic_reloc, /* special_function */ 1328 "R_MIPS_TLS_GD", /* name */ 1329 TRUE, /* partial_inplace */ 1330 0x0000ffff, /* src_mask */ 1331 0x0000ffff, /* dst_mask */ 1332 FALSE), /* pcrel_offset */ 1333 1334 /* TLS local dynamic variable reference. */ 1335 HOWTO (R_MIPS_TLS_LDM, /* type */ 1336 0, /* rightshift */ 1337 2, /* size (0 = byte, 1 = short, 2 = long) */ 1338 16, /* bitsize */ 1339 FALSE, /* pc_relative */ 1340 0, /* bitpos */ 1341 complain_overflow_signed, /* complain_on_overflow */ 1342 _bfd_mips_elf_generic_reloc, /* special_function */ 1343 "R_MIPS_TLS_LDM", /* name */ 1344 TRUE, /* partial_inplace */ 1345 0x0000ffff, /* src_mask */ 1346 0x0000ffff, /* dst_mask */ 1347 FALSE), /* pcrel_offset */ 1348 1349 /* TLS local dynamic offset. */ 1350 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */ 1351 0, /* rightshift */ 1352 2, /* size (0 = byte, 1 = short, 2 = long) */ 1353 16, /* bitsize */ 1354 FALSE, /* pc_relative */ 1355 0, /* bitpos */ 1356 complain_overflow_signed, /* complain_on_overflow */ 1357 _bfd_mips_elf_generic_reloc, /* special_function */ 1358 "R_MIPS_TLS_DTPREL_HI16", /* name */ 1359 TRUE, /* partial_inplace */ 1360 0x0000ffff, /* src_mask */ 1361 0x0000ffff, /* dst_mask */ 1362 FALSE), /* pcrel_offset */ 1363 1364 /* TLS local dynamic offset. */ 1365 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */ 1366 0, /* rightshift */ 1367 2, /* size (0 = byte, 1 = short, 2 = long) */ 1368 16, /* bitsize */ 1369 FALSE, /* pc_relative */ 1370 0, /* bitpos */ 1371 complain_overflow_signed, /* complain_on_overflow */ 1372 _bfd_mips_elf_generic_reloc, /* special_function */ 1373 "R_MIPS_TLS_DTPREL_LO16", /* name */ 1374 TRUE, /* partial_inplace */ 1375 0x0000ffff, /* src_mask */ 1376 0x0000ffff, /* dst_mask */ 1377 FALSE), /* pcrel_offset */ 1378 1379 /* TLS thread pointer offset. */ 1380 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */ 1381 0, /* rightshift */ 1382 2, /* size (0 = byte, 1 = short, 2 = long) */ 1383 16, /* bitsize */ 1384 FALSE, /* pc_relative */ 1385 0, /* bitpos */ 1386 complain_overflow_signed, /* complain_on_overflow */ 1387 _bfd_mips_elf_generic_reloc, /* special_function */ 1388 "R_MIPS_TLS_GOTTPREL", /* name */ 1389 TRUE, /* partial_inplace */ 1390 0x0000ffff, /* src_mask */ 1391 0x0000ffff, /* dst_mask */ 1392 FALSE), /* pcrel_offset */ 1393 1394 EMPTY_HOWTO (R_MIPS_TLS_TPREL32), 1395 EMPTY_HOWTO (R_MIPS_TLS_TPREL64), 1396 1397 /* TLS thread pointer offset. */ 1398 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */ 1399 0, /* rightshift */ 1400 2, /* size (0 = byte, 1 = short, 2 = long) */ 1401 16, /* bitsize */ 1402 FALSE, /* pc_relative */ 1403 0, /* bitpos */ 1404 complain_overflow_signed, /* complain_on_overflow */ 1405 _bfd_mips_elf_generic_reloc, /* special_function */ 1406 "R_MIPS_TLS_TPREL_HI16", /* name */ 1407 TRUE, /* partial_inplace */ 1408 0x0000ffff, /* src_mask */ 1409 0x0000ffff, /* dst_mask */ 1410 FALSE), /* pcrel_offset */ 1411 1412 /* TLS thread pointer offset. */ 1413 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */ 1414 0, /* rightshift */ 1415 2, /* size (0 = byte, 1 = short, 2 = long) */ 1416 16, /* bitsize */ 1417 FALSE, /* pc_relative */ 1418 0, /* bitpos */ 1419 complain_overflow_signed, /* complain_on_overflow */ 1420 _bfd_mips_elf_generic_reloc, /* special_function */ 1421 "R_MIPS_TLS_TPREL_LO16", /* name */ 1422 TRUE, /* partial_inplace */ 1423 0x0000ffff, /* src_mask */ 1424 0x0000ffff, /* dst_mask */ 1425 FALSE), /* pcrel_offset */ 1426 }; 1427 1428 static reloc_howto_type mips16_elf64_howto_table_rel[] = 1429 { 1430 /* The reloc used for the mips16 jump instruction. */ 1431 HOWTO (R_MIPS16_26, /* type */ 1432 2, /* rightshift */ 1433 2, /* size (0 = byte, 1 = short, 2 = long) */ 1434 26, /* bitsize */ 1435 FALSE, /* pc_relative */ 1436 0, /* bitpos */ 1437 complain_overflow_dont, /* complain_on_overflow */ 1438 /* This needs complex overflow 1439 detection, because the upper four 1440 bits must match the PC. */ 1441 mips16_jump_reloc, /* special_function */ 1442 "R_MIPS16_26", /* name */ 1443 TRUE, /* partial_inplace */ 1444 0x3ffffff, /* src_mask */ 1445 0x3ffffff, /* dst_mask */ 1446 FALSE), /* pcrel_offset */ 1447 1448 /* The reloc used for the mips16 gprel instruction. */ 1449 HOWTO (R_MIPS16_GPREL, /* type */ 1450 0, /* rightshift */ 1451 2, /* size (0 = byte, 1 = short, 2 = long) */ 1452 16, /* bitsize */ 1453 FALSE, /* pc_relative */ 1454 0, /* bitpos */ 1455 complain_overflow_signed, /* complain_on_overflow */ 1456 mips16_gprel_reloc, /* special_function */ 1457 "R_MIPS16_GPREL", /* name */ 1458 TRUE, /* partial_inplace */ 1459 0x0000ffff, /* src_mask */ 1460 0x0000ffff, /* dst_mask */ 1461 FALSE), /* pcrel_offset */ 1462 1463 /* A placeholder for MIPS16 reference to global offset table. */ 1464 EMPTY_HOWTO (R_MIPS16_GOT16), 1465 1466 /* A placeholder for MIPS16 16 bit call through global offset table. */ 1467 EMPTY_HOWTO (R_MIPS16_CALL16), 1468 1469 /* MIPS16 high 16 bits of symbol value. */ 1470 HOWTO (R_MIPS16_HI16, /* type */ 1471 16, /* rightshift */ 1472 2, /* size (0 = byte, 1 = short, 2 = long) */ 1473 16, /* bitsize */ 1474 FALSE, /* pc_relative */ 1475 0, /* bitpos */ 1476 complain_overflow_dont, /* complain_on_overflow */ 1477 _bfd_mips_elf_hi16_reloc, /* special_function */ 1478 "R_MIPS16_HI16", /* name */ 1479 TRUE, /* partial_inplace */ 1480 0x0000ffff, /* src_mask */ 1481 0x0000ffff, /* dst_mask */ 1482 FALSE), /* pcrel_offset */ 1483 1484 /* MIPS16 low 16 bits of symbol value. */ 1485 HOWTO (R_MIPS16_LO16, /* type */ 1486 0, /* rightshift */ 1487 2, /* size (0 = byte, 1 = short, 2 = long) */ 1488 16, /* bitsize */ 1489 FALSE, /* pc_relative */ 1490 0, /* bitpos */ 1491 complain_overflow_dont, /* complain_on_overflow */ 1492 _bfd_mips_elf_lo16_reloc, /* special_function */ 1493 "R_MIPS16_LO16", /* name */ 1494 TRUE, /* partial_inplace */ 1495 0x0000ffff, /* src_mask */ 1496 0x0000ffff, /* dst_mask */ 1497 FALSE), /* pcrel_offset */ 1498 }; 1499 1500 static reloc_howto_type mips16_elf64_howto_table_rela[] = 1501 { 1502 /* The reloc used for the mips16 jump instruction. */ 1503 HOWTO (R_MIPS16_26, /* type */ 1504 2, /* rightshift */ 1505 2, /* size (0 = byte, 1 = short, 2 = long) */ 1506 26, /* bitsize */ 1507 FALSE, /* pc_relative */ 1508 0, /* bitpos */ 1509 complain_overflow_dont, /* complain_on_overflow */ 1510 /* This needs complex overflow 1511 detection, because the upper four 1512 bits must match the PC. */ 1513 mips16_jump_reloc, /* special_function */ 1514 "R_MIPS16_26", /* name */ 1515 FALSE, /* partial_inplace */ 1516 0x3ffffff, /* src_mask */ 1517 0x3ffffff, /* dst_mask */ 1518 FALSE), /* pcrel_offset */ 1519 1520 /* The reloc used for the mips16 gprel instruction. */ 1521 HOWTO (R_MIPS16_GPREL, /* type */ 1522 0, /* rightshift */ 1523 2, /* size (0 = byte, 1 = short, 2 = long) */ 1524 16, /* bitsize */ 1525 FALSE, /* pc_relative */ 1526 0, /* bitpos */ 1527 complain_overflow_signed, /* complain_on_overflow */ 1528 mips16_gprel_reloc, /* special_function */ 1529 "R_MIPS16_GPREL", /* name */ 1530 FALSE, /* partial_inplace */ 1531 0x0000ffff, /* src_mask */ 1532 0x0000ffff, /* dst_mask */ 1533 FALSE), /* pcrel_offset */ 1534 1535 /* A placeholder for MIPS16 reference to global offset table. */ 1536 EMPTY_HOWTO (R_MIPS16_GOT16), 1537 1538 /* A placeholder for MIPS16 16 bit call through global offset table. */ 1539 EMPTY_HOWTO (R_MIPS16_CALL16), 1540 1541 /* MIPS16 high 16 bits of symbol value. */ 1542 HOWTO (R_MIPS16_HI16, /* type */ 1543 16, /* rightshift */ 1544 2, /* size (0 = byte, 1 = short, 2 = long) */ 1545 16, /* bitsize */ 1546 FALSE, /* pc_relative */ 1547 0, /* bitpos */ 1548 complain_overflow_dont, /* complain_on_overflow */ 1549 _bfd_mips_elf_hi16_reloc, /* special_function */ 1550 "R_MIPS16_HI16", /* name */ 1551 FALSE, /* partial_inplace */ 1552 0x0000ffff, /* src_mask */ 1553 0x0000ffff, /* dst_mask */ 1554 FALSE), /* pcrel_offset */ 1555 1556 /* MIPS16 low 16 bits of symbol value. */ 1557 HOWTO (R_MIPS16_LO16, /* type */ 1558 0, /* rightshift */ 1559 2, /* size (0 = byte, 1 = short, 2 = long) */ 1560 16, /* bitsize */ 1561 FALSE, /* pc_relative */ 1562 0, /* bitpos */ 1563 complain_overflow_dont, /* complain_on_overflow */ 1564 _bfd_mips_elf_lo16_reloc, /* special_function */ 1565 "R_MIPS16_LO16", /* name */ 1566 FALSE, /* partial_inplace */ 1567 0x0000ffff, /* src_mask */ 1568 0x0000ffff, /* dst_mask */ 1569 FALSE), /* pcrel_offset */ 1570 }; 1571 1572 /* GNU extension to record C++ vtable hierarchy */ 1573 static reloc_howto_type elf_mips_gnu_vtinherit_howto = 1574 HOWTO (R_MIPS_GNU_VTINHERIT, /* type */ 1575 0, /* rightshift */ 1576 2, /* size (0 = byte, 1 = short, 2 = long) */ 1577 0, /* bitsize */ 1578 FALSE, /* pc_relative */ 1579 0, /* bitpos */ 1580 complain_overflow_dont, /* complain_on_overflow */ 1581 NULL, /* special_function */ 1582 "R_MIPS_GNU_VTINHERIT", /* name */ 1583 FALSE, /* partial_inplace */ 1584 0, /* src_mask */ 1585 0, /* dst_mask */ 1586 FALSE); /* pcrel_offset */ 1587 1588 /* GNU extension to record C++ vtable member usage */ 1589 static reloc_howto_type elf_mips_gnu_vtentry_howto = 1590 HOWTO (R_MIPS_GNU_VTENTRY, /* type */ 1591 0, /* rightshift */ 1592 2, /* size (0 = byte, 1 = short, 2 = long) */ 1593 0, /* bitsize */ 1594 FALSE, /* pc_relative */ 1595 0, /* bitpos */ 1596 complain_overflow_dont, /* complain_on_overflow */ 1597 _bfd_elf_rel_vtable_reloc_fn, /* special_function */ 1598 "R_MIPS_GNU_VTENTRY", /* name */ 1599 FALSE, /* partial_inplace */ 1600 0, /* src_mask */ 1601 0, /* dst_mask */ 1602 FALSE); /* pcrel_offset */ 1603 1604 /* 16 bit offset for pc-relative branches. */ 1605 static reloc_howto_type elf_mips_gnu_rel16_s2 = 1606 HOWTO (R_MIPS_GNU_REL16_S2, /* type */ 1607 2, /* rightshift */ 1608 2, /* size (0 = byte, 1 = short, 2 = long) */ 1609 16, /* bitsize */ 1610 TRUE, /* pc_relative */ 1611 0, /* bitpos */ 1612 complain_overflow_signed, /* complain_on_overflow */ 1613 _bfd_mips_elf_generic_reloc, /* special_function */ 1614 "R_MIPS_GNU_REL16_S2", /* name */ 1615 TRUE, /* partial_inplace */ 1616 0x0000ffff, /* src_mask */ 1617 0x0000ffff, /* dst_mask */ 1618 TRUE); /* pcrel_offset */ 1619 1620 /* 16 bit offset for pc-relative branches. */ 1621 static reloc_howto_type elf_mips_gnu_rela16_s2 = 1622 HOWTO (R_MIPS_GNU_REL16_S2, /* type */ 1623 2, /* rightshift */ 1624 2, /* size (0 = byte, 1 = short, 2 = long) */ 1625 16, /* bitsize */ 1626 TRUE, /* pc_relative */ 1627 0, /* bitpos */ 1628 complain_overflow_signed, /* complain_on_overflow */ 1629 _bfd_mips_elf_generic_reloc, /* special_function */ 1630 "R_MIPS_GNU_REL16_S2", /* name */ 1631 FALSE, /* partial_inplace */ 1632 0, /* src_mask */ 1633 0x0000ffff, /* dst_mask */ 1634 TRUE); /* pcrel_offset */ 1635 1636 /* 32 bit pc-relative. */ 1637 static reloc_howto_type elf_mips_gnu_pcrel32 = 1638 HOWTO (R_MIPS_PC32, /* type */ 1639 0, /* rightshift */ 1640 2, /* size (0 = byte, 1 = short, 2 = long) */ 1641 32, /* bitsize */ 1642 TRUE, /* pc_relative */ 1643 0, /* bitpos */ 1644 complain_overflow_signed, /* complain_on_overflow */ 1645 _bfd_mips_elf_generic_reloc, /* special_function */ 1646 "R_MIPS_PC32", /* name */ 1647 TRUE, /* partial_inplace */ 1648 0xffffffff, /* src_mask */ 1649 0xffffffff, /* dst_mask */ 1650 TRUE); /* pcrel_offset */ 1651 1652 /* Swap in a MIPS 64-bit Rel reloc. */ 1653 1654 static void 1655 mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src, 1656 Elf64_Mips_Internal_Rela *dst) 1657 { 1658 dst->r_offset = H_GET_64 (abfd, src->r_offset); 1659 dst->r_sym = H_GET_32 (abfd, src->r_sym); 1660 dst->r_ssym = H_GET_8 (abfd, src->r_ssym); 1661 dst->r_type3 = H_GET_8 (abfd, src->r_type3); 1662 dst->r_type2 = H_GET_8 (abfd, src->r_type2); 1663 dst->r_type = H_GET_8 (abfd, src->r_type); 1664 dst->r_addend = 0; 1665 } 1666 1667 /* Swap in a MIPS 64-bit Rela reloc. */ 1668 1669 static void 1670 mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src, 1671 Elf64_Mips_Internal_Rela *dst) 1672 { 1673 dst->r_offset = H_GET_64 (abfd, src->r_offset); 1674 dst->r_sym = H_GET_32 (abfd, src->r_sym); 1675 dst->r_ssym = H_GET_8 (abfd, src->r_ssym); 1676 dst->r_type3 = H_GET_8 (abfd, src->r_type3); 1677 dst->r_type2 = H_GET_8 (abfd, src->r_type2); 1678 dst->r_type = H_GET_8 (abfd, src->r_type); 1679 dst->r_addend = H_GET_S64 (abfd, src->r_addend); 1680 } 1681 1682 /* Swap out a MIPS 64-bit Rel reloc. */ 1683 1684 static void 1685 mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src, 1686 Elf64_Mips_External_Rel *dst) 1687 { 1688 H_PUT_64 (abfd, src->r_offset, dst->r_offset); 1689 H_PUT_32 (abfd, src->r_sym, dst->r_sym); 1690 H_PUT_8 (abfd, src->r_ssym, dst->r_ssym); 1691 H_PUT_8 (abfd, src->r_type3, dst->r_type3); 1692 H_PUT_8 (abfd, src->r_type2, dst->r_type2); 1693 H_PUT_8 (abfd, src->r_type, dst->r_type); 1694 } 1695 1696 /* Swap out a MIPS 64-bit Rela reloc. */ 1697 1698 static void 1699 mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src, 1700 Elf64_Mips_External_Rela *dst) 1701 { 1702 H_PUT_64 (abfd, src->r_offset, dst->r_offset); 1703 H_PUT_32 (abfd, src->r_sym, dst->r_sym); 1704 H_PUT_8 (abfd, src->r_ssym, dst->r_ssym); 1705 H_PUT_8 (abfd, src->r_type3, dst->r_type3); 1706 H_PUT_8 (abfd, src->r_type2, dst->r_type2); 1707 H_PUT_8 (abfd, src->r_type, dst->r_type); 1708 H_PUT_S64 (abfd, src->r_addend, dst->r_addend); 1709 } 1710 1711 /* Swap in a MIPS 64-bit Rel reloc. */ 1712 1713 static void 1714 mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src, 1715 Elf_Internal_Rela *dst) 1716 { 1717 Elf64_Mips_Internal_Rela mirel; 1718 1719 mips_elf64_swap_reloc_in (abfd, 1720 (const Elf64_Mips_External_Rel *) src, 1721 &mirel); 1722 1723 dst[0].r_offset = mirel.r_offset; 1724 dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type); 1725 dst[0].r_addend = 0; 1726 dst[1].r_offset = mirel.r_offset; 1727 dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2); 1728 dst[1].r_addend = 0; 1729 dst[2].r_offset = mirel.r_offset; 1730 dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3); 1731 dst[2].r_addend = 0; 1732 } 1733 1734 /* Swap in a MIPS 64-bit Rela reloc. */ 1735 1736 static void 1737 mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src, 1738 Elf_Internal_Rela *dst) 1739 { 1740 Elf64_Mips_Internal_Rela mirela; 1741 1742 mips_elf64_swap_reloca_in (abfd, 1743 (const Elf64_Mips_External_Rela *) src, 1744 &mirela); 1745 1746 dst[0].r_offset = mirela.r_offset; 1747 dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type); 1748 dst[0].r_addend = mirela.r_addend; 1749 dst[1].r_offset = mirela.r_offset; 1750 dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2); 1751 dst[1].r_addend = 0; 1752 dst[2].r_offset = mirela.r_offset; 1753 dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3); 1754 dst[2].r_addend = 0; 1755 } 1756 1757 /* Swap out a MIPS 64-bit Rel reloc. */ 1758 1759 static void 1760 mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src, 1761 bfd_byte *dst) 1762 { 1763 Elf64_Mips_Internal_Rela mirel; 1764 1765 mirel.r_offset = src[0].r_offset; 1766 BFD_ASSERT(src[0].r_offset == src[1].r_offset); 1767 1768 mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info); 1769 mirel.r_sym = ELF64_R_SYM (src[0].r_info); 1770 mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info); 1771 mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info); 1772 mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info); 1773 1774 mips_elf64_swap_reloc_out (abfd, &mirel, 1775 (Elf64_Mips_External_Rel *) dst); 1776 } 1777 1778 /* Swap out a MIPS 64-bit Rela reloc. */ 1779 1780 static void 1781 mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src, 1782 bfd_byte *dst) 1783 { 1784 Elf64_Mips_Internal_Rela mirela; 1785 1786 mirela.r_offset = src[0].r_offset; 1787 BFD_ASSERT(src[0].r_offset == src[1].r_offset); 1788 BFD_ASSERT(src[0].r_offset == src[2].r_offset); 1789 1790 mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info); 1791 mirela.r_sym = ELF64_R_SYM (src[0].r_info); 1792 mirela.r_addend = src[0].r_addend; 1793 BFD_ASSERT(src[1].r_addend == 0); 1794 BFD_ASSERT(src[2].r_addend == 0); 1795 1796 mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info); 1797 mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info); 1798 mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info); 1799 1800 mips_elf64_swap_reloca_out (abfd, &mirela, 1801 (Elf64_Mips_External_Rela *) dst); 1802 } 1803 1804 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a 1805 dangerous relocation. */ 1806 1807 static bfd_boolean 1808 mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp) 1809 { 1810 unsigned int count; 1811 asymbol **sym; 1812 unsigned int i; 1813 1814 /* If we've already figured out what GP will be, just return it. */ 1815 *pgp = _bfd_get_gp_value (output_bfd); 1816 if (*pgp) 1817 return TRUE; 1818 1819 count = bfd_get_symcount (output_bfd); 1820 sym = bfd_get_outsymbols (output_bfd); 1821 1822 /* The linker script will have created a symbol named `_gp' with the 1823 appropriate value. */ 1824 if (sym == NULL) 1825 i = count; 1826 else 1827 { 1828 for (i = 0; i < count; i++, sym++) 1829 { 1830 register const char *name; 1831 1832 name = bfd_asymbol_name (*sym); 1833 if (*name == '_' && strcmp (name, "_gp") == 0) 1834 { 1835 *pgp = bfd_asymbol_value (*sym); 1836 _bfd_set_gp_value (output_bfd, *pgp); 1837 break; 1838 } 1839 } 1840 } 1841 1842 if (i >= count) 1843 { 1844 /* Only get the error once. */ 1845 *pgp = 4; 1846 _bfd_set_gp_value (output_bfd, *pgp); 1847 return FALSE; 1848 } 1849 1850 return TRUE; 1851 } 1852 1853 /* We have to figure out the gp value, so that we can adjust the 1854 symbol value correctly. We look up the symbol _gp in the output 1855 BFD. If we can't find it, we're stuck. We cache it in the ELF 1856 target data. We don't need to adjust the symbol value for an 1857 external symbol if we are producing relocatable output. */ 1858 1859 static bfd_reloc_status_type 1860 mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 1861 char **error_message, bfd_vma *pgp) 1862 { 1863 if (bfd_is_und_section (symbol->section) 1864 && ! relocatable) 1865 { 1866 *pgp = 0; 1867 return bfd_reloc_undefined; 1868 } 1869 1870 *pgp = _bfd_get_gp_value (output_bfd); 1871 if (*pgp == 0 1872 && (! relocatable 1873 || (symbol->flags & BSF_SECTION_SYM) != 0)) 1874 { 1875 if (relocatable) 1876 { 1877 /* Make up a value. */ 1878 *pgp = symbol->section->output_section->vma /*+ 0x4000*/; 1879 _bfd_set_gp_value (output_bfd, *pgp); 1880 } 1881 else if (!mips_elf64_assign_gp (output_bfd, pgp)) 1882 { 1883 *error_message = 1884 (char *) _("GP relative relocation when _gp not defined"); 1885 return bfd_reloc_dangerous; 1886 } 1887 } 1888 1889 return bfd_reloc_ok; 1890 } 1891 1892 /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must 1893 become the offset from the gp register. */ 1894 1895 static bfd_reloc_status_type 1896 mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1897 void *data, asection *input_section, bfd *output_bfd, 1898 char **error_message) 1899 { 1900 bfd_boolean relocatable; 1901 bfd_reloc_status_type ret; 1902 bfd_vma gp; 1903 1904 /* If we're relocating, and this is an external symbol, we don't want 1905 to change anything. */ 1906 if (output_bfd != NULL 1907 && (symbol->flags & BSF_SECTION_SYM) == 0 1908 && (symbol->flags & BSF_LOCAL) != 0) 1909 { 1910 reloc_entry->address += input_section->output_offset; 1911 return bfd_reloc_ok; 1912 } 1913 1914 if (output_bfd != NULL) 1915 relocatable = TRUE; 1916 else 1917 { 1918 relocatable = FALSE; 1919 output_bfd = symbol->section->output_section->owner; 1920 } 1921 1922 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message, 1923 &gp); 1924 if (ret != bfd_reloc_ok) 1925 return ret; 1926 1927 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 1928 input_section, relocatable, 1929 data, gp); 1930 } 1931 1932 /* Do a R_MIPS_LITERAL relocation. */ 1933 1934 static bfd_reloc_status_type 1935 mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1936 void *data, asection *input_section, bfd *output_bfd, 1937 char **error_message) 1938 { 1939 bfd_boolean relocatable; 1940 bfd_reloc_status_type ret; 1941 bfd_vma gp; 1942 1943 /* R_MIPS_LITERAL relocations are defined for local symbols only. */ 1944 if (output_bfd != NULL 1945 && (symbol->flags & BSF_SECTION_SYM) == 0 1946 && (symbol->flags & BSF_LOCAL) != 0) 1947 { 1948 *error_message = (char *) 1949 _("literal relocation occurs for an external symbol"); 1950 return bfd_reloc_outofrange; 1951 } 1952 1953 /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */ 1954 if (output_bfd != NULL) 1955 relocatable = TRUE; 1956 else 1957 { 1958 relocatable = FALSE; 1959 output_bfd = symbol->section->output_section->owner; 1960 } 1961 1962 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message, 1963 &gp); 1964 if (ret != bfd_reloc_ok) 1965 return ret; 1966 1967 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 1968 input_section, relocatable, 1969 data, gp); 1970 } 1971 1972 /* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must 1973 become the offset from the gp register. */ 1974 1975 static bfd_reloc_status_type 1976 mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1977 void *data, asection *input_section, bfd *output_bfd, 1978 char **error_message) 1979 { 1980 bfd_boolean relocatable; 1981 bfd_reloc_status_type ret; 1982 bfd_vma gp; 1983 bfd_vma relocation; 1984 bfd_vma val; 1985 1986 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */ 1987 if (output_bfd != NULL 1988 && (symbol->flags & BSF_SECTION_SYM) == 0 1989 && (symbol->flags & BSF_LOCAL) != 0) 1990 { 1991 *error_message = (char *) 1992 _("32bits gp relative relocation occurs for an external symbol"); 1993 return bfd_reloc_outofrange; 1994 } 1995 1996 if (output_bfd != NULL) 1997 relocatable = TRUE; 1998 else 1999 { 2000 relocatable = FALSE; 2001 output_bfd = symbol->section->output_section->owner; 2002 } 2003 2004 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, 2005 error_message, &gp); 2006 if (ret != bfd_reloc_ok) 2007 return ret; 2008 2009 if (bfd_is_com_section (symbol->section)) 2010 relocation = 0; 2011 else 2012 relocation = symbol->value; 2013 2014 relocation += symbol->section->output_section->vma; 2015 relocation += symbol->section->output_offset; 2016 2017 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) 2018 return bfd_reloc_outofrange; 2019 2020 /* Set val to the offset into the section or symbol. */ 2021 val = reloc_entry->addend; 2022 2023 if (reloc_entry->howto->partial_inplace) 2024 val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); 2025 2026 /* Adjust val for the final section location and GP value. If we 2027 are producing relocatable output, we don't want to do this for 2028 an external symbol. */ 2029 if (! relocatable 2030 || (symbol->flags & BSF_SECTION_SYM) != 0) 2031 val += relocation - gp; 2032 2033 if (reloc_entry->howto->partial_inplace) 2034 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address); 2035 else 2036 reloc_entry->addend = val; 2037 2038 if (relocatable) 2039 reloc_entry->address += input_section->output_offset; 2040 2041 return bfd_reloc_ok; 2042 } 2043 2044 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2, 2045 the rest is at bits 6-10. The bitpos already got right by the howto. */ 2046 2047 static bfd_reloc_status_type 2048 mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 2049 void *data, asection *input_section, bfd *output_bfd, 2050 char **error_message) 2051 { 2052 if (reloc_entry->howto->partial_inplace) 2053 { 2054 reloc_entry->addend = ((reloc_entry->addend & 0x00007c0) 2055 | (reloc_entry->addend & 0x00000800) >> 9); 2056 } 2057 2058 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data, 2059 input_section, output_bfd, 2060 error_message); 2061 } 2062 2063 /* Handle a mips16 jump. */ 2064 2065 static bfd_reloc_status_type 2066 mips16_jump_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 2067 asymbol *symbol, void *data ATTRIBUTE_UNUSED, 2068 asection *input_section, bfd *output_bfd, 2069 char **error_message ATTRIBUTE_UNUSED) 2070 { 2071 if (output_bfd != NULL 2072 && (symbol->flags & BSF_SECTION_SYM) == 0 2073 && (! reloc_entry->howto->partial_inplace 2074 || reloc_entry->addend == 0)) 2075 { 2076 reloc_entry->address += input_section->output_offset; 2077 return bfd_reloc_ok; 2078 } 2079 2080 /* FIXME. */ 2081 { 2082 static bfd_boolean warned; 2083 2084 if (! warned) 2085 (*_bfd_error_handler) 2086 (_("Linking mips16 objects into %s format is not supported"), 2087 bfd_get_target (input_section->output_section->owner)); 2088 warned = TRUE; 2089 } 2090 2091 return bfd_reloc_undefined; 2092 } 2093 2094 /* Handle a mips16 GP relative reloc. */ 2095 2096 static bfd_reloc_status_type 2097 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 2098 void *data, asection *input_section, bfd *output_bfd, 2099 char **error_message) 2100 { 2101 bfd_boolean relocatable; 2102 bfd_reloc_status_type ret; 2103 bfd_byte *location; 2104 bfd_vma gp; 2105 2106 /* If we're relocating, and this is an external symbol, we don't want 2107 to change anything. */ 2108 if (output_bfd != NULL 2109 && (symbol->flags & BSF_SECTION_SYM) == 0 2110 && (symbol->flags & BSF_LOCAL) != 0) 2111 { 2112 reloc_entry->address += input_section->output_offset; 2113 return bfd_reloc_ok; 2114 } 2115 2116 if (output_bfd != NULL) 2117 relocatable = TRUE; 2118 else 2119 { 2120 relocatable = FALSE; 2121 output_bfd = symbol->section->output_section->owner; 2122 } 2123 2124 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message, 2125 &gp); 2126 if (ret != bfd_reloc_ok) 2127 return ret; 2128 2129 location = (bfd_byte *) data + reloc_entry->address; 2130 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE, 2131 location); 2132 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 2133 input_section, relocatable, 2134 data, gp); 2135 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable, 2136 location); 2137 2138 return ret; 2139 } 2140 2141 /* A mapping from BFD reloc types to MIPS ELF reloc types. */ 2142 2143 struct elf_reloc_map { 2144 bfd_reloc_code_real_type bfd_val; 2145 enum elf_mips_reloc_type elf_val; 2146 }; 2147 2148 static const struct elf_reloc_map mips_reloc_map[] = 2149 { 2150 { BFD_RELOC_NONE, R_MIPS_NONE }, 2151 { BFD_RELOC_16, R_MIPS_16 }, 2152 { BFD_RELOC_32, R_MIPS_32 }, 2153 /* There is no BFD reloc for R_MIPS_REL32. */ 2154 { BFD_RELOC_64, R_MIPS_64 }, 2155 { BFD_RELOC_CTOR, R_MIPS_64 }, 2156 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 }, 2157 { BFD_RELOC_HI16_S, R_MIPS_HI16 }, 2158 { BFD_RELOC_LO16, R_MIPS_LO16 }, 2159 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 }, 2160 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 }, 2161 { BFD_RELOC_MIPS_JMP, R_MIPS_26 }, 2162 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL }, 2163 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 }, 2164 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 }, 2165 { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 }, 2166 { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 }, 2167 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP }, 2168 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE }, 2169 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST }, 2170 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 }, 2171 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 }, 2172 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB }, 2173 { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A }, 2174 { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B }, 2175 { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE }, 2176 { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST }, 2177 { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER }, 2178 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 }, 2179 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 }, 2180 { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP }, 2181 { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 }, 2182 /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */ 2183 { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT }, 2184 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR }, 2185 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 }, 2186 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 }, 2187 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 }, 2188 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 }, 2189 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD }, 2190 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM }, 2191 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 }, 2192 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 }, 2193 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL }, 2194 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 }, 2195 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 }, 2196 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 }, 2197 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 } 2198 }; 2199 2200 static const struct elf_reloc_map mips16_reloc_map[] = 2201 { 2202 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min }, 2203 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min }, 2204 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min }, 2205 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min }, 2206 }; 2207 2208 /* Given a BFD reloc type, return a howto structure. */ 2209 2210 static reloc_howto_type * 2211 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 2212 bfd_reloc_code_real_type code) 2213 { 2214 unsigned int i; 2215 /* FIXME: We default to RELA here instead of choosing the right 2216 relocation variant. */ 2217 reloc_howto_type *howto_table = mips_elf64_howto_table_rela; 2218 reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela; 2219 2220 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); 2221 i++) 2222 { 2223 if (mips_reloc_map[i].bfd_val == code) 2224 return &howto_table[(int) mips_reloc_map[i].elf_val]; 2225 } 2226 2227 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map); 2228 i++) 2229 { 2230 if (mips16_reloc_map[i].bfd_val == code) 2231 return &howto16_table[(int) mips16_reloc_map[i].elf_val]; 2232 } 2233 2234 switch (code) 2235 { 2236 case BFD_RELOC_VTABLE_INHERIT: 2237 return &elf_mips_gnu_vtinherit_howto; 2238 case BFD_RELOC_VTABLE_ENTRY: 2239 return &elf_mips_gnu_vtentry_howto; 2240 case BFD_RELOC_32_PCREL: 2241 return &elf_mips_gnu_pcrel32; 2242 default: 2243 bfd_set_error (bfd_error_bad_value); 2244 return NULL; 2245 } 2246 } 2247 2248 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */ 2249 2250 static reloc_howto_type * 2251 mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p) 2252 { 2253 switch (r_type) 2254 { 2255 case R_MIPS_GNU_VTINHERIT: 2256 return &elf_mips_gnu_vtinherit_howto; 2257 case R_MIPS_GNU_VTENTRY: 2258 return &elf_mips_gnu_vtentry_howto; 2259 case R_MIPS_GNU_REL16_S2: 2260 if (rela_p) 2261 return &elf_mips_gnu_rela16_s2; 2262 else 2263 return &elf_mips_gnu_rel16_s2; 2264 case R_MIPS_PC32: 2265 return &elf_mips_gnu_pcrel32; 2266 default: 2267 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) 2268 { 2269 if (rela_p) 2270 return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min]; 2271 else 2272 return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min]; 2273 } 2274 BFD_ASSERT (r_type < (unsigned int) R_MIPS_max); 2275 if (rela_p) 2276 return &mips_elf64_howto_table_rela[r_type]; 2277 else 2278 return &mips_elf64_howto_table_rel[r_type]; 2279 break; 2280 } 2281 } 2282 2283 /* Prevent relocation handling by bfd for MIPS ELF64. */ 2284 2285 static void 2286 mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, 2287 arelent *cache_ptr ATTRIBUTE_UNUSED, 2288 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED) 2289 { 2290 BFD_ASSERT (0); 2291 } 2292 2293 static void 2294 mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, 2295 arelent *cache_ptr ATTRIBUTE_UNUSED, 2296 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED) 2297 { 2298 BFD_ASSERT (0); 2299 } 2300 2301 /* Since each entry in an SHT_REL or SHT_RELA section can represent up 2302 to three relocs, we must tell the user to allocate more space. */ 2303 2304 static long 2305 mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) 2306 { 2307 return (sec->reloc_count * 3 + 1) * sizeof (arelent *); 2308 } 2309 2310 static long 2311 mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd) 2312 { 2313 return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3; 2314 } 2315 2316 /* We must also copy more relocations than the corresponding functions 2317 in elf.c would, so the two following functions are slightly 2318 modified from elf.c, that multiply the external relocation count by 2319 3 to obtain the internal relocation count. */ 2320 2321 static long 2322 mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section, 2323 arelent **relptr, asymbol **symbols) 2324 { 2325 arelent *tblptr; 2326 unsigned int i; 2327 const struct elf_backend_data *bed = get_elf_backend_data (abfd); 2328 2329 if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE)) 2330 return -1; 2331 2332 tblptr = section->relocation; 2333 for (i = 0; i < section->reloc_count * 3; i++) 2334 *relptr++ = tblptr++; 2335 2336 *relptr = NULL; 2337 2338 return section->reloc_count * 3; 2339 } 2340 2341 static long 2342 mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage, 2343 asymbol **syms) 2344 { 2345 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean); 2346 asection *s; 2347 long ret; 2348 2349 if (elf_dynsymtab (abfd) == 0) 2350 { 2351 bfd_set_error (bfd_error_invalid_operation); 2352 return -1; 2353 } 2354 2355 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table; 2356 ret = 0; 2357 for (s = abfd->sections; s != NULL; s = s->next) 2358 { 2359 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd) 2360 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL 2361 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)) 2362 { 2363 arelent *p; 2364 long count, i; 2365 2366 if (! (*slurp_relocs) (abfd, s, syms, TRUE)) 2367 return -1; 2368 count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3; 2369 p = s->relocation; 2370 for (i = 0; i < count; i++) 2371 *storage++ = p++; 2372 ret += count; 2373 } 2374 } 2375 2376 *storage = NULL; 2377 2378 return ret; 2379 } 2380 2381 /* Read the relocations from one reloc section. This is mostly copied 2382 from elfcode.h, except for the changes to expand one external 2383 relocation to 3 internal ones. We must unfortunately set 2384 reloc_count to the number of external relocations, because a lot of 2385 generic code seems to depend on this. */ 2386 2387 static bfd_boolean 2388 mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect, 2389 Elf_Internal_Shdr *rel_hdr, 2390 bfd_size_type reloc_count, 2391 arelent *relents, asymbol **symbols, 2392 bfd_boolean dynamic) 2393 { 2394 void *allocated; 2395 bfd_byte *native_relocs; 2396 arelent *relent; 2397 bfd_vma i; 2398 int entsize; 2399 bfd_boolean rela_p; 2400 2401 allocated = bfd_malloc (rel_hdr->sh_size); 2402 if (allocated == NULL) 2403 return FALSE; 2404 2405 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0 2406 || (bfd_bread (allocated, rel_hdr->sh_size, abfd) 2407 != rel_hdr->sh_size)) 2408 goto error_return; 2409 2410 native_relocs = allocated; 2411 2412 entsize = rel_hdr->sh_entsize; 2413 BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel) 2414 || entsize == sizeof (Elf64_Mips_External_Rela)); 2415 2416 if (entsize == sizeof (Elf64_Mips_External_Rel)) 2417 rela_p = FALSE; 2418 else 2419 rela_p = TRUE; 2420 2421 for (i = 0, relent = relents; 2422 i < reloc_count; 2423 i++, native_relocs += entsize) 2424 { 2425 Elf64_Mips_Internal_Rela rela; 2426 bfd_boolean used_sym, used_ssym; 2427 int ir; 2428 2429 if (entsize == sizeof (Elf64_Mips_External_Rela)) 2430 mips_elf64_swap_reloca_in (abfd, 2431 (Elf64_Mips_External_Rela *) native_relocs, 2432 &rela); 2433 else 2434 mips_elf64_swap_reloc_in (abfd, 2435 (Elf64_Mips_External_Rel *) native_relocs, 2436 &rela); 2437 2438 /* Each entry represents exactly three actual relocations. */ 2439 2440 used_sym = FALSE; 2441 used_ssym = FALSE; 2442 for (ir = 0; ir < 3; ir++) 2443 { 2444 enum elf_mips_reloc_type type; 2445 2446 switch (ir) 2447 { 2448 default: 2449 abort (); 2450 case 0: 2451 type = (enum elf_mips_reloc_type) rela.r_type; 2452 break; 2453 case 1: 2454 type = (enum elf_mips_reloc_type) rela.r_type2; 2455 break; 2456 case 2: 2457 type = (enum elf_mips_reloc_type) rela.r_type3; 2458 break; 2459 } 2460 2461 /* Some types require symbols, whereas some do not. */ 2462 switch (type) 2463 { 2464 case R_MIPS_NONE: 2465 case R_MIPS_LITERAL: 2466 case R_MIPS_INSERT_A: 2467 case R_MIPS_INSERT_B: 2468 case R_MIPS_DELETE: 2469 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 2470 break; 2471 2472 default: 2473 if (! used_sym) 2474 { 2475 if (rela.r_sym == 0) 2476 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 2477 else 2478 { 2479 asymbol **ps, *s; 2480 2481 ps = symbols + rela.r_sym - 1; 2482 s = *ps; 2483 if ((s->flags & BSF_SECTION_SYM) == 0) 2484 relent->sym_ptr_ptr = ps; 2485 else 2486 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr; 2487 } 2488 2489 used_sym = TRUE; 2490 } 2491 else if (! used_ssym) 2492 { 2493 switch (rela.r_ssym) 2494 { 2495 case RSS_UNDEF: 2496 relent->sym_ptr_ptr = 2497 bfd_abs_section_ptr->symbol_ptr_ptr; 2498 break; 2499 2500 case RSS_GP: 2501 case RSS_GP0: 2502 case RSS_LOC: 2503 /* FIXME: I think these need to be handled using 2504 special howto structures. */ 2505 BFD_ASSERT (0); 2506 break; 2507 2508 default: 2509 BFD_ASSERT (0); 2510 break; 2511 } 2512 2513 used_ssym = TRUE; 2514 } 2515 else 2516 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 2517 2518 break; 2519 } 2520 2521 /* The address of an ELF reloc is section relative for an 2522 object file, and absolute for an executable file or 2523 shared library. The address of a BFD reloc is always 2524 section relative. */ 2525 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic) 2526 relent->address = rela.r_offset; 2527 else 2528 relent->address = rela.r_offset - asect->vma; 2529 2530 relent->addend = rela.r_addend; 2531 2532 relent->howto = mips_elf64_rtype_to_howto (type, rela_p); 2533 2534 ++relent; 2535 } 2536 } 2537 2538 asect->reloc_count += (relent - relents) / 3; 2539 2540 if (allocated != NULL) 2541 free (allocated); 2542 2543 return TRUE; 2544 2545 error_return: 2546 if (allocated != NULL) 2547 free (allocated); 2548 return FALSE; 2549 } 2550 2551 /* Read the relocations. On Irix 6, there can be two reloc sections 2552 associated with a single data section. This is copied from 2553 elfcode.h as well, with changes as small as accounting for 3 2554 internal relocs per external reloc and resetting reloc_count to 2555 zero before processing the relocs of a section. */ 2556 2557 static bfd_boolean 2558 mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect, 2559 asymbol **symbols, bfd_boolean dynamic) 2560 { 2561 struct bfd_elf_section_data * const d = elf_section_data (asect); 2562 Elf_Internal_Shdr *rel_hdr; 2563 Elf_Internal_Shdr *rel_hdr2; 2564 bfd_size_type reloc_count; 2565 bfd_size_type reloc_count2; 2566 arelent *relents; 2567 bfd_size_type amt; 2568 2569 if (asect->relocation != NULL) 2570 return TRUE; 2571 2572 if (! dynamic) 2573 { 2574 if ((asect->flags & SEC_RELOC) == 0 2575 || asect->reloc_count == 0) 2576 return TRUE; 2577 2578 rel_hdr = &d->rel_hdr; 2579 reloc_count = NUM_SHDR_ENTRIES (rel_hdr); 2580 rel_hdr2 = d->rel_hdr2; 2581 reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0); 2582 2583 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2); 2584 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset 2585 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset)); 2586 2587 } 2588 else 2589 { 2590 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this 2591 case because relocations against this section may use the 2592 dynamic symbol table, and in that case bfd_section_from_shdr 2593 in elf.c does not update the RELOC_COUNT. */ 2594 if (asect->size == 0) 2595 return TRUE; 2596 2597 rel_hdr = &d->this_hdr; 2598 reloc_count = NUM_SHDR_ENTRIES (rel_hdr); 2599 rel_hdr2 = NULL; 2600 reloc_count2 = 0; 2601 } 2602 2603 /* Allocate space for 3 arelent structures for each Rel structure. */ 2604 amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent); 2605 relents = bfd_alloc (abfd, amt); 2606 if (relents == NULL) 2607 return FALSE; 2608 2609 /* The slurp_one_reloc_table routine increments reloc_count. */ 2610 asect->reloc_count = 0; 2611 2612 if (! mips_elf64_slurp_one_reloc_table (abfd, asect, 2613 rel_hdr, reloc_count, 2614 relents, 2615 symbols, dynamic)) 2616 return FALSE; 2617 if (d->rel_hdr2 != NULL) 2618 { 2619 if (! mips_elf64_slurp_one_reloc_table (abfd, asect, 2620 rel_hdr2, reloc_count2, 2621 relents + reloc_count * 3, 2622 symbols, dynamic)) 2623 return FALSE; 2624 } 2625 2626 asect->relocation = relents; 2627 return TRUE; 2628 } 2629 2630 /* Write out the relocations. */ 2631 2632 static void 2633 mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data) 2634 { 2635 bfd_boolean *failedp = data; 2636 int count; 2637 Elf_Internal_Shdr *rel_hdr; 2638 unsigned int idx; 2639 2640 /* If we have already failed, don't do anything. */ 2641 if (*failedp) 2642 return; 2643 2644 if ((sec->flags & SEC_RELOC) == 0) 2645 return; 2646 2647 /* The linker backend writes the relocs out itself, and sets the 2648 reloc_count field to zero to inhibit writing them here. Also, 2649 sometimes the SEC_RELOC flag gets set even when there aren't any 2650 relocs. */ 2651 if (sec->reloc_count == 0) 2652 return; 2653 2654 /* We can combine up to three relocs that refer to the same address 2655 if the latter relocs have no associated symbol. */ 2656 count = 0; 2657 for (idx = 0; idx < sec->reloc_count; idx++) 2658 { 2659 bfd_vma addr; 2660 unsigned int i; 2661 2662 ++count; 2663 2664 addr = sec->orelocation[idx]->address; 2665 for (i = 0; i < 2; i++) 2666 { 2667 arelent *r; 2668 2669 if (idx + 1 >= sec->reloc_count) 2670 break; 2671 r = sec->orelocation[idx + 1]; 2672 if (r->address != addr 2673 || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section) 2674 || (*r->sym_ptr_ptr)->value != 0) 2675 break; 2676 2677 /* We can merge the reloc at IDX + 1 with the reloc at IDX. */ 2678 2679 ++idx; 2680 } 2681 } 2682 2683 rel_hdr = &elf_section_data (sec)->rel_hdr; 2684 2685 /* Do the actual relocation. */ 2686 2687 if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel)) 2688 mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data); 2689 else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela)) 2690 mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data); 2691 else 2692 BFD_ASSERT (0); 2693 } 2694 2695 static void 2696 mips_elf64_write_rel (bfd *abfd, asection *sec, 2697 Elf_Internal_Shdr *rel_hdr, 2698 int *count, void *data) 2699 { 2700 bfd_boolean *failedp = data; 2701 Elf64_Mips_External_Rel *ext_rel; 2702 unsigned int idx; 2703 asymbol *last_sym = 0; 2704 int last_sym_idx = 0; 2705 2706 rel_hdr->sh_size = rel_hdr->sh_entsize * *count; 2707 rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size); 2708 if (rel_hdr->contents == NULL) 2709 { 2710 *failedp = TRUE; 2711 return; 2712 } 2713 2714 ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents; 2715 for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++) 2716 { 2717 arelent *ptr; 2718 Elf64_Mips_Internal_Rela int_rel; 2719 asymbol *sym; 2720 int n; 2721 unsigned int i; 2722 2723 ptr = sec->orelocation[idx]; 2724 2725 /* The address of an ELF reloc is section relative for an object 2726 file, and absolute for an executable file or shared library. 2727 The address of a BFD reloc is always section relative. */ 2728 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) 2729 int_rel.r_offset = ptr->address; 2730 else 2731 int_rel.r_offset = ptr->address + sec->vma; 2732 2733 sym = *ptr->sym_ptr_ptr; 2734 if (sym == last_sym) 2735 n = last_sym_idx; 2736 else if (bfd_is_abs_section (sym->section) && sym->value == 0) 2737 n = STN_UNDEF; 2738 else 2739 { 2740 last_sym = sym; 2741 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); 2742 if (n < 0) 2743 { 2744 *failedp = TRUE; 2745 return; 2746 } 2747 last_sym_idx = n; 2748 } 2749 2750 int_rel.r_sym = n; 2751 int_rel.r_ssym = RSS_UNDEF; 2752 2753 if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec 2754 && ! _bfd_elf_validate_reloc (abfd, ptr)) 2755 { 2756 *failedp = TRUE; 2757 return; 2758 } 2759 2760 int_rel.r_type = ptr->howto->type; 2761 int_rel.r_type2 = (int) R_MIPS_NONE; 2762 int_rel.r_type3 = (int) R_MIPS_NONE; 2763 2764 for (i = 0; i < 2; i++) 2765 { 2766 arelent *r; 2767 2768 if (idx + 1 >= sec->reloc_count) 2769 break; 2770 r = sec->orelocation[idx + 1]; 2771 if (r->address != ptr->address 2772 || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section) 2773 || (*r->sym_ptr_ptr)->value != 0) 2774 break; 2775 2776 /* We can merge the reloc at IDX + 1 with the reloc at IDX. */ 2777 2778 if (i == 0) 2779 int_rel.r_type2 = r->howto->type; 2780 else 2781 int_rel.r_type3 = r->howto->type; 2782 2783 ++idx; 2784 } 2785 2786 mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel); 2787 } 2788 2789 BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents 2790 == *count); 2791 } 2792 2793 static void 2794 mips_elf64_write_rela (bfd *abfd, asection *sec, 2795 Elf_Internal_Shdr *rela_hdr, 2796 int *count, void *data) 2797 { 2798 bfd_boolean *failedp = data; 2799 Elf64_Mips_External_Rela *ext_rela; 2800 unsigned int idx; 2801 asymbol *last_sym = 0; 2802 int last_sym_idx = 0; 2803 2804 rela_hdr->sh_size = rela_hdr->sh_entsize * *count; 2805 rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size); 2806 if (rela_hdr->contents == NULL) 2807 { 2808 *failedp = TRUE; 2809 return; 2810 } 2811 2812 ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents; 2813 for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++) 2814 { 2815 arelent *ptr; 2816 Elf64_Mips_Internal_Rela int_rela; 2817 asymbol *sym; 2818 int n; 2819 unsigned int i; 2820 2821 ptr = sec->orelocation[idx]; 2822 2823 /* The address of an ELF reloc is section relative for an object 2824 file, and absolute for an executable file or shared library. 2825 The address of a BFD reloc is always section relative. */ 2826 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) 2827 int_rela.r_offset = ptr->address; 2828 else 2829 int_rela.r_offset = ptr->address + sec->vma; 2830 2831 sym = *ptr->sym_ptr_ptr; 2832 if (sym == last_sym) 2833 n = last_sym_idx; 2834 else if (bfd_is_abs_section (sym->section) && sym->value == 0) 2835 n = STN_UNDEF; 2836 else 2837 { 2838 last_sym = sym; 2839 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); 2840 if (n < 0) 2841 { 2842 *failedp = TRUE; 2843 return; 2844 } 2845 last_sym_idx = n; 2846 } 2847 2848 int_rela.r_sym = n; 2849 int_rela.r_addend = ptr->addend; 2850 int_rela.r_ssym = RSS_UNDEF; 2851 2852 if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec 2853 && ! _bfd_elf_validate_reloc (abfd, ptr)) 2854 { 2855 *failedp = TRUE; 2856 return; 2857 } 2858 2859 int_rela.r_type = ptr->howto->type; 2860 int_rela.r_type2 = (int) R_MIPS_NONE; 2861 int_rela.r_type3 = (int) R_MIPS_NONE; 2862 2863 for (i = 0; i < 2; i++) 2864 { 2865 arelent *r; 2866 2867 if (idx + 1 >= sec->reloc_count) 2868 break; 2869 r = sec->orelocation[idx + 1]; 2870 if (r->address != ptr->address 2871 || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section) 2872 || (*r->sym_ptr_ptr)->value != 0) 2873 break; 2874 2875 /* We can merge the reloc at IDX + 1 with the reloc at IDX. */ 2876 2877 if (i == 0) 2878 int_rela.r_type2 = r->howto->type; 2879 else 2880 int_rela.r_type3 = r->howto->type; 2881 2882 ++idx; 2883 } 2884 2885 mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela); 2886 } 2887 2888 BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents 2889 == *count); 2890 } 2891 2892 /* Set the right machine number for a MIPS ELF file. */ 2893 2894 static bfd_boolean 2895 mips_elf64_object_p (bfd *abfd) 2896 { 2897 unsigned long mach; 2898 2899 /* Irix 6 is broken. Object file symbol tables are not always 2900 sorted correctly such that local symbols precede global symbols, 2901 and the sh_info field in the symbol table is not always right. */ 2902 if (elf64_mips_irix_compat (abfd) != ict_none) 2903 elf_bad_symtab (abfd) = TRUE; 2904 2905 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags); 2906 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach); 2907 return TRUE; 2908 } 2909 2910 /* Depending on the target vector we generate some version of Irix 2911 executables or "normal" MIPS ELF ABI executables. */ 2912 static irix_compat_t 2913 elf64_mips_irix_compat (bfd *abfd) 2914 { 2915 if ((abfd->xvec == &bfd_elf64_bigmips_vec) 2916 || (abfd->xvec == &bfd_elf64_littlemips_vec)) 2917 return ict_irix6; 2918 else 2919 return ict_none; 2920 } 2921 2922 /* Support for core dump NOTE sections. */ 2923 static bfd_boolean 2924 elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 2925 { 2926 int offset; 2927 unsigned int size; 2928 2929 switch (note->descsz) 2930 { 2931 default: 2932 return FALSE; 2933 2934 case 480: /* Linux/MIPS - N64 kernel */ 2935 /* pr_cursig */ 2936 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); 2937 2938 /* pr_pid */ 2939 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32); 2940 2941 /* pr_reg */ 2942 offset = 112; 2943 size = 360; 2944 2945 break; 2946 } 2947 2948 /* Make a ".reg/999" section. */ 2949 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 2950 size, note->descpos + offset); 2951 } 2952 2953 static bfd_boolean 2954 elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 2955 { 2956 switch (note->descsz) 2957 { 2958 default: 2959 return FALSE; 2960 2961 case 136: /* Linux/MIPS - N64 kernel elf_prpsinfo */ 2962 elf_tdata (abfd)->core_program 2963 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16); 2964 elf_tdata (abfd)->core_command 2965 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80); 2966 } 2967 2968 /* Note that for some reason, a spurious space is tacked 2969 onto the end of the args in some (at least one anyway) 2970 implementations, so strip it off if it exists. */ 2971 2972 { 2973 char *command = elf_tdata (abfd)->core_command; 2974 int n = strlen (command); 2975 2976 if (0 < n && command[n - 1] == ' ') 2977 command[n - 1] = '\0'; 2978 } 2979 2980 return TRUE; 2981 } 2982 2983 /* ECOFF swapping routines. These are used when dealing with the 2984 .mdebug section, which is in the ECOFF debugging format. */ 2985 static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap = 2986 { 2987 /* Symbol table magic number. */ 2988 magicSym2, 2989 /* Alignment of debugging information. E.g., 4. */ 2990 8, 2991 /* Sizes of external symbolic information. */ 2992 sizeof (struct hdr_ext), 2993 sizeof (struct dnr_ext), 2994 sizeof (struct pdr_ext), 2995 sizeof (struct sym_ext), 2996 sizeof (struct opt_ext), 2997 sizeof (struct fdr_ext), 2998 sizeof (struct rfd_ext), 2999 sizeof (struct ext_ext), 3000 /* Functions to swap in external symbolic data. */ 3001 ecoff_swap_hdr_in, 3002 ecoff_swap_dnr_in, 3003 ecoff_swap_pdr_in, 3004 ecoff_swap_sym_in, 3005 ecoff_swap_opt_in, 3006 ecoff_swap_fdr_in, 3007 ecoff_swap_rfd_in, 3008 ecoff_swap_ext_in, 3009 _bfd_ecoff_swap_tir_in, 3010 _bfd_ecoff_swap_rndx_in, 3011 /* Functions to swap out external symbolic data. */ 3012 ecoff_swap_hdr_out, 3013 ecoff_swap_dnr_out, 3014 ecoff_swap_pdr_out, 3015 ecoff_swap_sym_out, 3016 ecoff_swap_opt_out, 3017 ecoff_swap_fdr_out, 3018 ecoff_swap_rfd_out, 3019 ecoff_swap_ext_out, 3020 _bfd_ecoff_swap_tir_out, 3021 _bfd_ecoff_swap_rndx_out, 3022 /* Function to read in symbolic data. */ 3023 _bfd_mips_elf_read_ecoff_info 3024 }; 3025 3026 /* Relocations in the 64 bit MIPS ELF ABI are more complex than in 3027 standard ELF. This structure is used to redirect the relocation 3028 handling routines. */ 3029 3030 const struct elf_size_info mips_elf64_size_info = 3031 { 3032 sizeof (Elf64_External_Ehdr), 3033 sizeof (Elf64_External_Phdr), 3034 sizeof (Elf64_External_Shdr), 3035 sizeof (Elf64_Mips_External_Rel), 3036 sizeof (Elf64_Mips_External_Rela), 3037 sizeof (Elf64_External_Sym), 3038 sizeof (Elf64_External_Dyn), 3039 sizeof (Elf_External_Note), 3040 4, /* hash-table entry size */ 3041 3, /* internal relocations per external relocations */ 3042 64, /* arch_size */ 3043 3, /* log_file_align */ 3044 ELFCLASS64, 3045 EV_CURRENT, 3046 bfd_elf64_write_out_phdrs, 3047 bfd_elf64_write_shdrs_and_ehdr, 3048 mips_elf64_write_relocs, 3049 bfd_elf64_swap_symbol_in, 3050 bfd_elf64_swap_symbol_out, 3051 mips_elf64_slurp_reloc_table, 3052 bfd_elf64_slurp_symbol_table, 3053 bfd_elf64_swap_dyn_in, 3054 bfd_elf64_swap_dyn_out, 3055 mips_elf64_be_swap_reloc_in, 3056 mips_elf64_be_swap_reloc_out, 3057 mips_elf64_be_swap_reloca_in, 3058 mips_elf64_be_swap_reloca_out 3059 }; 3060 3061 #define ELF_ARCH bfd_arch_mips 3062 #define ELF_MACHINE_CODE EM_MIPS 3063 3064 #define elf_backend_collect TRUE 3065 #define elf_backend_type_change_ok TRUE 3066 #define elf_backend_can_gc_sections TRUE 3067 #define elf_info_to_howto mips_elf64_info_to_howto_rela 3068 #define elf_info_to_howto_rel mips_elf64_info_to_howto_rel 3069 #define elf_backend_object_p mips_elf64_object_p 3070 #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing 3071 #define elf_backend_section_processing _bfd_mips_elf_section_processing 3072 #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr 3073 #define elf_backend_fake_sections _bfd_mips_elf_fake_sections 3074 #define elf_backend_section_from_bfd_section \ 3075 _bfd_mips_elf_section_from_bfd_section 3076 #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook 3077 #define elf_backend_link_output_symbol_hook \ 3078 _bfd_mips_elf_link_output_symbol_hook 3079 #define elf_backend_create_dynamic_sections \ 3080 _bfd_mips_elf_create_dynamic_sections 3081 #define elf_backend_check_relocs _bfd_mips_elf_check_relocs 3082 #define elf_backend_adjust_dynamic_symbol \ 3083 _bfd_mips_elf_adjust_dynamic_symbol 3084 #define elf_backend_always_size_sections \ 3085 _bfd_mips_elf_always_size_sections 3086 #define elf_backend_size_dynamic_sections \ 3087 _bfd_mips_elf_size_dynamic_sections 3088 #define elf_backend_relocate_section _bfd_mips_elf_relocate_section 3089 #define elf_backend_finish_dynamic_symbol \ 3090 _bfd_mips_elf_finish_dynamic_symbol 3091 #define elf_backend_finish_dynamic_sections \ 3092 _bfd_mips_elf_finish_dynamic_sections 3093 #define elf_backend_final_write_processing \ 3094 _bfd_mips_elf_final_write_processing 3095 #define elf_backend_additional_program_headers \ 3096 _bfd_mips_elf_additional_program_headers 3097 #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map 3098 #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook 3099 #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook 3100 #define elf_backend_copy_indirect_symbol \ 3101 _bfd_mips_elf_copy_indirect_symbol 3102 #define elf_backend_hide_symbol _bfd_mips_elf_hide_symbol 3103 #define elf_backend_ignore_discarded_relocs \ 3104 _bfd_mips_elf_ignore_discarded_relocs 3105 #define elf_backend_mips_irix_compat elf64_mips_irix_compat 3106 #define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto 3107 #define elf_backend_ecoff_debug_swap &mips_elf64_ecoff_debug_swap 3108 #define elf_backend_size_info mips_elf64_size_info 3109 3110 #define elf_backend_grok_prstatus elf64_mips_grok_prstatus 3111 #define elf_backend_grok_psinfo elf64_mips_grok_psinfo 3112 3113 #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO) 3114 3115 /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations 3116 work better/work only in RELA, so we default to this. */ 3117 #define elf_backend_may_use_rel_p 1 3118 #define elf_backend_may_use_rela_p 1 3119 #define elf_backend_default_use_rela_p 1 3120 3121 #define elf_backend_write_section _bfd_mips_elf_write_section 3122 3123 /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit 3124 MIPS-specific function only applies to IRIX5, which had no 64-bit 3125 ABI. */ 3126 #define bfd_elf64_find_nearest_line _bfd_mips_elf_find_nearest_line 3127 #define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info 3128 #define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook 3129 #define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents 3130 #define bfd_elf64_bfd_get_relocated_section_contents \ 3131 _bfd_elf_mips_get_relocated_section_contents 3132 #define bfd_elf64_bfd_link_hash_table_create \ 3133 _bfd_mips_elf_link_hash_table_create 3134 #define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link 3135 #define bfd_elf64_bfd_merge_private_bfd_data \ 3136 _bfd_mips_elf_merge_private_bfd_data 3137 #define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags 3138 #define bfd_elf64_bfd_print_private_bfd_data \ 3139 _bfd_mips_elf_print_private_bfd_data 3140 3141 #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound 3142 #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc 3143 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound 3144 #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc 3145 #define bfd_elf64_bfd_relax_section _bfd_mips_relax_section 3146 3147 /* MIPS ELF64 archive functions. */ 3148 #define bfd_elf64_archive_functions 3149 extern bfd_boolean bfd_elf64_archive_slurp_armap 3150 (bfd *); 3151 extern bfd_boolean bfd_elf64_archive_write_armap 3152 (bfd *, unsigned int, struct orl *, unsigned int, int); 3153 #define bfd_elf64_archive_slurp_extended_name_table \ 3154 _bfd_archive_coff_slurp_extended_name_table 3155 #define bfd_elf64_archive_construct_extended_name_table \ 3156 _bfd_archive_coff_construct_extended_name_table 3157 #define bfd_elf64_archive_truncate_arname \ 3158 _bfd_archive_coff_truncate_arname 3159 #define bfd_elf64_archive_read_ar_hdr _bfd_archive_coff_read_ar_hdr 3160 #define bfd_elf64_archive_openr_next_archived_file \ 3161 _bfd_archive_coff_openr_next_archived_file 3162 #define bfd_elf64_archive_get_elt_at_index \ 3163 _bfd_archive_coff_get_elt_at_index 3164 #define bfd_elf64_archive_generic_stat_arch_elt \ 3165 _bfd_archive_coff_generic_stat_arch_elt 3166 #define bfd_elf64_archive_update_armap_timestamp \ 3167 _bfd_archive_coff_update_armap_timestamp 3168 3169 /* The SGI style (n)64 NewABI. */ 3170 #define TARGET_LITTLE_SYM bfd_elf64_littlemips_vec 3171 #define TARGET_LITTLE_NAME "elf64-littlemips" 3172 #define TARGET_BIG_SYM bfd_elf64_bigmips_vec 3173 #define TARGET_BIG_NAME "elf64-bigmips" 3174 3175 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses 3176 a value of 0x1000, and we are compatible. 3177 FIXME: How does this affect NewABI? */ 3178 #define ELF_MAXPAGESIZE 0x1000 3179 3180 #include "elf64-target.h" 3181 3182 /* The SYSV-style 'traditional' (n)64 NewABI. */ 3183 #undef TARGET_LITTLE_SYM 3184 #undef TARGET_LITTLE_NAME 3185 #undef TARGET_BIG_SYM 3186 #undef TARGET_BIG_NAME 3187 3188 #undef ELF_MAXPAGESIZE 3189 3190 #define TARGET_LITTLE_SYM bfd_elf64_tradlittlemips_vec 3191 #define TARGET_LITTLE_NAME "elf64-tradlittlemips" 3192 #define TARGET_BIG_SYM bfd_elf64_tradbigmips_vec 3193 #define TARGET_BIG_NAME "elf64-tradbigmips" 3194 3195 /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses 3196 page sizes of up to that limit, so we need to respect it. */ 3197 #define ELF_MAXPAGESIZE 0x10000 3198 #define elf64_bed elf64_tradbed 3199 3200 /* Include the target file again for this target. */ 3201 #include "elf64-target.h" 3202