1 /* MIPS-specific support for 32-bit ELF 2 Copyright (C) 1993-2024 Free Software Foundation, Inc. 3 4 Most of the information added by Ian Lance Taylor, Cygnus Support, 5 <ian@cygnus.com>. 6 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC. 7 <mark@codesourcery.com> 8 Traditional MIPS targets support added by Koundinya.K, Dansk Data 9 Elektronik & Operations Research Group. <kk@ddeorg.soft.net> 10 11 This file is part of BFD, the Binary File Descriptor library. 12 13 This program is free software; you can redistribute it and/or modify 14 it under the terms of the GNU General Public License as published by 15 the Free Software Foundation; either version 3 of the License, or 16 (at your option) any later version. 17 18 This program is distributed in the hope that it will be useful, 19 but WITHOUT ANY WARRANTY; without even the implied warranty of 20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 GNU General Public License for more details. 22 23 You should have received a copy of the GNU General Public License 24 along with this program; if not, write to the Free Software 25 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 26 MA 02110-1301, USA. */ 27 28 29 /* This file handles MIPS ELF targets. SGI Irix 5 uses a slightly 30 different MIPS ELF from other targets. This matters when linking. 31 This file supports both, switching at runtime. */ 32 33 #include "sysdep.h" 34 #include "bfd.h" 35 #include "libbfd.h" 36 #include "bfdlink.h" 37 #include "genlink.h" 38 #include "elf-bfd.h" 39 #include "elfxx-mips.h" 40 #include "elf/mips.h" 41 42 /* Get the ECOFF swapping routines. */ 43 #include "coff/sym.h" 44 #include "coff/symconst.h" 45 #include "coff/internal.h" 46 #include "coff/ecoff.h" 47 #include "coff/mips.h" 48 #define ECOFF_SIGNED_32 49 #include "ecoffswap.h" 50 51 static bool mips_elf_assign_gp 52 (bfd *, bfd_vma *); 53 static bfd_reloc_status_type mips_elf_final_gp 54 (bfd *, asymbol *, bool, char **, bfd_vma *); 55 static bfd_reloc_status_type mips_elf_gprel16_reloc 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 57 static bfd_reloc_status_type mips_elf_literal_reloc 58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 59 static bfd_reloc_status_type mips_elf_gprel32_reloc 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 61 static bfd_reloc_status_type gprel32_with_gp 62 (bfd *, asymbol *, arelent *, asection *, bool, void *, bfd_vma); 63 static bfd_reloc_status_type mips_elf_shift6_reloc 64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 65 static bfd_reloc_status_type mips16_gprel_reloc 66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 67 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup 68 (bfd *, bfd_reloc_code_real_type); 69 static bool mips_info_to_howto_rel 70 (bfd *, arelent *, Elf_Internal_Rela *); 71 static bool mips_info_to_howto_rela 72 (bfd *, arelent *, Elf_Internal_Rela *); 73 static bool mips_elf_sym_is_global 74 (bfd *, asymbol *); 75 static bool mips_elf_n32_elfsym_local_is_section 76 (bfd *); 77 static bool mips_elf_n32_object_p 78 (bfd *); 79 static bool elf32_mips_grok_prstatus 80 (bfd *, Elf_Internal_Note *); 81 static bool elf32_mips_grok_psinfo 82 (bfd *, Elf_Internal_Note *); 83 static bool mips_elf_n32_is_local_label_name 84 (bfd *, const char *); 85 static bool elf_n32_mips_grok_freebsd_prstatus 86 (bfd *, Elf_Internal_Note *); 87 static irix_compat_t elf_n32_mips_irix_compat 88 (bfd *); 89 static bool mips_elf_n32_mkobject 90 (bfd *); 91 92 extern const bfd_target mips_elf32_n_be_vec; 93 extern const bfd_target mips_elf32_n_le_vec; 94 95 /* Nonzero if ABFD is using the N32 ABI. */ 96 #define ABI_N32_P(abfd) \ 97 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0) 98 99 /* Whether we are trying to be compatible with IRIX at all. */ 100 #define SGI_COMPAT(abfd) \ 101 (elf_n32_mips_irix_compat (abfd) != ict_none) 102 103 /* The number of local .got entries we reserve. */ 104 #define MIPS_RESERVED_GOTNO (2) 105 106 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value 107 from smaller values. Start with zero, widen, *then* decrement. */ 108 #define MINUS_ONE (((bfd_vma)0) - 1) 109 110 /* The relocation table used for SHT_REL sections. */ 111 112 static reloc_howto_type elf_mips_howto_table_rel[] = 113 { 114 /* No relocation. */ 115 HOWTO (R_MIPS_NONE, /* type */ 116 0, /* rightshift */ 117 0, /* size */ 118 0, /* bitsize */ 119 false, /* pc_relative */ 120 0, /* bitpos */ 121 complain_overflow_dont, /* complain_on_overflow */ 122 _bfd_mips_elf_generic_reloc, /* special_function */ 123 "R_MIPS_NONE", /* name */ 124 false, /* partial_inplace */ 125 0, /* src_mask */ 126 0, /* dst_mask */ 127 false), /* pcrel_offset */ 128 129 /* 16 bit relocation. */ 130 HOWTO (R_MIPS_16, /* type */ 131 0, /* rightshift */ 132 4, /* size */ 133 16, /* bitsize */ 134 false, /* pc_relative */ 135 0, /* bitpos */ 136 complain_overflow_signed, /* complain_on_overflow */ 137 _bfd_mips_elf_generic_reloc, /* special_function */ 138 "R_MIPS_16", /* name */ 139 true, /* partial_inplace */ 140 0x0000ffff, /* src_mask */ 141 0x0000ffff, /* dst_mask */ 142 false), /* pcrel_offset */ 143 144 /* 32 bit relocation. */ 145 HOWTO (R_MIPS_32, /* type */ 146 0, /* rightshift */ 147 4, /* size */ 148 32, /* bitsize */ 149 false, /* pc_relative */ 150 0, /* bitpos */ 151 complain_overflow_dont, /* complain_on_overflow */ 152 _bfd_mips_elf_generic_reloc, /* special_function */ 153 "R_MIPS_32", /* name */ 154 true, /* partial_inplace */ 155 0xffffffff, /* src_mask */ 156 0xffffffff, /* dst_mask */ 157 false), /* pcrel_offset */ 158 159 /* 32 bit symbol relative relocation. */ 160 HOWTO (R_MIPS_REL32, /* type */ 161 0, /* rightshift */ 162 4, /* size */ 163 32, /* bitsize */ 164 false, /* pc_relative */ 165 0, /* bitpos */ 166 complain_overflow_dont, /* complain_on_overflow */ 167 _bfd_mips_elf_generic_reloc, /* special_function */ 168 "R_MIPS_REL32", /* name */ 169 true, /* partial_inplace */ 170 0xffffffff, /* src_mask */ 171 0xffffffff, /* dst_mask */ 172 false), /* pcrel_offset */ 173 174 /* 26 bit jump address. */ 175 HOWTO (R_MIPS_26, /* type */ 176 2, /* rightshift */ 177 4, /* size */ 178 26, /* bitsize */ 179 false, /* pc_relative */ 180 0, /* bitpos */ 181 complain_overflow_dont, /* complain_on_overflow */ 182 /* This needs complex overflow 183 detection, because the upper four 184 bits must match the PC + 4. */ 185 _bfd_mips_elf_generic_reloc, /* special_function */ 186 "R_MIPS_26", /* name */ 187 true, /* partial_inplace */ 188 0x03ffffff, /* src_mask */ 189 0x03ffffff, /* dst_mask */ 190 false), /* pcrel_offset */ 191 192 /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL. 193 However, the native IRIX6 tools use them, so we try our best. */ 194 195 /* High 16 bits of symbol value. */ 196 HOWTO (R_MIPS_HI16, /* type */ 197 16, /* rightshift */ 198 4, /* size */ 199 16, /* bitsize */ 200 false, /* pc_relative */ 201 0, /* bitpos */ 202 complain_overflow_dont, /* complain_on_overflow */ 203 _bfd_mips_elf_hi16_reloc, /* special_function */ 204 "R_MIPS_HI16", /* name */ 205 true, /* partial_inplace */ 206 0x0000ffff, /* src_mask */ 207 0x0000ffff, /* dst_mask */ 208 false), /* pcrel_offset */ 209 210 /* Low 16 bits of symbol value. */ 211 HOWTO (R_MIPS_LO16, /* type */ 212 0, /* rightshift */ 213 4, /* size */ 214 16, /* bitsize */ 215 false, /* pc_relative */ 216 0, /* bitpos */ 217 complain_overflow_dont, /* complain_on_overflow */ 218 _bfd_mips_elf_lo16_reloc, /* special_function */ 219 "R_MIPS_LO16", /* name */ 220 true, /* partial_inplace */ 221 0x0000ffff, /* src_mask */ 222 0x0000ffff, /* dst_mask */ 223 false), /* pcrel_offset */ 224 225 /* GP relative reference. */ 226 HOWTO (R_MIPS_GPREL16, /* type */ 227 0, /* rightshift */ 228 4, /* size */ 229 16, /* bitsize */ 230 false, /* pc_relative */ 231 0, /* bitpos */ 232 complain_overflow_signed, /* complain_on_overflow */ 233 mips_elf_gprel16_reloc, /* special_function */ 234 "R_MIPS_GPREL16", /* name */ 235 true, /* partial_inplace */ 236 0x0000ffff, /* src_mask */ 237 0x0000ffff, /* dst_mask */ 238 false), /* pcrel_offset */ 239 240 /* Reference to literal section. */ 241 HOWTO (R_MIPS_LITERAL, /* type */ 242 0, /* rightshift */ 243 4, /* size */ 244 16, /* bitsize */ 245 false, /* pc_relative */ 246 0, /* bitpos */ 247 complain_overflow_signed, /* complain_on_overflow */ 248 mips_elf_literal_reloc, /* special_function */ 249 "R_MIPS_LITERAL", /* name */ 250 true, /* partial_inplace */ 251 0x0000ffff, /* src_mask */ 252 0x0000ffff, /* dst_mask */ 253 false), /* pcrel_offset */ 254 255 /* Reference to global offset table. */ 256 HOWTO (R_MIPS_GOT16, /* type */ 257 0, /* rightshift */ 258 4, /* size */ 259 16, /* bitsize */ 260 false, /* pc_relative */ 261 0, /* bitpos */ 262 complain_overflow_signed, /* complain_on_overflow */ 263 _bfd_mips_elf_got16_reloc, /* special_function */ 264 "R_MIPS_GOT16", /* name */ 265 true, /* partial_inplace */ 266 0x0000ffff, /* src_mask */ 267 0x0000ffff, /* dst_mask */ 268 false), /* pcrel_offset */ 269 270 /* 16 bit PC relative reference. Note that the ABI document has a typo 271 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless. 272 We do the right thing here. */ 273 HOWTO (R_MIPS_PC16, /* type */ 274 2, /* rightshift */ 275 4, /* size */ 276 16, /* bitsize */ 277 true, /* pc_relative */ 278 0, /* bitpos */ 279 complain_overflow_signed, /* complain_on_overflow */ 280 _bfd_mips_elf_generic_reloc, /* special_function */ 281 "R_MIPS_PC16", /* name */ 282 true, /* partial_inplace */ 283 0x0000ffff, /* src_mask */ 284 0x0000ffff, /* dst_mask */ 285 true), /* pcrel_offset */ 286 287 /* 16 bit call through global offset table. */ 288 HOWTO (R_MIPS_CALL16, /* type */ 289 0, /* rightshift */ 290 4, /* size */ 291 16, /* bitsize */ 292 false, /* pc_relative */ 293 0, /* bitpos */ 294 complain_overflow_signed, /* complain_on_overflow */ 295 _bfd_mips_elf_generic_reloc, /* special_function */ 296 "R_MIPS_CALL16", /* name */ 297 true, /* partial_inplace */ 298 0x0000ffff, /* src_mask */ 299 0x0000ffff, /* dst_mask */ 300 false), /* pcrel_offset */ 301 302 /* 32 bit GP relative reference. */ 303 HOWTO (R_MIPS_GPREL32, /* type */ 304 0, /* rightshift */ 305 4, /* size */ 306 32, /* bitsize */ 307 false, /* pc_relative */ 308 0, /* bitpos */ 309 complain_overflow_dont, /* complain_on_overflow */ 310 mips_elf_gprel32_reloc, /* special_function */ 311 "R_MIPS_GPREL32", /* name */ 312 true, /* partial_inplace */ 313 0xffffffff, /* src_mask */ 314 0xffffffff, /* dst_mask */ 315 false), /* pcrel_offset */ 316 317 /* The remaining relocs are defined on Irix 5, although they are 318 not defined by the ABI. */ 319 EMPTY_HOWTO (13), 320 EMPTY_HOWTO (14), 321 EMPTY_HOWTO (15), 322 323 /* A 5 bit shift field. */ 324 HOWTO (R_MIPS_SHIFT5, /* type */ 325 0, /* rightshift */ 326 4, /* size */ 327 5, /* bitsize */ 328 false, /* pc_relative */ 329 6, /* bitpos */ 330 complain_overflow_bitfield, /* complain_on_overflow */ 331 _bfd_mips_elf_generic_reloc, /* special_function */ 332 "R_MIPS_SHIFT5", /* name */ 333 true, /* partial_inplace */ 334 0x000007c0, /* src_mask */ 335 0x000007c0, /* dst_mask */ 336 false), /* pcrel_offset */ 337 338 /* A 6 bit shift field. */ 339 HOWTO (R_MIPS_SHIFT6, /* type */ 340 0, /* rightshift */ 341 4, /* size */ 342 6, /* bitsize */ 343 false, /* pc_relative */ 344 6, /* bitpos */ 345 complain_overflow_bitfield, /* complain_on_overflow */ 346 mips_elf_shift6_reloc, /* special_function */ 347 "R_MIPS_SHIFT6", /* name */ 348 true, /* partial_inplace */ 349 0x000007c4, /* src_mask */ 350 0x000007c4, /* dst_mask */ 351 false), /* pcrel_offset */ 352 353 /* A 64 bit relocation. */ 354 HOWTO (R_MIPS_64, /* type */ 355 0, /* rightshift */ 356 8, /* size */ 357 64, /* bitsize */ 358 false, /* pc_relative */ 359 0, /* bitpos */ 360 complain_overflow_dont, /* complain_on_overflow */ 361 _bfd_mips_elf_generic_reloc, /* special_function */ 362 "R_MIPS_64", /* name */ 363 true, /* partial_inplace */ 364 MINUS_ONE, /* src_mask */ 365 MINUS_ONE, /* dst_mask */ 366 false), /* pcrel_offset */ 367 368 /* Displacement in the global offset table. */ 369 HOWTO (R_MIPS_GOT_DISP, /* type */ 370 0, /* rightshift */ 371 4, /* size */ 372 16, /* bitsize */ 373 false, /* pc_relative */ 374 0, /* bitpos */ 375 complain_overflow_signed, /* complain_on_overflow */ 376 _bfd_mips_elf_generic_reloc, /* special_function */ 377 "R_MIPS_GOT_DISP", /* name */ 378 true, /* partial_inplace */ 379 0x0000ffff, /* src_mask */ 380 0x0000ffff, /* dst_mask */ 381 false), /* pcrel_offset */ 382 383 /* Displacement to page pointer in the global offset table. */ 384 HOWTO (R_MIPS_GOT_PAGE, /* type */ 385 0, /* rightshift */ 386 4, /* size */ 387 16, /* bitsize */ 388 false, /* pc_relative */ 389 0, /* bitpos */ 390 complain_overflow_signed, /* complain_on_overflow */ 391 _bfd_mips_elf_generic_reloc, /* special_function */ 392 "R_MIPS_GOT_PAGE", /* name */ 393 true, /* partial_inplace */ 394 0x0000ffff, /* src_mask */ 395 0x0000ffff, /* dst_mask */ 396 false), /* pcrel_offset */ 397 398 /* Offset from page pointer in the global offset table. */ 399 HOWTO (R_MIPS_GOT_OFST, /* type */ 400 0, /* rightshift */ 401 4, /* size */ 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_OFST", /* name */ 408 true, /* partial_inplace */ 409 0x0000ffff, /* src_mask */ 410 0x0000ffff, /* dst_mask */ 411 false), /* pcrel_offset */ 412 413 /* High 16 bits of displacement in global offset table. */ 414 HOWTO (R_MIPS_GOT_HI16, /* type */ 415 0, /* rightshift */ 416 4, /* size */ 417 16, /* bitsize */ 418 false, /* pc_relative */ 419 0, /* bitpos */ 420 complain_overflow_dont, /* complain_on_overflow */ 421 _bfd_mips_elf_generic_reloc, /* special_function */ 422 "R_MIPS_GOT_HI16", /* name */ 423 true, /* partial_inplace */ 424 0x0000ffff, /* src_mask */ 425 0x0000ffff, /* dst_mask */ 426 false), /* pcrel_offset */ 427 428 /* Low 16 bits of displacement in global offset table. */ 429 HOWTO (R_MIPS_GOT_LO16, /* type */ 430 0, /* rightshift */ 431 4, /* size */ 432 16, /* bitsize */ 433 false, /* pc_relative */ 434 0, /* bitpos */ 435 complain_overflow_dont, /* complain_on_overflow */ 436 _bfd_mips_elf_generic_reloc, /* special_function */ 437 "R_MIPS_GOT_LO16", /* name */ 438 true, /* partial_inplace */ 439 0x0000ffff, /* src_mask */ 440 0x0000ffff, /* dst_mask */ 441 false), /* pcrel_offset */ 442 443 /* 64 bit subtraction. */ 444 HOWTO (R_MIPS_SUB, /* type */ 445 0, /* rightshift */ 446 8, /* size */ 447 64, /* 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_SUB", /* name */ 453 true, /* partial_inplace */ 454 MINUS_ONE, /* src_mask */ 455 MINUS_ONE, /* dst_mask */ 456 false), /* pcrel_offset */ 457 458 /* Insert the addend as an instruction. */ 459 /* FIXME: Not handled correctly. */ 460 HOWTO (R_MIPS_INSERT_A, /* type */ 461 0, /* rightshift */ 462 4, /* size */ 463 32, /* bitsize */ 464 false, /* pc_relative */ 465 0, /* bitpos */ 466 complain_overflow_dont, /* complain_on_overflow */ 467 _bfd_mips_elf_generic_reloc, /* special_function */ 468 "R_MIPS_INSERT_A", /* name */ 469 true, /* partial_inplace */ 470 0xffffffff, /* src_mask */ 471 0xffffffff, /* dst_mask */ 472 false), /* pcrel_offset */ 473 474 /* Insert the addend as an instruction, and change all relocations 475 to refer to the old instruction at the address. */ 476 /* FIXME: Not handled correctly. */ 477 HOWTO (R_MIPS_INSERT_B, /* type */ 478 0, /* rightshift */ 479 4, /* size */ 480 32, /* bitsize */ 481 false, /* pc_relative */ 482 0, /* bitpos */ 483 complain_overflow_dont, /* complain_on_overflow */ 484 _bfd_mips_elf_generic_reloc, /* special_function */ 485 "R_MIPS_INSERT_B", /* name */ 486 true, /* partial_inplace */ 487 0xffffffff, /* src_mask */ 488 0xffffffff, /* dst_mask */ 489 false), /* pcrel_offset */ 490 491 /* Delete a 32 bit instruction. */ 492 /* FIXME: Not handled correctly. */ 493 HOWTO (R_MIPS_DELETE, /* type */ 494 0, /* rightshift */ 495 4, /* size */ 496 32, /* bitsize */ 497 false, /* pc_relative */ 498 0, /* bitpos */ 499 complain_overflow_dont, /* complain_on_overflow */ 500 _bfd_mips_elf_generic_reloc, /* special_function */ 501 "R_MIPS_DELETE", /* name */ 502 true, /* partial_inplace */ 503 0xffffffff, /* src_mask */ 504 0xffffffff, /* dst_mask */ 505 false), /* pcrel_offset */ 506 507 /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations. 508 We don't, because 509 a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/ 510 R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using 511 fallable heuristics. 512 b) No other NewABI toolchain actually emits such relocations. */ 513 EMPTY_HOWTO (R_MIPS_HIGHER), 514 EMPTY_HOWTO (R_MIPS_HIGHEST), 515 516 /* High 16 bits of displacement in global offset table. */ 517 HOWTO (R_MIPS_CALL_HI16, /* type */ 518 0, /* rightshift */ 519 4, /* size */ 520 16, /* bitsize */ 521 false, /* pc_relative */ 522 0, /* bitpos */ 523 complain_overflow_dont, /* complain_on_overflow */ 524 _bfd_mips_elf_generic_reloc, /* special_function */ 525 "R_MIPS_CALL_HI16", /* name */ 526 true, /* partial_inplace */ 527 0x0000ffff, /* src_mask */ 528 0x0000ffff, /* dst_mask */ 529 false), /* pcrel_offset */ 530 531 /* Low 16 bits of displacement in global offset table. */ 532 HOWTO (R_MIPS_CALL_LO16, /* type */ 533 0, /* rightshift */ 534 4, /* size */ 535 16, /* bitsize */ 536 false, /* pc_relative */ 537 0, /* bitpos */ 538 complain_overflow_dont, /* complain_on_overflow */ 539 _bfd_mips_elf_generic_reloc, /* special_function */ 540 "R_MIPS_CALL_LO16", /* name */ 541 true, /* partial_inplace */ 542 0x0000ffff, /* src_mask */ 543 0x0000ffff, /* dst_mask */ 544 false), /* pcrel_offset */ 545 546 /* Section displacement. */ 547 HOWTO (R_MIPS_SCN_DISP, /* type */ 548 0, /* rightshift */ 549 4, /* size */ 550 32, /* 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_SCN_DISP", /* name */ 556 true, /* partial_inplace */ 557 0xffffffff, /* src_mask */ 558 0xffffffff, /* dst_mask */ 559 false), /* pcrel_offset */ 560 561 HOWTO (R_MIPS_REL16, /* type */ 562 0, /* rightshift */ 563 2, /* size */ 564 16, /* bitsize */ 565 false, /* pc_relative */ 566 0, /* bitpos */ 567 complain_overflow_signed, /* complain_on_overflow */ 568 _bfd_mips_elf_generic_reloc, /* special_function */ 569 "R_MIPS_REL16", /* name */ 570 true, /* partial_inplace */ 571 0xffff, /* src_mask */ 572 0xffff, /* dst_mask */ 573 false), /* pcrel_offset */ 574 575 /* These two are obsolete. */ 576 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE), 577 EMPTY_HOWTO (R_MIPS_PJUMP), 578 579 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section. 580 It must be used for multigot GOT's (and only there). */ 581 HOWTO (R_MIPS_RELGOT, /* type */ 582 0, /* rightshift */ 583 4, /* size */ 584 32, /* bitsize */ 585 false, /* pc_relative */ 586 0, /* bitpos */ 587 complain_overflow_dont, /* complain_on_overflow */ 588 _bfd_mips_elf_generic_reloc, /* special_function */ 589 "R_MIPS_RELGOT", /* name */ 590 true, /* partial_inplace */ 591 0xffffffff, /* src_mask */ 592 0xffffffff, /* dst_mask */ 593 false), /* pcrel_offset */ 594 595 /* Protected jump conversion. This is an optimization hint. No 596 relocation is required for correctness. */ 597 HOWTO (R_MIPS_JALR, /* type */ 598 0, /* rightshift */ 599 4, /* size */ 600 32, /* bitsize */ 601 false, /* pc_relative */ 602 0, /* bitpos */ 603 complain_overflow_dont, /* complain_on_overflow */ 604 _bfd_mips_elf_generic_reloc, /* special_function */ 605 "R_MIPS_JALR", /* name */ 606 false, /* partial_inplace */ 607 0x00000000, /* src_mask */ 608 0x00000000, /* dst_mask */ 609 false), /* pcrel_offset */ 610 611 /* TLS GD/LD dynamic relocations. */ 612 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */ 613 0, /* rightshift */ 614 4, /* size */ 615 32, /* bitsize */ 616 false, /* pc_relative */ 617 0, /* bitpos */ 618 complain_overflow_dont, /* complain_on_overflow */ 619 _bfd_mips_elf_generic_reloc, /* special_function */ 620 "R_MIPS_TLS_DTPMOD32", /* name */ 621 true, /* partial_inplace */ 622 0xffffffff, /* src_mask */ 623 0xffffffff, /* dst_mask */ 624 false), /* pcrel_offset */ 625 626 HOWTO (R_MIPS_TLS_DTPREL32, /* type */ 627 0, /* rightshift */ 628 4, /* size */ 629 32, /* bitsize */ 630 false, /* pc_relative */ 631 0, /* bitpos */ 632 complain_overflow_dont, /* complain_on_overflow */ 633 _bfd_mips_elf_generic_reloc, /* special_function */ 634 "R_MIPS_TLS_DTPREL32", /* name */ 635 true, /* partial_inplace */ 636 0xffffffff, /* src_mask */ 637 0xffffffff, /* dst_mask */ 638 false), /* pcrel_offset */ 639 640 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64), 641 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64), 642 643 /* TLS general dynamic variable reference. */ 644 HOWTO (R_MIPS_TLS_GD, /* type */ 645 0, /* rightshift */ 646 4, /* size */ 647 16, /* bitsize */ 648 false, /* pc_relative */ 649 0, /* bitpos */ 650 complain_overflow_signed, /* complain_on_overflow */ 651 _bfd_mips_elf_generic_reloc, /* special_function */ 652 "R_MIPS_TLS_GD", /* name */ 653 true, /* partial_inplace */ 654 0x0000ffff, /* src_mask */ 655 0x0000ffff, /* dst_mask */ 656 false), /* pcrel_offset */ 657 658 /* TLS local dynamic variable reference. */ 659 HOWTO (R_MIPS_TLS_LDM, /* type */ 660 0, /* rightshift */ 661 4, /* size */ 662 16, /* bitsize */ 663 false, /* pc_relative */ 664 0, /* bitpos */ 665 complain_overflow_signed, /* complain_on_overflow */ 666 _bfd_mips_elf_generic_reloc, /* special_function */ 667 "R_MIPS_TLS_LDM", /* name */ 668 true, /* partial_inplace */ 669 0x0000ffff, /* src_mask */ 670 0x0000ffff, /* dst_mask */ 671 false), /* pcrel_offset */ 672 673 /* TLS local dynamic offset. */ 674 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */ 675 0, /* rightshift */ 676 4, /* size */ 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_DTPREL_HI16", /* name */ 683 true, /* partial_inplace */ 684 0x0000ffff, /* src_mask */ 685 0x0000ffff, /* dst_mask */ 686 false), /* pcrel_offset */ 687 688 /* TLS local dynamic offset. */ 689 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */ 690 0, /* rightshift */ 691 4, /* size */ 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_DTPREL_LO16", /* name */ 698 true, /* partial_inplace */ 699 0x0000ffff, /* src_mask */ 700 0x0000ffff, /* dst_mask */ 701 false), /* pcrel_offset */ 702 703 /* TLS thread pointer offset. */ 704 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */ 705 0, /* rightshift */ 706 4, /* size */ 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_GOTTPREL", /* name */ 713 true, /* partial_inplace */ 714 0x0000ffff, /* src_mask */ 715 0x0000ffff, /* dst_mask */ 716 false), /* pcrel_offset */ 717 718 /* TLS IE dynamic relocations. */ 719 HOWTO (R_MIPS_TLS_TPREL32, /* type */ 720 0, /* rightshift */ 721 4, /* size */ 722 32, /* bitsize */ 723 false, /* pc_relative */ 724 0, /* bitpos */ 725 complain_overflow_dont, /* complain_on_overflow */ 726 _bfd_mips_elf_generic_reloc, /* special_function */ 727 "R_MIPS_TLS_TPREL32", /* name */ 728 true, /* partial_inplace */ 729 0xffffffff, /* src_mask */ 730 0xffffffff, /* dst_mask */ 731 false), /* pcrel_offset */ 732 733 EMPTY_HOWTO (R_MIPS_TLS_TPREL64), 734 735 /* TLS thread pointer offset. */ 736 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */ 737 0, /* rightshift */ 738 4, /* size */ 739 16, /* bitsize */ 740 false, /* pc_relative */ 741 0, /* bitpos */ 742 complain_overflow_signed, /* complain_on_overflow */ 743 _bfd_mips_elf_generic_reloc, /* special_function */ 744 "R_MIPS_TLS_TPREL_HI16", /* name */ 745 true, /* partial_inplace */ 746 0x0000ffff, /* src_mask */ 747 0x0000ffff, /* dst_mask */ 748 false), /* pcrel_offset */ 749 750 /* TLS thread pointer offset. */ 751 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */ 752 0, /* rightshift */ 753 4, /* size */ 754 16, /* bitsize */ 755 false, /* pc_relative */ 756 0, /* bitpos */ 757 complain_overflow_signed, /* complain_on_overflow */ 758 _bfd_mips_elf_generic_reloc, /* special_function */ 759 "R_MIPS_TLS_TPREL_LO16", /* name */ 760 true, /* partial_inplace */ 761 0x0000ffff, /* src_mask */ 762 0x0000ffff, /* dst_mask */ 763 false), /* pcrel_offset */ 764 765 /* 32 bit relocation with no addend. */ 766 HOWTO (R_MIPS_GLOB_DAT, /* type */ 767 0, /* rightshift */ 768 4, /* size */ 769 32, /* bitsize */ 770 false, /* pc_relative */ 771 0, /* bitpos */ 772 complain_overflow_dont, /* complain_on_overflow */ 773 _bfd_mips_elf_generic_reloc, /* special_function */ 774 "R_MIPS_GLOB_DAT", /* name */ 775 false, /* partial_inplace */ 776 0x0, /* src_mask */ 777 0xffffffff, /* dst_mask */ 778 false), /* pcrel_offset */ 779 780 EMPTY_HOWTO (52), 781 EMPTY_HOWTO (53), 782 EMPTY_HOWTO (54), 783 EMPTY_HOWTO (55), 784 EMPTY_HOWTO (56), 785 EMPTY_HOWTO (57), 786 EMPTY_HOWTO (58), 787 EMPTY_HOWTO (59), 788 789 HOWTO (R_MIPS_PC21_S2, /* type */ 790 2, /* rightshift */ 791 4, /* size */ 792 21, /* bitsize */ 793 true, /* pc_relative */ 794 0, /* bitpos */ 795 complain_overflow_signed, /* complain_on_overflow */ 796 _bfd_mips_elf_generic_reloc, /* special_function */ 797 "R_MIPS_PC21_S2", /* name */ 798 true, /* partial_inplace */ 799 0x001fffff, /* src_mask */ 800 0x001fffff, /* dst_mask */ 801 true), /* pcrel_offset */ 802 803 HOWTO (R_MIPS_PC26_S2, /* type */ 804 2, /* rightshift */ 805 4, /* size */ 806 26, /* bitsize */ 807 true, /* pc_relative */ 808 0, /* bitpos */ 809 complain_overflow_signed, /* complain_on_overflow */ 810 _bfd_mips_elf_generic_reloc, /* special_function */ 811 "R_MIPS_PC26_S2", /* name */ 812 true, /* partial_inplace */ 813 0x03ffffff, /* src_mask */ 814 0x03ffffff, /* dst_mask */ 815 true), /* pcrel_offset */ 816 817 HOWTO (R_MIPS_PC18_S3, /* type */ 818 3, /* rightshift */ 819 4, /* size */ 820 18, /* bitsize */ 821 true, /* pc_relative */ 822 0, /* bitpos */ 823 complain_overflow_signed, /* complain_on_overflow */ 824 _bfd_mips_elf_generic_reloc, /* special_function */ 825 "R_MIPS_PC18_S3", /* name */ 826 true, /* partial_inplace */ 827 0x0003ffff, /* src_mask */ 828 0x0003ffff, /* dst_mask */ 829 true), /* pcrel_offset */ 830 831 HOWTO (R_MIPS_PC19_S2, /* type */ 832 2, /* rightshift */ 833 4, /* size */ 834 19, /* bitsize */ 835 true, /* pc_relative */ 836 0, /* bitpos */ 837 complain_overflow_signed, /* complain_on_overflow */ 838 _bfd_mips_elf_generic_reloc, /* special_function */ 839 "R_MIPS_PC19_S2", /* name */ 840 true, /* partial_inplace */ 841 0x0007ffff, /* src_mask */ 842 0x0007ffff, /* dst_mask */ 843 true), /* pcrel_offset */ 844 845 HOWTO (R_MIPS_PCHI16, /* type */ 846 16, /* rightshift */ 847 4, /* size */ 848 16, /* bitsize */ 849 true, /* pc_relative */ 850 0, /* bitpos */ 851 complain_overflow_signed, /* complain_on_overflow */ 852 _bfd_mips_elf_generic_reloc, /* special_function */ 853 "R_MIPS_PCHI16", /* name */ 854 true, /* partial_inplace */ 855 0x0000ffff, /* src_mask */ 856 0x0000ffff, /* dst_mask */ 857 true), /* pcrel_offset */ 858 859 HOWTO (R_MIPS_PCLO16, /* type */ 860 0, /* rightshift */ 861 4, /* size */ 862 16, /* bitsize */ 863 true, /* pc_relative */ 864 0, /* bitpos */ 865 complain_overflow_dont, /* complain_on_overflow */ 866 _bfd_mips_elf_generic_reloc, /* special_function */ 867 "R_MIPS_PCLO16", /* name */ 868 true, /* partial_inplace */ 869 0x0000ffff, /* src_mask */ 870 0x0000ffff, /* dst_mask */ 871 true), /* pcrel_offset */ 872 873 }; 874 875 /* The relocation table used for SHT_RELA sections. */ 876 877 static reloc_howto_type elf_mips_howto_table_rela[] = 878 { 879 /* No relocation. */ 880 HOWTO (R_MIPS_NONE, /* type */ 881 0, /* rightshift */ 882 0, /* size */ 883 0, /* bitsize */ 884 false, /* pc_relative */ 885 0, /* bitpos */ 886 complain_overflow_dont, /* complain_on_overflow */ 887 _bfd_mips_elf_generic_reloc, /* special_function */ 888 "R_MIPS_NONE", /* name */ 889 false, /* partial_inplace */ 890 0, /* src_mask */ 891 0, /* dst_mask */ 892 false), /* pcrel_offset */ 893 894 /* 16 bit relocation. */ 895 HOWTO (R_MIPS_16, /* type */ 896 0, /* rightshift */ 897 4, /* size */ 898 16, /* bitsize */ 899 false, /* pc_relative */ 900 0, /* bitpos */ 901 complain_overflow_signed, /* complain_on_overflow */ 902 _bfd_mips_elf_generic_reloc, /* special_function */ 903 "R_MIPS_16", /* name */ 904 false, /* partial_inplace */ 905 0, /* src_mask */ 906 0x0000ffff, /* dst_mask */ 907 false), /* pcrel_offset */ 908 909 /* 32 bit relocation. */ 910 HOWTO (R_MIPS_32, /* type */ 911 0, /* rightshift */ 912 4, /* size */ 913 32, /* bitsize */ 914 false, /* pc_relative */ 915 0, /* bitpos */ 916 complain_overflow_dont, /* complain_on_overflow */ 917 _bfd_mips_elf_generic_reloc, /* special_function */ 918 "R_MIPS_32", /* name */ 919 false, /* partial_inplace */ 920 0, /* src_mask */ 921 0xffffffff, /* dst_mask */ 922 false), /* pcrel_offset */ 923 924 /* 32 bit symbol relative relocation. */ 925 HOWTO (R_MIPS_REL32, /* type */ 926 0, /* rightshift */ 927 4, /* size */ 928 32, /* bitsize */ 929 false, /* pc_relative */ 930 0, /* bitpos */ 931 complain_overflow_dont, /* complain_on_overflow */ 932 _bfd_mips_elf_generic_reloc, /* special_function */ 933 "R_MIPS_REL32", /* name */ 934 false, /* partial_inplace */ 935 0, /* src_mask */ 936 0xffffffff, /* dst_mask */ 937 false), /* pcrel_offset */ 938 939 /* 26 bit jump address. */ 940 HOWTO (R_MIPS_26, /* type */ 941 2, /* rightshift */ 942 4, /* size */ 943 26, /* bitsize */ 944 false, /* pc_relative */ 945 0, /* bitpos */ 946 complain_overflow_dont, /* complain_on_overflow */ 947 /* This needs complex overflow 948 detection, because the upper 36 949 bits must match the PC + 4. */ 950 _bfd_mips_elf_generic_reloc, /* special_function */ 951 "R_MIPS_26", /* name */ 952 false, /* partial_inplace */ 953 0, /* src_mask */ 954 0x03ffffff, /* dst_mask */ 955 false), /* pcrel_offset */ 956 957 /* High 16 bits of symbol value. */ 958 HOWTO (R_MIPS_HI16, /* type */ 959 0, /* rightshift */ 960 4, /* size */ 961 16, /* bitsize */ 962 false, /* pc_relative */ 963 0, /* bitpos */ 964 complain_overflow_dont, /* complain_on_overflow */ 965 _bfd_mips_elf_generic_reloc, /* special_function */ 966 "R_MIPS_HI16", /* name */ 967 false, /* partial_inplace */ 968 0, /* src_mask */ 969 0x0000ffff, /* dst_mask */ 970 false), /* pcrel_offset */ 971 972 /* Low 16 bits of symbol value. */ 973 HOWTO (R_MIPS_LO16, /* type */ 974 0, /* rightshift */ 975 4, /* size */ 976 16, /* bitsize */ 977 false, /* pc_relative */ 978 0, /* bitpos */ 979 complain_overflow_dont, /* complain_on_overflow */ 980 _bfd_mips_elf_generic_reloc, /* special_function */ 981 "R_MIPS_LO16", /* name */ 982 false, /* partial_inplace */ 983 0, /* src_mask */ 984 0x0000ffff, /* dst_mask */ 985 false), /* pcrel_offset */ 986 987 /* GP relative reference. */ 988 HOWTO (R_MIPS_GPREL16, /* type */ 989 0, /* rightshift */ 990 4, /* size */ 991 16, /* bitsize */ 992 false, /* pc_relative */ 993 0, /* bitpos */ 994 complain_overflow_signed, /* complain_on_overflow */ 995 mips_elf_gprel16_reloc, /* special_function */ 996 "R_MIPS_GPREL16", /* name */ 997 false, /* partial_inplace */ 998 0, /* src_mask */ 999 0x0000ffff, /* dst_mask */ 1000 false), /* pcrel_offset */ 1001 1002 /* Reference to literal section. */ 1003 HOWTO (R_MIPS_LITERAL, /* type */ 1004 0, /* rightshift */ 1005 4, /* size */ 1006 16, /* bitsize */ 1007 false, /* pc_relative */ 1008 0, /* bitpos */ 1009 complain_overflow_signed, /* complain_on_overflow */ 1010 mips_elf_literal_reloc, /* special_function */ 1011 "R_MIPS_LITERAL", /* name */ 1012 false, /* partial_inplace */ 1013 0, /* src_mask */ 1014 0x0000ffff, /* dst_mask */ 1015 false), /* pcrel_offset */ 1016 1017 /* Reference to global offset table. */ 1018 HOWTO (R_MIPS_GOT16, /* type */ 1019 0, /* rightshift */ 1020 4, /* size */ 1021 16, /* bitsize */ 1022 false, /* pc_relative */ 1023 0, /* bitpos */ 1024 complain_overflow_signed, /* complain_on_overflow */ 1025 _bfd_mips_elf_generic_reloc, /* special_function */ 1026 "R_MIPS_GOT16", /* name */ 1027 false, /* partial_inplace */ 1028 0, /* src_mask */ 1029 0x0000ffff, /* dst_mask */ 1030 false), /* pcrel_offset */ 1031 1032 /* 16 bit PC relative reference. Note that the ABI document has a typo 1033 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless. 1034 We do the right thing here. */ 1035 HOWTO (R_MIPS_PC16, /* type */ 1036 2, /* rightshift */ 1037 4, /* size */ 1038 16, /* bitsize */ 1039 true, /* pc_relative */ 1040 0, /* bitpos */ 1041 complain_overflow_signed, /* complain_on_overflow */ 1042 _bfd_mips_elf_generic_reloc, /* special_function */ 1043 "R_MIPS_PC16", /* name */ 1044 false, /* partial_inplace */ 1045 0, /* src_mask */ 1046 0x0000ffff, /* dst_mask */ 1047 true), /* pcrel_offset */ 1048 1049 /* 16 bit call through global offset table. */ 1050 HOWTO (R_MIPS_CALL16, /* type */ 1051 0, /* rightshift */ 1052 4, /* size */ 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_CALL16", /* name */ 1059 false, /* partial_inplace */ 1060 0, /* src_mask */ 1061 0x0000ffff, /* dst_mask */ 1062 false), /* pcrel_offset */ 1063 1064 /* 32 bit GP relative reference. */ 1065 HOWTO (R_MIPS_GPREL32, /* type */ 1066 0, /* rightshift */ 1067 4, /* size */ 1068 32, /* bitsize */ 1069 false, /* pc_relative */ 1070 0, /* bitpos */ 1071 complain_overflow_dont, /* complain_on_overflow */ 1072 mips_elf_gprel32_reloc, /* special_function */ 1073 "R_MIPS_GPREL32", /* name */ 1074 false, /* partial_inplace */ 1075 0, /* src_mask */ 1076 0xffffffff, /* dst_mask */ 1077 false), /* pcrel_offset */ 1078 1079 EMPTY_HOWTO (13), 1080 EMPTY_HOWTO (14), 1081 EMPTY_HOWTO (15), 1082 1083 /* A 5 bit shift field. */ 1084 HOWTO (R_MIPS_SHIFT5, /* type */ 1085 0, /* rightshift */ 1086 4, /* size */ 1087 5, /* bitsize */ 1088 false, /* pc_relative */ 1089 6, /* bitpos */ 1090 complain_overflow_bitfield, /* complain_on_overflow */ 1091 _bfd_mips_elf_generic_reloc, /* special_function */ 1092 "R_MIPS_SHIFT5", /* name */ 1093 false, /* partial_inplace */ 1094 0, /* src_mask */ 1095 0x000007c0, /* dst_mask */ 1096 false), /* pcrel_offset */ 1097 1098 /* A 6 bit shift field. */ 1099 HOWTO (R_MIPS_SHIFT6, /* type */ 1100 0, /* rightshift */ 1101 4, /* size */ 1102 6, /* bitsize */ 1103 false, /* pc_relative */ 1104 6, /* bitpos */ 1105 complain_overflow_bitfield, /* complain_on_overflow */ 1106 mips_elf_shift6_reloc, /* special_function */ 1107 "R_MIPS_SHIFT6", /* name */ 1108 false, /* partial_inplace */ 1109 0, /* src_mask */ 1110 0x000007c4, /* dst_mask */ 1111 false), /* pcrel_offset */ 1112 1113 /* 64 bit relocation. */ 1114 HOWTO (R_MIPS_64, /* type */ 1115 0, /* rightshift */ 1116 8, /* size */ 1117 64, /* bitsize */ 1118 false, /* pc_relative */ 1119 0, /* bitpos */ 1120 complain_overflow_dont, /* complain_on_overflow */ 1121 _bfd_mips_elf_generic_reloc, /* special_function */ 1122 "R_MIPS_64", /* name */ 1123 false, /* partial_inplace */ 1124 0, /* src_mask */ 1125 MINUS_ONE, /* dst_mask */ 1126 false), /* pcrel_offset */ 1127 1128 /* Displacement in the global offset table. */ 1129 HOWTO (R_MIPS_GOT_DISP, /* type */ 1130 0, /* rightshift */ 1131 4, /* size */ 1132 16, /* bitsize */ 1133 false, /* pc_relative */ 1134 0, /* bitpos */ 1135 complain_overflow_signed, /* complain_on_overflow */ 1136 _bfd_mips_elf_generic_reloc, /* special_function */ 1137 "R_MIPS_GOT_DISP", /* name */ 1138 false, /* partial_inplace */ 1139 0, /* src_mask */ 1140 0x0000ffff, /* dst_mask */ 1141 false), /* pcrel_offset */ 1142 1143 /* Displacement to page pointer in the global offset table. */ 1144 HOWTO (R_MIPS_GOT_PAGE, /* type */ 1145 0, /* rightshift */ 1146 4, /* size */ 1147 16, /* bitsize */ 1148 false, /* pc_relative */ 1149 0, /* bitpos */ 1150 complain_overflow_signed, /* complain_on_overflow */ 1151 _bfd_mips_elf_generic_reloc, /* special_function */ 1152 "R_MIPS_GOT_PAGE", /* name */ 1153 false, /* partial_inplace */ 1154 0, /* src_mask */ 1155 0x0000ffff, /* dst_mask */ 1156 false), /* pcrel_offset */ 1157 1158 /* Offset from page pointer in the global offset table. */ 1159 HOWTO (R_MIPS_GOT_OFST, /* type */ 1160 0, /* rightshift */ 1161 4, /* size */ 1162 16, /* bitsize */ 1163 false, /* pc_relative */ 1164 0, /* bitpos */ 1165 complain_overflow_signed, /* complain_on_overflow */ 1166 _bfd_mips_elf_generic_reloc, /* special_function */ 1167 "R_MIPS_GOT_OFST", /* name */ 1168 false, /* partial_inplace */ 1169 0, /* src_mask */ 1170 0x0000ffff, /* dst_mask */ 1171 false), /* pcrel_offset */ 1172 1173 /* High 16 bits of displacement in global offset table. */ 1174 HOWTO (R_MIPS_GOT_HI16, /* type */ 1175 0, /* rightshift */ 1176 4, /* size */ 1177 16, /* 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_GOT_HI16", /* name */ 1183 false, /* partial_inplace */ 1184 0, /* src_mask */ 1185 0x0000ffff, /* dst_mask */ 1186 false), /* pcrel_offset */ 1187 1188 /* Low 16 bits of displacement in global offset table. */ 1189 HOWTO (R_MIPS_GOT_LO16, /* type */ 1190 0, /* rightshift */ 1191 4, /* size */ 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_GOT_LO16", /* name */ 1198 false, /* partial_inplace */ 1199 0, /* src_mask */ 1200 0x0000ffff, /* dst_mask */ 1201 false), /* pcrel_offset */ 1202 1203 /* 64 bit subtraction. */ 1204 HOWTO (R_MIPS_SUB, /* type */ 1205 0, /* rightshift */ 1206 8, /* size */ 1207 64, /* 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_SUB", /* name */ 1213 false, /* partial_inplace */ 1214 0, /* src_mask */ 1215 MINUS_ONE, /* dst_mask */ 1216 false), /* pcrel_offset */ 1217 1218 /* Insert the addend as an instruction. */ 1219 /* FIXME: Not handled correctly. */ 1220 HOWTO (R_MIPS_INSERT_A, /* type */ 1221 0, /* rightshift */ 1222 4, /* size */ 1223 32, /* bitsize */ 1224 false, /* pc_relative */ 1225 0, /* bitpos */ 1226 complain_overflow_dont, /* complain_on_overflow */ 1227 _bfd_mips_elf_generic_reloc, /* special_function */ 1228 "R_MIPS_INSERT_A", /* name */ 1229 false, /* partial_inplace */ 1230 0, /* src_mask */ 1231 0xffffffff, /* dst_mask */ 1232 false), /* pcrel_offset */ 1233 1234 /* Insert the addend as an instruction, and change all relocations 1235 to refer to the old instruction at the address. */ 1236 /* FIXME: Not handled correctly. */ 1237 HOWTO (R_MIPS_INSERT_B, /* type */ 1238 0, /* rightshift */ 1239 4, /* size */ 1240 32, /* bitsize */ 1241 false, /* pc_relative */ 1242 0, /* bitpos */ 1243 complain_overflow_dont, /* complain_on_overflow */ 1244 _bfd_mips_elf_generic_reloc, /* special_function */ 1245 "R_MIPS_INSERT_B", /* name */ 1246 false, /* partial_inplace */ 1247 0, /* src_mask */ 1248 0xffffffff, /* dst_mask */ 1249 false), /* pcrel_offset */ 1250 1251 /* Delete a 32 bit instruction. */ 1252 /* FIXME: Not handled correctly. */ 1253 HOWTO (R_MIPS_DELETE, /* type */ 1254 0, /* rightshift */ 1255 4, /* size */ 1256 32, /* bitsize */ 1257 false, /* pc_relative */ 1258 0, /* bitpos */ 1259 complain_overflow_dont, /* complain_on_overflow */ 1260 _bfd_mips_elf_generic_reloc, /* special_function */ 1261 "R_MIPS_DELETE", /* name */ 1262 false, /* partial_inplace */ 1263 0, /* src_mask */ 1264 0xffffffff, /* dst_mask */ 1265 false), /* pcrel_offset */ 1266 1267 /* Get the higher value of a 64 bit addend. */ 1268 HOWTO (R_MIPS_HIGHER, /* type */ 1269 0, /* rightshift */ 1270 4, /* size */ 1271 16, /* bitsize */ 1272 false, /* pc_relative */ 1273 0, /* bitpos */ 1274 complain_overflow_dont, /* complain_on_overflow */ 1275 _bfd_mips_elf_generic_reloc, /* special_function */ 1276 "R_MIPS_HIGHER", /* name */ 1277 false, /* partial_inplace */ 1278 0, /* src_mask */ 1279 0x0000ffff, /* dst_mask */ 1280 false), /* pcrel_offset */ 1281 1282 /* Get the highest value of a 64 bit addend. */ 1283 HOWTO (R_MIPS_HIGHEST, /* type */ 1284 0, /* rightshift */ 1285 4, /* size */ 1286 16, /* 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_HIGHEST", /* name */ 1292 false, /* partial_inplace */ 1293 0, /* src_mask */ 1294 0x0000ffff, /* dst_mask */ 1295 false), /* pcrel_offset */ 1296 1297 /* High 16 bits of displacement in global offset table. */ 1298 HOWTO (R_MIPS_CALL_HI16, /* type */ 1299 0, /* rightshift */ 1300 4, /* size */ 1301 16, /* bitsize */ 1302 false, /* pc_relative */ 1303 0, /* bitpos */ 1304 complain_overflow_dont, /* complain_on_overflow */ 1305 _bfd_mips_elf_generic_reloc, /* special_function */ 1306 "R_MIPS_CALL_HI16", /* name */ 1307 false, /* partial_inplace */ 1308 0, /* src_mask */ 1309 0x0000ffff, /* dst_mask */ 1310 false), /* pcrel_offset */ 1311 1312 /* Low 16 bits of displacement in global offset table. */ 1313 HOWTO (R_MIPS_CALL_LO16, /* type */ 1314 0, /* rightshift */ 1315 4, /* size */ 1316 16, /* bitsize */ 1317 false, /* pc_relative */ 1318 0, /* bitpos */ 1319 complain_overflow_dont, /* complain_on_overflow */ 1320 _bfd_mips_elf_generic_reloc, /* special_function */ 1321 "R_MIPS_CALL_LO16", /* name */ 1322 false, /* partial_inplace */ 1323 0, /* src_mask */ 1324 0x0000ffff, /* dst_mask */ 1325 false), /* pcrel_offset */ 1326 1327 /* Section displacement, used by an associated event location section. */ 1328 HOWTO (R_MIPS_SCN_DISP, /* type */ 1329 0, /* rightshift */ 1330 4, /* size */ 1331 32, /* bitsize */ 1332 false, /* pc_relative */ 1333 0, /* bitpos */ 1334 complain_overflow_dont, /* complain_on_overflow */ 1335 _bfd_mips_elf_generic_reloc, /* special_function */ 1336 "R_MIPS_SCN_DISP", /* name */ 1337 false, /* partial_inplace */ 1338 0, /* src_mask */ 1339 0xffffffff, /* dst_mask */ 1340 false), /* pcrel_offset */ 1341 1342 /* 16 bit relocation. */ 1343 HOWTO (R_MIPS_REL16, /* type */ 1344 0, /* rightshift */ 1345 2, /* size */ 1346 16, /* bitsize */ 1347 false, /* pc_relative */ 1348 0, /* bitpos */ 1349 complain_overflow_signed, /* complain_on_overflow */ 1350 _bfd_mips_elf_generic_reloc, /* special_function */ 1351 "R_MIPS_REL16", /* name */ 1352 false, /* partial_inplace */ 1353 0, /* src_mask */ 1354 0xffff, /* dst_mask */ 1355 false), /* pcrel_offset */ 1356 1357 /* These two are obsolete. */ 1358 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE), 1359 EMPTY_HOWTO (R_MIPS_PJUMP), 1360 1361 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section. 1362 It must be used for multigot GOT's (and only there). */ 1363 HOWTO (R_MIPS_RELGOT, /* type */ 1364 0, /* rightshift */ 1365 4, /* size */ 1366 32, /* bitsize */ 1367 false, /* pc_relative */ 1368 0, /* bitpos */ 1369 complain_overflow_dont, /* complain_on_overflow */ 1370 _bfd_mips_elf_generic_reloc, /* special_function */ 1371 "R_MIPS_RELGOT", /* name */ 1372 false, /* partial_inplace */ 1373 0, /* src_mask */ 1374 0xffffffff, /* dst_mask */ 1375 false), /* pcrel_offset */ 1376 1377 /* Protected jump conversion. This is an optimization hint. No 1378 relocation is required for correctness. */ 1379 HOWTO (R_MIPS_JALR, /* type */ 1380 0, /* rightshift */ 1381 4, /* size */ 1382 32, /* bitsize */ 1383 false, /* pc_relative */ 1384 0, /* bitpos */ 1385 complain_overflow_dont, /* complain_on_overflow */ 1386 _bfd_mips_elf_generic_reloc, /* special_function */ 1387 "R_MIPS_JALR", /* name */ 1388 false, /* partial_inplace */ 1389 0, /* src_mask */ 1390 0, /* dst_mask */ 1391 false), /* pcrel_offset */ 1392 1393 /* TLS GD/LD dynamic relocations. */ 1394 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */ 1395 0, /* rightshift */ 1396 4, /* size */ 1397 32, /* bitsize */ 1398 false, /* pc_relative */ 1399 0, /* bitpos */ 1400 complain_overflow_dont, /* complain_on_overflow */ 1401 _bfd_mips_elf_generic_reloc, /* special_function */ 1402 "R_MIPS_TLS_DTPMOD32", /* name */ 1403 false, /* partial_inplace */ 1404 0, /* src_mask */ 1405 0xffffffff, /* dst_mask */ 1406 false), /* pcrel_offset */ 1407 1408 HOWTO (R_MIPS_TLS_DTPREL32, /* type */ 1409 0, /* rightshift */ 1410 4, /* size */ 1411 32, /* bitsize */ 1412 false, /* pc_relative */ 1413 0, /* bitpos */ 1414 complain_overflow_dont, /* complain_on_overflow */ 1415 _bfd_mips_elf_generic_reloc, /* special_function */ 1416 "R_MIPS_TLS_DTPREL32", /* name */ 1417 false, /* partial_inplace */ 1418 0, /* src_mask */ 1419 0xffffffff, /* dst_mask */ 1420 false), /* pcrel_offset */ 1421 1422 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64), 1423 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64), 1424 1425 /* TLS general dynamic variable reference. */ 1426 HOWTO (R_MIPS_TLS_GD, /* type */ 1427 0, /* rightshift */ 1428 4, /* size */ 1429 16, /* bitsize */ 1430 false, /* pc_relative */ 1431 0, /* bitpos */ 1432 complain_overflow_signed, /* complain_on_overflow */ 1433 _bfd_mips_elf_generic_reloc, /* special_function */ 1434 "R_MIPS_TLS_GD", /* name */ 1435 false, /* partial_inplace */ 1436 0, /* src_mask */ 1437 0x0000ffff, /* dst_mask */ 1438 false), /* pcrel_offset */ 1439 1440 /* TLS local dynamic variable reference. */ 1441 HOWTO (R_MIPS_TLS_LDM, /* type */ 1442 0, /* rightshift */ 1443 4, /* size */ 1444 16, /* bitsize */ 1445 false, /* pc_relative */ 1446 0, /* bitpos */ 1447 complain_overflow_signed, /* complain_on_overflow */ 1448 _bfd_mips_elf_generic_reloc, /* special_function */ 1449 "R_MIPS_TLS_LDM", /* name */ 1450 false, /* partial_inplace */ 1451 0, /* src_mask */ 1452 0x0000ffff, /* dst_mask */ 1453 false), /* pcrel_offset */ 1454 1455 /* TLS local dynamic offset. */ 1456 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */ 1457 0, /* rightshift */ 1458 4, /* size */ 1459 16, /* bitsize */ 1460 false, /* pc_relative */ 1461 0, /* bitpos */ 1462 complain_overflow_signed, /* complain_on_overflow */ 1463 _bfd_mips_elf_generic_reloc, /* special_function */ 1464 "R_MIPS_TLS_DTPREL_HI16", /* name */ 1465 false, /* partial_inplace */ 1466 0, /* src_mask */ 1467 0x0000ffff, /* dst_mask */ 1468 false), /* pcrel_offset */ 1469 1470 /* TLS local dynamic offset. */ 1471 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */ 1472 0, /* rightshift */ 1473 4, /* size */ 1474 16, /* bitsize */ 1475 false, /* pc_relative */ 1476 0, /* bitpos */ 1477 complain_overflow_signed, /* complain_on_overflow */ 1478 _bfd_mips_elf_generic_reloc, /* special_function */ 1479 "R_MIPS_TLS_DTPREL_LO16", /* name */ 1480 false, /* partial_inplace */ 1481 0, /* src_mask */ 1482 0x0000ffff, /* dst_mask */ 1483 false), /* pcrel_offset */ 1484 1485 /* TLS thread pointer offset. */ 1486 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */ 1487 0, /* rightshift */ 1488 4, /* size */ 1489 16, /* bitsize */ 1490 false, /* pc_relative */ 1491 0, /* bitpos */ 1492 complain_overflow_signed, /* complain_on_overflow */ 1493 _bfd_mips_elf_generic_reloc, /* special_function */ 1494 "R_MIPS_TLS_GOTTPREL", /* name */ 1495 false, /* partial_inplace */ 1496 0, /* src_mask */ 1497 0x0000ffff, /* dst_mask */ 1498 false), /* pcrel_offset */ 1499 1500 /* TLS IE dynamic relocations. */ 1501 HOWTO (R_MIPS_TLS_TPREL32, /* type */ 1502 0, /* rightshift */ 1503 4, /* size */ 1504 32, /* bitsize */ 1505 false, /* pc_relative */ 1506 0, /* bitpos */ 1507 complain_overflow_dont, /* complain_on_overflow */ 1508 _bfd_mips_elf_generic_reloc, /* special_function */ 1509 "R_MIPS_TLS_TPREL32", /* name */ 1510 false, /* partial_inplace */ 1511 0, /* src_mask */ 1512 0xffffffff, /* dst_mask */ 1513 false), /* pcrel_offset */ 1514 1515 EMPTY_HOWTO (R_MIPS_TLS_TPREL64), 1516 1517 /* TLS thread pointer offset. */ 1518 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */ 1519 0, /* rightshift */ 1520 4, /* size */ 1521 16, /* bitsize */ 1522 false, /* pc_relative */ 1523 0, /* bitpos */ 1524 complain_overflow_signed, /* complain_on_overflow */ 1525 _bfd_mips_elf_generic_reloc, /* special_function */ 1526 "R_MIPS_TLS_TPREL_HI16", /* name */ 1527 false, /* partial_inplace */ 1528 0, /* src_mask */ 1529 0x0000ffff, /* dst_mask */ 1530 false), /* pcrel_offset */ 1531 1532 /* TLS thread pointer offset. */ 1533 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */ 1534 0, /* rightshift */ 1535 4, /* size */ 1536 16, /* bitsize */ 1537 false, /* pc_relative */ 1538 0, /* bitpos */ 1539 complain_overflow_signed, /* complain_on_overflow */ 1540 _bfd_mips_elf_generic_reloc, /* special_function */ 1541 "R_MIPS_TLS_TPREL_LO16", /* name */ 1542 false, /* partial_inplace */ 1543 0, /* src_mask */ 1544 0x0000ffff, /* dst_mask */ 1545 false), /* pcrel_offset */ 1546 1547 /* 32 bit relocation with no addend. */ 1548 HOWTO (R_MIPS_GLOB_DAT, /* type */ 1549 0, /* rightshift */ 1550 4, /* size */ 1551 32, /* bitsize */ 1552 false, /* pc_relative */ 1553 0, /* bitpos */ 1554 complain_overflow_dont, /* complain_on_overflow */ 1555 _bfd_mips_elf_generic_reloc, /* special_function */ 1556 "R_MIPS_GLOB_DAT", /* name */ 1557 false, /* partial_inplace */ 1558 0x0, /* src_mask */ 1559 0xffffffff, /* dst_mask */ 1560 false), /* pcrel_offset */ 1561 1562 EMPTY_HOWTO (52), 1563 EMPTY_HOWTO (53), 1564 EMPTY_HOWTO (54), 1565 EMPTY_HOWTO (55), 1566 EMPTY_HOWTO (56), 1567 EMPTY_HOWTO (57), 1568 EMPTY_HOWTO (58), 1569 EMPTY_HOWTO (59), 1570 1571 HOWTO (R_MIPS_PC21_S2, /* type */ 1572 2, /* rightshift */ 1573 4, /* size */ 1574 21, /* bitsize */ 1575 true, /* pc_relative */ 1576 0, /* bitpos */ 1577 complain_overflow_signed, /* complain_on_overflow */ 1578 _bfd_mips_elf_generic_reloc, /* special_function */ 1579 "R_MIPS_PC21_S2", /* name */ 1580 false, /* partial_inplace */ 1581 0, /* src_mask */ 1582 0x001fffff, /* dst_mask */ 1583 true), /* pcrel_offset */ 1584 1585 HOWTO (R_MIPS_PC26_S2, /* type */ 1586 2, /* rightshift */ 1587 4, /* size */ 1588 26, /* bitsize */ 1589 true, /* pc_relative */ 1590 0, /* bitpos */ 1591 complain_overflow_signed, /* complain_on_overflow */ 1592 _bfd_mips_elf_generic_reloc, /* special_function */ 1593 "R_MIPS_PC26_S2", /* name */ 1594 false, /* partial_inplace */ 1595 0, /* src_mask */ 1596 0x03ffffff, /* dst_mask */ 1597 true), /* pcrel_offset */ 1598 1599 HOWTO (R_MIPS_PC18_S3, /* type */ 1600 3, /* rightshift */ 1601 4, /* size */ 1602 18, /* bitsize */ 1603 true, /* pc_relative */ 1604 0, /* bitpos */ 1605 complain_overflow_signed, /* complain_on_overflow */ 1606 _bfd_mips_elf_generic_reloc, /* special_function */ 1607 "R_MIPS_PC18_S3", /* name */ 1608 false, /* partial_inplace */ 1609 0, /* src_mask */ 1610 0x0003ffff, /* dst_mask */ 1611 true), /* pcrel_offset */ 1612 1613 HOWTO (R_MIPS_PC19_S2, /* type */ 1614 2, /* rightshift */ 1615 4, /* size */ 1616 19, /* bitsize */ 1617 true, /* pc_relative */ 1618 0, /* bitpos */ 1619 complain_overflow_signed, /* complain_on_overflow */ 1620 _bfd_mips_elf_generic_reloc, /* special_function */ 1621 "R_MIPS_PC19_S2", /* name */ 1622 false, /* partial_inplace */ 1623 0, /* src_mask */ 1624 0x0007ffff, /* dst_mask */ 1625 true), /* pcrel_offset */ 1626 1627 HOWTO (R_MIPS_PCHI16, /* type */ 1628 16, /* rightshift */ 1629 4, /* size */ 1630 16, /* bitsize */ 1631 true, /* pc_relative */ 1632 0, /* bitpos */ 1633 complain_overflow_signed, /* complain_on_overflow */ 1634 _bfd_mips_elf_generic_reloc, /* special_function */ 1635 "R_MIPS_PCHI16", /* name */ 1636 false, /* partial_inplace */ 1637 0, /* src_mask */ 1638 0x0000ffff, /* dst_mask */ 1639 true), /* pcrel_offset */ 1640 1641 HOWTO (R_MIPS_PCLO16, /* type */ 1642 0, /* rightshift */ 1643 4, /* size */ 1644 16, /* bitsize */ 1645 true, /* pc_relative */ 1646 0, /* bitpos */ 1647 complain_overflow_dont, /* complain_on_overflow */ 1648 _bfd_mips_elf_generic_reloc, /* special_function */ 1649 "R_MIPS_PCLO16", /* name */ 1650 false, /* partial_inplace */ 1651 0, /* src_mask */ 1652 0x0000ffff, /* dst_mask */ 1653 true), /* pcrel_offset */ 1654 1655 }; 1656 1657 static reloc_howto_type elf_mips16_howto_table_rel[] = 1658 { 1659 /* The reloc used for the mips16 jump instruction. */ 1660 HOWTO (R_MIPS16_26, /* type */ 1661 2, /* rightshift */ 1662 4, /* size */ 1663 26, /* bitsize */ 1664 false, /* pc_relative */ 1665 0, /* bitpos */ 1666 complain_overflow_dont, /* complain_on_overflow */ 1667 /* This needs complex overflow 1668 detection, because the upper four 1669 bits must match the PC. */ 1670 _bfd_mips_elf_generic_reloc, /* special_function */ 1671 "R_MIPS16_26", /* name */ 1672 true, /* partial_inplace */ 1673 0x3ffffff, /* src_mask */ 1674 0x3ffffff, /* dst_mask */ 1675 false), /* pcrel_offset */ 1676 1677 /* The reloc used for the mips16 gprel instruction. */ 1678 HOWTO (R_MIPS16_GPREL, /* type */ 1679 0, /* rightshift */ 1680 4, /* size */ 1681 16, /* bitsize */ 1682 false, /* pc_relative */ 1683 0, /* bitpos */ 1684 complain_overflow_signed, /* complain_on_overflow */ 1685 mips16_gprel_reloc, /* special_function */ 1686 "R_MIPS16_GPREL", /* name */ 1687 true, /* partial_inplace */ 1688 0x0000ffff, /* src_mask */ 1689 0x0000ffff, /* dst_mask */ 1690 false), /* pcrel_offset */ 1691 1692 /* A MIPS16 reference to the global offset table. */ 1693 HOWTO (R_MIPS16_GOT16, /* type */ 1694 0, /* rightshift */ 1695 4, /* size */ 1696 16, /* bitsize */ 1697 false, /* pc_relative */ 1698 0, /* bitpos */ 1699 complain_overflow_dont, /* complain_on_overflow */ 1700 _bfd_mips_elf_got16_reloc, /* special_function */ 1701 "R_MIPS16_GOT16", /* name */ 1702 true, /* partial_inplace */ 1703 0x0000ffff, /* src_mask */ 1704 0x0000ffff, /* dst_mask */ 1705 false), /* pcrel_offset */ 1706 1707 /* A MIPS16 call through the global offset table. */ 1708 HOWTO (R_MIPS16_CALL16, /* type */ 1709 0, /* rightshift */ 1710 4, /* size */ 1711 16, /* bitsize */ 1712 false, /* pc_relative */ 1713 0, /* bitpos */ 1714 complain_overflow_dont, /* complain_on_overflow */ 1715 _bfd_mips_elf_generic_reloc, /* special_function */ 1716 "R_MIPS16_CALL16", /* name */ 1717 true, /* partial_inplace */ 1718 0x0000ffff, /* src_mask */ 1719 0x0000ffff, /* dst_mask */ 1720 false), /* pcrel_offset */ 1721 1722 /* MIPS16 high 16 bits of symbol value. */ 1723 HOWTO (R_MIPS16_HI16, /* type */ 1724 16, /* rightshift */ 1725 4, /* size */ 1726 16, /* bitsize */ 1727 false, /* pc_relative */ 1728 0, /* bitpos */ 1729 complain_overflow_dont, /* complain_on_overflow */ 1730 _bfd_mips_elf_hi16_reloc, /* special_function */ 1731 "R_MIPS16_HI16", /* name */ 1732 true, /* partial_inplace */ 1733 0x0000ffff, /* src_mask */ 1734 0x0000ffff, /* dst_mask */ 1735 false), /* pcrel_offset */ 1736 1737 /* MIPS16 low 16 bits of symbol value. */ 1738 HOWTO (R_MIPS16_LO16, /* type */ 1739 0, /* rightshift */ 1740 4, /* size */ 1741 16, /* bitsize */ 1742 false, /* pc_relative */ 1743 0, /* bitpos */ 1744 complain_overflow_dont, /* complain_on_overflow */ 1745 _bfd_mips_elf_lo16_reloc, /* special_function */ 1746 "R_MIPS16_LO16", /* name */ 1747 true, /* partial_inplace */ 1748 0x0000ffff, /* src_mask */ 1749 0x0000ffff, /* dst_mask */ 1750 false), /* pcrel_offset */ 1751 1752 /* MIPS16 TLS general dynamic variable reference. */ 1753 HOWTO (R_MIPS16_TLS_GD, /* type */ 1754 0, /* rightshift */ 1755 4, /* size */ 1756 16, /* bitsize */ 1757 false, /* pc_relative */ 1758 0, /* bitpos */ 1759 complain_overflow_signed, /* complain_on_overflow */ 1760 _bfd_mips_elf_generic_reloc, /* special_function */ 1761 "R_MIPS16_TLS_GD", /* name */ 1762 true, /* partial_inplace */ 1763 0x0000ffff, /* src_mask */ 1764 0x0000ffff, /* dst_mask */ 1765 false), /* pcrel_offset */ 1766 1767 /* MIPS16 TLS local dynamic variable reference. */ 1768 HOWTO (R_MIPS16_TLS_LDM, /* type */ 1769 0, /* rightshift */ 1770 4, /* size */ 1771 16, /* bitsize */ 1772 false, /* pc_relative */ 1773 0, /* bitpos */ 1774 complain_overflow_signed, /* complain_on_overflow */ 1775 _bfd_mips_elf_generic_reloc, /* special_function */ 1776 "R_MIPS16_TLS_LDM", /* name */ 1777 true, /* partial_inplace */ 1778 0x0000ffff, /* src_mask */ 1779 0x0000ffff, /* dst_mask */ 1780 false), /* pcrel_offset */ 1781 1782 /* MIPS16 TLS local dynamic offset. */ 1783 HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */ 1784 0, /* rightshift */ 1785 4, /* size */ 1786 16, /* bitsize */ 1787 false, /* pc_relative */ 1788 0, /* bitpos */ 1789 complain_overflow_signed, /* complain_on_overflow */ 1790 _bfd_mips_elf_generic_reloc, /* special_function */ 1791 "R_MIPS16_TLS_DTPREL_HI16", /* name */ 1792 true, /* partial_inplace */ 1793 0x0000ffff, /* src_mask */ 1794 0x0000ffff, /* dst_mask */ 1795 false), /* pcrel_offset */ 1796 1797 /* MIPS16 TLS local dynamic offset. */ 1798 HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */ 1799 0, /* rightshift */ 1800 4, /* size */ 1801 16, /* bitsize */ 1802 false, /* pc_relative */ 1803 0, /* bitpos */ 1804 complain_overflow_signed, /* complain_on_overflow */ 1805 _bfd_mips_elf_generic_reloc, /* special_function */ 1806 "R_MIPS16_TLS_DTPREL_LO16", /* name */ 1807 true, /* partial_inplace */ 1808 0x0000ffff, /* src_mask */ 1809 0x0000ffff, /* dst_mask */ 1810 false), /* pcrel_offset */ 1811 1812 /* MIPS16 TLS thread pointer offset. */ 1813 HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */ 1814 0, /* rightshift */ 1815 4, /* size */ 1816 16, /* bitsize */ 1817 false, /* pc_relative */ 1818 0, /* bitpos */ 1819 complain_overflow_signed, /* complain_on_overflow */ 1820 _bfd_mips_elf_generic_reloc, /* special_function */ 1821 "R_MIPS16_TLS_GOTTPREL", /* name */ 1822 true, /* partial_inplace */ 1823 0x0000ffff, /* src_mask */ 1824 0x0000ffff, /* dst_mask */ 1825 false), /* pcrel_offset */ 1826 1827 /* MIPS16 TLS thread pointer offset. */ 1828 HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */ 1829 0, /* rightshift */ 1830 4, /* size */ 1831 16, /* bitsize */ 1832 false, /* pc_relative */ 1833 0, /* bitpos */ 1834 complain_overflow_signed, /* complain_on_overflow */ 1835 _bfd_mips_elf_generic_reloc, /* special_function */ 1836 "R_MIPS16_TLS_TPREL_HI16", /* name */ 1837 true, /* partial_inplace */ 1838 0x0000ffff, /* src_mask */ 1839 0x0000ffff, /* dst_mask */ 1840 false), /* pcrel_offset */ 1841 1842 /* MIPS16 TLS thread pointer offset. */ 1843 HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */ 1844 0, /* rightshift */ 1845 4, /* size */ 1846 16, /* bitsize */ 1847 false, /* pc_relative */ 1848 0, /* bitpos */ 1849 complain_overflow_signed, /* complain_on_overflow */ 1850 _bfd_mips_elf_generic_reloc, /* special_function */ 1851 "R_MIPS16_TLS_TPREL_LO16", /* name */ 1852 true, /* partial_inplace */ 1853 0x0000ffff, /* src_mask */ 1854 0x0000ffff, /* dst_mask */ 1855 false), /* pcrel_offset */ 1856 1857 /* MIPS16 16-bit PC-relative branch offset. */ 1858 HOWTO (R_MIPS16_PC16_S1, /* type */ 1859 1, /* rightshift */ 1860 4, /* size */ 1861 16, /* bitsize */ 1862 true, /* pc_relative */ 1863 0, /* bitpos */ 1864 complain_overflow_signed, /* complain_on_overflow */ 1865 _bfd_mips_elf_generic_reloc, /* special_function */ 1866 "R_MIPS16_PC16_S1", /* name */ 1867 true, /* partial_inplace */ 1868 0x0000ffff, /* src_mask */ 1869 0x0000ffff, /* dst_mask */ 1870 true), /* pcrel_offset */ 1871 }; 1872 1873 static reloc_howto_type elf_mips16_howto_table_rela[] = 1874 { 1875 /* The reloc used for the mips16 jump instruction. */ 1876 HOWTO (R_MIPS16_26, /* type */ 1877 2, /* rightshift */ 1878 4, /* size */ 1879 26, /* bitsize */ 1880 false, /* pc_relative */ 1881 0, /* bitpos */ 1882 complain_overflow_dont, /* complain_on_overflow */ 1883 /* This needs complex overflow 1884 detection, because the upper four 1885 bits must match the PC. */ 1886 _bfd_mips_elf_generic_reloc, /* special_function */ 1887 "R_MIPS16_26", /* name */ 1888 false, /* partial_inplace */ 1889 0, /* src_mask */ 1890 0x3ffffff, /* dst_mask */ 1891 false), /* pcrel_offset */ 1892 1893 /* The reloc used for the mips16 gprel instruction. */ 1894 HOWTO (R_MIPS16_GPREL, /* type */ 1895 0, /* rightshift */ 1896 4, /* size */ 1897 16, /* bitsize */ 1898 false, /* pc_relative */ 1899 0, /* bitpos */ 1900 complain_overflow_signed, /* complain_on_overflow */ 1901 mips16_gprel_reloc, /* special_function */ 1902 "R_MIPS16_GPREL", /* name */ 1903 false, /* partial_inplace */ 1904 0, /* src_mask */ 1905 0x0000ffff, /* dst_mask */ 1906 false), /* pcrel_offset */ 1907 1908 /* A MIPS16 reference to the global offset table. */ 1909 HOWTO (R_MIPS16_GOT16, /* type */ 1910 0, /* rightshift */ 1911 4, /* size */ 1912 16, /* bitsize */ 1913 false, /* pc_relative */ 1914 0, /* bitpos */ 1915 complain_overflow_dont, /* complain_on_overflow */ 1916 _bfd_mips_elf_got16_reloc, /* special_function */ 1917 "R_MIPS16_GOT16", /* name */ 1918 false, /* partial_inplace */ 1919 0, /* src_mask */ 1920 0x0000ffff, /* dst_mask */ 1921 false), /* pcrel_offset */ 1922 1923 /* A MIPS16 call through the global offset table. */ 1924 HOWTO (R_MIPS16_CALL16, /* type */ 1925 0, /* rightshift */ 1926 4, /* size */ 1927 16, /* bitsize */ 1928 false, /* pc_relative */ 1929 0, /* bitpos */ 1930 complain_overflow_dont, /* complain_on_overflow */ 1931 _bfd_mips_elf_generic_reloc, /* special_function */ 1932 "R_MIPS16_CALL16", /* name */ 1933 false, /* partial_inplace */ 1934 0, /* src_mask */ 1935 0x0000ffff, /* dst_mask */ 1936 false), /* pcrel_offset */ 1937 1938 /* MIPS16 high 16 bits of symbol value. */ 1939 HOWTO (R_MIPS16_HI16, /* type */ 1940 16, /* rightshift */ 1941 4, /* size */ 1942 16, /* bitsize */ 1943 false, /* pc_relative */ 1944 0, /* bitpos */ 1945 complain_overflow_dont, /* complain_on_overflow */ 1946 _bfd_mips_elf_hi16_reloc, /* special_function */ 1947 "R_MIPS16_HI16", /* name */ 1948 false, /* partial_inplace */ 1949 0, /* src_mask */ 1950 0x0000ffff, /* dst_mask */ 1951 false), /* pcrel_offset */ 1952 1953 /* MIPS16 low 16 bits of symbol value. */ 1954 HOWTO (R_MIPS16_LO16, /* type */ 1955 0, /* rightshift */ 1956 4, /* size */ 1957 16, /* bitsize */ 1958 false, /* pc_relative */ 1959 0, /* bitpos */ 1960 complain_overflow_dont, /* complain_on_overflow */ 1961 _bfd_mips_elf_lo16_reloc, /* special_function */ 1962 "R_MIPS16_LO16", /* name */ 1963 false, /* partial_inplace */ 1964 0, /* src_mask */ 1965 0x0000ffff, /* dst_mask */ 1966 false), /* pcrel_offset */ 1967 1968 /* MIPS16 TLS general dynamic variable reference. */ 1969 HOWTO (R_MIPS16_TLS_GD, /* type */ 1970 0, /* rightshift */ 1971 4, /* size */ 1972 16, /* bitsize */ 1973 false, /* pc_relative */ 1974 0, /* bitpos */ 1975 complain_overflow_signed, /* complain_on_overflow */ 1976 _bfd_mips_elf_generic_reloc, /* special_function */ 1977 "R_MIPS16_TLS_GD", /* name */ 1978 false, /* partial_inplace */ 1979 0, /* src_mask */ 1980 0x0000ffff, /* dst_mask */ 1981 false), /* pcrel_offset */ 1982 1983 /* MIPS16 TLS local dynamic variable reference. */ 1984 HOWTO (R_MIPS16_TLS_LDM, /* type */ 1985 0, /* rightshift */ 1986 4, /* size */ 1987 16, /* bitsize */ 1988 false, /* pc_relative */ 1989 0, /* bitpos */ 1990 complain_overflow_signed, /* complain_on_overflow */ 1991 _bfd_mips_elf_generic_reloc, /* special_function */ 1992 "R_MIPS16_TLS_LDM", /* name */ 1993 false, /* partial_inplace */ 1994 0, /* src_mask */ 1995 0x0000ffff, /* dst_mask */ 1996 false), /* pcrel_offset */ 1997 1998 /* MIPS16 TLS local dynamic offset. */ 1999 HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */ 2000 0, /* rightshift */ 2001 4, /* size */ 2002 16, /* bitsize */ 2003 false, /* pc_relative */ 2004 0, /* bitpos */ 2005 complain_overflow_signed, /* complain_on_overflow */ 2006 _bfd_mips_elf_generic_reloc, /* special_function */ 2007 "R_MIPS16_TLS_DTPREL_HI16", /* name */ 2008 false, /* partial_inplace */ 2009 0, /* src_mask */ 2010 0x0000ffff, /* dst_mask */ 2011 false), /* pcrel_offset */ 2012 2013 /* MIPS16 TLS local dynamic offset. */ 2014 HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */ 2015 0, /* rightshift */ 2016 4, /* size */ 2017 16, /* bitsize */ 2018 false, /* pc_relative */ 2019 0, /* bitpos */ 2020 complain_overflow_signed, /* complain_on_overflow */ 2021 _bfd_mips_elf_generic_reloc, /* special_function */ 2022 "R_MIPS16_TLS_DTPREL_LO16", /* name */ 2023 false, /* partial_inplace */ 2024 0, /* src_mask */ 2025 0x0000ffff, /* dst_mask */ 2026 false), /* pcrel_offset */ 2027 2028 /* MIPS16 TLS thread pointer offset. */ 2029 HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */ 2030 0, /* rightshift */ 2031 4, /* size */ 2032 16, /* bitsize */ 2033 false, /* pc_relative */ 2034 0, /* bitpos */ 2035 complain_overflow_signed, /* complain_on_overflow */ 2036 _bfd_mips_elf_generic_reloc, /* special_function */ 2037 "R_MIPS16_TLS_GOTTPREL", /* name */ 2038 false, /* partial_inplace */ 2039 0, /* src_mask */ 2040 0x0000ffff, /* dst_mask */ 2041 false), /* pcrel_offset */ 2042 2043 /* MIPS16 TLS thread pointer offset. */ 2044 HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */ 2045 0, /* rightshift */ 2046 4, /* size */ 2047 16, /* bitsize */ 2048 false, /* pc_relative */ 2049 0, /* bitpos */ 2050 complain_overflow_signed, /* complain_on_overflow */ 2051 _bfd_mips_elf_generic_reloc, /* special_function */ 2052 "R_MIPS16_TLS_TPREL_HI16", /* name */ 2053 false, /* partial_inplace */ 2054 0, /* src_mask */ 2055 0x0000ffff, /* dst_mask */ 2056 false), /* pcrel_offset */ 2057 2058 /* MIPS16 TLS thread pointer offset. */ 2059 HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */ 2060 0, /* rightshift */ 2061 4, /* size */ 2062 16, /* bitsize */ 2063 false, /* pc_relative */ 2064 0, /* bitpos */ 2065 complain_overflow_signed, /* complain_on_overflow */ 2066 _bfd_mips_elf_generic_reloc, /* special_function */ 2067 "R_MIPS16_TLS_TPREL_LO16", /* name */ 2068 false, /* partial_inplace */ 2069 0, /* src_mask */ 2070 0x0000ffff, /* dst_mask */ 2071 false), /* pcrel_offset */ 2072 2073 /* MIPS16 16-bit PC-relative branch offset. */ 2074 HOWTO (R_MIPS16_PC16_S1, /* type */ 2075 1, /* rightshift */ 2076 4, /* size */ 2077 16, /* bitsize */ 2078 true, /* pc_relative */ 2079 0, /* bitpos */ 2080 complain_overflow_signed, /* complain_on_overflow */ 2081 _bfd_mips_elf_generic_reloc, /* special_function */ 2082 "R_MIPS16_PC16_S1", /* name */ 2083 false, /* partial_inplace */ 2084 0, /* src_mask */ 2085 0x0000ffff, /* dst_mask */ 2086 true), /* pcrel_offset */ 2087 }; 2088 2089 static reloc_howto_type elf_micromips_howto_table_rel[] = 2090 { 2091 EMPTY_HOWTO (130), 2092 EMPTY_HOWTO (131), 2093 EMPTY_HOWTO (132), 2094 2095 /* 26 bit jump address. */ 2096 HOWTO (R_MICROMIPS_26_S1, /* type */ 2097 1, /* rightshift */ 2098 4, /* size */ 2099 26, /* bitsize */ 2100 false, /* pc_relative */ 2101 0, /* bitpos */ 2102 complain_overflow_dont, /* complain_on_overflow */ 2103 /* This needs complex overflow 2104 detection, because the upper four 2105 bits must match the PC. */ 2106 _bfd_mips_elf_generic_reloc, /* special_function */ 2107 "R_MICROMIPS_26_S1", /* name */ 2108 true, /* partial_inplace */ 2109 0x3ffffff, /* src_mask */ 2110 0x3ffffff, /* dst_mask */ 2111 false), /* pcrel_offset */ 2112 2113 /* High 16 bits of symbol value. */ 2114 HOWTO (R_MICROMIPS_HI16, /* type */ 2115 16, /* rightshift */ 2116 4, /* size */ 2117 16, /* bitsize */ 2118 false, /* pc_relative */ 2119 0, /* bitpos */ 2120 complain_overflow_dont, /* complain_on_overflow */ 2121 _bfd_mips_elf_hi16_reloc, /* special_function */ 2122 "R_MICROMIPS_HI16", /* name */ 2123 true, /* partial_inplace */ 2124 0x0000ffff, /* src_mask */ 2125 0x0000ffff, /* dst_mask */ 2126 false), /* pcrel_offset */ 2127 2128 /* Low 16 bits of symbol value. */ 2129 HOWTO (R_MICROMIPS_LO16, /* type */ 2130 0, /* rightshift */ 2131 4, /* size */ 2132 16, /* bitsize */ 2133 false, /* pc_relative */ 2134 0, /* bitpos */ 2135 complain_overflow_dont, /* complain_on_overflow */ 2136 _bfd_mips_elf_lo16_reloc, /* special_function */ 2137 "R_MICROMIPS_LO16", /* name */ 2138 true, /* partial_inplace */ 2139 0x0000ffff, /* src_mask */ 2140 0x0000ffff, /* dst_mask */ 2141 false), /* pcrel_offset */ 2142 2143 /* GP relative reference. */ 2144 HOWTO (R_MICROMIPS_GPREL16, /* type */ 2145 0, /* rightshift */ 2146 4, /* size */ 2147 16, /* bitsize */ 2148 false, /* pc_relative */ 2149 0, /* bitpos */ 2150 complain_overflow_signed, /* complain_on_overflow */ 2151 _bfd_mips_elf32_gprel16_reloc, /* special_function */ 2152 "R_MICROMIPS_GPREL16", /* name */ 2153 true, /* partial_inplace */ 2154 0x0000ffff, /* src_mask */ 2155 0x0000ffff, /* dst_mask */ 2156 false), /* pcrel_offset */ 2157 2158 /* Reference to literal section. */ 2159 HOWTO (R_MICROMIPS_LITERAL, /* type */ 2160 0, /* rightshift */ 2161 4, /* size */ 2162 16, /* bitsize */ 2163 false, /* pc_relative */ 2164 0, /* bitpos */ 2165 complain_overflow_signed, /* complain_on_overflow */ 2166 _bfd_mips_elf32_gprel16_reloc, /* special_function */ 2167 "R_MICROMIPS_LITERAL", /* name */ 2168 true, /* partial_inplace */ 2169 0x0000ffff, /* src_mask */ 2170 0x0000ffff, /* dst_mask */ 2171 false), /* pcrel_offset */ 2172 2173 /* Reference to global offset table. */ 2174 HOWTO (R_MICROMIPS_GOT16, /* type */ 2175 0, /* rightshift */ 2176 4, /* size */ 2177 16, /* bitsize */ 2178 false, /* pc_relative */ 2179 0, /* bitpos */ 2180 complain_overflow_signed, /* complain_on_overflow */ 2181 _bfd_mips_elf_got16_reloc, /* special_function */ 2182 "R_MICROMIPS_GOT16", /* name */ 2183 true, /* partial_inplace */ 2184 0x0000ffff, /* src_mask */ 2185 0x0000ffff, /* dst_mask */ 2186 false), /* pcrel_offset */ 2187 2188 /* This is for microMIPS branches. */ 2189 HOWTO (R_MICROMIPS_PC7_S1, /* type */ 2190 1, /* rightshift */ 2191 2, /* size */ 2192 7, /* bitsize */ 2193 true, /* pc_relative */ 2194 0, /* bitpos */ 2195 complain_overflow_signed, /* complain_on_overflow */ 2196 _bfd_mips_elf_generic_reloc, /* special_function */ 2197 "R_MICROMIPS_PC7_S1", /* name */ 2198 true, /* partial_inplace */ 2199 0x0000007f, /* src_mask */ 2200 0x0000007f, /* dst_mask */ 2201 true), /* pcrel_offset */ 2202 2203 HOWTO (R_MICROMIPS_PC10_S1, /* type */ 2204 1, /* rightshift */ 2205 2, /* size */ 2206 10, /* bitsize */ 2207 true, /* pc_relative */ 2208 0, /* bitpos */ 2209 complain_overflow_signed, /* complain_on_overflow */ 2210 _bfd_mips_elf_generic_reloc, /* special_function */ 2211 "R_MICROMIPS_PC10_S1", /* name */ 2212 true, /* partial_inplace */ 2213 0x000003ff, /* src_mask */ 2214 0x000003ff, /* dst_mask */ 2215 true), /* pcrel_offset */ 2216 2217 HOWTO (R_MICROMIPS_PC16_S1, /* type */ 2218 1, /* rightshift */ 2219 4, /* size */ 2220 16, /* bitsize */ 2221 true, /* pc_relative */ 2222 0, /* bitpos */ 2223 complain_overflow_signed, /* complain_on_overflow */ 2224 _bfd_mips_elf_generic_reloc, /* special_function */ 2225 "R_MICROMIPS_PC16_S1", /* name */ 2226 true, /* partial_inplace */ 2227 0x0000ffff, /* src_mask */ 2228 0x0000ffff, /* dst_mask */ 2229 true), /* pcrel_offset */ 2230 2231 /* 16 bit call through global offset table. */ 2232 HOWTO (R_MICROMIPS_CALL16, /* type */ 2233 0, /* rightshift */ 2234 4, /* size */ 2235 16, /* bitsize */ 2236 false, /* pc_relative */ 2237 0, /* bitpos */ 2238 complain_overflow_signed, /* complain_on_overflow */ 2239 _bfd_mips_elf_generic_reloc, /* special_function */ 2240 "R_MICROMIPS_CALL16", /* name */ 2241 true, /* partial_inplace */ 2242 0x0000ffff, /* src_mask */ 2243 0x0000ffff, /* dst_mask */ 2244 false), /* pcrel_offset */ 2245 2246 EMPTY_HOWTO (143), 2247 EMPTY_HOWTO (144), 2248 2249 /* Displacement in the global offset table. */ 2250 HOWTO (R_MICROMIPS_GOT_DISP, /* type */ 2251 0, /* rightshift */ 2252 4, /* size */ 2253 16, /* bitsize */ 2254 false, /* pc_relative */ 2255 0, /* bitpos */ 2256 complain_overflow_signed, /* complain_on_overflow */ 2257 _bfd_mips_elf_generic_reloc, /* special_function */ 2258 "R_MICROMIPS_GOT_DISP",/* name */ 2259 true, /* partial_inplace */ 2260 0x0000ffff, /* src_mask */ 2261 0x0000ffff, /* dst_mask */ 2262 false), /* pcrel_offset */ 2263 2264 /* Displacement to page pointer in the global offset table. */ 2265 HOWTO (R_MICROMIPS_GOT_PAGE, /* type */ 2266 0, /* rightshift */ 2267 4, /* size */ 2268 16, /* bitsize */ 2269 false, /* pc_relative */ 2270 0, /* bitpos */ 2271 complain_overflow_signed, /* complain_on_overflow */ 2272 _bfd_mips_elf_generic_reloc, /* special_function */ 2273 "R_MICROMIPS_GOT_PAGE",/* name */ 2274 true, /* partial_inplace */ 2275 0x0000ffff, /* src_mask */ 2276 0x0000ffff, /* dst_mask */ 2277 false), /* pcrel_offset */ 2278 2279 /* Offset from page pointer in the global offset table. */ 2280 HOWTO (R_MICROMIPS_GOT_OFST, /* type */ 2281 0, /* rightshift */ 2282 4, /* size */ 2283 16, /* bitsize */ 2284 false, /* pc_relative */ 2285 0, /* bitpos */ 2286 complain_overflow_signed, /* complain_on_overflow */ 2287 _bfd_mips_elf_generic_reloc, /* special_function */ 2288 "R_MICROMIPS_GOT_OFST",/* name */ 2289 true, /* partial_inplace */ 2290 0x0000ffff, /* src_mask */ 2291 0x0000ffff, /* dst_mask */ 2292 false), /* pcrel_offset */ 2293 2294 /* High 16 bits of displacement in global offset table. */ 2295 HOWTO (R_MICROMIPS_GOT_HI16, /* type */ 2296 0, /* rightshift */ 2297 4, /* size */ 2298 16, /* bitsize */ 2299 false, /* pc_relative */ 2300 0, /* bitpos */ 2301 complain_overflow_dont, /* complain_on_overflow */ 2302 _bfd_mips_elf_generic_reloc, /* special_function */ 2303 "R_MICROMIPS_GOT_HI16",/* name */ 2304 true, /* partial_inplace */ 2305 0x0000ffff, /* src_mask */ 2306 0x0000ffff, /* dst_mask */ 2307 false), /* pcrel_offset */ 2308 2309 /* Low 16 bits of displacement in global offset table. */ 2310 HOWTO (R_MICROMIPS_GOT_LO16, /* type */ 2311 0, /* rightshift */ 2312 4, /* size */ 2313 16, /* bitsize */ 2314 false, /* pc_relative */ 2315 0, /* bitpos */ 2316 complain_overflow_dont, /* complain_on_overflow */ 2317 _bfd_mips_elf_generic_reloc, /* special_function */ 2318 "R_MICROMIPS_GOT_LO16",/* name */ 2319 true, /* partial_inplace */ 2320 0x0000ffff, /* src_mask */ 2321 0x0000ffff, /* dst_mask */ 2322 false), /* pcrel_offset */ 2323 2324 /* 64 bit subtraction. Used in the N32 ABI. */ 2325 HOWTO (R_MICROMIPS_SUB, /* type */ 2326 0, /* rightshift */ 2327 8, /* size */ 2328 64, /* bitsize */ 2329 false, /* pc_relative */ 2330 0, /* bitpos */ 2331 complain_overflow_dont, /* complain_on_overflow */ 2332 _bfd_mips_elf_generic_reloc, /* special_function */ 2333 "R_MICROMIPS_SUB", /* name */ 2334 true, /* partial_inplace */ 2335 MINUS_ONE, /* src_mask */ 2336 MINUS_ONE, /* dst_mask */ 2337 false), /* pcrel_offset */ 2338 2339 /* We don't support these for REL relocations, because it means building 2340 the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/ 2341 R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering, 2342 using fallable heuristics. */ 2343 EMPTY_HOWTO (R_MICROMIPS_HIGHER), 2344 EMPTY_HOWTO (R_MICROMIPS_HIGHEST), 2345 2346 /* High 16 bits of displacement in global offset table. */ 2347 HOWTO (R_MICROMIPS_CALL_HI16, /* type */ 2348 0, /* rightshift */ 2349 4, /* size */ 2350 16, /* bitsize */ 2351 false, /* pc_relative */ 2352 0, /* bitpos */ 2353 complain_overflow_dont, /* complain_on_overflow */ 2354 _bfd_mips_elf_generic_reloc, /* special_function */ 2355 "R_MICROMIPS_CALL_HI16",/* name */ 2356 true, /* partial_inplace */ 2357 0x0000ffff, /* src_mask */ 2358 0x0000ffff, /* dst_mask */ 2359 false), /* pcrel_offset */ 2360 2361 /* Low 16 bits of displacement in global offset table. */ 2362 HOWTO (R_MICROMIPS_CALL_LO16, /* type */ 2363 0, /* rightshift */ 2364 4, /* size */ 2365 16, /* bitsize */ 2366 false, /* pc_relative */ 2367 0, /* bitpos */ 2368 complain_overflow_dont, /* complain_on_overflow */ 2369 _bfd_mips_elf_generic_reloc, /* special_function */ 2370 "R_MICROMIPS_CALL_LO16",/* name */ 2371 true, /* partial_inplace */ 2372 0x0000ffff, /* src_mask */ 2373 0x0000ffff, /* dst_mask */ 2374 false), /* pcrel_offset */ 2375 2376 /* Section displacement. */ 2377 HOWTO (R_MICROMIPS_SCN_DISP, /* type */ 2378 0, /* rightshift */ 2379 4, /* size */ 2380 32, /* bitsize */ 2381 false, /* pc_relative */ 2382 0, /* bitpos */ 2383 complain_overflow_dont, /* complain_on_overflow */ 2384 _bfd_mips_elf_generic_reloc, /* special_function */ 2385 "R_MICROMIPS_SCN_DISP", /* name */ 2386 true, /* partial_inplace */ 2387 0xffffffff, /* src_mask */ 2388 0xffffffff, /* dst_mask */ 2389 false), /* pcrel_offset */ 2390 2391 /* Protected jump conversion. This is an optimization hint. No 2392 relocation is required for correctness. */ 2393 HOWTO (R_MICROMIPS_JALR, /* type */ 2394 0, /* rightshift */ 2395 4, /* size */ 2396 32, /* bitsize */ 2397 false, /* pc_relative */ 2398 0, /* bitpos */ 2399 complain_overflow_dont, /* complain_on_overflow */ 2400 _bfd_mips_elf_generic_reloc, /* special_function */ 2401 "R_MICROMIPS_JALR", /* name */ 2402 false, /* partial_inplace */ 2403 0, /* src_mask */ 2404 0x00000000, /* dst_mask */ 2405 false), /* pcrel_offset */ 2406 2407 /* Low 16 bits of symbol value. Note that the high 16 bits of symbol values 2408 must be zero. This is used for relaxation. */ 2409 HOWTO (R_MICROMIPS_HI0_LO16, /* type */ 2410 0, /* rightshift */ 2411 4, /* size */ 2412 16, /* bitsize */ 2413 false, /* pc_relative */ 2414 0, /* bitpos */ 2415 complain_overflow_dont, /* complain_on_overflow */ 2416 _bfd_mips_elf_generic_reloc, /* special_function */ 2417 "R_MICROMIPS_HI0_LO16",/* name */ 2418 true, /* partial_inplace */ 2419 0x0000ffff, /* src_mask */ 2420 0x0000ffff, /* dst_mask */ 2421 false), /* pcrel_offset */ 2422 2423 EMPTY_HOWTO (158), 2424 EMPTY_HOWTO (159), 2425 EMPTY_HOWTO (160), 2426 EMPTY_HOWTO (161), 2427 2428 /* TLS general dynamic variable reference. */ 2429 HOWTO (R_MICROMIPS_TLS_GD, /* type */ 2430 0, /* rightshift */ 2431 4, /* size */ 2432 16, /* bitsize */ 2433 false, /* pc_relative */ 2434 0, /* bitpos */ 2435 complain_overflow_signed, /* complain_on_overflow */ 2436 _bfd_mips_elf_generic_reloc, /* special_function */ 2437 "R_MICROMIPS_TLS_GD", /* name */ 2438 true, /* partial_inplace */ 2439 0x0000ffff, /* src_mask */ 2440 0x0000ffff, /* dst_mask */ 2441 false), /* pcrel_offset */ 2442 2443 /* TLS local dynamic variable reference. */ 2444 HOWTO (R_MICROMIPS_TLS_LDM, /* type */ 2445 0, /* rightshift */ 2446 4, /* size */ 2447 16, /* bitsize */ 2448 false, /* pc_relative */ 2449 0, /* bitpos */ 2450 complain_overflow_signed, /* complain_on_overflow */ 2451 _bfd_mips_elf_generic_reloc, /* special_function */ 2452 "R_MICROMIPS_TLS_LDM", /* name */ 2453 true, /* partial_inplace */ 2454 0x0000ffff, /* src_mask */ 2455 0x0000ffff, /* dst_mask */ 2456 false), /* pcrel_offset */ 2457 2458 /* TLS local dynamic offset. */ 2459 HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */ 2460 0, /* rightshift */ 2461 4, /* size */ 2462 16, /* bitsize */ 2463 false, /* pc_relative */ 2464 0, /* bitpos */ 2465 complain_overflow_signed, /* complain_on_overflow */ 2466 _bfd_mips_elf_generic_reloc, /* special_function */ 2467 "R_MICROMIPS_TLS_DTPREL_HI16", /* name */ 2468 true, /* partial_inplace */ 2469 0x0000ffff, /* src_mask */ 2470 0x0000ffff, /* dst_mask */ 2471 false), /* pcrel_offset */ 2472 2473 /* TLS local dynamic offset. */ 2474 HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */ 2475 0, /* rightshift */ 2476 4, /* size */ 2477 16, /* bitsize */ 2478 false, /* pc_relative */ 2479 0, /* bitpos */ 2480 complain_overflow_signed, /* complain_on_overflow */ 2481 _bfd_mips_elf_generic_reloc, /* special_function */ 2482 "R_MICROMIPS_TLS_DTPREL_LO16", /* name */ 2483 true, /* partial_inplace */ 2484 0x0000ffff, /* src_mask */ 2485 0x0000ffff, /* dst_mask */ 2486 false), /* pcrel_offset */ 2487 2488 /* TLS thread pointer offset. */ 2489 HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */ 2490 0, /* rightshift */ 2491 4, /* size */ 2492 16, /* bitsize */ 2493 false, /* pc_relative */ 2494 0, /* bitpos */ 2495 complain_overflow_signed, /* complain_on_overflow */ 2496 _bfd_mips_elf_generic_reloc, /* special_function */ 2497 "R_MICROMIPS_TLS_GOTTPREL", /* name */ 2498 true, /* partial_inplace */ 2499 0x0000ffff, /* src_mask */ 2500 0x0000ffff, /* dst_mask */ 2501 false), /* pcrel_offset */ 2502 2503 EMPTY_HOWTO (167), 2504 EMPTY_HOWTO (168), 2505 2506 /* TLS thread pointer offset. */ 2507 HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */ 2508 0, /* rightshift */ 2509 4, /* size */ 2510 16, /* bitsize */ 2511 false, /* pc_relative */ 2512 0, /* bitpos */ 2513 complain_overflow_signed, /* complain_on_overflow */ 2514 _bfd_mips_elf_generic_reloc, /* special_function */ 2515 "R_MICROMIPS_TLS_TPREL_HI16", /* name */ 2516 true, /* partial_inplace */ 2517 0x0000ffff, /* src_mask */ 2518 0x0000ffff, /* dst_mask */ 2519 false), /* pcrel_offset */ 2520 2521 /* TLS thread pointer offset. */ 2522 HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */ 2523 0, /* rightshift */ 2524 4, /* size */ 2525 16, /* bitsize */ 2526 false, /* pc_relative */ 2527 0, /* bitpos */ 2528 complain_overflow_signed, /* complain_on_overflow */ 2529 _bfd_mips_elf_generic_reloc, /* special_function */ 2530 "R_MICROMIPS_TLS_TPREL_LO16", /* name */ 2531 true, /* partial_inplace */ 2532 0x0000ffff, /* src_mask */ 2533 0x0000ffff, /* dst_mask */ 2534 false), /* pcrel_offset */ 2535 2536 EMPTY_HOWTO (171), 2537 2538 /* GP- and PC-relative relocations. */ 2539 HOWTO (R_MICROMIPS_GPREL7_S2, /* type */ 2540 2, /* rightshift */ 2541 2, /* size */ 2542 7, /* bitsize */ 2543 false, /* pc_relative */ 2544 0, /* bitpos */ 2545 complain_overflow_signed, /* complain_on_overflow */ 2546 _bfd_mips_elf32_gprel16_reloc, /* special_function */ 2547 "R_MICROMIPS_GPREL7_S2", /* name */ 2548 true, /* partial_inplace */ 2549 0x0000007f, /* src_mask */ 2550 0x0000007f, /* dst_mask */ 2551 false), /* pcrel_offset */ 2552 2553 HOWTO (R_MICROMIPS_PC23_S2, /* type */ 2554 2, /* rightshift */ 2555 4, /* size */ 2556 23, /* bitsize */ 2557 true, /* pc_relative */ 2558 0, /* bitpos */ 2559 complain_overflow_signed, /* complain_on_overflow */ 2560 _bfd_mips_elf_generic_reloc, /* special_function */ 2561 "R_MICROMIPS_PC23_S2", /* name */ 2562 true, /* partial_inplace */ 2563 0x007fffff, /* src_mask */ 2564 0x007fffff, /* dst_mask */ 2565 true), /* pcrel_offset */ 2566 }; 2567 2568 static reloc_howto_type elf_micromips_howto_table_rela[] = 2569 { 2570 EMPTY_HOWTO (130), 2571 EMPTY_HOWTO (131), 2572 EMPTY_HOWTO (132), 2573 2574 /* 26 bit jump address. */ 2575 HOWTO (R_MICROMIPS_26_S1, /* type */ 2576 1, /* rightshift */ 2577 4, /* size */ 2578 26, /* bitsize */ 2579 false, /* pc_relative */ 2580 0, /* bitpos */ 2581 complain_overflow_dont, /* complain_on_overflow */ 2582 /* This needs complex overflow 2583 detection, because the upper four 2584 bits must match the PC. */ 2585 _bfd_mips_elf_generic_reloc, /* special_function */ 2586 "R_MICROMIPS_26_S1", /* name */ 2587 false, /* partial_inplace */ 2588 0, /* src_mask */ 2589 0x3ffffff, /* dst_mask */ 2590 false), /* pcrel_offset */ 2591 2592 /* High 16 bits of symbol value. */ 2593 HOWTO (R_MICROMIPS_HI16, /* type */ 2594 16, /* rightshift */ 2595 4, /* size */ 2596 16, /* bitsize */ 2597 false, /* pc_relative */ 2598 0, /* bitpos */ 2599 complain_overflow_dont, /* complain_on_overflow */ 2600 _bfd_mips_elf_hi16_reloc, /* special_function */ 2601 "R_MICROMIPS_HI16", /* name */ 2602 false, /* partial_inplace */ 2603 0, /* src_mask */ 2604 0x0000ffff, /* dst_mask */ 2605 false), /* pcrel_offset */ 2606 2607 /* Low 16 bits of symbol value. */ 2608 HOWTO (R_MICROMIPS_LO16, /* type */ 2609 0, /* rightshift */ 2610 4, /* size */ 2611 16, /* bitsize */ 2612 false, /* pc_relative */ 2613 0, /* bitpos */ 2614 complain_overflow_dont, /* complain_on_overflow */ 2615 _bfd_mips_elf_lo16_reloc, /* special_function */ 2616 "R_MICROMIPS_LO16", /* name */ 2617 false, /* partial_inplace */ 2618 0, /* src_mask */ 2619 0x0000ffff, /* dst_mask */ 2620 false), /* pcrel_offset */ 2621 2622 /* GP relative reference. */ 2623 HOWTO (R_MICROMIPS_GPREL16, /* type */ 2624 0, /* rightshift */ 2625 4, /* size */ 2626 16, /* bitsize */ 2627 false, /* pc_relative */ 2628 0, /* bitpos */ 2629 complain_overflow_signed, /* complain_on_overflow */ 2630 _bfd_mips_elf32_gprel16_reloc, /* special_function */ 2631 "R_MICROMIPS_GPREL16", /* name */ 2632 false, /* partial_inplace */ 2633 0, /* src_mask */ 2634 0x0000ffff, /* dst_mask */ 2635 false), /* pcrel_offset */ 2636 2637 /* Reference to literal section. */ 2638 HOWTO (R_MICROMIPS_LITERAL, /* type */ 2639 0, /* rightshift */ 2640 4, /* size */ 2641 16, /* bitsize */ 2642 false, /* pc_relative */ 2643 0, /* bitpos */ 2644 complain_overflow_signed, /* complain_on_overflow */ 2645 _bfd_mips_elf32_gprel16_reloc, /* special_function */ 2646 "R_MICROMIPS_LITERAL", /* name */ 2647 false, /* partial_inplace */ 2648 0, /* src_mask */ 2649 0x0000ffff, /* dst_mask */ 2650 false), /* pcrel_offset */ 2651 2652 /* Reference to global offset table. */ 2653 HOWTO (R_MICROMIPS_GOT16, /* type */ 2654 0, /* rightshift */ 2655 4, /* size */ 2656 16, /* bitsize */ 2657 false, /* pc_relative */ 2658 0, /* bitpos */ 2659 complain_overflow_signed, /* complain_on_overflow */ 2660 _bfd_mips_elf_got16_reloc, /* special_function */ 2661 "R_MICROMIPS_GOT16", /* name */ 2662 false, /* partial_inplace */ 2663 0, /* src_mask */ 2664 0x0000ffff, /* dst_mask */ 2665 false), /* pcrel_offset */ 2666 2667 /* This is for microMIPS branches. */ 2668 HOWTO (R_MICROMIPS_PC7_S1, /* type */ 2669 1, /* rightshift */ 2670 2, /* size */ 2671 7, /* bitsize */ 2672 true, /* pc_relative */ 2673 0, /* bitpos */ 2674 complain_overflow_signed, /* complain_on_overflow */ 2675 _bfd_mips_elf_generic_reloc, /* special_function */ 2676 "R_MICROMIPS_PC7_S1", /* name */ 2677 false, /* partial_inplace */ 2678 0, /* src_mask */ 2679 0x0000007f, /* dst_mask */ 2680 true), /* pcrel_offset */ 2681 2682 HOWTO (R_MICROMIPS_PC10_S1, /* type */ 2683 1, /* rightshift */ 2684 2, /* size */ 2685 10, /* bitsize */ 2686 true, /* pc_relative */ 2687 0, /* bitpos */ 2688 complain_overflow_signed, /* complain_on_overflow */ 2689 _bfd_mips_elf_generic_reloc, /* special_function */ 2690 "R_MICROMIPS_PC10_S1", /* name */ 2691 false, /* partial_inplace */ 2692 0, /* src_mask */ 2693 0x000003ff, /* dst_mask */ 2694 true), /* pcrel_offset */ 2695 2696 HOWTO (R_MICROMIPS_PC16_S1, /* type */ 2697 1, /* rightshift */ 2698 4, /* size */ 2699 16, /* bitsize */ 2700 true, /* pc_relative */ 2701 0, /* bitpos */ 2702 complain_overflow_signed, /* complain_on_overflow */ 2703 _bfd_mips_elf_generic_reloc, /* special_function */ 2704 "R_MICROMIPS_PC16_S1", /* name */ 2705 false, /* partial_inplace */ 2706 0, /* src_mask */ 2707 0x0000ffff, /* dst_mask */ 2708 true), /* pcrel_offset */ 2709 2710 /* 16 bit call through global offset table. */ 2711 HOWTO (R_MICROMIPS_CALL16, /* type */ 2712 0, /* rightshift */ 2713 4, /* size */ 2714 16, /* bitsize */ 2715 false, /* pc_relative */ 2716 0, /* bitpos */ 2717 complain_overflow_signed, /* complain_on_overflow */ 2718 _bfd_mips_elf_generic_reloc, /* special_function */ 2719 "R_MICROMIPS_CALL16", /* name */ 2720 false, /* partial_inplace */ 2721 0, /* src_mask */ 2722 0x0000ffff, /* dst_mask */ 2723 false), /* pcrel_offset */ 2724 2725 EMPTY_HOWTO (143), 2726 EMPTY_HOWTO (144), 2727 2728 /* Displacement in the global offset table. */ 2729 HOWTO (R_MICROMIPS_GOT_DISP, /* type */ 2730 0, /* rightshift */ 2731 4, /* size */ 2732 16, /* bitsize */ 2733 false, /* pc_relative */ 2734 0, /* bitpos */ 2735 complain_overflow_signed, /* complain_on_overflow */ 2736 _bfd_mips_elf_generic_reloc, /* special_function */ 2737 "R_MICROMIPS_GOT_DISP",/* name */ 2738 false, /* partial_inplace */ 2739 0, /* src_mask */ 2740 0x0000ffff, /* dst_mask */ 2741 false), /* pcrel_offset */ 2742 2743 /* Displacement to page pointer in the global offset table. */ 2744 HOWTO (R_MICROMIPS_GOT_PAGE, /* type */ 2745 0, /* rightshift */ 2746 4, /* size */ 2747 16, /* bitsize */ 2748 false, /* pc_relative */ 2749 0, /* bitpos */ 2750 complain_overflow_signed, /* complain_on_overflow */ 2751 _bfd_mips_elf_generic_reloc, /* special_function */ 2752 "R_MICROMIPS_GOT_PAGE",/* name */ 2753 false, /* partial_inplace */ 2754 0, /* src_mask */ 2755 0x0000ffff, /* dst_mask */ 2756 false), /* pcrel_offset */ 2757 2758 /* Offset from page pointer in the global offset table. */ 2759 HOWTO (R_MICROMIPS_GOT_OFST, /* type */ 2760 0, /* rightshift */ 2761 4, /* size */ 2762 16, /* bitsize */ 2763 false, /* pc_relative */ 2764 0, /* bitpos */ 2765 complain_overflow_signed, /* complain_on_overflow */ 2766 _bfd_mips_elf_generic_reloc, /* special_function */ 2767 "R_MICROMIPS_GOT_OFST",/* name */ 2768 false, /* partial_inplace */ 2769 0, /* src_mask */ 2770 0x0000ffff, /* dst_mask */ 2771 false), /* pcrel_offset */ 2772 2773 /* High 16 bits of displacement in global offset table. */ 2774 HOWTO (R_MICROMIPS_GOT_HI16, /* type */ 2775 0, /* rightshift */ 2776 4, /* size */ 2777 16, /* bitsize */ 2778 false, /* pc_relative */ 2779 0, /* bitpos */ 2780 complain_overflow_dont, /* complain_on_overflow */ 2781 _bfd_mips_elf_generic_reloc, /* special_function */ 2782 "R_MICROMIPS_GOT_HI16",/* name */ 2783 false, /* partial_inplace */ 2784 0, /* src_mask */ 2785 0x0000ffff, /* dst_mask */ 2786 false), /* pcrel_offset */ 2787 2788 /* Low 16 bits of displacement in global offset table. */ 2789 HOWTO (R_MICROMIPS_GOT_LO16, /* type */ 2790 0, /* rightshift */ 2791 4, /* size */ 2792 16, /* bitsize */ 2793 false, /* pc_relative */ 2794 0, /* bitpos */ 2795 complain_overflow_dont, /* complain_on_overflow */ 2796 _bfd_mips_elf_generic_reloc, /* special_function */ 2797 "R_MICROMIPS_GOT_LO16",/* name */ 2798 false, /* partial_inplace */ 2799 0, /* src_mask */ 2800 0x0000ffff, /* dst_mask */ 2801 false), /* pcrel_offset */ 2802 2803 /* 64 bit subtraction. Used in the N32 ABI. */ 2804 HOWTO (R_MICROMIPS_SUB, /* type */ 2805 0, /* rightshift */ 2806 8, /* size */ 2807 64, /* bitsize */ 2808 false, /* pc_relative */ 2809 0, /* bitpos */ 2810 complain_overflow_dont, /* complain_on_overflow */ 2811 _bfd_mips_elf_generic_reloc, /* special_function */ 2812 "R_MICROMIPS_SUB", /* name */ 2813 false, /* partial_inplace */ 2814 0, /* src_mask */ 2815 MINUS_ONE, /* dst_mask */ 2816 false), /* pcrel_offset */ 2817 2818 /* Get the higher value of a 64 bit addend. */ 2819 HOWTO (R_MICROMIPS_HIGHER, /* type */ 2820 0, /* rightshift */ 2821 4, /* size */ 2822 16, /* bitsize */ 2823 false, /* pc_relative */ 2824 0, /* bitpos */ 2825 complain_overflow_dont, /* complain_on_overflow */ 2826 _bfd_mips_elf_generic_reloc, /* special_function */ 2827 "R_MICROMIPS_HIGHER", /* name */ 2828 false, /* partial_inplace */ 2829 0, /* src_mask */ 2830 0x0000ffff, /* dst_mask */ 2831 false), /* pcrel_offset */ 2832 2833 /* Get the highest value of a 64 bit addend. */ 2834 HOWTO (R_MICROMIPS_HIGHEST, /* type */ 2835 0, /* rightshift */ 2836 4, /* size */ 2837 16, /* bitsize */ 2838 false, /* pc_relative */ 2839 0, /* bitpos */ 2840 complain_overflow_dont, /* complain_on_overflow */ 2841 _bfd_mips_elf_generic_reloc, /* special_function */ 2842 "R_MICROMIPS_HIGHEST", /* name */ 2843 false, /* partial_inplace */ 2844 0, /* src_mask */ 2845 0x0000ffff, /* dst_mask */ 2846 false), /* pcrel_offset */ 2847 2848 /* High 16 bits of displacement in global offset table. */ 2849 HOWTO (R_MICROMIPS_CALL_HI16, /* type */ 2850 0, /* rightshift */ 2851 4, /* size */ 2852 16, /* bitsize */ 2853 false, /* pc_relative */ 2854 0, /* bitpos */ 2855 complain_overflow_dont, /* complain_on_overflow */ 2856 _bfd_mips_elf_generic_reloc, /* special_function */ 2857 "R_MICROMIPS_CALL_HI16",/* name */ 2858 false, /* partial_inplace */ 2859 0, /* src_mask */ 2860 0x0000ffff, /* dst_mask */ 2861 false), /* pcrel_offset */ 2862 2863 /* Low 16 bits of displacement in global offset table. */ 2864 HOWTO (R_MICROMIPS_CALL_LO16, /* type */ 2865 0, /* rightshift */ 2866 4, /* size */ 2867 16, /* bitsize */ 2868 false, /* pc_relative */ 2869 0, /* bitpos */ 2870 complain_overflow_dont, /* complain_on_overflow */ 2871 _bfd_mips_elf_generic_reloc, /* special_function */ 2872 "R_MICROMIPS_CALL_LO16",/* name */ 2873 false, /* partial_inplace */ 2874 0, /* src_mask */ 2875 0x0000ffff, /* dst_mask */ 2876 false), /* pcrel_offset */ 2877 2878 /* Section displacement. */ 2879 HOWTO (R_MICROMIPS_SCN_DISP, /* type */ 2880 0, /* rightshift */ 2881 4, /* size */ 2882 32, /* bitsize */ 2883 false, /* pc_relative */ 2884 0, /* bitpos */ 2885 complain_overflow_dont, /* complain_on_overflow */ 2886 _bfd_mips_elf_generic_reloc, /* special_function */ 2887 "R_MICROMIPS_SCN_DISP", /* name */ 2888 false, /* partial_inplace */ 2889 0, /* src_mask */ 2890 0xffffffff, /* dst_mask */ 2891 false), /* pcrel_offset */ 2892 2893 /* Protected jump conversion. This is an optimization hint. No 2894 relocation is required for correctness. */ 2895 HOWTO (R_MICROMIPS_JALR, /* type */ 2896 0, /* rightshift */ 2897 4, /* size */ 2898 32, /* bitsize */ 2899 false, /* pc_relative */ 2900 0, /* bitpos */ 2901 complain_overflow_dont, /* complain_on_overflow */ 2902 _bfd_mips_elf_generic_reloc, /* special_function */ 2903 "R_MICROMIPS_JALR", /* name */ 2904 false, /* partial_inplace */ 2905 0, /* src_mask */ 2906 0x00000000, /* dst_mask */ 2907 false), /* pcrel_offset */ 2908 2909 /* Low 16 bits of symbol value. Note that the high 16 bits of symbol values 2910 must be zero. This is used for relaxation. */ 2911 HOWTO (R_MICROMIPS_HI0_LO16, /* type */ 2912 0, /* rightshift */ 2913 4, /* size */ 2914 16, /* bitsize */ 2915 false, /* pc_relative */ 2916 0, /* bitpos */ 2917 complain_overflow_dont, /* complain_on_overflow */ 2918 _bfd_mips_elf_generic_reloc, /* special_function */ 2919 "R_MICROMIPS_HI0_LO16",/* name */ 2920 false, /* partial_inplace */ 2921 0, /* src_mask */ 2922 0x0000ffff, /* dst_mask */ 2923 false), /* pcrel_offset */ 2924 2925 EMPTY_HOWTO (158), 2926 EMPTY_HOWTO (159), 2927 EMPTY_HOWTO (160), 2928 EMPTY_HOWTO (161), 2929 2930 /* TLS general dynamic variable reference. */ 2931 HOWTO (R_MICROMIPS_TLS_GD, /* type */ 2932 0, /* rightshift */ 2933 4, /* size */ 2934 16, /* bitsize */ 2935 false, /* pc_relative */ 2936 0, /* bitpos */ 2937 complain_overflow_signed, /* complain_on_overflow */ 2938 _bfd_mips_elf_generic_reloc, /* special_function */ 2939 "R_MICROMIPS_TLS_GD", /* name */ 2940 false, /* partial_inplace */ 2941 0, /* src_mask */ 2942 0x0000ffff, /* dst_mask */ 2943 false), /* pcrel_offset */ 2944 2945 /* TLS local dynamic variable reference. */ 2946 HOWTO (R_MICROMIPS_TLS_LDM, /* type */ 2947 0, /* rightshift */ 2948 4, /* size */ 2949 16, /* bitsize */ 2950 false, /* pc_relative */ 2951 0, /* bitpos */ 2952 complain_overflow_signed, /* complain_on_overflow */ 2953 _bfd_mips_elf_generic_reloc, /* special_function */ 2954 "R_MICROMIPS_TLS_LDM", /* name */ 2955 false, /* partial_inplace */ 2956 0, /* src_mask */ 2957 0x0000ffff, /* dst_mask */ 2958 false), /* pcrel_offset */ 2959 2960 /* TLS local dynamic offset. */ 2961 HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */ 2962 0, /* rightshift */ 2963 4, /* size */ 2964 16, /* bitsize */ 2965 false, /* pc_relative */ 2966 0, /* bitpos */ 2967 complain_overflow_signed, /* complain_on_overflow */ 2968 _bfd_mips_elf_generic_reloc, /* special_function */ 2969 "R_MICROMIPS_TLS_DTPREL_HI16", /* name */ 2970 false, /* partial_inplace */ 2971 0, /* src_mask */ 2972 0x0000ffff, /* dst_mask */ 2973 false), /* pcrel_offset */ 2974 2975 /* TLS local dynamic offset. */ 2976 HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */ 2977 0, /* rightshift */ 2978 4, /* size */ 2979 16, /* bitsize */ 2980 false, /* pc_relative */ 2981 0, /* bitpos */ 2982 complain_overflow_signed, /* complain_on_overflow */ 2983 _bfd_mips_elf_generic_reloc, /* special_function */ 2984 "R_MICROMIPS_TLS_DTPREL_LO16", /* name */ 2985 false, /* partial_inplace */ 2986 0, /* src_mask */ 2987 0x0000ffff, /* dst_mask */ 2988 false), /* pcrel_offset */ 2989 2990 /* TLS thread pointer offset. */ 2991 HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */ 2992 0, /* rightshift */ 2993 4, /* size */ 2994 16, /* bitsize */ 2995 false, /* pc_relative */ 2996 0, /* bitpos */ 2997 complain_overflow_signed, /* complain_on_overflow */ 2998 _bfd_mips_elf_generic_reloc, /* special_function */ 2999 "R_MICROMIPS_TLS_GOTTPREL", /* name */ 3000 false, /* partial_inplace */ 3001 0, /* src_mask */ 3002 0x0000ffff, /* dst_mask */ 3003 false), /* pcrel_offset */ 3004 3005 EMPTY_HOWTO (167), 3006 EMPTY_HOWTO (168), 3007 3008 /* TLS thread pointer offset. */ 3009 HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */ 3010 0, /* rightshift */ 3011 4, /* size */ 3012 16, /* bitsize */ 3013 false, /* pc_relative */ 3014 0, /* bitpos */ 3015 complain_overflow_signed, /* complain_on_overflow */ 3016 _bfd_mips_elf_generic_reloc, /* special_function */ 3017 "R_MICROMIPS_TLS_TPREL_HI16", /* name */ 3018 false, /* partial_inplace */ 3019 0, /* src_mask */ 3020 0x0000ffff, /* dst_mask */ 3021 false), /* pcrel_offset */ 3022 3023 /* TLS thread pointer offset. */ 3024 HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */ 3025 0, /* rightshift */ 3026 4, /* size */ 3027 16, /* bitsize */ 3028 false, /* pc_relative */ 3029 0, /* bitpos */ 3030 complain_overflow_signed, /* complain_on_overflow */ 3031 _bfd_mips_elf_generic_reloc, /* special_function */ 3032 "R_MICROMIPS_TLS_TPREL_LO16", /* name */ 3033 false, /* partial_inplace */ 3034 0, /* src_mask */ 3035 0x0000ffff, /* dst_mask */ 3036 false), /* pcrel_offset */ 3037 3038 EMPTY_HOWTO (171), 3039 3040 /* GP- and PC-relative relocations. */ 3041 HOWTO (R_MICROMIPS_GPREL7_S2, /* type */ 3042 2, /* rightshift */ 3043 2, /* size */ 3044 7, /* bitsize */ 3045 false, /* pc_relative */ 3046 0, /* bitpos */ 3047 complain_overflow_signed, /* complain_on_overflow */ 3048 _bfd_mips_elf32_gprel16_reloc, /* special_function */ 3049 "R_MICROMIPS_GPREL7_S2", /* name */ 3050 false, /* partial_inplace */ 3051 0, /* src_mask */ 3052 0x0000007f, /* dst_mask */ 3053 false), /* pcrel_offset */ 3054 3055 HOWTO (R_MICROMIPS_PC23_S2, /* type */ 3056 2, /* rightshift */ 3057 4, /* size */ 3058 23, /* bitsize */ 3059 true, /* pc_relative */ 3060 0, /* bitpos */ 3061 complain_overflow_signed, /* complain_on_overflow */ 3062 _bfd_mips_elf_generic_reloc, /* special_function */ 3063 "R_MICROMIPS_PC23_S2", /* name */ 3064 false, /* partial_inplace */ 3065 0, /* src_mask */ 3066 0x007fffff, /* dst_mask */ 3067 true), /* pcrel_offset */ 3068 }; 3069 3070 /* GNU extension to record C++ vtable hierarchy */ 3071 static reloc_howto_type elf_mips_gnu_vtinherit_howto = 3072 HOWTO (R_MIPS_GNU_VTINHERIT, /* type */ 3073 0, /* rightshift */ 3074 4, /* size */ 3075 0, /* bitsize */ 3076 false, /* pc_relative */ 3077 0, /* bitpos */ 3078 complain_overflow_dont, /* complain_on_overflow */ 3079 NULL, /* special_function */ 3080 "R_MIPS_GNU_VTINHERIT", /* name */ 3081 false, /* partial_inplace */ 3082 0, /* src_mask */ 3083 0, /* dst_mask */ 3084 false); /* pcrel_offset */ 3085 3086 /* GNU extension to record C++ vtable member usage */ 3087 static reloc_howto_type elf_mips_gnu_vtentry_howto = 3088 HOWTO (R_MIPS_GNU_VTENTRY, /* type */ 3089 0, /* rightshift */ 3090 4, /* size */ 3091 0, /* bitsize */ 3092 false, /* pc_relative */ 3093 0, /* bitpos */ 3094 complain_overflow_dont, /* complain_on_overflow */ 3095 _bfd_elf_rel_vtable_reloc_fn, /* special_function */ 3096 "R_MIPS_GNU_VTENTRY", /* name */ 3097 false, /* partial_inplace */ 3098 0, /* src_mask */ 3099 0, /* dst_mask */ 3100 false); /* pcrel_offset */ 3101 3102 /* 16 bit offset for pc-relative branches. */ 3103 static reloc_howto_type elf_mips_gnu_rel16_s2 = 3104 HOWTO (R_MIPS_GNU_REL16_S2, /* type */ 3105 2, /* rightshift */ 3106 4, /* size */ 3107 16, /* bitsize */ 3108 true, /* pc_relative */ 3109 0, /* bitpos */ 3110 complain_overflow_signed, /* complain_on_overflow */ 3111 _bfd_mips_elf_generic_reloc, /* special_function */ 3112 "R_MIPS_GNU_REL16_S2", /* name */ 3113 true, /* partial_inplace */ 3114 0x0000ffff, /* src_mask */ 3115 0x0000ffff, /* dst_mask */ 3116 true); /* pcrel_offset */ 3117 3118 /* 16 bit offset for pc-relative branches. */ 3119 static reloc_howto_type elf_mips_gnu_rela16_s2 = 3120 HOWTO (R_MIPS_GNU_REL16_S2, /* type */ 3121 2, /* rightshift */ 3122 4, /* size */ 3123 16, /* bitsize */ 3124 true, /* pc_relative */ 3125 0, /* bitpos */ 3126 complain_overflow_signed, /* complain_on_overflow */ 3127 _bfd_mips_elf_generic_reloc, /* special_function */ 3128 "R_MIPS_GNU_REL16_S2", /* name */ 3129 false, /* partial_inplace */ 3130 0, /* src_mask */ 3131 0x0000ffff, /* dst_mask */ 3132 true); /* pcrel_offset */ 3133 3134 /* 32 bit pc-relative. Used for compact EH tables. */ 3135 static reloc_howto_type elf_mips_gnu_pcrel32 = 3136 HOWTO (R_MIPS_PC32, /* type */ 3137 0, /* rightshift */ 3138 4, /* size */ 3139 32, /* bitsize */ 3140 true, /* pc_relative */ 3141 0, /* bitpos */ 3142 complain_overflow_signed, /* complain_on_overflow */ 3143 _bfd_mips_elf_generic_reloc, /* special_function */ 3144 "R_MIPS_PC32", /* name */ 3145 true, /* partial_inplace */ 3146 0xffffffff, /* src_mask */ 3147 0xffffffff, /* dst_mask */ 3148 true); /* pcrel_offset */ 3149 3150 3151 /* Originally a VxWorks extension, but now used for other systems too. */ 3152 static reloc_howto_type elf_mips_copy_howto = 3153 HOWTO (R_MIPS_COPY, /* type */ 3154 0, /* rightshift */ 3155 0, /* this one is variable size */ 3156 0, /* bitsize */ 3157 false, /* pc_relative */ 3158 0, /* bitpos */ 3159 complain_overflow_bitfield, /* complain_on_overflow */ 3160 _bfd_mips_elf_generic_reloc, /* special_function */ 3161 "R_MIPS_COPY", /* name */ 3162 false, /* partial_inplace */ 3163 0x0, /* src_mask */ 3164 0x0, /* dst_mask */ 3165 false); /* pcrel_offset */ 3166 3167 /* Originally a VxWorks extension, but now used for other systems too. */ 3168 static reloc_howto_type elf_mips_jump_slot_howto = 3169 HOWTO (R_MIPS_JUMP_SLOT, /* type */ 3170 0, /* rightshift */ 3171 4, /* size */ 3172 32, /* bitsize */ 3173 false, /* pc_relative */ 3174 0, /* bitpos */ 3175 complain_overflow_bitfield, /* complain_on_overflow */ 3176 _bfd_mips_elf_generic_reloc, /* special_function */ 3177 "R_MIPS_JUMP_SLOT", /* name */ 3178 false, /* partial_inplace */ 3179 0x0, /* src_mask */ 3180 0x0, /* dst_mask */ 3181 false); /* pcrel_offset */ 3182 3183 /* Used in EH tables. */ 3184 static reloc_howto_type elf_mips_eh_howto = 3185 HOWTO (R_MIPS_EH, /* type */ 3186 0, /* rightshift */ 3187 4, /* size */ 3188 32, /* bitsize */ 3189 false, /* pc_relative */ 3190 0, /* bitpos */ 3191 complain_overflow_signed, /* complain_on_overflow */ 3192 _bfd_mips_elf_generic_reloc, /* special_function */ 3193 "R_MIPS_EH", /* name */ 3194 true, /* partial_inplace */ 3195 0xffffffff, /* src_mask */ 3196 0xffffffff, /* dst_mask */ 3197 false); /* pcrel_offset */ 3198 3199 3200 /* Set the GP value for OUTPUT_BFD. Returns false if this is a 3201 dangerous relocation. */ 3202 3203 static bool 3204 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp) 3205 { 3206 unsigned int count; 3207 asymbol **sym; 3208 unsigned int i; 3209 3210 /* If we've already figured out what GP will be, just return it. */ 3211 *pgp = _bfd_get_gp_value (output_bfd); 3212 if (*pgp) 3213 return true; 3214 3215 count = bfd_get_symcount (output_bfd); 3216 sym = bfd_get_outsymbols (output_bfd); 3217 3218 /* The linker script will have created a symbol named `_gp' with the 3219 appropriate value. */ 3220 if (sym == NULL) 3221 i = count; 3222 else 3223 { 3224 for (i = 0; i < count; i++, sym++) 3225 { 3226 register const char *name; 3227 3228 name = bfd_asymbol_name (*sym); 3229 if (*name == '_' && strcmp (name, "_gp") == 0) 3230 { 3231 *pgp = bfd_asymbol_value (*sym); 3232 _bfd_set_gp_value (output_bfd, *pgp); 3233 break; 3234 } 3235 } 3236 } 3237 3238 if (i >= count) 3239 { 3240 /* Only get the error once. */ 3241 *pgp = 4; 3242 _bfd_set_gp_value (output_bfd, *pgp); 3243 return false; 3244 } 3245 3246 return true; 3247 } 3248 3249 /* We have to figure out the gp value, so that we can adjust the 3250 symbol value correctly. We look up the symbol _gp in the output 3251 BFD. If we can't find it, we're stuck. We cache it in the ELF 3252 target data. We don't need to adjust the symbol value for an 3253 external symbol if we are producing relocatable output. */ 3254 3255 static bfd_reloc_status_type 3256 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bool relocatable, 3257 char **error_message, bfd_vma *pgp) 3258 { 3259 if (output_bfd == NULL) 3260 { 3261 *pgp = 0; 3262 return bfd_reloc_undefined; 3263 } 3264 3265 *pgp = _bfd_get_gp_value (output_bfd); 3266 if (*pgp == 0 3267 && (! relocatable 3268 || (symbol->flags & BSF_SECTION_SYM) != 0)) 3269 { 3270 if (relocatable) 3271 { 3272 /* Make up a value. */ 3273 *pgp = symbol->section->output_section->vma /*+ 0x4000*/; 3274 _bfd_set_gp_value (output_bfd, *pgp); 3275 } 3276 else if (!mips_elf_assign_gp (output_bfd, pgp)) 3277 { 3278 *error_message = 3279 (char *) _("GP relative relocation when _gp not defined"); 3280 return bfd_reloc_dangerous; 3281 } 3282 } 3283 3284 return bfd_reloc_ok; 3285 } 3286 3287 /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must 3288 become the offset from the gp register. */ 3289 3290 static bfd_reloc_status_type 3291 mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 3292 asymbol *symbol, void *data ATTRIBUTE_UNUSED, 3293 asection *input_section, bfd *output_bfd, 3294 char **error_message ATTRIBUTE_UNUSED) 3295 { 3296 bool relocatable; 3297 bfd_reloc_status_type ret; 3298 bfd_vma gp; 3299 3300 if (output_bfd != NULL) 3301 relocatable = true; 3302 else 3303 { 3304 relocatable = false; 3305 if (symbol->section->output_section != NULL) 3306 output_bfd = symbol->section->output_section->owner; 3307 } 3308 3309 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message, 3310 &gp); 3311 if (ret != bfd_reloc_ok) 3312 return ret; 3313 3314 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 3315 input_section, relocatable, 3316 data, gp); 3317 } 3318 3319 /* Do a R_MIPS_LITERAL relocation. */ 3320 3321 static bfd_reloc_status_type 3322 mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3323 void *data, asection *input_section, bfd *output_bfd, 3324 char **error_message) 3325 { 3326 bool relocatable; 3327 bfd_reloc_status_type ret; 3328 bfd_vma gp; 3329 3330 /* R_MIPS_LITERAL relocations are defined for local symbols only. */ 3331 if (output_bfd != NULL 3332 && (symbol->flags & BSF_SECTION_SYM) == 0 3333 && (symbol->flags & BSF_LOCAL) != 0) 3334 { 3335 *error_message = (char *) 3336 _("literal relocation occurs for an external symbol"); 3337 return bfd_reloc_outofrange; 3338 } 3339 3340 /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */ 3341 if (output_bfd != NULL) 3342 relocatable = true; 3343 else 3344 { 3345 relocatable = false; 3346 if (symbol->section->output_section != NULL) 3347 output_bfd = symbol->section->output_section->owner; 3348 } 3349 3350 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message, 3351 &gp); 3352 if (ret != bfd_reloc_ok) 3353 return ret; 3354 3355 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 3356 input_section, relocatable, 3357 data, gp); 3358 } 3359 3360 /* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must 3361 become the offset from the gp register. */ 3362 3363 static bfd_reloc_status_type 3364 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3365 void *data, asection *input_section, bfd *output_bfd, 3366 char **error_message) 3367 { 3368 bool relocatable; 3369 bfd_reloc_status_type ret; 3370 bfd_vma gp; 3371 3372 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */ 3373 if (output_bfd != NULL 3374 && (symbol->flags & BSF_SECTION_SYM) == 0 3375 && (symbol->flags & BSF_LOCAL) != 0) 3376 { 3377 *error_message = (char *) 3378 _("32bits gp relative relocation occurs for an external symbol"); 3379 return bfd_reloc_outofrange; 3380 } 3381 3382 if (output_bfd != NULL) 3383 { 3384 relocatable = true; 3385 gp = _bfd_get_gp_value (output_bfd); 3386 } 3387 else 3388 { 3389 relocatable = false; 3390 if (symbol->section->output_section != NULL) 3391 output_bfd = symbol->section->output_section->owner; 3392 3393 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, 3394 error_message, &gp); 3395 if (ret != bfd_reloc_ok) 3396 return ret; 3397 } 3398 3399 return gprel32_with_gp (abfd, symbol, reloc_entry, input_section, 3400 relocatable, data, gp); 3401 } 3402 3403 static bfd_reloc_status_type 3404 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry, 3405 asection *input_section, bool relocatable, 3406 void *data, bfd_vma gp) 3407 { 3408 bfd_vma relocation; 3409 unsigned long val; 3410 3411 if (bfd_is_com_section (symbol->section)) 3412 relocation = 0; 3413 else 3414 relocation = symbol->value; 3415 3416 if (symbol->section->output_section != NULL) 3417 { 3418 relocation += symbol->section->output_section->vma; 3419 relocation += symbol->section->output_offset; 3420 } 3421 3422 if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section, 3423 reloc_entry->address)) 3424 return bfd_reloc_outofrange; 3425 3426 if (reloc_entry->howto->src_mask == 0) 3427 val = 0; 3428 else 3429 val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); 3430 3431 /* Set val to the offset into the section or symbol. */ 3432 val += reloc_entry->addend; 3433 3434 /* Adjust val for the final section location and GP value. If we 3435 are producing relocatable output, we don't want to do this for 3436 an external symbol. */ 3437 if (! relocatable 3438 || (symbol->flags & BSF_SECTION_SYM) != 0) 3439 val += relocation - gp; 3440 3441 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address); 3442 3443 if (relocatable) 3444 reloc_entry->address += input_section->output_offset; 3445 3446 return bfd_reloc_ok; 3447 } 3448 3449 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2, 3450 the rest is at bits 6-10. The bitpos already got right by the howto. */ 3451 3452 static bfd_reloc_status_type 3453 mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3454 void *data, asection *input_section, bfd *output_bfd, 3455 char **error_message) 3456 { 3457 if (reloc_entry->howto->partial_inplace) 3458 { 3459 reloc_entry->addend = ((reloc_entry->addend & 0x00007c0) 3460 | (reloc_entry->addend & 0x00000800) >> 9); 3461 } 3462 3463 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data, 3464 input_section, output_bfd, 3465 error_message); 3466 } 3467 3468 /* Handle a mips16 GP relative reloc. */ 3469 3470 static bfd_reloc_status_type 3471 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3472 void *data, asection *input_section, bfd *output_bfd, 3473 char **error_message) 3474 { 3475 bool relocatable; 3476 bfd_reloc_status_type ret; 3477 bfd_byte *location; 3478 bfd_vma gp; 3479 3480 /* If we're relocating, and this is an external symbol, we don't want 3481 to change anything. */ 3482 if (output_bfd != NULL 3483 && (symbol->flags & BSF_SECTION_SYM) == 0 3484 && (symbol->flags & BSF_LOCAL) != 0) 3485 { 3486 reloc_entry->address += input_section->output_offset; 3487 return bfd_reloc_ok; 3488 } 3489 3490 if (output_bfd != NULL) 3491 relocatable = true; 3492 else 3493 { 3494 relocatable = false; 3495 if (symbol->section->output_section != NULL) 3496 output_bfd = symbol->section->output_section->owner; 3497 } 3498 3499 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message, 3500 &gp); 3501 if (ret != bfd_reloc_ok) 3502 return ret; 3503 3504 if (!_bfd_mips_reloc_offset_in_range (abfd, input_section, reloc_entry, 3505 check_shuffle)) 3506 return bfd_reloc_outofrange; 3507 3508 location = (bfd_byte *) data + reloc_entry->address; 3509 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, false, 3510 location); 3511 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 3512 input_section, relocatable, 3513 data, gp); 3514 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable, 3515 location); 3516 3517 return ret; 3518 } 3519 3520 /* A mapping from BFD reloc types to MIPS ELF reloc types. */ 3521 3522 struct elf_reloc_map { 3523 bfd_reloc_code_real_type bfd_val; 3524 enum elf_mips_reloc_type elf_val; 3525 }; 3526 3527 static const struct elf_reloc_map mips_reloc_map[] = 3528 { 3529 { BFD_RELOC_NONE, R_MIPS_NONE }, 3530 { BFD_RELOC_MIPS_16, R_MIPS_16 }, 3531 { BFD_RELOC_16, R_MIPS_REL16 }, 3532 { BFD_RELOC_32, R_MIPS_32 }, 3533 /* There is no BFD reloc for R_MIPS_REL32. */ 3534 { BFD_RELOC_CTOR, R_MIPS_32 }, 3535 { BFD_RELOC_64, R_MIPS_64 }, 3536 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 }, 3537 { BFD_RELOC_HI16_S, R_MIPS_HI16 }, 3538 { BFD_RELOC_LO16, R_MIPS_LO16 }, 3539 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 }, 3540 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 }, 3541 { BFD_RELOC_MIPS_JMP, R_MIPS_26 }, 3542 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL }, 3543 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 }, 3544 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 }, 3545 { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 }, 3546 { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 }, 3547 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP }, 3548 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE }, 3549 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST }, 3550 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 }, 3551 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 }, 3552 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB }, 3553 { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A }, 3554 { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B }, 3555 { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE }, 3556 { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST }, 3557 { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER }, 3558 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 }, 3559 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 }, 3560 { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP }, 3561 /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */ 3562 { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT }, 3563 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR }, 3564 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 }, 3565 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 }, 3566 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 }, 3567 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 }, 3568 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD }, 3569 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM }, 3570 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 }, 3571 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 }, 3572 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL }, 3573 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 }, 3574 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 }, 3575 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 }, 3576 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }, 3577 { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 }, 3578 { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 }, 3579 { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 }, 3580 { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 }, 3581 { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 }, 3582 { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 } 3583 }; 3584 3585 static const struct elf_reloc_map mips16_reloc_map[] = 3586 { 3587 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min }, 3588 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min }, 3589 { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min }, 3590 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min }, 3591 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min }, 3592 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min }, 3593 { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min }, 3594 { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min }, 3595 { BFD_RELOC_MIPS16_TLS_DTPREL_HI16, 3596 R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min }, 3597 { BFD_RELOC_MIPS16_TLS_DTPREL_LO16, 3598 R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min }, 3599 { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min }, 3600 { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min }, 3601 { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }, 3602 { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min } 3603 }; 3604 3605 static const struct elf_reloc_map micromips_reloc_map[] = 3606 { 3607 { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min }, 3608 { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min }, 3609 { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min }, 3610 { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min }, 3611 { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min }, 3612 { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min }, 3613 { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min }, 3614 { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min }, 3615 { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min }, 3616 { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min }, 3617 { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min }, 3618 { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min }, 3619 { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min }, 3620 { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min }, 3621 { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min }, 3622 { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min }, 3623 { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min }, 3624 { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min }, 3625 { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min }, 3626 { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min }, 3627 { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min }, 3628 { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min }, 3629 /* There is no BFD reloc for R_MICROMIPS_HI0_LO16. */ 3630 { BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min }, 3631 { BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min }, 3632 { BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16, 3633 R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min }, 3634 { BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16, 3635 R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min }, 3636 { BFD_RELOC_MICROMIPS_TLS_GOTTPREL, 3637 R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min }, 3638 { BFD_RELOC_MICROMIPS_TLS_TPREL_HI16, 3639 R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min }, 3640 { BFD_RELOC_MICROMIPS_TLS_TPREL_LO16, 3641 R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min }, 3642 /* There is no BFD reloc for R_MICROMIPS_GPREL7_S2. */ 3643 /* There is no BFD reloc for R_MICROMIPS_PC23_S2. */ 3644 }; 3645 3646 /* Given a BFD reloc type, return a howto structure. */ 3647 3648 static reloc_howto_type * 3649 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 3650 bfd_reloc_code_real_type code) 3651 { 3652 unsigned int i; 3653 /* FIXME: We default to RELA here instead of choosing the right 3654 relocation variant. */ 3655 reloc_howto_type *howto_table = elf_mips_howto_table_rela; 3656 reloc_howto_type *howto16_table = elf_mips16_howto_table_rela; 3657 reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela; 3658 3659 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); 3660 i++) 3661 { 3662 if (mips_reloc_map[i].bfd_val == code) 3663 return &howto_table[(int) mips_reloc_map[i].elf_val]; 3664 } 3665 3666 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map); 3667 i++) 3668 { 3669 if (mips16_reloc_map[i].bfd_val == code) 3670 return &howto16_table[(int) mips16_reloc_map[i].elf_val]; 3671 } 3672 3673 for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map); 3674 i++) 3675 { 3676 if (micromips_reloc_map[i].bfd_val == code) 3677 return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val]; 3678 } 3679 3680 switch (code) 3681 { 3682 case BFD_RELOC_VTABLE_INHERIT: 3683 return &elf_mips_gnu_vtinherit_howto; 3684 case BFD_RELOC_VTABLE_ENTRY: 3685 return &elf_mips_gnu_vtentry_howto; 3686 case BFD_RELOC_32_PCREL: 3687 return &elf_mips_gnu_pcrel32; 3688 case BFD_RELOC_MIPS_EH: 3689 return &elf_mips_eh_howto; 3690 case BFD_RELOC_MIPS_COPY: 3691 return &elf_mips_copy_howto; 3692 case BFD_RELOC_MIPS_JUMP_SLOT: 3693 return &elf_mips_jump_slot_howto; 3694 default: 3695 bfd_set_error (bfd_error_bad_value); 3696 return NULL; 3697 } 3698 } 3699 3700 static reloc_howto_type * 3701 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 3702 const char *r_name) 3703 { 3704 unsigned int i; 3705 3706 for (i = 0; 3707 i < (sizeof (elf_mips_howto_table_rela) 3708 / sizeof (elf_mips_howto_table_rela[0])); 3709 i++) 3710 if (elf_mips_howto_table_rela[i].name != NULL 3711 && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0) 3712 return &elf_mips_howto_table_rela[i]; 3713 3714 for (i = 0; 3715 i < (sizeof (elf_mips16_howto_table_rela) 3716 / sizeof (elf_mips16_howto_table_rela[0])); 3717 i++) 3718 if (elf_mips16_howto_table_rela[i].name != NULL 3719 && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0) 3720 return &elf_mips16_howto_table_rela[i]; 3721 3722 for (i = 0; 3723 i < (sizeof (elf_micromips_howto_table_rela) 3724 / sizeof (elf_micromips_howto_table_rela[0])); 3725 i++) 3726 if (elf_micromips_howto_table_rela[i].name != NULL 3727 && strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0) 3728 return &elf_micromips_howto_table_rela[i]; 3729 3730 if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0) 3731 return &elf_mips_gnu_vtinherit_howto; 3732 if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0) 3733 return &elf_mips_gnu_vtentry_howto; 3734 if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0) 3735 return &elf_mips_gnu_rel16_s2; 3736 if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0) 3737 return &elf_mips_gnu_rela16_s2; 3738 if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0) 3739 return &elf_mips_gnu_pcrel32; 3740 if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0) 3741 return &elf_mips_eh_howto; 3742 if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0) 3743 return &elf_mips_copy_howto; 3744 if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0) 3745 return &elf_mips_jump_slot_howto; 3746 3747 return NULL; 3748 } 3749 3750 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */ 3751 3752 static reloc_howto_type * 3753 mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bool rela_p) 3754 { 3755 reloc_howto_type *howto = NULL; 3756 3757 switch (r_type) 3758 { 3759 case R_MIPS_GNU_VTINHERIT: 3760 return &elf_mips_gnu_vtinherit_howto; 3761 case R_MIPS_GNU_VTENTRY: 3762 return &elf_mips_gnu_vtentry_howto; 3763 case R_MIPS_GNU_REL16_S2: 3764 if (rela_p) 3765 return &elf_mips_gnu_rela16_s2; 3766 else 3767 return &elf_mips_gnu_rel16_s2; 3768 case R_MIPS_PC32: 3769 return &elf_mips_gnu_pcrel32; 3770 case R_MIPS_EH: 3771 return &elf_mips_eh_howto; 3772 case R_MIPS_COPY: 3773 return &elf_mips_copy_howto; 3774 case R_MIPS_JUMP_SLOT: 3775 return &elf_mips_jump_slot_howto; 3776 default: 3777 if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max) 3778 { 3779 if (rela_p) 3780 howto = &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min]; 3781 else 3782 howto = &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min]; 3783 } 3784 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) 3785 { 3786 if (rela_p) 3787 howto = &elf_mips16_howto_table_rela[r_type - R_MIPS16_min]; 3788 else 3789 howto = &elf_mips16_howto_table_rel[r_type - R_MIPS16_min]; 3790 } 3791 if (r_type < R_MIPS_max) 3792 { 3793 if (rela_p) 3794 howto = &elf_mips_howto_table_rela[r_type]; 3795 else 3796 howto = &elf_mips_howto_table_rel[r_type]; 3797 } 3798 if (howto != NULL && howto->name != NULL) 3799 return howto; 3800 3801 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 3802 abfd, r_type); 3803 bfd_set_error (bfd_error_bad_value); 3804 return NULL; 3805 } 3806 } 3807 3808 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */ 3809 3810 static bool 3811 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) 3812 { 3813 unsigned int r_type; 3814 3815 r_type = ELF32_R_TYPE (dst->r_info); 3816 cache_ptr->howto = mips_elf_n32_rtype_to_howto (abfd, r_type, false); 3817 3818 if (cache_ptr->howto == NULL) 3819 return false; 3820 3821 /* The addend for a GPREL16 or LITERAL relocation comes from the GP 3822 value for the object file. We get the addend now, rather than 3823 when we do the relocation, because the symbol manipulations done 3824 by the linker may cause us to lose track of the input BFD. */ 3825 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0 3826 && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL)) 3827 cache_ptr->addend = elf_gp (abfd); 3828 3829 return true; 3830 } 3831 3832 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure. */ 3833 3834 static bool 3835 mips_info_to_howto_rela (bfd *abfd, 3836 arelent *cache_ptr, Elf_Internal_Rela *dst) 3837 { 3838 unsigned int r_type; 3839 3840 r_type = ELF32_R_TYPE (dst->r_info); 3841 cache_ptr->howto = mips_elf_n32_rtype_to_howto (abfd, r_type, true); 3842 cache_ptr->addend = dst->r_addend; 3843 return cache_ptr->howto != NULL; 3844 } 3845 3846 /* Determine whether a symbol is global for the purposes of splitting 3847 the symbol table into global symbols and local symbols. At least 3848 on Irix 5, this split must be between section symbols and all other 3849 symbols. On most ELF targets the split is between static symbols 3850 and externally visible symbols. */ 3851 3852 static bool 3853 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym) 3854 { 3855 if (SGI_COMPAT (abfd)) 3856 return (sym->flags & BSF_SECTION_SYM) == 0; 3857 else 3858 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0 3859 || bfd_is_und_section (bfd_asymbol_section (sym)) 3860 || bfd_is_com_section (bfd_asymbol_section (sym))); 3861 } 3862 3863 /* Likewise, return true if the symbol table split overall must be 3864 between section symbols and all other symbols. */ 3865 static bool 3866 mips_elf_n32_elfsym_local_is_section (bfd *abfd) 3867 { 3868 return SGI_COMPAT (abfd); 3869 } 3870 3871 /* Set the right machine number for a MIPS ELF file. */ 3872 3873 static bool 3874 mips_elf_n32_object_p (bfd *abfd) 3875 { 3876 unsigned long mach; 3877 3878 if (!ABI_N32_P (abfd)) 3879 return false; 3880 3881 /* Irix 5 and 6 are broken. Object file symbol tables are not always 3882 sorted correctly such that local symbols precede global symbols, 3883 and the sh_info field in the symbol table is not always right. */ 3884 if (SGI_COMPAT (abfd)) 3885 elf_bad_symtab (abfd) = true; 3886 3887 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags); 3888 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach); 3889 return true; 3890 } 3891 3892 /* Support for core dump NOTE sections. */ 3893 static bool 3894 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 3895 { 3896 int offset; 3897 unsigned int size; 3898 3899 switch (note->descsz) 3900 { 3901 default: 3902 return false; 3903 3904 case 440: /* Linux/MIPS N32 */ 3905 /* pr_cursig */ 3906 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 3907 3908 /* pr_pid */ 3909 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24); 3910 3911 /* pr_reg */ 3912 offset = 72; 3913 size = 360; 3914 3915 break; 3916 } 3917 3918 /* Make a ".reg/999" section. */ 3919 return _bfd_elfcore_make_pseudosection (abfd, ".reg", size, 3920 note->descpos + offset); 3921 } 3922 3923 static bool 3924 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 3925 { 3926 switch (note->descsz) 3927 { 3928 default: 3929 return false; 3930 3931 case 128: /* Linux/MIPS elf_prpsinfo */ 3932 elf_tdata (abfd)->core->pid 3933 = bfd_get_32 (abfd, note->descdata + 16); 3934 elf_tdata (abfd)->core->program 3935 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16); 3936 elf_tdata (abfd)->core->command 3937 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80); 3938 } 3939 3940 /* Note that for some reason, a spurious space is tacked 3941 onto the end of the args in some (at least one anyway) 3942 implementations, so strip it off if it exists. */ 3943 3944 { 3945 char *command = elf_tdata (abfd)->core->command; 3946 int n = strlen (command); 3947 3948 if (0 < n && command[n - 1] == ' ') 3949 command[n - 1] = '\0'; 3950 } 3951 3952 return true; 3953 } 3954 3955 static bool 3956 elf_n32_mips_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note) 3957 { 3958 size_t offset; 3959 size_t size; 3960 size_t min_size; 3961 3962 /* Compute offset of pr_getregsz, skipping over pr_statussz. 3963 Also compute minimum size of this note. */ 3964 offset = 4 + 4; 3965 min_size = offset + 4 * 2 + 4 + 4 + 4; 3966 3967 if (note->descsz < min_size) 3968 return false; 3969 3970 /* Check for version 1 in pr_version. */ 3971 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1) 3972 return false; 3973 3974 /* Extract size of pr_reg from pr_gregsetsz. */ 3975 /* Skip over pr_gregsetsz and pr_fpregsetsz. */ 3976 size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset); 3977 offset += 4 * 2; 3978 3979 /* Skip over pr_osreldate. */ 3980 offset += 4; 3981 3982 /* Read signal from pr_cursig. */ 3983 if (elf_tdata (abfd)->core->signal == 0) 3984 elf_tdata (abfd)->core->signal 3985 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset); 3986 offset += 4; 3987 3988 /* Read TID from pr_pid. */ 3989 elf_tdata (abfd)->core->lwpid 3990 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset); 3991 offset += 4; 3992 3993 /* Padding before pr_reg. */ 3994 offset += 4; 3995 3996 /* Make sure that there is enough data remaining in the note. */ 3997 if (note->descsz - offset < size) 3998 return false; 3999 4000 /* Make a ".reg/999" section and a ".reg" section. */ 4001 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 4002 size, note->descpos + offset); 4003 } 4004 4005 /* Write Linux core PRSTATUS note into core file. */ 4006 4007 static char * 4008 elf32_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, 4009 ...) 4010 { 4011 switch (note_type) 4012 { 4013 default: 4014 return NULL; 4015 4016 case NT_PRPSINFO: 4017 BFD_FAIL (); 4018 return NULL; 4019 4020 case NT_PRSTATUS: 4021 { 4022 char data[440]; 4023 va_list ap; 4024 long pid; 4025 int cursig; 4026 const void *greg; 4027 4028 va_start (ap, note_type); 4029 memset (data, 0, 72); 4030 pid = va_arg (ap, long); 4031 bfd_put_32 (abfd, pid, data + 24); 4032 cursig = va_arg (ap, int); 4033 bfd_put_16 (abfd, cursig, data + 12); 4034 greg = va_arg (ap, const void *); 4035 memcpy (data + 72, greg, 360); 4036 memset (data + 432, 0, 8); 4037 va_end (ap); 4038 return elfcore_write_note (abfd, buf, bufsiz, 4039 "CORE", note_type, data, sizeof (data)); 4040 } 4041 } 4042 } 4043 4044 /* MIPS ELF local labels start with "$L". */ 4045 static bool 4046 mips_elf_n32_is_local_label_name (bfd *abfd, const char *name) 4047 { 4048 if (name[0] == '$' && name[1] == 'L') 4049 return true; 4050 4051 /* We accept the generic ELF local label syntax as well. */ 4052 return _bfd_elf_is_local_label_name (abfd, name); 4053 } 4054 4055 /* Depending on the target vector we generate some version of Irix 4056 executables or "normal" MIPS ELF ABI executables. */ 4057 static irix_compat_t 4058 elf_n32_mips_irix_compat (bfd *abfd) 4059 { 4060 if ((abfd->xvec == &mips_elf32_n_be_vec) 4061 || (abfd->xvec == &mips_elf32_n_le_vec)) 4062 return ict_irix6; 4063 else 4064 return ict_none; 4065 } 4066 4067 /* Make an n32 MIPS object. We need to set the n32 ABI flag in 4068 `e_flags' to tell the object apart from an o32 object. */ 4069 4070 static bool 4071 mips_elf_n32_mkobject (bfd *abfd) 4072 { 4073 bool ret; 4074 4075 ret = _bfd_mips_elf_mkobject (abfd); 4076 if (ret) 4077 elf_elfheader (abfd)->e_flags |= EF_MIPS_ABI2; 4078 4079 return ret; 4080 } 4081 4082 /* ECOFF swapping routines. These are used when dealing with the 4083 .mdebug section, which is in the ECOFF debugging format. */ 4084 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { 4085 /* Symbol table magic number. */ 4086 magicSym, 4087 /* Alignment of debugging information. E.g., 4. */ 4088 4, 4089 /* Sizes of external symbolic information. */ 4090 sizeof (struct hdr_ext), 4091 sizeof (struct dnr_ext), 4092 sizeof (struct pdr_ext), 4093 sizeof (struct sym_ext), 4094 sizeof (struct opt_ext), 4095 sizeof (struct fdr_ext), 4096 sizeof (struct rfd_ext), 4097 sizeof (struct ext_ext), 4098 /* Functions to swap in external symbolic data. */ 4099 ecoff_swap_hdr_in, 4100 ecoff_swap_dnr_in, 4101 ecoff_swap_pdr_in, 4102 ecoff_swap_sym_in, 4103 ecoff_swap_opt_in, 4104 ecoff_swap_fdr_in, 4105 ecoff_swap_rfd_in, 4106 ecoff_swap_ext_in, 4107 _bfd_ecoff_swap_tir_in, 4108 _bfd_ecoff_swap_rndx_in, 4109 /* Functions to swap out external symbolic data. */ 4110 ecoff_swap_hdr_out, 4111 ecoff_swap_dnr_out, 4112 ecoff_swap_pdr_out, 4113 ecoff_swap_sym_out, 4114 ecoff_swap_opt_out, 4115 ecoff_swap_fdr_out, 4116 ecoff_swap_rfd_out, 4117 ecoff_swap_ext_out, 4118 _bfd_ecoff_swap_tir_out, 4119 _bfd_ecoff_swap_rndx_out, 4120 /* Function to read in symbolic data. */ 4121 _bfd_mips_elf_read_ecoff_info 4122 }; 4123 4124 #define ELF_ARCH bfd_arch_mips 4125 #define ELF_TARGET_ID MIPS_ELF_DATA 4126 #define ELF_MACHINE_CODE EM_MIPS 4127 4128 #define elf_backend_collect true 4129 #define elf_backend_type_change_ok true 4130 #define elf_backend_can_gc_sections true 4131 #define elf_backend_gc_mark_extra_sections \ 4132 _bfd_mips_elf_gc_mark_extra_sections 4133 #define elf_info_to_howto mips_info_to_howto_rela 4134 #define elf_info_to_howto_rel mips_info_to_howto_rel 4135 #define elf_backend_sym_is_global mips_elf_sym_is_global 4136 #define elf_backend_object_p mips_elf_n32_object_p 4137 #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing 4138 #define elf_backend_section_processing _bfd_mips_elf_section_processing 4139 #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr 4140 #define elf_backend_fake_sections _bfd_mips_elf_fake_sections 4141 #define elf_backend_section_from_bfd_section \ 4142 _bfd_mips_elf_section_from_bfd_section 4143 #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook 4144 #define elf_backend_link_output_symbol_hook \ 4145 _bfd_mips_elf_link_output_symbol_hook 4146 #define elf_backend_create_dynamic_sections \ 4147 _bfd_mips_elf_create_dynamic_sections 4148 #define elf_backend_check_relocs _bfd_mips_elf_check_relocs 4149 #define elf_backend_merge_symbol_attribute \ 4150 _bfd_mips_elf_merge_symbol_attribute 4151 #define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag 4152 #define elf_backend_adjust_dynamic_symbol \ 4153 _bfd_mips_elf_adjust_dynamic_symbol 4154 #define elf_backend_always_size_sections \ 4155 _bfd_mips_elf_always_size_sections 4156 #define elf_backend_size_dynamic_sections \ 4157 _bfd_mips_elf_size_dynamic_sections 4158 #define elf_backend_init_index_section _bfd_elf_init_1_index_section 4159 #define elf_backend_relocate_section _bfd_mips_elf_relocate_section 4160 #define elf_backend_finish_dynamic_symbol \ 4161 _bfd_mips_elf_finish_dynamic_symbol 4162 #define elf_backend_finish_dynamic_sections \ 4163 _bfd_mips_elf_finish_dynamic_sections 4164 #define elf_backend_final_write_processing \ 4165 _bfd_mips_elf_final_write_processing 4166 #define elf_backend_additional_program_headers \ 4167 _bfd_mips_elf_additional_program_headers 4168 #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map 4169 #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook 4170 #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook 4171 #define elf_backend_copy_indirect_symbol \ 4172 _bfd_mips_elf_copy_indirect_symbol 4173 #define elf_backend_hide_symbol _bfd_mips_elf_hide_symbol 4174 #define elf_backend_grok_prstatus elf32_mips_grok_prstatus 4175 #define elf_backend_grok_psinfo elf32_mips_grok_psinfo 4176 #define elf_backend_grok_freebsd_prstatus \ 4177 elf_n32_mips_grok_freebsd_prstatus 4178 #define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap 4179 4180 #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO) 4181 #define elf_backend_want_dynrelro 1 4182 4183 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations 4184 work better/work only in RELA, so we default to this. */ 4185 #define elf_backend_may_use_rel_p 1 4186 #define elf_backend_may_use_rela_p 1 4187 #define elf_backend_default_use_rela_p 1 4188 #define elf_backend_rela_plts_and_copies_p 0 4189 #define elf_backend_sign_extend_vma true 4190 #define elf_backend_plt_readonly 1 4191 #define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val 4192 4193 #define elf_backend_discard_info _bfd_mips_elf_discard_info 4194 #define elf_backend_ignore_discarded_relocs \ 4195 _bfd_mips_elf_ignore_discarded_relocs 4196 #define elf_backend_write_section _bfd_mips_elf_write_section 4197 #define elf_backend_elfsym_local_is_section \ 4198 mips_elf_n32_elfsym_local_is_section 4199 #define elf_backend_mips_irix_compat elf_n32_mips_irix_compat 4200 #define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto 4201 4202 #define bfd_elf32_bfd_is_local_label_name \ 4203 mips_elf_n32_is_local_label_name 4204 #define bfd_elf32_bfd_is_target_special_symbol \ 4205 _bfd_mips_elf_is_target_special_symbol 4206 #define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line 4207 #define bfd_elf32_find_nearest_line_with_alt \ 4208 _bfd_mips_elf_find_nearest_line_with_alt 4209 #define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info 4210 #define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook 4211 #define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents 4212 #define bfd_elf32_bfd_get_relocated_section_contents \ 4213 _bfd_elf_mips_get_relocated_section_contents 4214 #define bfd_elf32_bfd_link_hash_table_create \ 4215 _bfd_mips_elf_link_hash_table_create 4216 #define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link 4217 #define bfd_elf32_bfd_merge_private_bfd_data \ 4218 _bfd_mips_elf_merge_private_bfd_data 4219 #define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags 4220 #define bfd_elf32_bfd_print_private_bfd_data \ 4221 _bfd_mips_elf_print_private_bfd_data 4222 #define bfd_elf32_mkobject mips_elf_n32_mkobject 4223 #define bfd_elf32_bfd_free_cached_info _bfd_mips_elf_free_cached_info 4224 4225 /* Support for SGI-ish mips targets using n32 ABI. */ 4226 4227 #define TARGET_LITTLE_SYM mips_elf32_n_le_vec 4228 #define TARGET_LITTLE_NAME "elf32-nlittlemips" 4229 #define TARGET_BIG_SYM mips_elf32_n_be_vec 4230 #define TARGET_BIG_NAME "elf32-nbigmips" 4231 4232 #define ELF_MAXPAGESIZE 0x10000 4233 #define ELF_COMMONPAGESIZE 0x1000 4234 4235 #include "elf32-target.h" 4236 4237 /* Support for traditional mips targets using n32 ABI. */ 4238 #undef TARGET_LITTLE_SYM 4239 #undef TARGET_LITTLE_NAME 4240 #undef TARGET_BIG_SYM 4241 #undef TARGET_BIG_NAME 4242 4243 #undef ELF_MAXPAGESIZE 4244 #undef ELF_COMMONPAGESIZE 4245 4246 #define TARGET_LITTLE_SYM mips_elf32_ntrad_le_vec 4247 #define TARGET_LITTLE_NAME "elf32-ntradlittlemips" 4248 #define TARGET_BIG_SYM mips_elf32_ntrad_be_vec 4249 #define TARGET_BIG_NAME "elf32-ntradbigmips" 4250 4251 #define ELF_MAXPAGESIZE 0x10000 4252 #define ELF_COMMONPAGESIZE 0x1000 4253 #define elf32_bed elf32_tradbed 4254 4255 #undef elf_backend_write_core_note 4256 #define elf_backend_write_core_note elf32_mips_write_core_note 4257 4258 /* Include the target file again for this target. */ 4259 #include "elf32-target.h" 4260 4261 4262 /* FreeBSD support. */ 4263 4264 #undef TARGET_LITTLE_SYM 4265 #undef TARGET_LITTLE_NAME 4266 #undef TARGET_BIG_SYM 4267 #undef TARGET_BIG_NAME 4268 4269 #define TARGET_LITTLE_SYM mips_elf32_ntradfbsd_le_vec 4270 #define TARGET_LITTLE_NAME "elf32-ntradlittlemips-freebsd" 4271 #define TARGET_BIG_SYM mips_elf32_ntradfbsd_be_vec 4272 #define TARGET_BIG_NAME "elf32-ntradbigmips-freebsd" 4273 4274 #undef ELF_OSABI 4275 #define ELF_OSABI ELFOSABI_FREEBSD 4276 4277 #undef elf32_bed 4278 #define elf32_bed elf32_fbsd_tradbed 4279 4280 #undef elf_backend_write_core_note 4281 4282 #include "elf32-target.h" 4283