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