1/* MIPS-specific support for 32-bit ELF 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 3 2003, 2004, 2005, 2007 Free Software Foundation, Inc. 4 5 Most of the information added by Ian Lance Taylor, Cygnus Support, 6 <ian@cygnus.com>. 7 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC. 8 <mark@codesourcery.com> 9 Traditional MIPS targets support added by Koundinya.K, Dansk Data 10 Elektronik & Operations Research Group. <kk@ddeorg.soft.net> 11 12 This file is part of BFD, the Binary File Descriptor library. 13 14 This program is free software; you can redistribute it and/or modify 15 it under the terms of the GNU General Public License as published by 16 the Free Software Foundation; either version 3 of the License, or 17 (at your option) any later version. 18 19 This program is distributed in the hope that it will be useful, 20 but WITHOUT ANY WARRANTY; without even the implied warranty of 21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 GNU General Public License for more details. 23 24 You should have received a copy of the GNU General Public License 25 along with this program; if not, write to the Free Software 26 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 27 MA 02110-1301, USA. */ 28 29 30/* This file handles MIPS ELF targets. SGI Irix 5 uses a slightly 31 different MIPS ELF from other targets. This matters when linking. 32 This file supports both, switching at runtime. */ 33 34#include "sysdep.h" 35#include "bfd.h" 36#include "libbfd.h" 37#include "bfdlink.h" 38#include "genlink.h" 39#include "elf-bfd.h" 40#include "elfxx-mips.h" 41#include "elf/mips.h" 42 43/* Get the ECOFF swapping routines. */ 44#include "coff/sym.h" 45#include "coff/symconst.h" 46#include "coff/internal.h" 47#include "coff/ecoff.h" 48#include "coff/mips.h" 49#define ECOFF_SIGNED_32 50#include "ecoffswap.h" 51 52static bfd_boolean mips_elf_assign_gp 53 (bfd *, bfd_vma *); 54static bfd_reloc_status_type mips_elf_final_gp 55 (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *); 56static bfd_reloc_status_type mips_elf_gprel16_reloc 57 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 58static bfd_reloc_status_type mips_elf_literal_reloc 59 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 60static bfd_reloc_status_type mips_elf_gprel32_reloc 61 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 62static bfd_reloc_status_type gprel32_with_gp 63 (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma); 64static bfd_reloc_status_type mips_elf_shift6_reloc 65 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 66static bfd_reloc_status_type mips16_gprel_reloc 67 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 68static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup 69 (bfd *, bfd_reloc_code_real_type); 70static reloc_howto_type *mips_elf_n32_rtype_to_howto 71 (unsigned int, bfd_boolean); 72static void mips_info_to_howto_rel 73 (bfd *, arelent *, Elf_Internal_Rela *); 74static void mips_info_to_howto_rela 75 (bfd *, arelent *, Elf_Internal_Rela *); 76static bfd_boolean mips_elf_sym_is_global 77 (bfd *, asymbol *); 78static bfd_boolean mips_elf_n32_object_p 79 (bfd *); 80static bfd_boolean elf32_mips_grok_prstatus 81 (bfd *, Elf_Internal_Note *); 82static bfd_boolean elf32_mips_grok_psinfo 83 (bfd *, Elf_Internal_Note *); 84static irix_compat_t elf_n32_mips_irix_compat 85 (bfd *); 86 87extern const bfd_target bfd_elf32_nbigmips_vec; 88extern const bfd_target bfd_elf32_nlittlemips_vec; 89 90/* Nonzero if ABFD is using the N32 ABI. */ 91#define ABI_N32_P(abfd) \ 92 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0) 93 94/* Whether we are trying to be compatible with IRIX at all. */ 95#define SGI_COMPAT(abfd) \ 96 (elf_n32_mips_irix_compat (abfd) != ict_none) 97 98/* The number of local .got entries we reserve. */ 99#define MIPS_RESERVED_GOTNO (2) 100 101/* In case we're on a 32-bit machine, construct a 64-bit "-1" value 102 from smaller values. Start with zero, widen, *then* decrement. */ 103#define MINUS_ONE (((bfd_vma)0) - 1) 104 105/* The relocation table used for SHT_REL sections. */ 106 107static reloc_howto_type elf_mips_howto_table_rel[] = 108{ 109 /* No relocation. */ 110 HOWTO (R_MIPS_NONE, /* type */ 111 0, /* rightshift */ 112 0, /* size (0 = byte, 1 = short, 2 = long) */ 113 0, /* bitsize */ 114 FALSE, /* pc_relative */ 115 0, /* bitpos */ 116 complain_overflow_dont, /* complain_on_overflow */ 117 _bfd_mips_elf_generic_reloc, /* special_function */ 118 "R_MIPS_NONE", /* name */ 119 FALSE, /* partial_inplace */ 120 0, /* src_mask */ 121 0, /* dst_mask */ 122 FALSE), /* pcrel_offset */ 123 124 /* 16 bit relocation. */ 125 HOWTO (R_MIPS_16, /* type */ 126 0, /* rightshift */ 127 2, /* size (0 = byte, 1 = short, 2 = long) */ 128 16, /* bitsize */ 129 FALSE, /* pc_relative */ 130 0, /* bitpos */ 131 complain_overflow_signed, /* complain_on_overflow */ 132 _bfd_mips_elf_generic_reloc, /* special_function */ 133 "R_MIPS_16", /* name */ 134 TRUE, /* partial_inplace */ 135 0x0000ffff, /* src_mask */ 136 0x0000ffff, /* dst_mask */ 137 FALSE), /* pcrel_offset */ 138 139 /* 32 bit relocation. */ 140 HOWTO (R_MIPS_32, /* type */ 141 0, /* rightshift */ 142 2, /* size (0 = byte, 1 = short, 2 = long) */ 143 32, /* bitsize */ 144 FALSE, /* pc_relative */ 145 0, /* bitpos */ 146 complain_overflow_dont, /* complain_on_overflow */ 147 _bfd_mips_elf_generic_reloc, /* special_function */ 148 "R_MIPS_32", /* name */ 149 TRUE, /* partial_inplace */ 150 0xffffffff, /* src_mask */ 151 0xffffffff, /* dst_mask */ 152 FALSE), /* pcrel_offset */ 153 154 /* 32 bit symbol relative relocation. */ 155 HOWTO (R_MIPS_REL32, /* type */ 156 0, /* rightshift */ 157 2, /* size (0 = byte, 1 = short, 2 = long) */ 158 32, /* bitsize */ 159 FALSE, /* pc_relative */ 160 0, /* bitpos */ 161 complain_overflow_dont, /* complain_on_overflow */ 162 _bfd_mips_elf_generic_reloc, /* special_function */ 163 "R_MIPS_REL32", /* name */ 164 TRUE, /* partial_inplace */ 165 0xffffffff, /* src_mask */ 166 0xffffffff, /* dst_mask */ 167 FALSE), /* pcrel_offset */ 168 169 /* 26 bit jump address. */ 170 HOWTO (R_MIPS_26, /* type */ 171 2, /* rightshift */ 172 2, /* size (0 = byte, 1 = short, 2 = long) */ 173 26, /* bitsize */ 174 FALSE, /* pc_relative */ 175 0, /* bitpos */ 176 complain_overflow_dont, /* complain_on_overflow */ 177 /* This needs complex overflow 178 detection, because the upper four 179 bits must match the PC + 4. */ 180 _bfd_mips_elf_generic_reloc, /* special_function */ 181 "R_MIPS_26", /* name */ 182 TRUE, /* partial_inplace */ 183 0x03ffffff, /* src_mask */ 184 0x03ffffff, /* dst_mask */ 185 FALSE), /* pcrel_offset */ 186 187 /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL. 188 However, the native IRIX6 tools use them, so we try our best. */ 189 190 /* High 16 bits of symbol value. */ 191 HOWTO (R_MIPS_HI16, /* type */ 192 16, /* rightshift */ 193 2, /* size (0 = byte, 1 = short, 2 = long) */ 194 16, /* bitsize */ 195 FALSE, /* pc_relative */ 196 0, /* bitpos */ 197 complain_overflow_dont, /* complain_on_overflow */ 198 _bfd_mips_elf_hi16_reloc, /* special_function */ 199 "R_MIPS_HI16", /* name */ 200 TRUE, /* partial_inplace */ 201 0x0000ffff, /* src_mask */ 202 0x0000ffff, /* dst_mask */ 203 FALSE), /* pcrel_offset */ 204 205 /* Low 16 bits of symbol value. */ 206 HOWTO (R_MIPS_LO16, /* type */ 207 0, /* rightshift */ 208 2, /* size (0 = byte, 1 = short, 2 = long) */ 209 16, /* bitsize */ 210 FALSE, /* pc_relative */ 211 0, /* bitpos */ 212 complain_overflow_dont, /* complain_on_overflow */ 213 _bfd_mips_elf_lo16_reloc, /* special_function */ 214 "R_MIPS_LO16", /* name */ 215 TRUE, /* partial_inplace */ 216 0x0000ffff, /* src_mask */ 217 0x0000ffff, /* dst_mask */ 218 FALSE), /* pcrel_offset */ 219 220 /* GP relative reference. */ 221 HOWTO (R_MIPS_GPREL16, /* type */ 222 0, /* rightshift */ 223 2, /* size (0 = byte, 1 = short, 2 = long) */ 224 16, /* bitsize */ 225 FALSE, /* pc_relative */ 226 0, /* bitpos */ 227 complain_overflow_signed, /* complain_on_overflow */ 228 mips_elf_gprel16_reloc, /* special_function */ 229 "R_MIPS_GPREL16", /* name */ 230 TRUE, /* partial_inplace */ 231 0x0000ffff, /* src_mask */ 232 0x0000ffff, /* dst_mask */ 233 FALSE), /* pcrel_offset */ 234 235 /* Reference to literal section. */ 236 HOWTO (R_MIPS_LITERAL, /* type */ 237 0, /* rightshift */ 238 2, /* size (0 = byte, 1 = short, 2 = long) */ 239 16, /* bitsize */ 240 FALSE, /* pc_relative */ 241 0, /* bitpos */ 242 complain_overflow_signed, /* complain_on_overflow */ 243 mips_elf_literal_reloc, /* special_function */ 244 "R_MIPS_LITERAL", /* name */ 245 TRUE, /* partial_inplace */ 246 0x0000ffff, /* src_mask */ 247 0x0000ffff, /* dst_mask */ 248 FALSE), /* pcrel_offset */ 249 250 /* Reference to global offset table. */ 251 HOWTO (R_MIPS_GOT16, /* type */ 252 0, /* rightshift */ 253 2, /* size (0 = byte, 1 = short, 2 = long) */ 254 16, /* bitsize */ 255 FALSE, /* pc_relative */ 256 0, /* bitpos */ 257 complain_overflow_signed, /* complain_on_overflow */ 258 _bfd_mips_elf_got16_reloc, /* special_function */ 259 "R_MIPS_GOT16", /* name */ 260 TRUE, /* partial_inplace */ 261 0x0000ffff, /* src_mask */ 262 0x0000ffff, /* dst_mask */ 263 FALSE), /* pcrel_offset */ 264 265 /* 16 bit PC relative reference. Note that the ABI document has a typo 266 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless. 267 We do the right thing here. */ 268 HOWTO (R_MIPS_PC16, /* type */ 269 2, /* rightshift */ 270 2, /* size (0 = byte, 1 = short, 2 = long) */ 271 16, /* bitsize */ 272 TRUE, /* pc_relative */ 273 0, /* bitpos */ 274 complain_overflow_signed, /* complain_on_overflow */ 275 _bfd_mips_elf_generic_reloc, /* special_function */ 276 "R_MIPS_PC16", /* name */ 277 TRUE, /* partial_inplace */ 278 0x0000ffff, /* src_mask */ 279 0x0000ffff, /* dst_mask */ 280 TRUE), /* pcrel_offset */ 281 282 /* 16 bit call through global offset table. */ 283 HOWTO (R_MIPS_CALL16, /* type */ 284 0, /* rightshift */ 285 2, /* size (0 = byte, 1 = short, 2 = long) */ 286 16, /* bitsize */ 287 FALSE, /* pc_relative */ 288 0, /* bitpos */ 289 complain_overflow_signed, /* complain_on_overflow */ 290 _bfd_mips_elf_generic_reloc, /* special_function */ 291 "R_MIPS_CALL16", /* name */ 292 TRUE, /* partial_inplace */ 293 0x0000ffff, /* src_mask */ 294 0x0000ffff, /* dst_mask */ 295 FALSE), /* pcrel_offset */ 296 297 /* 32 bit GP relative reference. */ 298 HOWTO (R_MIPS_GPREL32, /* type */ 299 0, /* rightshift */ 300 2, /* size (0 = byte, 1 = short, 2 = long) */ 301 32, /* bitsize */ 302 FALSE, /* pc_relative */ 303 0, /* bitpos */ 304 complain_overflow_dont, /* complain_on_overflow */ 305 mips_elf_gprel32_reloc, /* special_function */ 306 "R_MIPS_GPREL32", /* name */ 307 TRUE, /* partial_inplace */ 308 0xffffffff, /* src_mask */ 309 0xffffffff, /* dst_mask */ 310 FALSE), /* pcrel_offset */ 311 312 /* The remaining relocs are defined on Irix 5, although they are 313 not defined by the ABI. */ 314 EMPTY_HOWTO (13), 315 EMPTY_HOWTO (14), 316 EMPTY_HOWTO (15), 317 318 /* A 5 bit shift field. */ 319 HOWTO (R_MIPS_SHIFT5, /* type */ 320 0, /* rightshift */ 321 2, /* size (0 = byte, 1 = short, 2 = long) */ 322 5, /* bitsize */ 323 FALSE, /* pc_relative */ 324 6, /* bitpos */ 325 complain_overflow_bitfield, /* complain_on_overflow */ 326 _bfd_mips_elf_generic_reloc, /* special_function */ 327 "R_MIPS_SHIFT5", /* name */ 328 TRUE, /* partial_inplace */ 329 0x000007c0, /* src_mask */ 330 0x000007c0, /* dst_mask */ 331 FALSE), /* pcrel_offset */ 332 333 /* A 6 bit shift field. */ 334 HOWTO (R_MIPS_SHIFT6, /* type */ 335 0, /* rightshift */ 336 2, /* size (0 = byte, 1 = short, 2 = long) */ 337 6, /* bitsize */ 338 FALSE, /* pc_relative */ 339 6, /* bitpos */ 340 complain_overflow_bitfield, /* complain_on_overflow */ 341 mips_elf_shift6_reloc, /* special_function */ 342 "R_MIPS_SHIFT6", /* name */ 343 TRUE, /* partial_inplace */ 344 0x000007c4, /* src_mask */ 345 0x000007c4, /* dst_mask */ 346 FALSE), /* pcrel_offset */ 347 348 /* A 64 bit relocation. */ 349 HOWTO (R_MIPS_64, /* type */ 350 0, /* rightshift */ 351 4, /* size (0 = byte, 1 = short, 2 = long) */ 352 64, /* bitsize */ 353 FALSE, /* pc_relative */ 354 0, /* bitpos */ 355 complain_overflow_dont, /* complain_on_overflow */ 356 _bfd_mips_elf_generic_reloc, /* special_function */ 357 "R_MIPS_64", /* name */ 358 TRUE, /* partial_inplace */ 359 MINUS_ONE, /* src_mask */ 360 MINUS_ONE, /* dst_mask */ 361 FALSE), /* pcrel_offset */ 362 363 /* Displacement in the global offset table. */ 364 HOWTO (R_MIPS_GOT_DISP, /* type */ 365 0, /* rightshift */ 366 2, /* size (0 = byte, 1 = short, 2 = long) */ 367 16, /* bitsize */ 368 FALSE, /* pc_relative */ 369 0, /* bitpos */ 370 complain_overflow_signed, /* complain_on_overflow */ 371 _bfd_mips_elf_generic_reloc, /* special_function */ 372 "R_MIPS_GOT_DISP", /* name */ 373 TRUE, /* partial_inplace */ 374 0x0000ffff, /* src_mask */ 375 0x0000ffff, /* dst_mask */ 376 FALSE), /* pcrel_offset */ 377 378 /* Displacement to page pointer in the global offset table. */ 379 HOWTO (R_MIPS_GOT_PAGE, /* type */ 380 0, /* rightshift */ 381 2, /* size (0 = byte, 1 = short, 2 = long) */ 382 16, /* bitsize */ 383 FALSE, /* pc_relative */ 384 0, /* bitpos */ 385 complain_overflow_signed, /* complain_on_overflow */ 386 _bfd_mips_elf_generic_reloc, /* special_function */ 387 "R_MIPS_GOT_PAGE", /* name */ 388 TRUE, /* partial_inplace */ 389 0x0000ffff, /* src_mask */ 390 0x0000ffff, /* dst_mask */ 391 FALSE), /* pcrel_offset */ 392 393 /* Offset from page pointer in the global offset table. */ 394 HOWTO (R_MIPS_GOT_OFST, /* type */ 395 0, /* rightshift */ 396 2, /* size (0 = byte, 1 = short, 2 = long) */ 397 16, /* bitsize */ 398 FALSE, /* pc_relative */ 399 0, /* bitpos */ 400 complain_overflow_signed, /* complain_on_overflow */ 401 _bfd_mips_elf_generic_reloc, /* special_function */ 402 "R_MIPS_GOT_OFST", /* name */ 403 TRUE, /* partial_inplace */ 404 0x0000ffff, /* src_mask */ 405 0x0000ffff, /* dst_mask */ 406 FALSE), /* pcrel_offset */ 407 408 /* High 16 bits of displacement in global offset table. */ 409 HOWTO (R_MIPS_GOT_HI16, /* type */ 410 0, /* rightshift */ 411 2, /* size (0 = byte, 1 = short, 2 = long) */ 412 16, /* bitsize */ 413 FALSE, /* pc_relative */ 414 0, /* bitpos */ 415 complain_overflow_dont, /* complain_on_overflow */ 416 _bfd_mips_elf_generic_reloc, /* special_function */ 417 "R_MIPS_GOT_HI16", /* name */ 418 TRUE, /* partial_inplace */ 419 0x0000ffff, /* src_mask */ 420 0x0000ffff, /* dst_mask */ 421 FALSE), /* pcrel_offset */ 422 423 /* Low 16 bits of displacement in global offset table. */ 424 HOWTO (R_MIPS_GOT_LO16, /* type */ 425 0, /* rightshift */ 426 2, /* size (0 = byte, 1 = short, 2 = long) */ 427 16, /* bitsize */ 428 FALSE, /* pc_relative */ 429 0, /* bitpos */ 430 complain_overflow_dont, /* complain_on_overflow */ 431 _bfd_mips_elf_generic_reloc, /* special_function */ 432 "R_MIPS_GOT_LO16", /* name */ 433 TRUE, /* partial_inplace */ 434 0x0000ffff, /* src_mask */ 435 0x0000ffff, /* dst_mask */ 436 FALSE), /* pcrel_offset */ 437 438 /* 64 bit subtraction. */ 439 HOWTO (R_MIPS_SUB, /* type */ 440 0, /* rightshift */ 441 4, /* size (0 = byte, 1 = short, 2 = long) */ 442 64, /* bitsize */ 443 FALSE, /* pc_relative */ 444 0, /* bitpos */ 445 complain_overflow_dont, /* complain_on_overflow */ 446 _bfd_mips_elf_generic_reloc, /* special_function */ 447 "R_MIPS_SUB", /* name */ 448 TRUE, /* partial_inplace */ 449 MINUS_ONE, /* src_mask */ 450 MINUS_ONE, /* dst_mask */ 451 FALSE), /* pcrel_offset */ 452 453 /* Insert the addend as an instruction. */ 454 /* FIXME: Not handled correctly. */ 455 HOWTO (R_MIPS_INSERT_A, /* type */ 456 0, /* rightshift */ 457 2, /* size (0 = byte, 1 = short, 2 = long) */ 458 32, /* bitsize */ 459 FALSE, /* pc_relative */ 460 0, /* bitpos */ 461 complain_overflow_dont, /* complain_on_overflow */ 462 _bfd_mips_elf_generic_reloc, /* special_function */ 463 "R_MIPS_INSERT_A", /* name */ 464 TRUE, /* partial_inplace */ 465 0xffffffff, /* src_mask */ 466 0xffffffff, /* dst_mask */ 467 FALSE), /* pcrel_offset */ 468 469 /* Insert the addend as an instruction, and change all relocations 470 to refer to the old instruction at the address. */ 471 /* FIXME: Not handled correctly. */ 472 HOWTO (R_MIPS_INSERT_B, /* type */ 473 0, /* rightshift */ 474 2, /* size (0 = byte, 1 = short, 2 = long) */ 475 32, /* bitsize */ 476 FALSE, /* pc_relative */ 477 0, /* bitpos */ 478 complain_overflow_dont, /* complain_on_overflow */ 479 _bfd_mips_elf_generic_reloc, /* special_function */ 480 "R_MIPS_INSERT_B", /* name */ 481 TRUE, /* partial_inplace */ 482 0xffffffff, /* src_mask */ 483 0xffffffff, /* dst_mask */ 484 FALSE), /* pcrel_offset */ 485 486 /* Delete a 32 bit instruction. */ 487 /* FIXME: Not handled correctly. */ 488 HOWTO (R_MIPS_DELETE, /* type */ 489 0, /* rightshift */ 490 2, /* size (0 = byte, 1 = short, 2 = long) */ 491 32, /* bitsize */ 492 FALSE, /* pc_relative */ 493 0, /* bitpos */ 494 complain_overflow_dont, /* complain_on_overflow */ 495 _bfd_mips_elf_generic_reloc, /* special_function */ 496 "R_MIPS_DELETE", /* name */ 497 TRUE, /* partial_inplace */ 498 0xffffffff, /* src_mask */ 499 0xffffffff, /* dst_mask */ 500 FALSE), /* pcrel_offset */ 501 502 /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations. 503 We don't, because 504 a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/ 505 R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using 506 fallable heuristics. 507 b) No other NewABI toolchain actually emits such relocations. */ 508 EMPTY_HOWTO (R_MIPS_HIGHER), 509 EMPTY_HOWTO (R_MIPS_HIGHEST), 510 511 /* High 16 bits of displacement in global offset table. */ 512 HOWTO (R_MIPS_CALL_HI16, /* type */ 513 0, /* rightshift */ 514 2, /* size (0 = byte, 1 = short, 2 = long) */ 515 16, /* bitsize */ 516 FALSE, /* pc_relative */ 517 0, /* bitpos */ 518 complain_overflow_dont, /* complain_on_overflow */ 519 _bfd_mips_elf_generic_reloc, /* special_function */ 520 "R_MIPS_CALL_HI16", /* name */ 521 TRUE, /* partial_inplace */ 522 0x0000ffff, /* src_mask */ 523 0x0000ffff, /* dst_mask */ 524 FALSE), /* pcrel_offset */ 525 526 /* Low 16 bits of displacement in global offset table. */ 527 HOWTO (R_MIPS_CALL_LO16, /* type */ 528 0, /* rightshift */ 529 2, /* size (0 = byte, 1 = short, 2 = long) */ 530 16, /* bitsize */ 531 FALSE, /* pc_relative */ 532 0, /* bitpos */ 533 complain_overflow_dont, /* complain_on_overflow */ 534 _bfd_mips_elf_generic_reloc, /* special_function */ 535 "R_MIPS_CALL_LO16", /* name */ 536 TRUE, /* partial_inplace */ 537 0x0000ffff, /* src_mask */ 538 0x0000ffff, /* dst_mask */ 539 FALSE), /* pcrel_offset */ 540 541 /* Section displacement. */ 542 HOWTO (R_MIPS_SCN_DISP, /* type */ 543 0, /* rightshift */ 544 2, /* size (0 = byte, 1 = short, 2 = long) */ 545 32, /* bitsize */ 546 FALSE, /* pc_relative */ 547 0, /* bitpos */ 548 complain_overflow_dont, /* complain_on_overflow */ 549 _bfd_mips_elf_generic_reloc, /* special_function */ 550 "R_MIPS_SCN_DISP", /* name */ 551 TRUE, /* partial_inplace */ 552 0xffffffff, /* src_mask */ 553 0xffffffff, /* dst_mask */ 554 FALSE), /* pcrel_offset */ 555 556 HOWTO (R_MIPS_REL16, /* type */ 557 0, /* rightshift */ 558 1, /* size (0 = byte, 1 = short, 2 = long) */ 559 16, /* bitsize */ 560 FALSE, /* pc_relative */ 561 0, /* bitpos */ 562 complain_overflow_signed, /* complain_on_overflow */ 563 _bfd_mips_elf_generic_reloc, /* special_function */ 564 "R_MIPS_REL16", /* name */ 565 TRUE, /* partial_inplace */ 566 0xffff, /* src_mask */ 567 0xffff, /* dst_mask */ 568 FALSE), /* pcrel_offset */ 569 570 /* These two are obsolete. */ 571 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE), 572 EMPTY_HOWTO (R_MIPS_PJUMP), 573 574 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section. 575 It must be used for multigot GOT's (and only there). */ 576 HOWTO (R_MIPS_RELGOT, /* type */ 577 0, /* rightshift */ 578 2, /* size (0 = byte, 1 = short, 2 = long) */ 579 32, /* bitsize */ 580 FALSE, /* pc_relative */ 581 0, /* bitpos */ 582 complain_overflow_dont, /* complain_on_overflow */ 583 _bfd_mips_elf_generic_reloc, /* special_function */ 584 "R_MIPS_RELGOT", /* name */ 585 TRUE, /* partial_inplace */ 586 0xffffffff, /* src_mask */ 587 0xffffffff, /* dst_mask */ 588 FALSE), /* pcrel_offset */ 589 590 /* Protected jump conversion. This is an optimization hint. No 591 relocation is required for correctness. */ 592 HOWTO (R_MIPS_JALR, /* type */ 593 0, /* rightshift */ 594 2, /* size (0 = byte, 1 = short, 2 = long) */ 595 32, /* bitsize */ 596 FALSE, /* pc_relative */ 597 0, /* bitpos */ 598 complain_overflow_dont, /* complain_on_overflow */ 599 _bfd_mips_elf_generic_reloc, /* special_function */ 600 "R_MIPS_JALR", /* name */ 601 FALSE, /* partial_inplace */ 602 0x00000000, /* src_mask */ 603 0x00000000, /* dst_mask */ 604 FALSE), /* pcrel_offset */ 605 606 /* TLS GD/LD dynamic relocations. */ 607 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */ 608 0, /* rightshift */ 609 2, /* size (0 = byte, 1 = short, 2 = long) */ 610 32, /* bitsize */ 611 FALSE, /* pc_relative */ 612 0, /* bitpos */ 613 complain_overflow_dont, /* complain_on_overflow */ 614 _bfd_mips_elf_generic_reloc, /* special_function */ 615 "R_MIPS_TLS_DTPMOD32", /* name */ 616 TRUE, /* partial_inplace */ 617 0xffffffff, /* src_mask */ 618 0xffffffff, /* dst_mask */ 619 FALSE), /* pcrel_offset */ 620 621 HOWTO (R_MIPS_TLS_DTPREL32, /* type */ 622 0, /* rightshift */ 623 2, /* size (0 = byte, 1 = short, 2 = long) */ 624 32, /* bitsize */ 625 FALSE, /* pc_relative */ 626 0, /* bitpos */ 627 complain_overflow_dont, /* complain_on_overflow */ 628 _bfd_mips_elf_generic_reloc, /* special_function */ 629 "R_MIPS_TLS_DTPREL32", /* name */ 630 TRUE, /* partial_inplace */ 631 0xffffffff, /* src_mask */ 632 0xffffffff, /* dst_mask */ 633 FALSE), /* pcrel_offset */ 634 635 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64), 636 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64), 637 638 /* TLS general dynamic variable reference. */ 639 HOWTO (R_MIPS_TLS_GD, /* type */ 640 0, /* rightshift */ 641 2, /* size (0 = byte, 1 = short, 2 = long) */ 642 16, /* bitsize */ 643 FALSE, /* pc_relative */ 644 0, /* bitpos */ 645 complain_overflow_signed, /* complain_on_overflow */ 646 _bfd_mips_elf_generic_reloc, /* special_function */ 647 "R_MIPS_TLS_GD", /* name */ 648 TRUE, /* partial_inplace */ 649 0x0000ffff, /* src_mask */ 650 0x0000ffff, /* dst_mask */ 651 FALSE), /* pcrel_offset */ 652 653 /* TLS local dynamic variable reference. */ 654 HOWTO (R_MIPS_TLS_LDM, /* type */ 655 0, /* rightshift */ 656 2, /* size (0 = byte, 1 = short, 2 = long) */ 657 16, /* bitsize */ 658 FALSE, /* pc_relative */ 659 0, /* bitpos */ 660 complain_overflow_signed, /* complain_on_overflow */ 661 _bfd_mips_elf_generic_reloc, /* special_function */ 662 "R_MIPS_TLS_LDM", /* name */ 663 TRUE, /* partial_inplace */ 664 0x0000ffff, /* src_mask */ 665 0x0000ffff, /* dst_mask */ 666 FALSE), /* pcrel_offset */ 667 668 /* TLS local dynamic offset. */ 669 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */ 670 0, /* rightshift */ 671 2, /* size (0 = byte, 1 = short, 2 = long) */ 672 16, /* bitsize */ 673 FALSE, /* pc_relative */ 674 0, /* bitpos */ 675 complain_overflow_signed, /* complain_on_overflow */ 676 _bfd_mips_elf_generic_reloc, /* special_function */ 677 "R_MIPS_TLS_DTPREL_HI16", /* name */ 678 TRUE, /* partial_inplace */ 679 0x0000ffff, /* src_mask */ 680 0x0000ffff, /* dst_mask */ 681 FALSE), /* pcrel_offset */ 682 683 /* TLS local dynamic offset. */ 684 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */ 685 0, /* rightshift */ 686 2, /* size (0 = byte, 1 = short, 2 = long) */ 687 16, /* bitsize */ 688 FALSE, /* pc_relative */ 689 0, /* bitpos */ 690 complain_overflow_signed, /* complain_on_overflow */ 691 _bfd_mips_elf_generic_reloc, /* special_function */ 692 "R_MIPS_TLS_DTPREL_LO16", /* name */ 693 TRUE, /* partial_inplace */ 694 0x0000ffff, /* src_mask */ 695 0x0000ffff, /* dst_mask */ 696 FALSE), /* pcrel_offset */ 697 698 /* TLS thread pointer offset. */ 699 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */ 700 0, /* rightshift */ 701 2, /* size (0 = byte, 1 = short, 2 = long) */ 702 16, /* bitsize */ 703 FALSE, /* pc_relative */ 704 0, /* bitpos */ 705 complain_overflow_signed, /* complain_on_overflow */ 706 _bfd_mips_elf_generic_reloc, /* special_function */ 707 "R_MIPS_TLS_GOTTPREL", /* name */ 708 TRUE, /* partial_inplace */ 709 0x0000ffff, /* src_mask */ 710 0x0000ffff, /* dst_mask */ 711 FALSE), /* pcrel_offset */ 712 713 /* TLS IE dynamic relocations. */ 714 HOWTO (R_MIPS_TLS_TPREL32, /* type */ 715 0, /* rightshift */ 716 2, /* size (0 = byte, 1 = short, 2 = long) */ 717 32, /* bitsize */ 718 FALSE, /* pc_relative */ 719 0, /* bitpos */ 720 complain_overflow_dont, /* complain_on_overflow */ 721 _bfd_mips_elf_generic_reloc, /* special_function */ 722 "R_MIPS_TLS_TPREL32", /* name */ 723 TRUE, /* partial_inplace */ 724 0xffffffff, /* src_mask */ 725 0xffffffff, /* dst_mask */ 726 FALSE), /* pcrel_offset */ 727 728 EMPTY_HOWTO (R_MIPS_TLS_TPREL64), 729 730 /* TLS thread pointer offset. */ 731 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */ 732 0, /* rightshift */ 733 2, /* size (0 = byte, 1 = short, 2 = long) */ 734 16, /* bitsize */ 735 FALSE, /* pc_relative */ 736 0, /* bitpos */ 737 complain_overflow_signed, /* complain_on_overflow */ 738 _bfd_mips_elf_generic_reloc, /* special_function */ 739 "R_MIPS_TLS_TPREL_HI16", /* name */ 740 TRUE, /* partial_inplace */ 741 0x0000ffff, /* src_mask */ 742 0x0000ffff, /* dst_mask */ 743 FALSE), /* pcrel_offset */ 744 745 /* TLS thread pointer offset. */ 746 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */ 747 0, /* rightshift */ 748 2, /* size (0 = byte, 1 = short, 2 = long) */ 749 16, /* bitsize */ 750 FALSE, /* pc_relative */ 751 0, /* bitpos */ 752 complain_overflow_signed, /* complain_on_overflow */ 753 _bfd_mips_elf_generic_reloc, /* special_function */ 754 "R_MIPS_TLS_TPREL_LO16", /* name */ 755 TRUE, /* partial_inplace */ 756 0x0000ffff, /* src_mask */ 757 0x0000ffff, /* dst_mask */ 758 FALSE), /* pcrel_offset */ 759 760 /* 32 bit relocation with no addend. */ 761 HOWTO (R_MIPS_GLOB_DAT, /* type */ 762 0, /* rightshift */ 763 2, /* size (0 = byte, 1 = short, 2 = long) */ 764 32, /* bitsize */ 765 FALSE, /* pc_relative */ 766 0, /* bitpos */ 767 complain_overflow_dont, /* complain_on_overflow */ 768 _bfd_mips_elf_generic_reloc, /* special_function */ 769 "R_MIPS_GLOB_DAT", /* name */ 770 FALSE, /* partial_inplace */ 771 0x0, /* src_mask */ 772 0xffffffff, /* dst_mask */ 773 FALSE), /* pcrel_offset */ 774}; 775 776/* The relocation table used for SHT_RELA sections. */ 777 778static reloc_howto_type elf_mips_howto_table_rela[] = 779{ 780 /* No relocation. */ 781 HOWTO (R_MIPS_NONE, /* type */ 782 0, /* rightshift */ 783 0, /* size (0 = byte, 1 = short, 2 = long) */ 784 0, /* bitsize */ 785 FALSE, /* pc_relative */ 786 0, /* bitpos */ 787 complain_overflow_dont, /* complain_on_overflow */ 788 _bfd_mips_elf_generic_reloc, /* special_function */ 789 "R_MIPS_NONE", /* name */ 790 FALSE, /* partial_inplace */ 791 0, /* src_mask */ 792 0, /* dst_mask */ 793 FALSE), /* pcrel_offset */ 794 795 /* 16 bit relocation. */ 796 HOWTO (R_MIPS_16, /* type */ 797 0, /* rightshift */ 798 2, /* size (0 = byte, 1 = short, 2 = long) */ 799 16, /* bitsize */ 800 FALSE, /* pc_relative */ 801 0, /* bitpos */ 802 complain_overflow_signed, /* complain_on_overflow */ 803 _bfd_mips_elf_generic_reloc, /* special_function */ 804 "R_MIPS_16", /* name */ 805 FALSE, /* partial_inplace */ 806 0, /* src_mask */ 807 0x0000, /* dst_mask */ 808 FALSE), /* pcrel_offset */ 809 810 /* 32 bit relocation. */ 811 HOWTO (R_MIPS_32, /* type */ 812 0, /* rightshift */ 813 2, /* size (0 = byte, 1 = short, 2 = long) */ 814 32, /* bitsize */ 815 FALSE, /* pc_relative */ 816 0, /* bitpos */ 817 complain_overflow_dont, /* complain_on_overflow */ 818 _bfd_mips_elf_generic_reloc, /* special_function */ 819 "R_MIPS_32", /* name */ 820 FALSE, /* partial_inplace */ 821 0, /* src_mask */ 822 0xffffffff, /* dst_mask */ 823 FALSE), /* pcrel_offset */ 824 825 /* 32 bit symbol relative relocation. */ 826 HOWTO (R_MIPS_REL32, /* type */ 827 0, /* rightshift */ 828 2, /* size (0 = byte, 1 = short, 2 = long) */ 829 32, /* bitsize */ 830 FALSE, /* pc_relative */ 831 0, /* bitpos */ 832 complain_overflow_dont, /* complain_on_overflow */ 833 _bfd_mips_elf_generic_reloc, /* special_function */ 834 "R_MIPS_REL32", /* name */ 835 FALSE, /* partial_inplace */ 836 0, /* src_mask */ 837 0xffffffff, /* dst_mask */ 838 FALSE), /* pcrel_offset */ 839 840 /* 26 bit jump address. */ 841 HOWTO (R_MIPS_26, /* type */ 842 2, /* rightshift */ 843 2, /* size (0 = byte, 1 = short, 2 = long) */ 844 26, /* bitsize */ 845 FALSE, /* pc_relative */ 846 0, /* bitpos */ 847 complain_overflow_dont, /* complain_on_overflow */ 848 /* This needs complex overflow 849 detection, because the upper 36 850 bits must match the PC + 4. */ 851 _bfd_mips_elf_generic_reloc, /* special_function */ 852 "R_MIPS_26", /* name */ 853 FALSE, /* partial_inplace */ 854 0, /* src_mask */ 855 0x03ffffff, /* dst_mask */ 856 FALSE), /* pcrel_offset */ 857 858 /* High 16 bits of symbol value. */ 859 HOWTO (R_MIPS_HI16, /* type */ 860 0, /* rightshift */ 861 2, /* size (0 = byte, 1 = short, 2 = long) */ 862 16, /* bitsize */ 863 FALSE, /* pc_relative */ 864 0, /* bitpos */ 865 complain_overflow_dont, /* complain_on_overflow */ 866 _bfd_mips_elf_generic_reloc, /* special_function */ 867 "R_MIPS_HI16", /* name */ 868 FALSE, /* partial_inplace */ 869 0, /* src_mask */ 870 0x0000ffff, /* dst_mask */ 871 FALSE), /* pcrel_offset */ 872 873 /* Low 16 bits of symbol value. */ 874 HOWTO (R_MIPS_LO16, /* type */ 875 0, /* rightshift */ 876 2, /* size (0 = byte, 1 = short, 2 = long) */ 877 16, /* bitsize */ 878 FALSE, /* pc_relative */ 879 0, /* bitpos */ 880 complain_overflow_dont, /* complain_on_overflow */ 881 _bfd_mips_elf_generic_reloc, /* special_function */ 882 "R_MIPS_LO16", /* name */ 883 FALSE, /* partial_inplace */ 884 0, /* src_mask */ 885 0x0000ffff, /* dst_mask */ 886 FALSE), /* pcrel_offset */ 887 888 /* GP relative reference. */ 889 HOWTO (R_MIPS_GPREL16, /* type */ 890 0, /* rightshift */ 891 2, /* size (0 = byte, 1 = short, 2 = long) */ 892 16, /* bitsize */ 893 FALSE, /* pc_relative */ 894 0, /* bitpos */ 895 complain_overflow_signed, /* complain_on_overflow */ 896 mips_elf_gprel16_reloc, /* special_function */ 897 "R_MIPS_GPREL16", /* name */ 898 FALSE, /* partial_inplace */ 899 0, /* src_mask */ 900 0x0000ffff, /* dst_mask */ 901 FALSE), /* pcrel_offset */ 902 903 /* Reference to literal section. */ 904 HOWTO (R_MIPS_LITERAL, /* type */ 905 0, /* rightshift */ 906 2, /* size (0 = byte, 1 = short, 2 = long) */ 907 16, /* bitsize */ 908 FALSE, /* pc_relative */ 909 0, /* bitpos */ 910 complain_overflow_signed, /* complain_on_overflow */ 911 mips_elf_literal_reloc, /* special_function */ 912 "R_MIPS_LITERAL", /* name */ 913 FALSE, /* partial_inplace */ 914 0, /* src_mask */ 915 0x0000ffff, /* dst_mask */ 916 FALSE), /* pcrel_offset */ 917 918 /* Reference to global offset table. */ 919 HOWTO (R_MIPS_GOT16, /* type */ 920 0, /* rightshift */ 921 2, /* size (0 = byte, 1 = short, 2 = long) */ 922 16, /* bitsize */ 923 FALSE, /* pc_relative */ 924 0, /* bitpos */ 925 complain_overflow_signed, /* complain_on_overflow */ 926 _bfd_mips_elf_generic_reloc, /* special_function */ 927 "R_MIPS_GOT16", /* name */ 928 FALSE, /* partial_inplace */ 929 0, /* src_mask */ 930 0x0000ffff, /* dst_mask */ 931 FALSE), /* pcrel_offset */ 932 933 /* 16 bit PC relative reference. Note that the ABI document has a typo 934 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless. 935 We do the right thing here. */ 936 HOWTO (R_MIPS_PC16, /* type */ 937 2, /* rightshift */ 938 2, /* size (0 = byte, 1 = short, 2 = long) */ 939 16, /* bitsize */ 940 TRUE, /* pc_relative */ 941 0, /* bitpos */ 942 complain_overflow_signed, /* complain_on_overflow */ 943 _bfd_mips_elf_generic_reloc, /* special_function */ 944 "R_MIPS_PC16", /* name */ 945 FALSE, /* partial_inplace */ 946 0, /* src_mask */ 947 0x0000ffff, /* dst_mask */ 948 TRUE), /* pcrel_offset */ 949 950 /* 16 bit call through global offset table. */ 951 HOWTO (R_MIPS_CALL16, /* type */ 952 0, /* rightshift */ 953 2, /* size (0 = byte, 1 = short, 2 = long) */ 954 16, /* bitsize */ 955 FALSE, /* pc_relative */ 956 0, /* bitpos */ 957 complain_overflow_signed, /* complain_on_overflow */ 958 _bfd_mips_elf_generic_reloc, /* special_function */ 959 "R_MIPS_CALL16", /* name */ 960 FALSE, /* partial_inplace */ 961 0, /* src_mask */ 962 0x0000ffff, /* dst_mask */ 963 FALSE), /* pcrel_offset */ 964 965 /* 32 bit GP relative reference. */ 966 HOWTO (R_MIPS_GPREL32, /* type */ 967 0, /* rightshift */ 968 2, /* size (0 = byte, 1 = short, 2 = long) */ 969 32, /* bitsize */ 970 FALSE, /* pc_relative */ 971 0, /* bitpos */ 972 complain_overflow_dont, /* complain_on_overflow */ 973 mips_elf_gprel32_reloc, /* special_function */ 974 "R_MIPS_GPREL32", /* name */ 975 FALSE, /* partial_inplace */ 976 0, /* src_mask */ 977 0xffffffff, /* dst_mask */ 978 FALSE), /* pcrel_offset */ 979 980 EMPTY_HOWTO (13), 981 EMPTY_HOWTO (14), 982 EMPTY_HOWTO (15), 983 984 /* A 5 bit shift field. */ 985 HOWTO (R_MIPS_SHIFT5, /* type */ 986 0, /* rightshift */ 987 2, /* size (0 = byte, 1 = short, 2 = long) */ 988 5, /* bitsize */ 989 FALSE, /* pc_relative */ 990 6, /* bitpos */ 991 complain_overflow_bitfield, /* complain_on_overflow */ 992 _bfd_mips_elf_generic_reloc, /* special_function */ 993 "R_MIPS_SHIFT5", /* name */ 994 FALSE, /* partial_inplace */ 995 0, /* src_mask */ 996 0x000007c0, /* dst_mask */ 997 FALSE), /* pcrel_offset */ 998 999 /* A 6 bit shift field. */ 1000 HOWTO (R_MIPS_SHIFT6, /* type */ 1001 0, /* rightshift */ 1002 2, /* size (0 = byte, 1 = short, 2 = long) */ 1003 6, /* bitsize */ 1004 FALSE, /* pc_relative */ 1005 6, /* bitpos */ 1006 complain_overflow_bitfield, /* complain_on_overflow */ 1007 mips_elf_shift6_reloc, /* special_function */ 1008 "R_MIPS_SHIFT6", /* name */ 1009 FALSE, /* partial_inplace */ 1010 0, /* src_mask */ 1011 0x000007c4, /* dst_mask */ 1012 FALSE), /* pcrel_offset */ 1013 1014 /* 64 bit relocation. */ 1015 HOWTO (R_MIPS_64, /* type */ 1016 0, /* rightshift */ 1017 4, /* size (0 = byte, 1 = short, 2 = long) */ 1018 64, /* bitsize */ 1019 FALSE, /* pc_relative */ 1020 0, /* bitpos */ 1021 complain_overflow_dont, /* complain_on_overflow */ 1022 _bfd_mips_elf_generic_reloc, /* special_function */ 1023 "R_MIPS_64", /* name */ 1024 FALSE, /* partial_inplace */ 1025 0, /* src_mask */ 1026 MINUS_ONE, /* dst_mask */ 1027 FALSE), /* pcrel_offset */ 1028 1029 /* Displacement in the global offset table. */ 1030 HOWTO (R_MIPS_GOT_DISP, /* type */ 1031 0, /* rightshift */ 1032 2, /* size (0 = byte, 1 = short, 2 = long) */ 1033 16, /* bitsize */ 1034 FALSE, /* pc_relative */ 1035 0, /* bitpos */ 1036 complain_overflow_signed, /* complain_on_overflow */ 1037 _bfd_mips_elf_generic_reloc, /* special_function */ 1038 "R_MIPS_GOT_DISP", /* name */ 1039 FALSE, /* partial_inplace */ 1040 0, /* src_mask */ 1041 0x0000ffff, /* dst_mask */ 1042 FALSE), /* pcrel_offset */ 1043 1044 /* Displacement to page pointer in the global offset table. */ 1045 HOWTO (R_MIPS_GOT_PAGE, /* type */ 1046 0, /* rightshift */ 1047 2, /* size (0 = byte, 1 = short, 2 = long) */ 1048 16, /* bitsize */ 1049 FALSE, /* pc_relative */ 1050 0, /* bitpos */ 1051 complain_overflow_signed, /* complain_on_overflow */ 1052 _bfd_mips_elf_generic_reloc, /* special_function */ 1053 "R_MIPS_GOT_PAGE", /* name */ 1054 FALSE, /* partial_inplace */ 1055 0, /* src_mask */ 1056 0x0000ffff, /* dst_mask */ 1057 FALSE), /* pcrel_offset */ 1058 1059 /* Offset from page pointer in the global offset table. */ 1060 HOWTO (R_MIPS_GOT_OFST, /* type */ 1061 0, /* rightshift */ 1062 2, /* size (0 = byte, 1 = short, 2 = long) */ 1063 16, /* bitsize */ 1064 FALSE, /* pc_relative */ 1065 0, /* bitpos */ 1066 complain_overflow_signed, /* complain_on_overflow */ 1067 _bfd_mips_elf_generic_reloc, /* special_function */ 1068 "R_MIPS_GOT_OFST", /* name */ 1069 FALSE, /* partial_inplace */ 1070 0, /* src_mask */ 1071 0x0000ffff, /* dst_mask */ 1072 FALSE), /* pcrel_offset */ 1073 1074 /* High 16 bits of displacement in global offset table. */ 1075 HOWTO (R_MIPS_GOT_HI16, /* type */ 1076 0, /* rightshift */ 1077 2, /* size (0 = byte, 1 = short, 2 = long) */ 1078 16, /* bitsize */ 1079 FALSE, /* pc_relative */ 1080 0, /* bitpos */ 1081 complain_overflow_dont, /* complain_on_overflow */ 1082 _bfd_mips_elf_generic_reloc, /* special_function */ 1083 "R_MIPS_GOT_HI16", /* name */ 1084 FALSE, /* partial_inplace */ 1085 0, /* src_mask */ 1086 0x0000ffff, /* dst_mask */ 1087 FALSE), /* pcrel_offset */ 1088 1089 /* Low 16 bits of displacement in global offset table. */ 1090 HOWTO (R_MIPS_GOT_LO16, /* type */ 1091 0, /* rightshift */ 1092 2, /* size (0 = byte, 1 = short, 2 = long) */ 1093 16, /* bitsize */ 1094 FALSE, /* pc_relative */ 1095 0, /* bitpos */ 1096 complain_overflow_dont, /* complain_on_overflow */ 1097 _bfd_mips_elf_generic_reloc, /* special_function */ 1098 "R_MIPS_GOT_LO16", /* name */ 1099 FALSE, /* partial_inplace */ 1100 0, /* src_mask */ 1101 0x0000ffff, /* dst_mask */ 1102 FALSE), /* pcrel_offset */ 1103 1104 /* 64 bit subtraction. */ 1105 HOWTO (R_MIPS_SUB, /* type */ 1106 0, /* rightshift */ 1107 4, /* size (0 = byte, 1 = short, 2 = long) */ 1108 64, /* bitsize */ 1109 FALSE, /* pc_relative */ 1110 0, /* bitpos */ 1111 complain_overflow_dont, /* complain_on_overflow */ 1112 _bfd_mips_elf_generic_reloc, /* special_function */ 1113 "R_MIPS_SUB", /* name */ 1114 FALSE, /* partial_inplace */ 1115 0, /* src_mask */ 1116 MINUS_ONE, /* dst_mask */ 1117 FALSE), /* pcrel_offset */ 1118 1119 /* Insert the addend as an instruction. */ 1120 /* FIXME: Not handled correctly. */ 1121 HOWTO (R_MIPS_INSERT_A, /* type */ 1122 0, /* rightshift */ 1123 2, /* size (0 = byte, 1 = short, 2 = long) */ 1124 32, /* bitsize */ 1125 FALSE, /* pc_relative */ 1126 0, /* bitpos */ 1127 complain_overflow_dont, /* complain_on_overflow */ 1128 _bfd_mips_elf_generic_reloc, /* special_function */ 1129 "R_MIPS_INSERT_A", /* name */ 1130 FALSE, /* partial_inplace */ 1131 0, /* src_mask */ 1132 0xffffffff, /* dst_mask */ 1133 FALSE), /* pcrel_offset */ 1134 1135 /* Insert the addend as an instruction, and change all relocations 1136 to refer to the old instruction at the address. */ 1137 /* FIXME: Not handled correctly. */ 1138 HOWTO (R_MIPS_INSERT_B, /* type */ 1139 0, /* rightshift */ 1140 2, /* size (0 = byte, 1 = short, 2 = long) */ 1141 32, /* bitsize */ 1142 FALSE, /* pc_relative */ 1143 0, /* bitpos */ 1144 complain_overflow_dont, /* complain_on_overflow */ 1145 _bfd_mips_elf_generic_reloc, /* special_function */ 1146 "R_MIPS_INSERT_B", /* name */ 1147 FALSE, /* partial_inplace */ 1148 0, /* src_mask */ 1149 0xffffffff, /* dst_mask */ 1150 FALSE), /* pcrel_offset */ 1151 1152 /* Delete a 32 bit instruction. */ 1153 /* FIXME: Not handled correctly. */ 1154 HOWTO (R_MIPS_DELETE, /* type */ 1155 0, /* rightshift */ 1156 2, /* size (0 = byte, 1 = short, 2 = long) */ 1157 32, /* bitsize */ 1158 FALSE, /* pc_relative */ 1159 0, /* bitpos */ 1160 complain_overflow_dont, /* complain_on_overflow */ 1161 _bfd_mips_elf_generic_reloc, /* special_function */ 1162 "R_MIPS_DELETE", /* name */ 1163 FALSE, /* partial_inplace */ 1164 0, /* src_mask */ 1165 0xffffffff, /* dst_mask */ 1166 FALSE), /* pcrel_offset */ 1167 1168 /* Get the higher value of a 64 bit addend. */ 1169 HOWTO (R_MIPS_HIGHER, /* type */ 1170 0, /* rightshift */ 1171 2, /* size (0 = byte, 1 = short, 2 = long) */ 1172 16, /* bitsize */ 1173 FALSE, /* pc_relative */ 1174 0, /* bitpos */ 1175 complain_overflow_dont, /* complain_on_overflow */ 1176 _bfd_mips_elf_generic_reloc, /* special_function */ 1177 "R_MIPS_HIGHER", /* name */ 1178 FALSE, /* partial_inplace */ 1179 0, /* src_mask */ 1180 0x0000ffff, /* dst_mask */ 1181 FALSE), /* pcrel_offset */ 1182 1183 /* Get the highest value of a 64 bit addend. */ 1184 HOWTO (R_MIPS_HIGHEST, /* type */ 1185 0, /* rightshift */ 1186 2, /* size (0 = byte, 1 = short, 2 = long) */ 1187 16, /* bitsize */ 1188 FALSE, /* pc_relative */ 1189 0, /* bitpos */ 1190 complain_overflow_dont, /* complain_on_overflow */ 1191 _bfd_mips_elf_generic_reloc, /* special_function */ 1192 "R_MIPS_HIGHEST", /* name */ 1193 FALSE, /* partial_inplace */ 1194 0, /* src_mask */ 1195 0x0000ffff, /* dst_mask */ 1196 FALSE), /* pcrel_offset */ 1197 1198 /* High 16 bits of displacement in global offset table. */ 1199 HOWTO (R_MIPS_CALL_HI16, /* type */ 1200 0, /* rightshift */ 1201 2, /* size (0 = byte, 1 = short, 2 = long) */ 1202 16, /* bitsize */ 1203 FALSE, /* pc_relative */ 1204 0, /* bitpos */ 1205 complain_overflow_dont, /* complain_on_overflow */ 1206 _bfd_mips_elf_generic_reloc, /* special_function */ 1207 "R_MIPS_CALL_HI16", /* name */ 1208 FALSE, /* partial_inplace */ 1209 0, /* src_mask */ 1210 0x0000ffff, /* dst_mask */ 1211 FALSE), /* pcrel_offset */ 1212 1213 /* Low 16 bits of displacement in global offset table. */ 1214 HOWTO (R_MIPS_CALL_LO16, /* type */ 1215 0, /* rightshift */ 1216 2, /* size (0 = byte, 1 = short, 2 = long) */ 1217 16, /* bitsize */ 1218 FALSE, /* pc_relative */ 1219 0, /* bitpos */ 1220 complain_overflow_dont, /* complain_on_overflow */ 1221 _bfd_mips_elf_generic_reloc, /* special_function */ 1222 "R_MIPS_CALL_LO16", /* name */ 1223 FALSE, /* partial_inplace */ 1224 0, /* src_mask */ 1225 0x0000ffff, /* dst_mask */ 1226 FALSE), /* pcrel_offset */ 1227 1228 /* Section displacement, used by an associated event location section. */ 1229 HOWTO (R_MIPS_SCN_DISP, /* type */ 1230 0, /* rightshift */ 1231 2, /* size (0 = byte, 1 = short, 2 = long) */ 1232 32, /* bitsize */ 1233 FALSE, /* pc_relative */ 1234 0, /* bitpos */ 1235 complain_overflow_dont, /* complain_on_overflow */ 1236 _bfd_mips_elf_generic_reloc, /* special_function */ 1237 "R_MIPS_SCN_DISP", /* name */ 1238 FALSE, /* partial_inplace */ 1239 0, /* src_mask */ 1240 0xffffffff, /* dst_mask */ 1241 FALSE), /* pcrel_offset */ 1242 1243 /* 16 bit relocation. */ 1244 HOWTO (R_MIPS_REL16, /* type */ 1245 0, /* rightshift */ 1246 1, /* size (0 = byte, 1 = short, 2 = long) */ 1247 16, /* bitsize */ 1248 FALSE, /* pc_relative */ 1249 0, /* bitpos */ 1250 complain_overflow_signed, /* complain_on_overflow */ 1251 _bfd_mips_elf_generic_reloc, /* special_function */ 1252 "R_MIPS_REL16", /* name */ 1253 FALSE, /* partial_inplace */ 1254 0, /* src_mask */ 1255 0xffff, /* dst_mask */ 1256 FALSE), /* pcrel_offset */ 1257 1258 /* These two are obsolete. */ 1259 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE), 1260 EMPTY_HOWTO (R_MIPS_PJUMP), 1261 1262 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section. 1263 It must be used for multigot GOT's (and only there). */ 1264 HOWTO (R_MIPS_RELGOT, /* type */ 1265 0, /* rightshift */ 1266 2, /* size (0 = byte, 1 = short, 2 = long) */ 1267 32, /* bitsize */ 1268 FALSE, /* pc_relative */ 1269 0, /* bitpos */ 1270 complain_overflow_dont, /* complain_on_overflow */ 1271 _bfd_mips_elf_generic_reloc, /* special_function */ 1272 "R_MIPS_RELGOT", /* name */ 1273 FALSE, /* partial_inplace */ 1274 0, /* src_mask */ 1275 0xffffffff, /* dst_mask */ 1276 FALSE), /* pcrel_offset */ 1277 1278 /* Protected jump conversion. This is an optimization hint. No 1279 relocation is required for correctness. */ 1280 HOWTO (R_MIPS_JALR, /* type */ 1281 0, /* rightshift */ 1282 2, /* size (0 = byte, 1 = short, 2 = long) */ 1283 32, /* bitsize */ 1284 FALSE, /* pc_relative */ 1285 0, /* bitpos */ 1286 complain_overflow_dont, /* complain_on_overflow */ 1287 _bfd_mips_elf_generic_reloc, /* special_function */ 1288 "R_MIPS_JALR", /* name */ 1289 FALSE, /* partial_inplace */ 1290 0, /* src_mask */ 1291 0, /* dst_mask */ 1292 FALSE), /* pcrel_offset */ 1293 1294 /* TLS GD/LD dynamic relocations. */ 1295 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */ 1296 0, /* rightshift */ 1297 2, /* size (0 = byte, 1 = short, 2 = long) */ 1298 32, /* bitsize */ 1299 FALSE, /* pc_relative */ 1300 0, /* bitpos */ 1301 complain_overflow_dont, /* complain_on_overflow */ 1302 _bfd_mips_elf_generic_reloc, /* special_function */ 1303 "R_MIPS_TLS_DTPMOD32", /* name */ 1304 TRUE, /* partial_inplace */ 1305 0xffffffff, /* src_mask */ 1306 0xffffffff, /* dst_mask */ 1307 FALSE), /* pcrel_offset */ 1308 1309 HOWTO (R_MIPS_TLS_DTPREL32, /* type */ 1310 0, /* rightshift */ 1311 2, /* size (0 = byte, 1 = short, 2 = long) */ 1312 32, /* bitsize */ 1313 FALSE, /* pc_relative */ 1314 0, /* bitpos */ 1315 complain_overflow_dont, /* complain_on_overflow */ 1316 _bfd_mips_elf_generic_reloc, /* special_function */ 1317 "R_MIPS_TLS_DTPREL32", /* name */ 1318 TRUE, /* partial_inplace */ 1319 0xffffffff, /* src_mask */ 1320 0xffffffff, /* dst_mask */ 1321 FALSE), /* pcrel_offset */ 1322 1323 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64), 1324 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64), 1325 1326 /* TLS general dynamic variable reference. */ 1327 HOWTO (R_MIPS_TLS_GD, /* type */ 1328 0, /* rightshift */ 1329 2, /* size (0 = byte, 1 = short, 2 = long) */ 1330 16, /* bitsize */ 1331 FALSE, /* pc_relative */ 1332 0, /* bitpos */ 1333 complain_overflow_signed, /* complain_on_overflow */ 1334 _bfd_mips_elf_generic_reloc, /* special_function */ 1335 "R_MIPS_TLS_GD", /* name */ 1336 TRUE, /* partial_inplace */ 1337 0x0000ffff, /* src_mask */ 1338 0x0000ffff, /* dst_mask */ 1339 FALSE), /* pcrel_offset */ 1340 1341 /* TLS local dynamic variable reference. */ 1342 HOWTO (R_MIPS_TLS_LDM, /* type */ 1343 0, /* rightshift */ 1344 2, /* size (0 = byte, 1 = short, 2 = long) */ 1345 16, /* bitsize */ 1346 FALSE, /* pc_relative */ 1347 0, /* bitpos */ 1348 complain_overflow_signed, /* complain_on_overflow */ 1349 _bfd_mips_elf_generic_reloc, /* special_function */ 1350 "R_MIPS_TLS_LDM", /* name */ 1351 TRUE, /* partial_inplace */ 1352 0x0000ffff, /* src_mask */ 1353 0x0000ffff, /* dst_mask */ 1354 FALSE), /* pcrel_offset */ 1355 1356 /* TLS local dynamic offset. */ 1357 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */ 1358 0, /* rightshift */ 1359 2, /* size (0 = byte, 1 = short, 2 = long) */ 1360 16, /* bitsize */ 1361 FALSE, /* pc_relative */ 1362 0, /* bitpos */ 1363 complain_overflow_signed, /* complain_on_overflow */ 1364 _bfd_mips_elf_generic_reloc, /* special_function */ 1365 "R_MIPS_TLS_DTPREL_HI16", /* name */ 1366 TRUE, /* partial_inplace */ 1367 0x0000ffff, /* src_mask */ 1368 0x0000ffff, /* dst_mask */ 1369 FALSE), /* pcrel_offset */ 1370 1371 /* TLS local dynamic offset. */ 1372 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */ 1373 0, /* rightshift */ 1374 2, /* size (0 = byte, 1 = short, 2 = long) */ 1375 16, /* bitsize */ 1376 FALSE, /* pc_relative */ 1377 0, /* bitpos */ 1378 complain_overflow_signed, /* complain_on_overflow */ 1379 _bfd_mips_elf_generic_reloc, /* special_function */ 1380 "R_MIPS_TLS_DTPREL_LO16", /* name */ 1381 TRUE, /* partial_inplace */ 1382 0x0000ffff, /* src_mask */ 1383 0x0000ffff, /* dst_mask */ 1384 FALSE), /* pcrel_offset */ 1385 1386 /* TLS thread pointer offset. */ 1387 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */ 1388 0, /* rightshift */ 1389 2, /* size (0 = byte, 1 = short, 2 = long) */ 1390 16, /* bitsize */ 1391 FALSE, /* pc_relative */ 1392 0, /* bitpos */ 1393 complain_overflow_signed, /* complain_on_overflow */ 1394 _bfd_mips_elf_generic_reloc, /* special_function */ 1395 "R_MIPS_TLS_GOTTPREL", /* name */ 1396 TRUE, /* partial_inplace */ 1397 0x0000ffff, /* src_mask */ 1398 0x0000ffff, /* dst_mask */ 1399 FALSE), /* pcrel_offset */ 1400 1401 /* TLS IE dynamic relocations. */ 1402 HOWTO (R_MIPS_TLS_TPREL32, /* type */ 1403 0, /* rightshift */ 1404 2, /* size (0 = byte, 1 = short, 2 = long) */ 1405 32, /* bitsize */ 1406 FALSE, /* pc_relative */ 1407 0, /* bitpos */ 1408 complain_overflow_dont, /* complain_on_overflow */ 1409 _bfd_mips_elf_generic_reloc, /* special_function */ 1410 "R_MIPS_TLS_TPREL32", /* name */ 1411 TRUE, /* partial_inplace */ 1412 0xffffffff, /* src_mask */ 1413 0xffffffff, /* dst_mask */ 1414 FALSE), /* pcrel_offset */ 1415 1416 EMPTY_HOWTO (R_MIPS_TLS_TPREL64), 1417 1418 /* TLS thread pointer offset. */ 1419 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */ 1420 0, /* rightshift */ 1421 2, /* size (0 = byte, 1 = short, 2 = long) */ 1422 16, /* bitsize */ 1423 FALSE, /* pc_relative */ 1424 0, /* bitpos */ 1425 complain_overflow_signed, /* complain_on_overflow */ 1426 _bfd_mips_elf_generic_reloc, /* special_function */ 1427 "R_MIPS_TLS_TPREL_HI16", /* name */ 1428 TRUE, /* partial_inplace */ 1429 0x0000ffff, /* src_mask */ 1430 0x0000ffff, /* dst_mask */ 1431 FALSE), /* pcrel_offset */ 1432 1433 /* TLS thread pointer offset. */ 1434 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */ 1435 0, /* rightshift */ 1436 2, /* size (0 = byte, 1 = short, 2 = long) */ 1437 16, /* bitsize */ 1438 FALSE, /* pc_relative */ 1439 0, /* bitpos */ 1440 complain_overflow_signed, /* complain_on_overflow */ 1441 _bfd_mips_elf_generic_reloc, /* special_function */ 1442 "R_MIPS_TLS_TPREL_LO16", /* name */ 1443 TRUE, /* partial_inplace */ 1444 0x0000ffff, /* src_mask */ 1445 0x0000ffff, /* dst_mask */ 1446 FALSE), /* pcrel_offset */ 1447 1448 /* 32 bit relocation with no addend. */ 1449 HOWTO (R_MIPS_GLOB_DAT, /* type */ 1450 0, /* rightshift */ 1451 2, /* size (0 = byte, 1 = short, 2 = long) */ 1452 32, /* bitsize */ 1453 FALSE, /* pc_relative */ 1454 0, /* bitpos */ 1455 complain_overflow_dont, /* complain_on_overflow */ 1456 _bfd_mips_elf_generic_reloc, /* special_function */ 1457 "R_MIPS_GLOB_DAT", /* name */ 1458 FALSE, /* partial_inplace */ 1459 0x0, /* src_mask */ 1460 0xffffffff, /* dst_mask */ 1461 FALSE), /* pcrel_offset */ 1462}; 1463 1464static reloc_howto_type elf_mips16_howto_table_rel[] = 1465{ 1466 /* The reloc used for the mips16 jump instruction. */ 1467 HOWTO (R_MIPS16_26, /* type */ 1468 2, /* rightshift */ 1469 2, /* size (0 = byte, 1 = short, 2 = long) */ 1470 26, /* bitsize */ 1471 FALSE, /* pc_relative */ 1472 0, /* bitpos */ 1473 complain_overflow_dont, /* complain_on_overflow */ 1474 /* This needs complex overflow 1475 detection, because the upper four 1476 bits must match the PC. */ 1477 _bfd_mips_elf_generic_reloc, /* special_function */ 1478 "R_MIPS16_26", /* name */ 1479 TRUE, /* partial_inplace */ 1480 0x3ffffff, /* src_mask */ 1481 0x3ffffff, /* dst_mask */ 1482 FALSE), /* pcrel_offset */ 1483 1484 /* The reloc used for the mips16 gprel instruction. */ 1485 HOWTO (R_MIPS16_GPREL, /* type */ 1486 0, /* rightshift */ 1487 2, /* size (0 = byte, 1 = short, 2 = long) */ 1488 16, /* bitsize */ 1489 FALSE, /* pc_relative */ 1490 0, /* bitpos */ 1491 complain_overflow_signed, /* complain_on_overflow */ 1492 mips16_gprel_reloc, /* special_function */ 1493 "R_MIPS16_GPREL", /* name */ 1494 TRUE, /* partial_inplace */ 1495 0x0000ffff, /* src_mask */ 1496 0x0000ffff, /* dst_mask */ 1497 FALSE), /* pcrel_offset */ 1498 1499 /* A placeholder for MIPS16 reference to global offset table. */ 1500 EMPTY_HOWTO (R_MIPS16_GOT16), 1501 1502 /* A placeholder for MIPS16 16 bit call through global offset table. */ 1503 EMPTY_HOWTO (R_MIPS16_CALL16), 1504 1505 /* MIPS16 high 16 bits of symbol value. */ 1506 HOWTO (R_MIPS16_HI16, /* type */ 1507 16, /* rightshift */ 1508 2, /* size (0 = byte, 1 = short, 2 = long) */ 1509 16, /* bitsize */ 1510 FALSE, /* pc_relative */ 1511 0, /* bitpos */ 1512 complain_overflow_dont, /* complain_on_overflow */ 1513 _bfd_mips_elf_hi16_reloc, /* special_function */ 1514 "R_MIPS16_HI16", /* name */ 1515 TRUE, /* partial_inplace */ 1516 0x0000ffff, /* src_mask */ 1517 0x0000ffff, /* dst_mask */ 1518 FALSE), /* pcrel_offset */ 1519 1520 /* MIPS16 low 16 bits of symbol value. */ 1521 HOWTO (R_MIPS16_LO16, /* type */ 1522 0, /* rightshift */ 1523 2, /* size (0 = byte, 1 = short, 2 = long) */ 1524 16, /* bitsize */ 1525 FALSE, /* pc_relative */ 1526 0, /* bitpos */ 1527 complain_overflow_dont, /* complain_on_overflow */ 1528 _bfd_mips_elf_lo16_reloc, /* special_function */ 1529 "R_MIPS16_LO16", /* name */ 1530 TRUE, /* partial_inplace */ 1531 0x0000ffff, /* src_mask */ 1532 0x0000ffff, /* dst_mask */ 1533 FALSE), /* pcrel_offset */ 1534}; 1535 1536static reloc_howto_type elf_mips16_howto_table_rela[] = 1537{ 1538 /* The reloc used for the mips16 jump instruction. */ 1539 HOWTO (R_MIPS16_26, /* type */ 1540 2, /* rightshift */ 1541 2, /* size (0 = byte, 1 = short, 2 = long) */ 1542 26, /* bitsize */ 1543 FALSE, /* pc_relative */ 1544 0, /* bitpos */ 1545 complain_overflow_dont, /* complain_on_overflow */ 1546 /* This needs complex overflow 1547 detection, because the upper four 1548 bits must match the PC. */ 1549 _bfd_mips_elf_generic_reloc, /* special_function */ 1550 "R_MIPS16_26", /* name */ 1551 FALSE, /* partial_inplace */ 1552 0x3ffffff, /* src_mask */ 1553 0x3ffffff, /* dst_mask */ 1554 FALSE), /* pcrel_offset */ 1555 1556 /* The reloc used for the mips16 gprel instruction. */ 1557 HOWTO (R_MIPS16_GPREL, /* type */ 1558 0, /* rightshift */ 1559 2, /* size (0 = byte, 1 = short, 2 = long) */ 1560 16, /* bitsize */ 1561 FALSE, /* pc_relative */ 1562 0, /* bitpos */ 1563 complain_overflow_signed, /* complain_on_overflow */ 1564 mips16_gprel_reloc, /* special_function */ 1565 "R_MIPS16_GPREL", /* name */ 1566 FALSE, /* partial_inplace */ 1567 0x0000ffff, /* src_mask */ 1568 0x0000ffff, /* dst_mask */ 1569 FALSE), /* pcrel_offset */ 1570 1571 /* A placeholder for MIPS16 reference to global offset table. */ 1572 EMPTY_HOWTO (R_MIPS16_GOT16), 1573 1574 /* A placeholder for MIPS16 16 bit call through global offset table. */ 1575 EMPTY_HOWTO (R_MIPS16_CALL16), 1576 1577 /* MIPS16 high 16 bits of symbol value. */ 1578 HOWTO (R_MIPS16_HI16, /* type */ 1579 16, /* rightshift */ 1580 2, /* size (0 = byte, 1 = short, 2 = long) */ 1581 16, /* bitsize */ 1582 FALSE, /* pc_relative */ 1583 0, /* bitpos */ 1584 complain_overflow_dont, /* complain_on_overflow */ 1585 _bfd_mips_elf_hi16_reloc, /* special_function */ 1586 "R_MIPS16_HI16", /* name */ 1587 FALSE, /* partial_inplace */ 1588 0x0000ffff, /* src_mask */ 1589 0x0000ffff, /* dst_mask */ 1590 FALSE), /* pcrel_offset */ 1591 1592 /* MIPS16 low 16 bits of symbol value. */ 1593 HOWTO (R_MIPS16_LO16, /* type */ 1594 0, /* rightshift */ 1595 2, /* size (0 = byte, 1 = short, 2 = long) */ 1596 16, /* bitsize */ 1597 FALSE, /* pc_relative */ 1598 0, /* bitpos */ 1599 complain_overflow_dont, /* complain_on_overflow */ 1600 _bfd_mips_elf_lo16_reloc, /* special_function */ 1601 "R_MIPS16_LO16", /* name */ 1602 FALSE, /* partial_inplace */ 1603 0x0000ffff, /* src_mask */ 1604 0x0000ffff, /* dst_mask */ 1605 FALSE), /* pcrel_offset */ 1606}; 1607 1608/* GNU extension to record C++ vtable hierarchy */ 1609static reloc_howto_type elf_mips_gnu_vtinherit_howto = 1610 HOWTO (R_MIPS_GNU_VTINHERIT, /* type */ 1611 0, /* rightshift */ 1612 2, /* size (0 = byte, 1 = short, 2 = long) */ 1613 0, /* bitsize */ 1614 FALSE, /* pc_relative */ 1615 0, /* bitpos */ 1616 complain_overflow_dont, /* complain_on_overflow */ 1617 NULL, /* special_function */ 1618 "R_MIPS_GNU_VTINHERIT", /* name */ 1619 FALSE, /* partial_inplace */ 1620 0, /* src_mask */ 1621 0, /* dst_mask */ 1622 FALSE); /* pcrel_offset */ 1623 1624/* GNU extension to record C++ vtable member usage */ 1625static reloc_howto_type elf_mips_gnu_vtentry_howto = 1626 HOWTO (R_MIPS_GNU_VTENTRY, /* type */ 1627 0, /* rightshift */ 1628 2, /* size (0 = byte, 1 = short, 2 = long) */ 1629 0, /* bitsize */ 1630 FALSE, /* pc_relative */ 1631 0, /* bitpos */ 1632 complain_overflow_dont, /* complain_on_overflow */ 1633 _bfd_elf_rel_vtable_reloc_fn, /* special_function */ 1634 "R_MIPS_GNU_VTENTRY", /* name */ 1635 FALSE, /* partial_inplace */ 1636 0, /* src_mask */ 1637 0, /* dst_mask */ 1638 FALSE); /* pcrel_offset */ 1639 1640/* 16 bit offset for pc-relative branches. */ 1641static reloc_howto_type elf_mips_gnu_rel16_s2 = 1642 HOWTO (R_MIPS_GNU_REL16_S2, /* type */ 1643 2, /* rightshift */ 1644 2, /* size (0 = byte, 1 = short, 2 = long) */ 1645 16, /* bitsize */ 1646 TRUE, /* pc_relative */ 1647 0, /* bitpos */ 1648 complain_overflow_signed, /* complain_on_overflow */ 1649 _bfd_mips_elf_generic_reloc, /* special_function */ 1650 "R_MIPS_GNU_REL16_S2", /* name */ 1651 TRUE, /* partial_inplace */ 1652 0x0000ffff, /* src_mask */ 1653 0x0000ffff, /* dst_mask */ 1654 TRUE); /* pcrel_offset */ 1655 1656/* 16 bit offset for pc-relative branches. */ 1657static reloc_howto_type elf_mips_gnu_rela16_s2 = 1658 HOWTO (R_MIPS_GNU_REL16_S2, /* type */ 1659 2, /* rightshift */ 1660 2, /* size (0 = byte, 1 = short, 2 = long) */ 1661 16, /* bitsize */ 1662 TRUE, /* pc_relative */ 1663 0, /* bitpos */ 1664 complain_overflow_signed, /* complain_on_overflow */ 1665 _bfd_mips_elf_generic_reloc, /* special_function */ 1666 "R_MIPS_GNU_REL16_S2", /* name */ 1667 FALSE, /* partial_inplace */ 1668 0, /* src_mask */ 1669 0x0000ffff, /* dst_mask */ 1670 TRUE); /* pcrel_offset */ 1671 1672/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a 1673 dangerous relocation. */ 1674 1675static bfd_boolean 1676mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp) 1677{ 1678 unsigned int count; 1679 asymbol **sym; 1680 unsigned int i; 1681 1682 /* If we've already figured out what GP will be, just return it. */ 1683 *pgp = _bfd_get_gp_value (output_bfd); 1684 if (*pgp) 1685 return TRUE; 1686 1687 count = bfd_get_symcount (output_bfd); 1688 sym = bfd_get_outsymbols (output_bfd); 1689 1690 /* The linker script will have created a symbol named `_gp' with the 1691 appropriate value. */ 1692 if (sym == NULL) 1693 i = count; 1694 else 1695 { 1696 for (i = 0; i < count; i++, sym++) 1697 { 1698 register const char *name; 1699 1700 name = bfd_asymbol_name (*sym); 1701 if (*name == '_' && strcmp (name, "_gp") == 0) 1702 { 1703 *pgp = bfd_asymbol_value (*sym); 1704 _bfd_set_gp_value (output_bfd, *pgp); 1705 break; 1706 } 1707 } 1708 } 1709 1710 if (i >= count) 1711 { 1712 /* Only get the error once. */ 1713 *pgp = 4; 1714 _bfd_set_gp_value (output_bfd, *pgp); 1715 return FALSE; 1716 } 1717 1718 return TRUE; 1719} 1720 1721/* We have to figure out the gp value, so that we can adjust the 1722 symbol value correctly. We look up the symbol _gp in the output 1723 BFD. If we can't find it, we're stuck. We cache it in the ELF 1724 target data. We don't need to adjust the symbol value for an 1725 external symbol if we are producing relocatable output. */ 1726 1727static bfd_reloc_status_type 1728mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 1729 char **error_message, bfd_vma *pgp) 1730{ 1731 if (bfd_is_und_section (symbol->section) 1732 && ! relocatable) 1733 { 1734 *pgp = 0; 1735 return bfd_reloc_undefined; 1736 } 1737 1738 *pgp = _bfd_get_gp_value (output_bfd); 1739 if (*pgp == 0 1740 && (! relocatable 1741 || (symbol->flags & BSF_SECTION_SYM) != 0)) 1742 { 1743 if (relocatable) 1744 { 1745 /* Make up a value. */ 1746 *pgp = symbol->section->output_section->vma /*+ 0x4000*/; 1747 _bfd_set_gp_value (output_bfd, *pgp); 1748 } 1749 else if (!mips_elf_assign_gp (output_bfd, pgp)) 1750 { 1751 *error_message = 1752 (char *) _("GP relative relocation when _gp not defined"); 1753 return bfd_reloc_dangerous; 1754 } 1755 } 1756 1757 return bfd_reloc_ok; 1758} 1759 1760/* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must 1761 become the offset from the gp register. */ 1762 1763static bfd_reloc_status_type 1764mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 1765 asymbol *symbol, void *data ATTRIBUTE_UNUSED, 1766 asection *input_section, bfd *output_bfd, 1767 char **error_message ATTRIBUTE_UNUSED) 1768{ 1769 bfd_boolean relocatable; 1770 bfd_reloc_status_type ret; 1771 bfd_vma gp; 1772 1773 if (output_bfd != NULL) 1774 relocatable = TRUE; 1775 else 1776 { 1777 relocatable = FALSE; 1778 output_bfd = symbol->section->output_section->owner; 1779 } 1780 1781 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message, 1782 &gp); 1783 if (ret != bfd_reloc_ok) 1784 return ret; 1785 1786 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 1787 input_section, relocatable, 1788 data, gp); 1789} 1790 1791/* Do a R_MIPS_LITERAL relocation. */ 1792 1793static bfd_reloc_status_type 1794mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1795 void *data, asection *input_section, bfd *output_bfd, 1796 char **error_message) 1797{ 1798 bfd_boolean relocatable; 1799 bfd_reloc_status_type ret; 1800 bfd_vma gp; 1801 1802 /* R_MIPS_LITERAL relocations are defined for local symbols only. */ 1803 if (output_bfd != NULL 1804 && (symbol->flags & BSF_SECTION_SYM) == 0 1805 && (symbol->flags & BSF_LOCAL) != 0) 1806 { 1807 *error_message = (char *) 1808 _("literal relocation occurs for an external symbol"); 1809 return bfd_reloc_outofrange; 1810 } 1811 1812 /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */ 1813 if (output_bfd != NULL) 1814 relocatable = TRUE; 1815 else 1816 { 1817 relocatable = FALSE; 1818 output_bfd = symbol->section->output_section->owner; 1819 } 1820 1821 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message, 1822 &gp); 1823 if (ret != bfd_reloc_ok) 1824 return ret; 1825 1826 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 1827 input_section, relocatable, 1828 data, gp); 1829} 1830 1831/* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must 1832 become the offset from the gp register. */ 1833 1834static bfd_reloc_status_type 1835mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1836 void *data, asection *input_section, bfd *output_bfd, 1837 char **error_message) 1838{ 1839 bfd_boolean relocatable; 1840 bfd_reloc_status_type ret; 1841 bfd_vma gp; 1842 1843 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */ 1844 if (output_bfd != NULL 1845 && (symbol->flags & BSF_SECTION_SYM) == 0 1846 && (symbol->flags & BSF_LOCAL) != 0) 1847 { 1848 *error_message = (char *) 1849 _("32bits gp relative relocation occurs for an external symbol"); 1850 return bfd_reloc_outofrange; 1851 } 1852 1853 if (output_bfd != NULL) 1854 { 1855 relocatable = TRUE; 1856 gp = _bfd_get_gp_value (output_bfd); 1857 } 1858 else 1859 { 1860 relocatable = FALSE; 1861 output_bfd = symbol->section->output_section->owner; 1862 1863 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, 1864 error_message, &gp); 1865 if (ret != bfd_reloc_ok) 1866 return ret; 1867 } 1868 1869 return gprel32_with_gp (abfd, symbol, reloc_entry, input_section, 1870 relocatable, data, gp); 1871} 1872 1873static bfd_reloc_status_type 1874gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry, 1875 asection *input_section, bfd_boolean relocatable, 1876 void *data, bfd_vma gp) 1877{ 1878 bfd_vma relocation; 1879 unsigned long val; 1880 1881 if (bfd_is_com_section (symbol->section)) 1882 relocation = 0; 1883 else 1884 relocation = symbol->value; 1885 1886 relocation += symbol->section->output_section->vma; 1887 relocation += symbol->section->output_offset; 1888 1889 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) 1890 return bfd_reloc_outofrange; 1891 1892 if (reloc_entry->howto->src_mask == 0) 1893 val = 0; 1894 else 1895 val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); 1896 1897 /* Set val to the offset into the section or symbol. */ 1898 val += reloc_entry->addend; 1899 1900 /* Adjust val for the final section location and GP value. If we 1901 are producing relocatable output, we don't want to do this for 1902 an external symbol. */ 1903 if (! relocatable 1904 || (symbol->flags & BSF_SECTION_SYM) != 0) 1905 val += relocation - gp; 1906 1907 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address); 1908 1909 if (relocatable) 1910 reloc_entry->address += input_section->output_offset; 1911 1912 return bfd_reloc_ok; 1913} 1914 1915/* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2, 1916 the rest is at bits 6-10. The bitpos already got right by the howto. */ 1917 1918static bfd_reloc_status_type 1919mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1920 void *data, asection *input_section, bfd *output_bfd, 1921 char **error_message) 1922{ 1923 if (reloc_entry->howto->partial_inplace) 1924 { 1925 reloc_entry->addend = ((reloc_entry->addend & 0x00007c0) 1926 | (reloc_entry->addend & 0x00000800) >> 9); 1927 } 1928 1929 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data, 1930 input_section, output_bfd, 1931 error_message); 1932} 1933 1934/* Handle a mips16 GP relative reloc. */ 1935 1936static bfd_reloc_status_type 1937mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1938 void *data, asection *input_section, bfd *output_bfd, 1939 char **error_message) 1940{ 1941 bfd_boolean relocatable; 1942 bfd_reloc_status_type ret; 1943 bfd_byte *location; 1944 bfd_vma gp; 1945 1946 /* If we're relocating, and this is an external symbol, we don't want 1947 to change anything. */ 1948 if (output_bfd != NULL 1949 && (symbol->flags & BSF_SECTION_SYM) == 0 1950 && (symbol->flags & BSF_LOCAL) != 0) 1951 { 1952 reloc_entry->address += input_section->output_offset; 1953 return bfd_reloc_ok; 1954 } 1955 1956 if (output_bfd != NULL) 1957 relocatable = TRUE; 1958 else 1959 { 1960 relocatable = FALSE; 1961 output_bfd = symbol->section->output_section->owner; 1962 } 1963 1964 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message, 1965 &gp); 1966 if (ret != bfd_reloc_ok) 1967 return ret; 1968 1969 location = (bfd_byte *) data + reloc_entry->address; 1970 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE, 1971 location); 1972 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, 1973 input_section, relocatable, 1974 data, gp); 1975 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable, 1976 location); 1977 1978 return ret; 1979} 1980 1981/* A mapping from BFD reloc types to MIPS ELF reloc types. */ 1982 1983struct elf_reloc_map { 1984 bfd_reloc_code_real_type bfd_val; 1985 enum elf_mips_reloc_type elf_val; 1986}; 1987 1988static const struct elf_reloc_map mips_reloc_map[] = 1989{ 1990 { BFD_RELOC_NONE, R_MIPS_NONE }, 1991 { BFD_RELOC_16, R_MIPS_16 }, 1992 { BFD_RELOC_32, R_MIPS_32 }, 1993 /* There is no BFD reloc for R_MIPS_REL32. */ 1994 { BFD_RELOC_CTOR, R_MIPS_32 }, 1995 { BFD_RELOC_64, R_MIPS_64 }, 1996 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 }, 1997 { BFD_RELOC_HI16_S, R_MIPS_HI16 }, 1998 { BFD_RELOC_LO16, R_MIPS_LO16 }, 1999 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 }, 2000 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 }, 2001 { BFD_RELOC_MIPS_JMP, R_MIPS_26 }, 2002 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL }, 2003 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 }, 2004 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 }, 2005 { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 }, 2006 { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 }, 2007 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP }, 2008 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE }, 2009 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST }, 2010 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 }, 2011 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 }, 2012 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB }, 2013 { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A }, 2014 { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B }, 2015 { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE }, 2016 { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST }, 2017 { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER }, 2018 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 }, 2019 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 }, 2020 { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP }, 2021 { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 }, 2022 /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */ 2023 { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT }, 2024 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR }, 2025 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 }, 2026 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 }, 2027 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 }, 2028 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 }, 2029 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD }, 2030 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM }, 2031 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 }, 2032 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 }, 2033 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL }, 2034 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 }, 2035 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 }, 2036 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 }, 2037 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 } 2038}; 2039 2040static const struct elf_reloc_map mips16_reloc_map[] = 2041{ 2042 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min }, 2043 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min }, 2044 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min }, 2045 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min }, 2046}; 2047 2048/* Given a BFD reloc type, return a howto structure. */ 2049 2050static reloc_howto_type * 2051bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 2052 bfd_reloc_code_real_type code) 2053{ 2054 unsigned int i; 2055 /* FIXME: We default to RELA here instead of choosing the right 2056 relocation variant. */ 2057 reloc_howto_type *howto_table = elf_mips_howto_table_rela; 2058 reloc_howto_type *howto16_table = elf_mips16_howto_table_rela; 2059 2060 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); 2061 i++) 2062 { 2063 if (mips_reloc_map[i].bfd_val == code) 2064 return &howto_table[(int) mips_reloc_map[i].elf_val]; 2065 } 2066 2067 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map); 2068 i++) 2069 { 2070 if (mips16_reloc_map[i].bfd_val == code) 2071 return &howto16_table[(int) mips16_reloc_map[i].elf_val]; 2072 } 2073 2074 switch (code) 2075 { 2076 case BFD_RELOC_VTABLE_INHERIT: 2077 return &elf_mips_gnu_vtinherit_howto; 2078 case BFD_RELOC_VTABLE_ENTRY: 2079 return &elf_mips_gnu_vtentry_howto; 2080 default: 2081 bfd_set_error (bfd_error_bad_value); 2082 return NULL; 2083 } 2084} 2085 2086static reloc_howto_type * 2087bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 2088 const char *r_name) 2089{ 2090 unsigned int i; 2091 2092 for (i = 0; 2093 i < (sizeof (elf_mips_howto_table_rela) 2094 / sizeof (elf_mips_howto_table_rela[0])); 2095 i++) 2096 if (elf_mips_howto_table_rela[i].name != NULL 2097 && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0) 2098 return &elf_mips_howto_table_rela[i]; 2099 2100 for (i = 0; 2101 i < (sizeof (elf_mips16_howto_table_rela) 2102 / sizeof (elf_mips16_howto_table_rela[0])); 2103 i++) 2104 if (elf_mips16_howto_table_rela[i].name != NULL 2105 && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0) 2106 return &elf_mips16_howto_table_rela[i]; 2107 2108 if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0) 2109 return &elf_mips_gnu_vtinherit_howto; 2110 if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0) 2111 return &elf_mips_gnu_vtentry_howto; 2112 if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0) 2113 return &elf_mips_gnu_rel16_s2; 2114 if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0) 2115 return &elf_mips_gnu_rela16_s2; 2116 2117 return NULL; 2118} 2119 2120/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */ 2121 2122static reloc_howto_type * 2123mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p) 2124{ 2125 switch (r_type) 2126 { 2127 case R_MIPS_GNU_VTINHERIT: 2128 return &elf_mips_gnu_vtinherit_howto; 2129 case R_MIPS_GNU_VTENTRY: 2130 return &elf_mips_gnu_vtentry_howto; 2131 case R_MIPS_GNU_REL16_S2: 2132 if (rela_p) 2133 return &elf_mips_gnu_rela16_s2; 2134 else 2135 return &elf_mips_gnu_rel16_s2; 2136 default: 2137 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max) 2138 { 2139 if (rela_p) 2140 return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min]; 2141 else 2142 return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min]; 2143 } 2144 BFD_ASSERT (r_type < (unsigned int) R_MIPS_max); 2145 if (rela_p) 2146 return &elf_mips_howto_table_rela[r_type]; 2147 else 2148 return &elf_mips_howto_table_rel[r_type]; 2149 break; 2150 } 2151} 2152 2153/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */ 2154 2155static void 2156mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) 2157{ 2158 unsigned int r_type; 2159 2160 r_type = ELF32_R_TYPE (dst->r_info); 2161 cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE); 2162 2163 /* The addend for a GPREL16 or LITERAL relocation comes from the GP 2164 value for the object file. We get the addend now, rather than 2165 when we do the relocation, because the symbol manipulations done 2166 by the linker may cause us to lose track of the input BFD. */ 2167 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0 2168 && (r_type == (unsigned int) R_MIPS_GPREL16 2169 || r_type == (unsigned int) R_MIPS_LITERAL)) 2170 cache_ptr->addend = elf_gp (abfd); 2171} 2172 2173/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure. */ 2174 2175static void 2176mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, 2177 arelent *cache_ptr, Elf_Internal_Rela *dst) 2178{ 2179 unsigned int r_type; 2180 2181 r_type = ELF32_R_TYPE (dst->r_info); 2182 cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE); 2183 cache_ptr->addend = dst->r_addend; 2184} 2185 2186/* Determine whether a symbol is global for the purposes of splitting 2187 the symbol table into global symbols and local symbols. At least 2188 on Irix 5, this split must be between section symbols and all other 2189 symbols. On most ELF targets the split is between static symbols 2190 and externally visible symbols. */ 2191 2192static bfd_boolean 2193mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym) 2194{ 2195 if (SGI_COMPAT (abfd)) 2196 return (sym->flags & BSF_SECTION_SYM) == 0; 2197 else 2198 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0 2199 || bfd_is_und_section (bfd_get_section (sym)) 2200 || bfd_is_com_section (bfd_get_section (sym))); 2201} 2202 2203/* Set the right machine number for a MIPS ELF file. */ 2204 2205static bfd_boolean 2206mips_elf_n32_object_p (bfd *abfd) 2207{ 2208 unsigned long mach; 2209 2210 /* Irix 5 and 6 are broken. Object file symbol tables are not always 2211 sorted correctly such that local symbols precede global symbols, 2212 and the sh_info field in the symbol table is not always right. */ 2213 if (SGI_COMPAT (abfd)) 2214 elf_bad_symtab (abfd) = TRUE; 2215 2216 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags); 2217 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach); 2218 2219 if (! ABI_N32_P(abfd)) 2220 return FALSE; 2221 2222 return TRUE; 2223} 2224 2225/* Support for core dump NOTE sections. */ 2226static bfd_boolean 2227elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 2228{ 2229 int offset; 2230 unsigned int size; 2231 2232 switch (note->descsz) 2233 { 2234 default: 2235 return FALSE; 2236 2237 case 440: /* Linux/MIPS N32 */ 2238 /* pr_cursig */ 2239 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); 2240 2241 /* pr_pid */ 2242 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); 2243 2244 /* pr_reg */ 2245 offset = 72; 2246 size = 360; 2247 2248 break; 2249 } 2250 2251 /* Make a ".reg/999" section. */ 2252 return _bfd_elfcore_make_pseudosection (abfd, ".reg", size, 2253 note->descpos + offset); 2254} 2255 2256static bfd_boolean 2257elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 2258{ 2259 switch (note->descsz) 2260 { 2261 default: 2262 return FALSE; 2263 2264 case 128: /* Linux/MIPS elf_prpsinfo */ 2265 elf_tdata (abfd)->core_program 2266 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16); 2267 elf_tdata (abfd)->core_command 2268 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80); 2269 } 2270 2271 /* Note that for some reason, a spurious space is tacked 2272 onto the end of the args in some (at least one anyway) 2273 implementations, so strip it off if it exists. */ 2274 2275 { 2276 char *command = elf_tdata (abfd)->core_command; 2277 int n = strlen (command); 2278 2279 if (0 < n && command[n - 1] == ' ') 2280 command[n - 1] = '\0'; 2281 } 2282 2283 return TRUE; 2284} 2285 2286/* Depending on the target vector we generate some version of Irix 2287 executables or "normal" MIPS ELF ABI executables. */ 2288static irix_compat_t 2289elf_n32_mips_irix_compat (bfd *abfd) 2290{ 2291 if ((abfd->xvec == &bfd_elf32_nbigmips_vec) 2292 || (abfd->xvec == &bfd_elf32_nlittlemips_vec)) 2293 return ict_irix6; 2294 else 2295 return ict_none; 2296} 2297 2298/* ECOFF swapping routines. These are used when dealing with the 2299 .mdebug section, which is in the ECOFF debugging format. */ 2300static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { 2301 /* Symbol table magic number. */ 2302 magicSym, 2303 /* Alignment of debugging information. E.g., 4. */ 2304 4, 2305 /* Sizes of external symbolic information. */ 2306 sizeof (struct hdr_ext), 2307 sizeof (struct dnr_ext), 2308 sizeof (struct pdr_ext), 2309 sizeof (struct sym_ext), 2310 sizeof (struct opt_ext), 2311 sizeof (struct fdr_ext), 2312 sizeof (struct rfd_ext), 2313 sizeof (struct ext_ext), 2314 /* Functions to swap in external symbolic data. */ 2315 ecoff_swap_hdr_in, 2316 ecoff_swap_dnr_in, 2317 ecoff_swap_pdr_in, 2318 ecoff_swap_sym_in, 2319 ecoff_swap_opt_in, 2320 ecoff_swap_fdr_in, 2321 ecoff_swap_rfd_in, 2322 ecoff_swap_ext_in, 2323 _bfd_ecoff_swap_tir_in, 2324 _bfd_ecoff_swap_rndx_in, 2325 /* Functions to swap out external symbolic data. */ 2326 ecoff_swap_hdr_out, 2327 ecoff_swap_dnr_out, 2328 ecoff_swap_pdr_out, 2329 ecoff_swap_sym_out, 2330 ecoff_swap_opt_out, 2331 ecoff_swap_fdr_out, 2332 ecoff_swap_rfd_out, 2333 ecoff_swap_ext_out, 2334 _bfd_ecoff_swap_tir_out, 2335 _bfd_ecoff_swap_rndx_out, 2336 /* Function to read in symbolic data. */ 2337 _bfd_mips_elf_read_ecoff_info 2338}; 2339 2340#define ELF_ARCH bfd_arch_mips 2341#define ELF_MACHINE_CODE EM_MIPS 2342 2343#define elf_backend_collect TRUE 2344#define elf_backend_type_change_ok TRUE 2345#define elf_backend_can_gc_sections TRUE 2346#define elf_info_to_howto mips_info_to_howto_rela 2347#define elf_info_to_howto_rel mips_info_to_howto_rel 2348#define elf_backend_sym_is_global mips_elf_sym_is_global 2349#define elf_backend_object_p mips_elf_n32_object_p 2350#define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing 2351#define elf_backend_section_processing _bfd_mips_elf_section_processing 2352#define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr 2353#define elf_backend_fake_sections _bfd_mips_elf_fake_sections 2354#define elf_backend_section_from_bfd_section \ 2355 _bfd_mips_elf_section_from_bfd_section 2356#define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook 2357#define elf_backend_link_output_symbol_hook \ 2358 _bfd_mips_elf_link_output_symbol_hook 2359#define elf_backend_create_dynamic_sections \ 2360 _bfd_mips_elf_create_dynamic_sections 2361#define elf_backend_check_relocs _bfd_mips_elf_check_relocs 2362#define elf_backend_merge_symbol_attribute \ 2363 _bfd_mips_elf_merge_symbol_attribute 2364#define elf_backend_adjust_dynamic_symbol \ 2365 _bfd_mips_elf_adjust_dynamic_symbol 2366#define elf_backend_always_size_sections \ 2367 _bfd_mips_elf_always_size_sections 2368#define elf_backend_size_dynamic_sections \ 2369 _bfd_mips_elf_size_dynamic_sections 2370#define elf_backend_init_index_section _bfd_elf_init_1_index_section 2371#define elf_backend_relocate_section _bfd_mips_elf_relocate_section 2372#define elf_backend_finish_dynamic_symbol \ 2373 _bfd_mips_elf_finish_dynamic_symbol 2374#define elf_backend_finish_dynamic_sections \ 2375 _bfd_mips_elf_finish_dynamic_sections 2376#define elf_backend_final_write_processing \ 2377 _bfd_mips_elf_final_write_processing 2378#define elf_backend_additional_program_headers \ 2379 _bfd_mips_elf_additional_program_headers 2380#define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map 2381#define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook 2382#define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook 2383#define elf_backend_copy_indirect_symbol \ 2384 _bfd_mips_elf_copy_indirect_symbol 2385#define elf_backend_hide_symbol _bfd_mips_elf_hide_symbol 2386#define elf_backend_grok_prstatus elf32_mips_grok_prstatus 2387#define elf_backend_grok_psinfo elf32_mips_grok_psinfo 2388#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap 2389 2390#define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO) 2391 2392/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations 2393 work better/work only in RELA, so we default to this. */ 2394#define elf_backend_may_use_rel_p 1 2395#define elf_backend_may_use_rela_p 1 2396#define elf_backend_default_use_rela_p 1 2397#define elf_backend_sign_extend_vma TRUE 2398 2399#define elf_backend_discard_info _bfd_mips_elf_discard_info 2400#define elf_backend_ignore_discarded_relocs \ 2401 _bfd_mips_elf_ignore_discarded_relocs 2402#define elf_backend_write_section _bfd_mips_elf_write_section 2403#define elf_backend_mips_irix_compat elf_n32_mips_irix_compat 2404#define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto 2405#define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line 2406#define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info 2407#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook 2408#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents 2409#define bfd_elf32_bfd_get_relocated_section_contents \ 2410 _bfd_elf_mips_get_relocated_section_contents 2411#define bfd_elf32_bfd_link_hash_table_create \ 2412 _bfd_mips_elf_link_hash_table_create 2413#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link 2414#define bfd_elf32_bfd_merge_private_bfd_data \ 2415 _bfd_mips_elf_merge_private_bfd_data 2416#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags 2417#define bfd_elf32_bfd_print_private_bfd_data \ 2418 _bfd_mips_elf_print_private_bfd_data 2419#define bfd_elf32_bfd_relax_section _bfd_mips_relax_section 2420 2421/* Support for SGI-ish mips targets using n32 ABI. */ 2422 2423#define TARGET_LITTLE_SYM bfd_elf32_nlittlemips_vec 2424#define TARGET_LITTLE_NAME "elf32-nlittlemips" 2425#define TARGET_BIG_SYM bfd_elf32_nbigmips_vec 2426#define TARGET_BIG_NAME "elf32-nbigmips" 2427 2428#define ELF_MAXPAGESIZE 0x10000 2429#define ELF_COMMONPAGESIZE 0x1000 2430 2431#include "elf32-target.h" 2432 2433/* Support for traditional mips targets using n32 ABI. */ 2434#undef TARGET_LITTLE_SYM 2435#undef TARGET_LITTLE_NAME 2436#undef TARGET_BIG_SYM 2437#undef TARGET_BIG_NAME 2438 2439#undef ELF_MAXPAGESIZE 2440#undef ELF_COMMONPAGESIZE 2441 2442#define TARGET_LITTLE_SYM bfd_elf32_ntradlittlemips_vec 2443#define TARGET_LITTLE_NAME "elf32-ntradlittlemips" 2444#define TARGET_BIG_SYM bfd_elf32_ntradbigmips_vec 2445#define TARGET_BIG_NAME "elf32-ntradbigmips" 2446 2447#define ELF_MAXPAGESIZE 0x10000 2448#define ELF_COMMONPAGESIZE 0x1000 2449#define elf32_bed elf32_tradbed 2450 2451/* Include the target file again for this target. */ 2452#include "elf32-target.h" 2453