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