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