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 /* Swap in a MIPS 64-bit Rel reloc. */ 1637 1638 static void 1639 mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src, 1640 Elf64_Mips_Internal_Rela *dst) 1641 { 1642 dst->r_offset = H_GET_64 (abfd, src->r_offset); 1643 dst->r_sym = H_GET_32 (abfd, src->r_sym); 1644 dst->r_ssym = H_GET_8 (abfd, src->r_ssym); 1645 dst->r_type3 = H_GET_8 (abfd, src->r_type3); 1646 dst->r_type2 = H_GET_8 (abfd, src->r_type2); 1647 dst->r_type = H_GET_8 (abfd, src->r_type); 1648 dst->r_addend = 0; 1649 } 1650 1651 /* Swap in a MIPS 64-bit Rela reloc. */ 1652 1653 static void 1654 mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src, 1655 Elf64_Mips_Internal_Rela *dst) 1656 { 1657 dst->r_offset = H_GET_64 (abfd, src->r_offset); 1658 dst->r_sym = H_GET_32 (abfd, src->r_sym); 1659 dst->r_ssym = H_GET_8 (abfd, src->r_ssym); 1660 dst->r_type3 = H_GET_8 (abfd, src->r_type3); 1661 dst->r_type2 = H_GET_8 (abfd, src->r_type2); 1662 dst->r_type = H_GET_8 (abfd, src->r_type); 1663 dst->r_addend = H_GET_S64 (abfd, src->r_addend); 1664 } 1665 1666 /* Swap out a MIPS 64-bit Rel reloc. */ 1667 1668 static void 1669 mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src, 1670 Elf64_Mips_External_Rel *dst) 1671 { 1672 H_PUT_64 (abfd, src->r_offset, dst->r_offset); 1673 H_PUT_32 (abfd, src->r_sym, dst->r_sym); 1674 H_PUT_8 (abfd, src->r_ssym, dst->r_ssym); 1675 H_PUT_8 (abfd, src->r_type3, dst->r_type3); 1676 H_PUT_8 (abfd, src->r_type2, dst->r_type2); 1677 H_PUT_8 (abfd, src->r_type, dst->r_type); 1678 } 1679 1680 /* Swap out a MIPS 64-bit Rela reloc. */ 1681 1682 static void 1683 mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src, 1684 Elf64_Mips_External_Rela *dst) 1685 { 1686 H_PUT_64 (abfd, src->r_offset, dst->r_offset); 1687 H_PUT_32 (abfd, src->r_sym, dst->r_sym); 1688 H_PUT_8 (abfd, src->r_ssym, dst->r_ssym); 1689 H_PUT_8 (abfd, src->r_type3, dst->r_type3); 1690 H_PUT_8 (abfd, src->r_type2, dst->r_type2); 1691 H_PUT_8 (abfd, src->r_type, dst->r_type); 1692 H_PUT_S64 (abfd, src->r_addend, dst->r_addend); 1693 } 1694 1695 /* Swap in a MIPS 64-bit Rel reloc. */ 1696 1697 static void 1698 mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src, 1699 Elf_Internal_Rela *dst) 1700 { 1701 Elf64_Mips_Internal_Rela mirel; 1702 1703 mips_elf64_swap_reloc_in (abfd, 1704 (const Elf64_Mips_External_Rel *) src, 1705 &mirel); 1706 1707 dst[0].r_offset = mirel.r_offset; 1708 dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type); 1709 dst[0].r_addend = 0; 1710 dst[1].r_offset = mirel.r_offset; 1711 dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2); 1712 dst[1].r_addend = 0; 1713 dst[2].r_offset = mirel.r_offset; 1714 dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3); 1715 dst[2].r_addend = 0; 1716 } 1717 1718 /* Swap in a MIPS 64-bit Rela reloc. */ 1719 1720 static void 1721 mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src, 1722 Elf_Internal_Rela *dst) 1723 { 1724 Elf64_Mips_Internal_Rela mirela; 1725 1726 mips_elf64_swap_reloca_in (abfd, 1727 (const Elf64_Mips_External_Rela *) src, 1728 &mirela); 1729 1730 dst[0].r_offset = mirela.r_offset; 1731 dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type); 1732 dst[0].r_addend = mirela.r_addend; 1733 dst[1].r_offset = mirela.r_offset; 1734 dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2); 1735 dst[1].r_addend = 0; 1736 dst[2].r_offset = mirela.r_offset; 1737 dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3); 1738 dst[2].r_addend = 0; 1739 } 1740 1741 /* Swap out a MIPS 64-bit Rel reloc. */ 1742 1743 static void 1744 mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src, 1745 bfd_byte *dst) 1746 { 1747 Elf64_Mips_Internal_Rela mirel; 1748 1749 mirel.r_offset = src[0].r_offset; 1750 BFD_ASSERT(src[0].r_offset == src[1].r_offset); 1751 1752 mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info); 1753 mirel.r_sym = ELF64_R_SYM (src[0].r_info); 1754 mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info); 1755 mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info); 1756 mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info); 1757 1758 mips_elf64_swap_reloc_out (abfd, &mirel, 1759 (Elf64_Mips_External_Rel *) dst); 1760 } 1761 1762 /* Swap out a MIPS 64-bit Rela reloc. */ 1763 1764 static void 1765 mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src, 1766 bfd_byte *dst) 1767 { 1768 Elf64_Mips_Internal_Rela mirela; 1769 1770 mirela.r_offset = src[0].r_offset; 1771 BFD_ASSERT(src[0].r_offset == src[1].r_offset); 1772 BFD_ASSERT(src[0].r_offset == src[2].r_offset); 1773 1774 mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info); 1775 mirela.r_sym = ELF64_R_SYM (src[0].r_info); 1776 mirela.r_addend = src[0].r_addend; 1777 BFD_ASSERT(src[1].r_addend == 0); 1778 BFD_ASSERT(src[2].r_addend == 0); 1779 1780 mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info); 1781 mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info); 1782 mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info); 1783 1784 mips_elf64_swap_reloca_out (abfd, &mirela, 1785 (Elf64_Mips_External_Rela *) dst); 1786 } 1787 1788 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a 1789 dangerous relocation. */ 1790 1791 static bfd_boolean 1792 mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp) 1793 { 1794 unsigned int count; 1795 asymbol **sym; 1796 unsigned int i; 1797 1798 /* If we've already figured out what GP will be, just return it. */ 1799 *pgp = _bfd_get_gp_value (output_bfd); 1800 if (*pgp) 1801 return TRUE; 1802 1803 count = bfd_get_symcount (output_bfd); 1804 sym = bfd_get_outsymbols (output_bfd); 1805 1806 /* The linker script will have created a symbol named `_gp' with the 1807 appropriate value. */ 1808 if (sym == NULL) 1809 i = count; 1810 else 1811 { 1812 for (i = 0; i < count; i++, sym++) 1813 { 1814 register const char *name; 1815 1816 name = bfd_asymbol_name (*sym); 1817 if (*name == '_' && strcmp (name, "_gp") == 0) 1818 { 1819 *pgp = bfd_asymbol_value (*sym); 1820 _bfd_set_gp_value (output_bfd, *pgp); 1821 break; 1822 } 1823 } 1824 } 1825 1826 if (i >= count) 1827 { 1828 /* Only get the error once. */ 1829 *pgp = 4; 1830 _bfd_set_gp_value (output_bfd, *pgp); 1831 return FALSE; 1832 } 1833 1834 return TRUE; 1835 } 1836 1837 /* We have to figure out the gp value, so that we can adjust the 1838 symbol value correctly. We look up the symbol _gp in the output 1839 BFD. If we can't find it, we're stuck. We cache it in the ELF 1840 target data. We don't need to adjust the symbol value for an 1841 external symbol if we are producing relocatable output. */ 1842 1843 static bfd_reloc_status_type 1844 mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 1845 char **error_message, bfd_vma *pgp) 1846 { 1847 if (bfd_is_und_section (symbol->section) 1848 && ! relocatable) 1849 { 1850 *pgp = 0; 1851 return bfd_reloc_undefined; 1852 } 1853 1854 *pgp = _bfd_get_gp_value (output_bfd); 1855 if (*pgp == 0 1856 && (! relocatable 1857 || (symbol->flags & BSF_SECTION_SYM) != 0)) 1858 { 1859 if (relocatable) 1860 { 1861 /* Make up a value. */ 1862 *pgp = symbol->section->output_section->vma /*+ 0x4000*/; 1863 _bfd_set_gp_value (output_bfd, *pgp); 1864 } 1865 else if (!mips_elf64_assign_gp (output_bfd, pgp)) 1866 { 1867 *error_message = 1868 (char *) _("GP relative relocation when _gp not defined"); 1869 return bfd_reloc_dangerous; 1870 } 1871 } 1872 1873 return bfd_reloc_ok; 1874 } 1875 1876 /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must 1877 become the offset from the gp register. */ 1878 1879 static bfd_reloc_status_type 1880 mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1881 void *data, asection *input_section, bfd *output_bfd, 1882 char **error_message) 1883 { 1884 bfd_boolean relocatable; 1885 bfd_reloc_status_type ret; 1886 bfd_vma gp; 1887 1888 /* If we're relocating, and this is an external symbol, we don't want 1889 to change anything. */ 1890 if (output_bfd != NULL 1891 && (symbol->flags & BSF_SECTION_SYM) == 0 1892 && (symbol->flags & BSF_LOCAL) != 0) 1893 { 1894 reloc_entry->address += input_section->output_offset; 1895 return bfd_reloc_ok; 1896 } 1897 1898 if (output_bfd != NULL) 1899 relocatable = TRUE; 1900 else 1901 { 1902 relocatable = FALSE; 1903 output_bfd = symbol->section->output_section->owner; 1904 } 1905 1906 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message, 1907 &gp); 1908 if (ret != bfd_reloc_ok) 1909 return ret; 1910 1911 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 1912 input_section, relocatable, 1913 data, gp); 1914 } 1915 1916 /* Do a R_MIPS_LITERAL relocation. */ 1917 1918 static bfd_reloc_status_type 1919 mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1920 void *data, asection *input_section, bfd *output_bfd, 1921 char **error_message) 1922 { 1923 bfd_boolean relocatable; 1924 bfd_reloc_status_type ret; 1925 bfd_vma gp; 1926 1927 /* R_MIPS_LITERAL relocations are defined for local symbols only. */ 1928 if (output_bfd != NULL 1929 && (symbol->flags & BSF_SECTION_SYM) == 0 1930 && (symbol->flags & BSF_LOCAL) != 0) 1931 { 1932 *error_message = (char *) 1933 _("literal relocation occurs for an external symbol"); 1934 return bfd_reloc_outofrange; 1935 } 1936 1937 /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */ 1938 if (output_bfd != NULL) 1939 relocatable = TRUE; 1940 else 1941 { 1942 relocatable = FALSE; 1943 output_bfd = symbol->section->output_section->owner; 1944 } 1945 1946 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message, 1947 &gp); 1948 if (ret != bfd_reloc_ok) 1949 return ret; 1950 1951 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 1952 input_section, relocatable, 1953 data, gp); 1954 } 1955 1956 /* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must 1957 become the offset from the gp register. */ 1958 1959 static bfd_reloc_status_type 1960 mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1961 void *data, asection *input_section, bfd *output_bfd, 1962 char **error_message) 1963 { 1964 bfd_boolean relocatable; 1965 bfd_reloc_status_type ret; 1966 bfd_vma gp; 1967 bfd_vma relocation; 1968 bfd_vma val; 1969 1970 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */ 1971 if (output_bfd != NULL 1972 && (symbol->flags & BSF_SECTION_SYM) == 0 1973 && (symbol->flags & BSF_LOCAL) != 0) 1974 { 1975 *error_message = (char *) 1976 _("32bits gp relative relocation occurs for an external symbol"); 1977 return bfd_reloc_outofrange; 1978 } 1979 1980 if (output_bfd != NULL) 1981 relocatable = TRUE; 1982 else 1983 { 1984 relocatable = FALSE; 1985 output_bfd = symbol->section->output_section->owner; 1986 } 1987 1988 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, 1989 error_message, &gp); 1990 if (ret != bfd_reloc_ok) 1991 return ret; 1992 1993 if (bfd_is_com_section (symbol->section)) 1994 relocation = 0; 1995 else 1996 relocation = symbol->value; 1997 1998 relocation += symbol->section->output_section->vma; 1999 relocation += symbol->section->output_offset; 2000 2001 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) 2002 return bfd_reloc_outofrange; 2003 2004 /* Set val to the offset into the section or symbol. */ 2005 val = reloc_entry->addend; 2006 2007 if (reloc_entry->howto->partial_inplace) 2008 val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); 2009 2010 /* Adjust val for the final section location and GP value. If we 2011 are producing relocatable output, we don't want to do this for 2012 an external symbol. */ 2013 if (! relocatable 2014 || (symbol->flags & BSF_SECTION_SYM) != 0) 2015 val += relocation - gp; 2016 2017 if (reloc_entry->howto->partial_inplace) 2018 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address); 2019 else 2020 reloc_entry->addend = val; 2021 2022 if (relocatable) 2023 reloc_entry->address += input_section->output_offset; 2024 2025 return bfd_reloc_ok; 2026 } 2027 2028 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2, 2029 the rest is at bits 6-10. The bitpos already got right by the howto. */ 2030 2031 static bfd_reloc_status_type 2032 mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 2033 void *data, asection *input_section, bfd *output_bfd, 2034 char **error_message) 2035 { 2036 if (reloc_entry->howto->partial_inplace) 2037 { 2038 reloc_entry->addend = ((reloc_entry->addend & 0x00007c0) 2039 | (reloc_entry->addend & 0x00000800) >> 9); 2040 } 2041 2042 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data, 2043 input_section, output_bfd, 2044 error_message); 2045 } 2046 2047 /* Handle a mips16 jump. */ 2048 2049 static bfd_reloc_status_type 2050 mips16_jump_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 2051 asymbol *symbol, void *data ATTRIBUTE_UNUSED, 2052 asection *input_section, bfd *output_bfd, 2053 char **error_message ATTRIBUTE_UNUSED) 2054 { 2055 if (output_bfd != NULL 2056 && (symbol->flags & BSF_SECTION_SYM) == 0 2057 && (! reloc_entry->howto->partial_inplace 2058 || reloc_entry->addend == 0)) 2059 { 2060 reloc_entry->address += input_section->output_offset; 2061 return bfd_reloc_ok; 2062 } 2063 2064 /* FIXME. */ 2065 { 2066 static bfd_boolean warned; 2067 2068 if (! warned) 2069 (*_bfd_error_handler) 2070 (_("Linking mips16 objects into %s format is not supported"), 2071 bfd_get_target (input_section->output_section->owner)); 2072 warned = TRUE; 2073 } 2074 2075 return bfd_reloc_undefined; 2076 } 2077 2078 /* Handle a mips16 GP relative reloc. */ 2079 2080 static bfd_reloc_status_type 2081 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 2082 void *data, asection *input_section, bfd *output_bfd, 2083 char **error_message) 2084 { 2085 bfd_boolean relocatable; 2086 bfd_reloc_status_type ret; 2087 bfd_byte *location; 2088 bfd_vma gp; 2089 2090 /* If we're relocating, and this is an external symbol, we don't want 2091 to change anything. */ 2092 if (output_bfd != NULL 2093 && (symbol->flags & BSF_SECTION_SYM) == 0 2094 && (symbol->flags & BSF_LOCAL) != 0) 2095 { 2096 reloc_entry->address += input_section->output_offset; 2097 return bfd_reloc_ok; 2098 } 2099 2100 if (output_bfd != NULL) 2101 relocatable = TRUE; 2102 else 2103 { 2104 relocatable = FALSE; 2105 output_bfd = symbol->section->output_section->owner; 2106 } 2107 2108 ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message, 2109 &gp); 2110 if (ret != bfd_reloc_ok) 2111 return ret; 2112 2113 location = (bfd_byte *) data + reloc_entry->address; 2114 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE, 2115 location); 2116 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 2117 input_section, relocatable, 2118 data, gp); 2119 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable, 2120 location); 2121 2122 return ret; 2123 } 2124 2125 /* A mapping from BFD reloc types to MIPS ELF reloc types. */ 2126 2127 struct elf_reloc_map { 2128 bfd_reloc_code_real_type bfd_val; 2129 enum elf_mips_reloc_type elf_val; 2130 }; 2131 2132 static const struct elf_reloc_map mips_reloc_map[] = 2133 { 2134 { BFD_RELOC_NONE, R_MIPS_NONE }, 2135 { BFD_RELOC_16, R_MIPS_16 }, 2136 { BFD_RELOC_32, R_MIPS_32 }, 2137 /* There is no BFD reloc for R_MIPS_REL32. */ 2138 { BFD_RELOC_64, R_MIPS_64 }, 2139 { BFD_RELOC_CTOR, R_MIPS_64 }, 2140 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 }, 2141 { BFD_RELOC_HI16_S, R_MIPS_HI16 }, 2142 { BFD_RELOC_LO16, R_MIPS_LO16 }, 2143 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 }, 2144 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 }, 2145 { BFD_RELOC_MIPS_JMP, R_MIPS_26 }, 2146 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL }, 2147 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 }, 2148 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 }, 2149 { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 }, 2150 { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 }, 2151 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP }, 2152 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE }, 2153 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST }, 2154 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 }, 2155 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 }, 2156 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB }, 2157 { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A }, 2158 { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B }, 2159 { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE }, 2160 { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST }, 2161 { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER }, 2162 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 }, 2163 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 }, 2164 { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP }, 2165 { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 }, 2166 /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */ 2167 { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT }, 2168 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR }, 2169 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 }, 2170 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 }, 2171 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 }, 2172 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 }, 2173 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD }, 2174 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM }, 2175 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 }, 2176 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 }, 2177 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL }, 2178 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 }, 2179 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 }, 2180 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 }, 2181 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 } 2182 }; 2183 2184 static const struct elf_reloc_map mips16_reloc_map[] = 2185 { 2186 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min }, 2187 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min }, 2188 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min }, 2189 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min }, 2190 }; 2191 2192 /* Given a BFD reloc type, return a howto structure. */ 2193 2194 static reloc_howto_type * 2195 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 2196 bfd_reloc_code_real_type code) 2197 { 2198 unsigned int i; 2199 /* FIXME: We default to RELA here instead of choosing the right 2200 relocation variant. */ 2201 reloc_howto_type *howto_table = mips_elf64_howto_table_rela; 2202 reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela; 2203 2204 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); 2205 i++) 2206 { 2207 if (mips_reloc_map[i].bfd_val == code) 2208 return &howto_table[(int) mips_reloc_map[i].elf_val]; 2209 } 2210 2211 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map); 2212 i++) 2213 { 2214 if (mips16_reloc_map[i].bfd_val == code) 2215 return &howto16_table[(int) mips16_reloc_map[i].elf_val]; 2216 } 2217 2218 switch (code) 2219 { 2220 case BFD_RELOC_VTABLE_INHERIT: 2221 return &elf_mips_gnu_vtinherit_howto; 2222 case BFD_RELOC_VTABLE_ENTRY: 2223 return &elf_mips_gnu_vtentry_howto; 2224 default: 2225 bfd_set_error (bfd_error_bad_value); 2226 return NULL; 2227 } 2228 } 2229 2230 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */ 2231 2232 static reloc_howto_type * 2233 mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p) 2234 { 2235 switch (r_type) 2236 { 2237 case R_MIPS_GNU_VTINHERIT: 2238 return &elf_mips_gnu_vtinherit_howto; 2239 case R_MIPS_GNU_VTENTRY: 2240 return &elf_mips_gnu_vtentry_howto; 2241 case R_MIPS_GNU_REL16_S2: 2242 if (rela_p) 2243 return &elf_mips_gnu_rela16_s2; 2244 else 2245 return &elf_mips_gnu_rel16_s2; 2246 default: 2247 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) 2248 { 2249 if (rela_p) 2250 return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min]; 2251 else 2252 return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min]; 2253 } 2254 BFD_ASSERT (r_type < (unsigned int) R_MIPS_max); 2255 if (rela_p) 2256 return &mips_elf64_howto_table_rela[r_type]; 2257 else 2258 return &mips_elf64_howto_table_rel[r_type]; 2259 break; 2260 } 2261 } 2262 2263 /* Prevent relocation handling by bfd for MIPS ELF64. */ 2264 2265 static void 2266 mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, 2267 arelent *cache_ptr ATTRIBUTE_UNUSED, 2268 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED) 2269 { 2270 BFD_ASSERT (0); 2271 } 2272 2273 static void 2274 mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, 2275 arelent *cache_ptr ATTRIBUTE_UNUSED, 2276 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED) 2277 { 2278 BFD_ASSERT (0); 2279 } 2280 2281 /* Since each entry in an SHT_REL or SHT_RELA section can represent up 2282 to three relocs, we must tell the user to allocate more space. */ 2283 2284 static long 2285 mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) 2286 { 2287 return (sec->reloc_count * 3 + 1) * sizeof (arelent *); 2288 } 2289 2290 static long 2291 mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd) 2292 { 2293 return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3; 2294 } 2295 2296 /* We must also copy more relocations than the corresponding functions 2297 in elf.c would, so the two following functions are slightly 2298 modified from elf.c, that multiply the external relocation count by 2299 3 to obtain the internal relocation count. */ 2300 2301 static long 2302 mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section, 2303 arelent **relptr, asymbol **symbols) 2304 { 2305 arelent *tblptr; 2306 unsigned int i; 2307 const struct elf_backend_data *bed = get_elf_backend_data (abfd); 2308 2309 if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE)) 2310 return -1; 2311 2312 tblptr = section->relocation; 2313 for (i = 0; i < section->reloc_count * 3; i++) 2314 *relptr++ = tblptr++; 2315 2316 *relptr = NULL; 2317 2318 return section->reloc_count * 3; 2319 } 2320 2321 static long 2322 mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage, 2323 asymbol **syms) 2324 { 2325 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean); 2326 asection *s; 2327 long ret; 2328 2329 if (elf_dynsymtab (abfd) == 0) 2330 { 2331 bfd_set_error (bfd_error_invalid_operation); 2332 return -1; 2333 } 2334 2335 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table; 2336 ret = 0; 2337 for (s = abfd->sections; s != NULL; s = s->next) 2338 { 2339 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd) 2340 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL 2341 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)) 2342 { 2343 arelent *p; 2344 long count, i; 2345 2346 if (! (*slurp_relocs) (abfd, s, syms, TRUE)) 2347 return -1; 2348 count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3; 2349 p = s->relocation; 2350 for (i = 0; i < count; i++) 2351 *storage++ = p++; 2352 ret += count; 2353 } 2354 } 2355 2356 *storage = NULL; 2357 2358 return ret; 2359 } 2360 2361 /* Read the relocations from one reloc section. This is mostly copied 2362 from elfcode.h, except for the changes to expand one external 2363 relocation to 3 internal ones. We must unfortunately set 2364 reloc_count to the number of external relocations, because a lot of 2365 generic code seems to depend on this. */ 2366 2367 static bfd_boolean 2368 mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect, 2369 Elf_Internal_Shdr *rel_hdr, 2370 bfd_size_type reloc_count, 2371 arelent *relents, asymbol **symbols, 2372 bfd_boolean dynamic) 2373 { 2374 void *allocated; 2375 bfd_byte *native_relocs; 2376 arelent *relent; 2377 bfd_vma i; 2378 int entsize; 2379 bfd_boolean rela_p; 2380 2381 allocated = bfd_malloc (rel_hdr->sh_size); 2382 if (allocated == NULL) 2383 return FALSE; 2384 2385 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0 2386 || (bfd_bread (allocated, rel_hdr->sh_size, abfd) 2387 != rel_hdr->sh_size)) 2388 goto error_return; 2389 2390 native_relocs = allocated; 2391 2392 entsize = rel_hdr->sh_entsize; 2393 BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel) 2394 || entsize == sizeof (Elf64_Mips_External_Rela)); 2395 2396 if (entsize == sizeof (Elf64_Mips_External_Rel)) 2397 rela_p = FALSE; 2398 else 2399 rela_p = TRUE; 2400 2401 for (i = 0, relent = relents; 2402 i < reloc_count; 2403 i++, native_relocs += entsize) 2404 { 2405 Elf64_Mips_Internal_Rela rela; 2406 bfd_boolean used_sym, used_ssym; 2407 int ir; 2408 2409 if (entsize == sizeof (Elf64_Mips_External_Rela)) 2410 mips_elf64_swap_reloca_in (abfd, 2411 (Elf64_Mips_External_Rela *) native_relocs, 2412 &rela); 2413 else 2414 mips_elf64_swap_reloc_in (abfd, 2415 (Elf64_Mips_External_Rel *) native_relocs, 2416 &rela); 2417 2418 /* Each entry represents exactly three actual relocations. */ 2419 2420 used_sym = FALSE; 2421 used_ssym = FALSE; 2422 for (ir = 0; ir < 3; ir++) 2423 { 2424 enum elf_mips_reloc_type type; 2425 2426 switch (ir) 2427 { 2428 default: 2429 abort (); 2430 case 0: 2431 type = (enum elf_mips_reloc_type) rela.r_type; 2432 break; 2433 case 1: 2434 type = (enum elf_mips_reloc_type) rela.r_type2; 2435 break; 2436 case 2: 2437 type = (enum elf_mips_reloc_type) rela.r_type3; 2438 break; 2439 } 2440 2441 /* Some types require symbols, whereas some do not. */ 2442 switch (type) 2443 { 2444 case R_MIPS_NONE: 2445 case R_MIPS_LITERAL: 2446 case R_MIPS_INSERT_A: 2447 case R_MIPS_INSERT_B: 2448 case R_MIPS_DELETE: 2449 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 2450 break; 2451 2452 default: 2453 if (! used_sym) 2454 { 2455 if (rela.r_sym == 0) 2456 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 2457 else 2458 { 2459 asymbol **ps, *s; 2460 2461 ps = symbols + rela.r_sym - 1; 2462 s = *ps; 2463 if ((s->flags & BSF_SECTION_SYM) == 0) 2464 relent->sym_ptr_ptr = ps; 2465 else 2466 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr; 2467 } 2468 2469 used_sym = TRUE; 2470 } 2471 else if (! used_ssym) 2472 { 2473 switch (rela.r_ssym) 2474 { 2475 case RSS_UNDEF: 2476 relent->sym_ptr_ptr = 2477 bfd_abs_section_ptr->symbol_ptr_ptr; 2478 break; 2479 2480 case RSS_GP: 2481 case RSS_GP0: 2482 case RSS_LOC: 2483 /* FIXME: I think these need to be handled using 2484 special howto structures. */ 2485 BFD_ASSERT (0); 2486 break; 2487 2488 default: 2489 BFD_ASSERT (0); 2490 break; 2491 } 2492 2493 used_ssym = TRUE; 2494 } 2495 else 2496 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 2497 2498 break; 2499 } 2500 2501 /* The address of an ELF reloc is section relative for an 2502 object file, and absolute for an executable file or 2503 shared library. The address of a BFD reloc is always 2504 section relative. */ 2505 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic) 2506 relent->address = rela.r_offset; 2507 else 2508 relent->address = rela.r_offset - asect->vma; 2509 2510 relent->addend = rela.r_addend; 2511 2512 relent->howto = mips_elf64_rtype_to_howto (type, rela_p); 2513 2514 ++relent; 2515 } 2516 } 2517 2518 asect->reloc_count += (relent - relents) / 3; 2519 2520 if (allocated != NULL) 2521 free (allocated); 2522 2523 return TRUE; 2524 2525 error_return: 2526 if (allocated != NULL) 2527 free (allocated); 2528 return FALSE; 2529 } 2530 2531 /* Read the relocations. On Irix 6, there can be two reloc sections 2532 associated with a single data section. This is copied from 2533 elfcode.h as well, with changes as small as accounting for 3 2534 internal relocs per external reloc and resetting reloc_count to 2535 zero before processing the relocs of a section. */ 2536 2537 static bfd_boolean 2538 mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect, 2539 asymbol **symbols, bfd_boolean dynamic) 2540 { 2541 struct bfd_elf_section_data * const d = elf_section_data (asect); 2542 Elf_Internal_Shdr *rel_hdr; 2543 Elf_Internal_Shdr *rel_hdr2; 2544 bfd_size_type reloc_count; 2545 bfd_size_type reloc_count2; 2546 arelent *relents; 2547 bfd_size_type amt; 2548 2549 if (asect->relocation != NULL) 2550 return TRUE; 2551 2552 if (! dynamic) 2553 { 2554 if ((asect->flags & SEC_RELOC) == 0 2555 || asect->reloc_count == 0) 2556 return TRUE; 2557 2558 rel_hdr = &d->rel_hdr; 2559 reloc_count = NUM_SHDR_ENTRIES (rel_hdr); 2560 rel_hdr2 = d->rel_hdr2; 2561 reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0); 2562 2563 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2); 2564 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset 2565 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset)); 2566 2567 } 2568 else 2569 { 2570 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this 2571 case because relocations against this section may use the 2572 dynamic symbol table, and in that case bfd_section_from_shdr 2573 in elf.c does not update the RELOC_COUNT. */ 2574 if (asect->size == 0) 2575 return TRUE; 2576 2577 rel_hdr = &d->this_hdr; 2578 reloc_count = NUM_SHDR_ENTRIES (rel_hdr); 2579 rel_hdr2 = NULL; 2580 reloc_count2 = 0; 2581 } 2582 2583 /* Allocate space for 3 arelent structures for each Rel structure. */ 2584 amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent); 2585 relents = bfd_alloc (abfd, amt); 2586 if (relents == NULL) 2587 return FALSE; 2588 2589 /* The slurp_one_reloc_table routine increments reloc_count. */ 2590 asect->reloc_count = 0; 2591 2592 if (! mips_elf64_slurp_one_reloc_table (abfd, asect, 2593 rel_hdr, reloc_count, 2594 relents, 2595 symbols, dynamic)) 2596 return FALSE; 2597 if (d->rel_hdr2 != NULL) 2598 { 2599 if (! mips_elf64_slurp_one_reloc_table (abfd, asect, 2600 rel_hdr2, reloc_count2, 2601 relents + reloc_count * 3, 2602 symbols, dynamic)) 2603 return FALSE; 2604 } 2605 2606 asect->relocation = relents; 2607 return TRUE; 2608 } 2609 2610 /* Write out the relocations. */ 2611 2612 static void 2613 mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data) 2614 { 2615 bfd_boolean *failedp = data; 2616 int count; 2617 Elf_Internal_Shdr *rel_hdr; 2618 unsigned int idx; 2619 2620 /* If we have already failed, don't do anything. */ 2621 if (*failedp) 2622 return; 2623 2624 if ((sec->flags & SEC_RELOC) == 0) 2625 return; 2626 2627 /* The linker backend writes the relocs out itself, and sets the 2628 reloc_count field to zero to inhibit writing them here. Also, 2629 sometimes the SEC_RELOC flag gets set even when there aren't any 2630 relocs. */ 2631 if (sec->reloc_count == 0) 2632 return; 2633 2634 /* We can combine up to three relocs that refer to the same address 2635 if the latter relocs have no associated symbol. */ 2636 count = 0; 2637 for (idx = 0; idx < sec->reloc_count; idx++) 2638 { 2639 bfd_vma addr; 2640 unsigned int i; 2641 2642 ++count; 2643 2644 addr = sec->orelocation[idx]->address; 2645 for (i = 0; i < 2; i++) 2646 { 2647 arelent *r; 2648 2649 if (idx + 1 >= sec->reloc_count) 2650 break; 2651 r = sec->orelocation[idx + 1]; 2652 if (r->address != addr 2653 || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section) 2654 || (*r->sym_ptr_ptr)->value != 0) 2655 break; 2656 2657 /* We can merge the reloc at IDX + 1 with the reloc at IDX. */ 2658 2659 ++idx; 2660 } 2661 } 2662 2663 rel_hdr = &elf_section_data (sec)->rel_hdr; 2664 2665 /* Do the actual relocation. */ 2666 2667 if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel)) 2668 mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data); 2669 else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela)) 2670 mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data); 2671 else 2672 BFD_ASSERT (0); 2673 } 2674 2675 static void 2676 mips_elf64_write_rel (bfd *abfd, asection *sec, 2677 Elf_Internal_Shdr *rel_hdr, 2678 int *count, void *data) 2679 { 2680 bfd_boolean *failedp = data; 2681 Elf64_Mips_External_Rel *ext_rel; 2682 unsigned int idx; 2683 asymbol *last_sym = 0; 2684 int last_sym_idx = 0; 2685 2686 rel_hdr->sh_size = rel_hdr->sh_entsize * *count; 2687 rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size); 2688 if (rel_hdr->contents == NULL) 2689 { 2690 *failedp = TRUE; 2691 return; 2692 } 2693 2694 ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents; 2695 for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++) 2696 { 2697 arelent *ptr; 2698 Elf64_Mips_Internal_Rela int_rel; 2699 asymbol *sym; 2700 int n; 2701 unsigned int i; 2702 2703 ptr = sec->orelocation[idx]; 2704 2705 /* The address of an ELF reloc is section relative for an object 2706 file, and absolute for an executable file or shared library. 2707 The address of a BFD reloc is always section relative. */ 2708 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) 2709 int_rel.r_offset = ptr->address; 2710 else 2711 int_rel.r_offset = ptr->address + sec->vma; 2712 2713 sym = *ptr->sym_ptr_ptr; 2714 if (sym == last_sym) 2715 n = last_sym_idx; 2716 else if (bfd_is_abs_section (sym->section) && sym->value == 0) 2717 n = STN_UNDEF; 2718 else 2719 { 2720 last_sym = sym; 2721 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); 2722 if (n < 0) 2723 { 2724 *failedp = TRUE; 2725 return; 2726 } 2727 last_sym_idx = n; 2728 } 2729 2730 int_rel.r_sym = n; 2731 int_rel.r_ssym = RSS_UNDEF; 2732 2733 if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec 2734 && ! _bfd_elf_validate_reloc (abfd, ptr)) 2735 { 2736 *failedp = TRUE; 2737 return; 2738 } 2739 2740 int_rel.r_type = ptr->howto->type; 2741 int_rel.r_type2 = (int) R_MIPS_NONE; 2742 int_rel.r_type3 = (int) R_MIPS_NONE; 2743 2744 for (i = 0; i < 2; i++) 2745 { 2746 arelent *r; 2747 2748 if (idx + 1 >= sec->reloc_count) 2749 break; 2750 r = sec->orelocation[idx + 1]; 2751 if (r->address != ptr->address 2752 || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section) 2753 || (*r->sym_ptr_ptr)->value != 0) 2754 break; 2755 2756 /* We can merge the reloc at IDX + 1 with the reloc at IDX. */ 2757 2758 if (i == 0) 2759 int_rel.r_type2 = r->howto->type; 2760 else 2761 int_rel.r_type3 = r->howto->type; 2762 2763 ++idx; 2764 } 2765 2766 mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel); 2767 } 2768 2769 BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents 2770 == *count); 2771 } 2772 2773 static void 2774 mips_elf64_write_rela (bfd *abfd, asection *sec, 2775 Elf_Internal_Shdr *rela_hdr, 2776 int *count, void *data) 2777 { 2778 bfd_boolean *failedp = data; 2779 Elf64_Mips_External_Rela *ext_rela; 2780 unsigned int idx; 2781 asymbol *last_sym = 0; 2782 int last_sym_idx = 0; 2783 2784 rela_hdr->sh_size = rela_hdr->sh_entsize * *count; 2785 rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size); 2786 if (rela_hdr->contents == NULL) 2787 { 2788 *failedp = TRUE; 2789 return; 2790 } 2791 2792 ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents; 2793 for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++) 2794 { 2795 arelent *ptr; 2796 Elf64_Mips_Internal_Rela int_rela; 2797 asymbol *sym; 2798 int n; 2799 unsigned int i; 2800 2801 ptr = sec->orelocation[idx]; 2802 2803 /* The address of an ELF reloc is section relative for an object 2804 file, and absolute for an executable file or shared library. 2805 The address of a BFD reloc is always section relative. */ 2806 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) 2807 int_rela.r_offset = ptr->address; 2808 else 2809 int_rela.r_offset = ptr->address + sec->vma; 2810 2811 sym = *ptr->sym_ptr_ptr; 2812 if (sym == last_sym) 2813 n = last_sym_idx; 2814 else if (bfd_is_abs_section (sym->section) && sym->value == 0) 2815 n = STN_UNDEF; 2816 else 2817 { 2818 last_sym = sym; 2819 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); 2820 if (n < 0) 2821 { 2822 *failedp = TRUE; 2823 return; 2824 } 2825 last_sym_idx = n; 2826 } 2827 2828 int_rela.r_sym = n; 2829 int_rela.r_addend = ptr->addend; 2830 int_rela.r_ssym = RSS_UNDEF; 2831 2832 if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec 2833 && ! _bfd_elf_validate_reloc (abfd, ptr)) 2834 { 2835 *failedp = TRUE; 2836 return; 2837 } 2838 2839 int_rela.r_type = ptr->howto->type; 2840 int_rela.r_type2 = (int) R_MIPS_NONE; 2841 int_rela.r_type3 = (int) R_MIPS_NONE; 2842 2843 for (i = 0; i < 2; i++) 2844 { 2845 arelent *r; 2846 2847 if (idx + 1 >= sec->reloc_count) 2848 break; 2849 r = sec->orelocation[idx + 1]; 2850 if (r->address != ptr->address 2851 || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section) 2852 || (*r->sym_ptr_ptr)->value != 0) 2853 break; 2854 2855 /* We can merge the reloc at IDX + 1 with the reloc at IDX. */ 2856 2857 if (i == 0) 2858 int_rela.r_type2 = r->howto->type; 2859 else 2860 int_rela.r_type3 = r->howto->type; 2861 2862 ++idx; 2863 } 2864 2865 mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela); 2866 } 2867 2868 BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents 2869 == *count); 2870 } 2871 2872 /* Set the right machine number for a MIPS ELF file. */ 2873 2874 static bfd_boolean 2875 mips_elf64_object_p (bfd *abfd) 2876 { 2877 unsigned long mach; 2878 2879 /* Irix 6 is broken. Object file symbol tables are not always 2880 sorted correctly such that local symbols precede global symbols, 2881 and the sh_info field in the symbol table is not always right. */ 2882 if (elf64_mips_irix_compat (abfd) != ict_none) 2883 elf_bad_symtab (abfd) = TRUE; 2884 2885 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags); 2886 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach); 2887 return TRUE; 2888 } 2889 2890 /* Depending on the target vector we generate some version of Irix 2891 executables or "normal" MIPS ELF ABI executables. */ 2892 static irix_compat_t 2893 elf64_mips_irix_compat (bfd *abfd) 2894 { 2895 if ((abfd->xvec == &bfd_elf64_bigmips_vec) 2896 || (abfd->xvec == &bfd_elf64_littlemips_vec)) 2897 return ict_irix6; 2898 else 2899 return ict_none; 2900 } 2901 2902 /* Support for core dump NOTE sections. */ 2903 static bfd_boolean 2904 elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 2905 { 2906 int offset; 2907 unsigned int size; 2908 2909 switch (note->descsz) 2910 { 2911 default: 2912 return FALSE; 2913 2914 case 480: /* Linux/MIPS - N64 kernel */ 2915 /* pr_cursig */ 2916 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); 2917 2918 /* pr_pid */ 2919 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32); 2920 2921 /* pr_reg */ 2922 offset = 112; 2923 size = 360; 2924 2925 break; 2926 } 2927 2928 /* Make a ".reg/999" section. */ 2929 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 2930 size, note->descpos + offset); 2931 } 2932 2933 static bfd_boolean 2934 elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 2935 { 2936 switch (note->descsz) 2937 { 2938 default: 2939 return FALSE; 2940 2941 case 136: /* Linux/MIPS - N64 kernel elf_prpsinfo */ 2942 elf_tdata (abfd)->core_program 2943 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16); 2944 elf_tdata (abfd)->core_command 2945 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80); 2946 } 2947 2948 /* Note that for some reason, a spurious space is tacked 2949 onto the end of the args in some (at least one anyway) 2950 implementations, so strip it off if it exists. */ 2951 2952 { 2953 char *command = elf_tdata (abfd)->core_command; 2954 int n = strlen (command); 2955 2956 if (0 < n && command[n - 1] == ' ') 2957 command[n - 1] = '\0'; 2958 } 2959 2960 return TRUE; 2961 } 2962 2963 /* ECOFF swapping routines. These are used when dealing with the 2964 .mdebug section, which is in the ECOFF debugging format. */ 2965 static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap = 2966 { 2967 /* Symbol table magic number. */ 2968 magicSym2, 2969 /* Alignment of debugging information. E.g., 4. */ 2970 8, 2971 /* Sizes of external symbolic information. */ 2972 sizeof (struct hdr_ext), 2973 sizeof (struct dnr_ext), 2974 sizeof (struct pdr_ext), 2975 sizeof (struct sym_ext), 2976 sizeof (struct opt_ext), 2977 sizeof (struct fdr_ext), 2978 sizeof (struct rfd_ext), 2979 sizeof (struct ext_ext), 2980 /* Functions to swap in external symbolic data. */ 2981 ecoff_swap_hdr_in, 2982 ecoff_swap_dnr_in, 2983 ecoff_swap_pdr_in, 2984 ecoff_swap_sym_in, 2985 ecoff_swap_opt_in, 2986 ecoff_swap_fdr_in, 2987 ecoff_swap_rfd_in, 2988 ecoff_swap_ext_in, 2989 _bfd_ecoff_swap_tir_in, 2990 _bfd_ecoff_swap_rndx_in, 2991 /* Functions to swap out external symbolic data. */ 2992 ecoff_swap_hdr_out, 2993 ecoff_swap_dnr_out, 2994 ecoff_swap_pdr_out, 2995 ecoff_swap_sym_out, 2996 ecoff_swap_opt_out, 2997 ecoff_swap_fdr_out, 2998 ecoff_swap_rfd_out, 2999 ecoff_swap_ext_out, 3000 _bfd_ecoff_swap_tir_out, 3001 _bfd_ecoff_swap_rndx_out, 3002 /* Function to read in symbolic data. */ 3003 _bfd_mips_elf_read_ecoff_info 3004 }; 3005 3006 /* Relocations in the 64 bit MIPS ELF ABI are more complex than in 3007 standard ELF. This structure is used to redirect the relocation 3008 handling routines. */ 3009 3010 const struct elf_size_info mips_elf64_size_info = 3011 { 3012 sizeof (Elf64_External_Ehdr), 3013 sizeof (Elf64_External_Phdr), 3014 sizeof (Elf64_External_Shdr), 3015 sizeof (Elf64_Mips_External_Rel), 3016 sizeof (Elf64_Mips_External_Rela), 3017 sizeof (Elf64_External_Sym), 3018 sizeof (Elf64_External_Dyn), 3019 sizeof (Elf_External_Note), 3020 4, /* hash-table entry size */ 3021 3, /* internal relocations per external relocations */ 3022 64, /* arch_size */ 3023 3, /* log_file_align */ 3024 ELFCLASS64, 3025 EV_CURRENT, 3026 bfd_elf64_write_out_phdrs, 3027 bfd_elf64_write_shdrs_and_ehdr, 3028 mips_elf64_write_relocs, 3029 bfd_elf64_swap_symbol_in, 3030 bfd_elf64_swap_symbol_out, 3031 mips_elf64_slurp_reloc_table, 3032 bfd_elf64_slurp_symbol_table, 3033 bfd_elf64_swap_dyn_in, 3034 bfd_elf64_swap_dyn_out, 3035 mips_elf64_be_swap_reloc_in, 3036 mips_elf64_be_swap_reloc_out, 3037 mips_elf64_be_swap_reloca_in, 3038 mips_elf64_be_swap_reloca_out 3039 }; 3040 3041 #define ELF_ARCH bfd_arch_mips 3042 #define ELF_MACHINE_CODE EM_MIPS 3043 3044 #define elf_backend_collect TRUE 3045 #define elf_backend_type_change_ok TRUE 3046 #define elf_backend_can_gc_sections TRUE 3047 #define elf_info_to_howto mips_elf64_info_to_howto_rela 3048 #define elf_info_to_howto_rel mips_elf64_info_to_howto_rel 3049 #define elf_backend_object_p mips_elf64_object_p 3050 #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing 3051 #define elf_backend_section_processing _bfd_mips_elf_section_processing 3052 #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr 3053 #define elf_backend_fake_sections _bfd_mips_elf_fake_sections 3054 #define elf_backend_section_from_bfd_section \ 3055 _bfd_mips_elf_section_from_bfd_section 3056 #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook 3057 #define elf_backend_link_output_symbol_hook \ 3058 _bfd_mips_elf_link_output_symbol_hook 3059 #define elf_backend_create_dynamic_sections \ 3060 _bfd_mips_elf_create_dynamic_sections 3061 #define elf_backend_check_relocs _bfd_mips_elf_check_relocs 3062 #define elf_backend_adjust_dynamic_symbol \ 3063 _bfd_mips_elf_adjust_dynamic_symbol 3064 #define elf_backend_always_size_sections \ 3065 _bfd_mips_elf_always_size_sections 3066 #define elf_backend_size_dynamic_sections \ 3067 _bfd_mips_elf_size_dynamic_sections 3068 #define elf_backend_relocate_section _bfd_mips_elf_relocate_section 3069 #define elf_backend_finish_dynamic_symbol \ 3070 _bfd_mips_elf_finish_dynamic_symbol 3071 #define elf_backend_finish_dynamic_sections \ 3072 _bfd_mips_elf_finish_dynamic_sections 3073 #define elf_backend_final_write_processing \ 3074 _bfd_mips_elf_final_write_processing 3075 #define elf_backend_additional_program_headers \ 3076 _bfd_mips_elf_additional_program_headers 3077 #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map 3078 #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook 3079 #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook 3080 #define elf_backend_copy_indirect_symbol \ 3081 _bfd_mips_elf_copy_indirect_symbol 3082 #define elf_backend_hide_symbol _bfd_mips_elf_hide_symbol 3083 #define elf_backend_ignore_discarded_relocs \ 3084 _bfd_mips_elf_ignore_discarded_relocs 3085 #define elf_backend_mips_irix_compat elf64_mips_irix_compat 3086 #define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto 3087 #define elf_backend_ecoff_debug_swap &mips_elf64_ecoff_debug_swap 3088 #define elf_backend_size_info mips_elf64_size_info 3089 3090 #define elf_backend_grok_prstatus elf64_mips_grok_prstatus 3091 #define elf_backend_grok_psinfo elf64_mips_grok_psinfo 3092 3093 #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO) 3094 3095 /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations 3096 work better/work only in RELA, so we default to this. */ 3097 #define elf_backend_may_use_rel_p 1 3098 #define elf_backend_may_use_rela_p 1 3099 #define elf_backend_default_use_rela_p 1 3100 3101 #define elf_backend_write_section _bfd_mips_elf_write_section 3102 3103 /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit 3104 MIPS-specific function only applies to IRIX5, which had no 64-bit 3105 ABI. */ 3106 #define bfd_elf64_find_nearest_line _bfd_mips_elf_find_nearest_line 3107 #define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info 3108 #define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook 3109 #define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents 3110 #define bfd_elf64_bfd_get_relocated_section_contents \ 3111 _bfd_elf_mips_get_relocated_section_contents 3112 #define bfd_elf64_bfd_link_hash_table_create \ 3113 _bfd_mips_elf_link_hash_table_create 3114 #define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link 3115 #define bfd_elf64_bfd_merge_private_bfd_data \ 3116 _bfd_mips_elf_merge_private_bfd_data 3117 #define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags 3118 #define bfd_elf64_bfd_print_private_bfd_data \ 3119 _bfd_mips_elf_print_private_bfd_data 3120 3121 #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound 3122 #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc 3123 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound 3124 #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc 3125 #define bfd_elf64_bfd_relax_section _bfd_mips_relax_section 3126 3127 /* MIPS ELF64 archive functions. */ 3128 #define bfd_elf64_archive_functions 3129 extern bfd_boolean bfd_elf64_archive_slurp_armap 3130 (bfd *); 3131 extern bfd_boolean bfd_elf64_archive_write_armap 3132 (bfd *, unsigned int, struct orl *, unsigned int, int); 3133 #define bfd_elf64_archive_slurp_extended_name_table \ 3134 _bfd_archive_coff_slurp_extended_name_table 3135 #define bfd_elf64_archive_construct_extended_name_table \ 3136 _bfd_archive_coff_construct_extended_name_table 3137 #define bfd_elf64_archive_truncate_arname \ 3138 _bfd_archive_coff_truncate_arname 3139 #define bfd_elf64_archive_read_ar_hdr _bfd_archive_coff_read_ar_hdr 3140 #define bfd_elf64_archive_openr_next_archived_file \ 3141 _bfd_archive_coff_openr_next_archived_file 3142 #define bfd_elf64_archive_get_elt_at_index \ 3143 _bfd_archive_coff_get_elt_at_index 3144 #define bfd_elf64_archive_generic_stat_arch_elt \ 3145 _bfd_archive_coff_generic_stat_arch_elt 3146 #define bfd_elf64_archive_update_armap_timestamp \ 3147 _bfd_archive_coff_update_armap_timestamp 3148 3149 /* The SGI style (n)64 NewABI. */ 3150 #define TARGET_LITTLE_SYM bfd_elf64_littlemips_vec 3151 #define TARGET_LITTLE_NAME "elf64-littlemips" 3152 #define TARGET_BIG_SYM bfd_elf64_bigmips_vec 3153 #define TARGET_BIG_NAME "elf64-bigmips" 3154 3155 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses 3156 a value of 0x1000, and we are compatible. 3157 FIXME: How does this affect NewABI? */ 3158 #define ELF_MAXPAGESIZE 0x1000 3159 3160 #include "elf64-target.h" 3161 3162 /* The SYSV-style 'traditional' (n)64 NewABI. */ 3163 #undef TARGET_LITTLE_SYM 3164 #undef TARGET_LITTLE_NAME 3165 #undef TARGET_BIG_SYM 3166 #undef TARGET_BIG_NAME 3167 3168 #undef ELF_MAXPAGESIZE 3169 3170 #define TARGET_LITTLE_SYM bfd_elf64_tradlittlemips_vec 3171 #define TARGET_LITTLE_NAME "elf64-tradlittlemips" 3172 #define TARGET_BIG_SYM bfd_elf64_tradbigmips_vec 3173 #define TARGET_BIG_NAME "elf64-tradbigmips" 3174 3175 /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses 3176 page sizes of up to that limit, so we need to respect it. */ 3177 #define ELF_MAXPAGESIZE 0x10000 3178 #define elf64_bed elf64_tradbed 3179 3180 /* Include the target file again for this target. */ 3181 #include "elf64-target.h" 3182