1 /* 32-bit ELF support for Nios II. 2 Copyright (C) 2012, 2013 Free Software Foundation, Inc. 3 Contributed by Nigel Gray (ngray@altera.com). 4 Contributed by Mentor Graphics, Inc. 5 6 This file is part of BFD, the Binary File Descriptor library. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 MA 02110-1301, USA. */ 22 23 /* This file handles Altera Nios II ELF targets. */ 24 25 #include "sysdep.h" 26 #include "bfd.h" 27 #include "libbfd.h" 28 #include "bfdlink.h" 29 #include "genlink.h" 30 #include "elf-bfd.h" 31 #include "elf/nios2.h" 32 #include "opcode/nios2.h" 33 34 /* Use RELA relocations. */ 35 #ifndef USE_RELA 36 #define USE_RELA 37 #endif 38 39 #ifdef USE_REL 40 #undef USE_REL 41 #endif 42 43 /* Forward declarations. */ 44 static bfd_reloc_status_type nios2_elf32_ignore_reloc 45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 46 static bfd_reloc_status_type nios2_elf32_hi16_relocate 47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 48 static bfd_reloc_status_type nios2_elf32_lo16_relocate 49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 50 static bfd_reloc_status_type nios2_elf32_hiadj16_relocate 51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 52 static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate 53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 54 static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate 55 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 56 static bfd_reloc_status_type nios2_elf32_pcrel16_relocate 57 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 58 static bfd_reloc_status_type nios2_elf32_call26_relocate 59 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 60 static bfd_reloc_status_type nios2_elf32_gprel_relocate 61 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 62 static bfd_reloc_status_type nios2_elf32_ujmp_relocate 63 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 64 static bfd_reloc_status_type nios2_elf32_cjmp_relocate 65 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 66 static bfd_reloc_status_type nios2_elf32_callr_relocate 67 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 68 69 /* Target vector. */ 70 extern const bfd_target bfd_elf32_littlenios2_vec; 71 extern const bfd_target bfd_elf32_bignios2_vec; 72 73 /* Offset of tp and dtp pointers from start of TLS block. */ 74 #define TP_OFFSET 0x7000 75 #define DTP_OFFSET 0x8000 76 77 /* The relocation table used for SHT_REL sections. */ 78 static reloc_howto_type elf_nios2_howto_table_rel[] = { 79 /* No relocation. */ 80 HOWTO (R_NIOS2_NONE, /* type */ 81 0, /* rightshift */ 82 0, /* size (0 = byte, 1 = short, 2 = long) */ 83 0, /* bitsize */ 84 FALSE, /* pc_relative */ 85 0, /* bitpos */ 86 complain_overflow_dont, /* complain_on_overflow */ 87 bfd_elf_generic_reloc, /* special_function */ 88 "R_NIOS2_NONE", /* name */ 89 FALSE, /* partial_inplace */ 90 0, /* src_mask */ 91 0, /* dst_mask */ 92 FALSE), /* pcrel_offset */ 93 94 /* 16-bit signed immediate relocation. */ 95 HOWTO (R_NIOS2_S16, /* type */ 96 0, /* rightshift */ 97 2, /* size (0 = byte, 1 = short, 2 = long) */ 98 16, /* bitsize */ 99 FALSE, /* pc_relative */ 100 6, /* bitpos */ 101 complain_overflow_signed, /* complain on overflow */ 102 bfd_elf_generic_reloc, /* special function */ 103 "R_NIOS2_S16", /* name */ 104 FALSE, /* partial_inplace */ 105 0x003fffc0, /* src_mask */ 106 0x003fffc0, /* dest_mask */ 107 FALSE), /* pcrel_offset */ 108 109 /* 16-bit unsigned immediate relocation. */ 110 HOWTO (R_NIOS2_U16, /* type */ 111 0, /* rightshift */ 112 2, /* size (0 = byte, 1 = short, 2 = long) */ 113 16, /* bitsize */ 114 FALSE, /* pc_relative */ 115 6, /* bitpos */ 116 complain_overflow_unsigned, /* complain on overflow */ 117 bfd_elf_generic_reloc, /* special function */ 118 "R_NIOS2_U16", /* name */ 119 FALSE, /* partial_inplace */ 120 0x003fffc0, /* src_mask */ 121 0x003fffc0, /* dest_mask */ 122 FALSE), /* pcrel_offset */ 123 124 HOWTO (R_NIOS2_PCREL16, /* type */ 125 0, /* rightshift */ 126 2, /* size (0 = byte, 1 = short, 2 = long) */ 127 16, /* bitsize */ 128 TRUE, /* pc_relative */ 129 6, /* bitpos */ 130 complain_overflow_signed, /* complain on overflow */ 131 nios2_elf32_pcrel16_relocate, /* special function */ 132 "R_NIOS2_PCREL16", /* name */ 133 FALSE, /* partial_inplace */ 134 0x003fffc0, /* src_mask */ 135 0x003fffc0, /* dest_mask */ 136 TRUE), /* pcrel_offset */ 137 138 HOWTO (R_NIOS2_CALL26, /* type */ 139 2, /* rightshift */ 140 2, /* size (0 = byte, 1 = short, 2 = long) */ 141 26, /* bitsize */ 142 FALSE, /* pc_relative */ 143 6, /* bitpos */ 144 complain_overflow_dont, /* complain on overflow */ 145 nios2_elf32_call26_relocate, /* special function */ 146 "R_NIOS2_CALL26", /* name */ 147 FALSE, /* partial_inplace */ 148 0xffffffc0, /* src_mask */ 149 0xffffffc0, /* dst_mask */ 150 FALSE), /* pcrel_offset */ 151 152 HOWTO (R_NIOS2_IMM5, 153 0, 154 2, 155 5, 156 FALSE, 157 6, 158 complain_overflow_bitfield, 159 bfd_elf_generic_reloc, 160 "R_NIOS2_IMM5", 161 FALSE, 162 0x000007c0, 163 0x000007c0, 164 FALSE), 165 166 HOWTO (R_NIOS2_CACHE_OPX, 167 0, 168 2, 169 5, 170 FALSE, 171 22, 172 complain_overflow_bitfield, 173 bfd_elf_generic_reloc, 174 "R_NIOS2_CACHE_OPX", 175 FALSE, 176 0x07c00000, 177 0x07c00000, 178 FALSE), 179 180 HOWTO (R_NIOS2_IMM6, 181 0, 182 2, 183 6, 184 FALSE, 185 6, 186 complain_overflow_bitfield, 187 bfd_elf_generic_reloc, 188 "R_NIOS2_IMM6", 189 FALSE, 190 0x00000fc0, 191 0x00000fc0, 192 FALSE), 193 194 HOWTO (R_NIOS2_IMM8, 195 0, 196 2, 197 8, 198 FALSE, 199 6, 200 complain_overflow_bitfield, 201 bfd_elf_generic_reloc, 202 "R_NIOS2_IMM8", 203 FALSE, 204 0x00003fc0, 205 0x00003fc0, 206 FALSE), 207 208 HOWTO (R_NIOS2_HI16, 209 0, 210 2, 211 32, 212 FALSE, 213 6, 214 complain_overflow_dont, 215 nios2_elf32_hi16_relocate, 216 "R_NIOS2_HI16", 217 FALSE, 218 0x003fffc0, 219 0x003fffc0, 220 FALSE), 221 222 HOWTO (R_NIOS2_LO16, 223 0, 224 2, 225 32, 226 FALSE, 227 6, 228 complain_overflow_dont, 229 nios2_elf32_lo16_relocate, 230 "R_NIOS2_LO16", 231 FALSE, 232 0x003fffc0, 233 0x003fffc0, 234 FALSE), 235 236 HOWTO (R_NIOS2_HIADJ16, 237 0, 238 2, 239 32, 240 FALSE, 241 6, 242 complain_overflow_dont, 243 nios2_elf32_hiadj16_relocate, 244 "R_NIOS2_HIADJ16", 245 FALSE, 246 0x003fffc0, 247 0x003fffc0, 248 FALSE), 249 250 HOWTO (R_NIOS2_BFD_RELOC_32, 251 0, 252 2, /* long */ 253 32, 254 FALSE, 255 0, 256 complain_overflow_dont, 257 bfd_elf_generic_reloc, 258 "R_NIOS2_BFD_RELOC32", 259 FALSE, 260 0xffffffff, 261 0xffffffff, 262 FALSE), 263 264 HOWTO (R_NIOS2_BFD_RELOC_16, 265 0, 266 1, /* short */ 267 16, 268 FALSE, 269 0, 270 complain_overflow_bitfield, 271 bfd_elf_generic_reloc, 272 "R_NIOS2_BFD_RELOC16", 273 FALSE, 274 0x0000ffff, 275 0x0000ffff, 276 FALSE), 277 278 HOWTO (R_NIOS2_BFD_RELOC_8, 279 0, 280 0, /* byte */ 281 8, 282 FALSE, 283 0, 284 complain_overflow_bitfield, 285 bfd_elf_generic_reloc, 286 "R_NIOS2_BFD_RELOC8", 287 FALSE, 288 0x000000ff, 289 0x000000ff, 290 FALSE), 291 292 HOWTO (R_NIOS2_GPREL, 293 0, 294 2, 295 32, 296 FALSE, 297 6, 298 complain_overflow_dont, 299 nios2_elf32_gprel_relocate, 300 "R_NIOS2_GPREL", 301 FALSE, 302 0x003fffc0, 303 0x003fffc0, 304 FALSE), 305 306 HOWTO (R_NIOS2_GNU_VTINHERIT, 307 0, 308 2, /* short */ 309 0, 310 FALSE, 311 0, 312 complain_overflow_dont, 313 NULL, 314 "R_NIOS2_GNU_VTINHERIT", 315 FALSE, 316 0, 317 0, 318 FALSE), 319 320 HOWTO (R_NIOS2_GNU_VTENTRY, 321 0, 322 2, /* byte */ 323 0, 324 FALSE, 325 0, 326 complain_overflow_dont, 327 _bfd_elf_rel_vtable_reloc_fn, 328 "R_NIOS2_GNU_VTENTRY", 329 FALSE, 330 0, 331 0, 332 FALSE), 333 334 HOWTO (R_NIOS2_UJMP, 335 0, 336 2, 337 32, 338 FALSE, 339 6, 340 complain_overflow_dont, 341 nios2_elf32_ujmp_relocate, 342 "R_NIOS2_UJMP", 343 FALSE, 344 0x003fffc0, 345 0x003fffc0, 346 FALSE), 347 348 HOWTO (R_NIOS2_CJMP, 349 0, 350 2, 351 32, 352 FALSE, 353 6, 354 complain_overflow_dont, 355 nios2_elf32_cjmp_relocate, 356 "R_NIOS2_CJMP", 357 FALSE, 358 0x003fffc0, 359 0x003fffc0, 360 FALSE), 361 362 HOWTO (R_NIOS2_CALLR, 363 0, 364 2, 365 32, 366 FALSE, 367 6, 368 complain_overflow_dont, 369 nios2_elf32_callr_relocate, 370 "R_NIOS2_CALLR", 371 FALSE, 372 0x003fffc0, 373 0x003fffc0, 374 FALSE), 375 376 HOWTO (R_NIOS2_ALIGN, 377 0, 378 2, 379 0, 380 FALSE, 381 0, 382 complain_overflow_dont, 383 nios2_elf32_ignore_reloc, 384 "R_NIOS2_ALIGN", 385 FALSE, 386 0, 387 0, 388 TRUE), 389 390 391 HOWTO (R_NIOS2_GOT16, 392 0, 393 2, 394 16, 395 FALSE, 396 6, 397 complain_overflow_bitfield, 398 bfd_elf_generic_reloc, 399 "R_NIOS2_GOT16", 400 FALSE, 401 0x003fffc0, 402 0x003fffc0, 403 FALSE), 404 405 HOWTO (R_NIOS2_CALL16, 406 0, 407 2, 408 16, 409 FALSE, 410 6, 411 complain_overflow_bitfield, 412 bfd_elf_generic_reloc, 413 "R_NIOS2_CALL16", 414 FALSE, 415 0x003fffc0, 416 0x003fffc0, 417 FALSE), 418 419 HOWTO (R_NIOS2_GOTOFF_LO, 420 0, 421 2, 422 16, 423 FALSE, 424 6, 425 complain_overflow_dont, 426 bfd_elf_generic_reloc, 427 "R_NIOS2_GOTOFF_LO", 428 FALSE, 429 0x003fffc0, 430 0x003fffc0, 431 FALSE), 432 433 HOWTO (R_NIOS2_GOTOFF_HA, 434 0, 435 2, 436 16, 437 FALSE, 438 6, 439 complain_overflow_dont, 440 bfd_elf_generic_reloc, 441 "R_NIOS2_GOTOFF_HA", 442 FALSE, 443 0x003fffc0, 444 0x003fffc0, 445 FALSE), 446 447 HOWTO (R_NIOS2_PCREL_LO, 448 0, 449 2, 450 16, 451 TRUE, 452 6, 453 complain_overflow_dont, 454 nios2_elf32_pcrel_lo16_relocate, 455 "R_NIOS2_PCREL_LO", 456 FALSE, 457 0x003fffc0, 458 0x003fffc0, 459 TRUE), 460 461 HOWTO (R_NIOS2_PCREL_HA, 462 0, 463 2, 464 16, 465 FALSE, /* This is a PC-relative relocation, but we need to subtract 466 PC ourselves before the HIADJ. */ 467 6, 468 complain_overflow_dont, 469 nios2_elf32_pcrel_hiadj16_relocate, 470 "R_NIOS2_PCREL_HA", 471 FALSE, 472 0x003fffc0, 473 0x003fffc0, 474 TRUE), 475 476 HOWTO (R_NIOS2_TLS_GD16, 477 0, 478 2, 479 16, 480 FALSE, 481 6, 482 complain_overflow_bitfield, 483 bfd_elf_generic_reloc, 484 "R_NIOS2_TLS_GD16", 485 FALSE, 486 0x003fffc0, 487 0x003fffc0, 488 FALSE), 489 490 HOWTO (R_NIOS2_TLS_LDM16, 491 0, 492 2, 493 16, 494 FALSE, 495 6, 496 complain_overflow_bitfield, 497 bfd_elf_generic_reloc, 498 "R_NIOS2_TLS_LDM16", 499 FALSE, 500 0x003fffc0, 501 0x003fffc0, 502 FALSE), 503 504 HOWTO (R_NIOS2_TLS_LDO16, 505 0, 506 2, 507 16, 508 FALSE, 509 6, 510 complain_overflow_bitfield, 511 bfd_elf_generic_reloc, 512 "R_NIOS2_TLS_LDO16", 513 FALSE, 514 0x003fffc0, 515 0x003fffc0, 516 FALSE), 517 518 HOWTO (R_NIOS2_TLS_IE16, 519 0, 520 2, 521 16, 522 FALSE, 523 6, 524 complain_overflow_bitfield, 525 bfd_elf_generic_reloc, 526 "R_NIOS2_TLS_IE16", 527 FALSE, 528 0x003fffc0, 529 0x003fffc0, 530 FALSE), 531 532 HOWTO (R_NIOS2_TLS_LE16, 533 0, 534 2, 535 16, 536 FALSE, 537 6, 538 complain_overflow_bitfield, 539 bfd_elf_generic_reloc, 540 "R_NIOS2_TLS_LE16", 541 FALSE, 542 0x003fffc0, 543 0x003fffc0, 544 FALSE), 545 546 HOWTO (R_NIOS2_TLS_DTPMOD, 547 0, 548 2, 549 32, 550 FALSE, 551 0, 552 complain_overflow_dont, 553 bfd_elf_generic_reloc, 554 "R_NIOS2_TLS_DTPMOD", 555 FALSE, 556 0xffffffff, 557 0xffffffff, 558 FALSE), 559 560 HOWTO (R_NIOS2_TLS_DTPREL, 561 0, 562 2, 563 32, 564 FALSE, 565 0, 566 complain_overflow_dont, 567 bfd_elf_generic_reloc, 568 "R_NIOS2_TLS_DTPREL", 569 FALSE, 570 0xffffffff, 571 0xffffffff, 572 FALSE), 573 574 HOWTO (R_NIOS2_TLS_TPREL, 575 0, 576 2, 577 32, 578 FALSE, 579 0, 580 complain_overflow_dont, 581 bfd_elf_generic_reloc, 582 "R_NIOS2_TLS_TPREL", 583 FALSE, 584 0xffffffff, 585 0xffffffff, 586 FALSE), 587 588 HOWTO (R_NIOS2_COPY, 589 0, 590 2, 591 32, 592 FALSE, 593 0, 594 complain_overflow_dont, 595 bfd_elf_generic_reloc, 596 "R_NIOS2_COPY", 597 FALSE, 598 0, 599 0, 600 FALSE), 601 602 HOWTO (R_NIOS2_GLOB_DAT, 603 0, 604 2, 605 32, 606 FALSE, 607 0, 608 complain_overflow_dont, 609 bfd_elf_generic_reloc, 610 "R_NIOS2_GLOB_DAT", 611 FALSE, 612 0xffffffff, 613 0xffffffff, 614 FALSE), 615 616 HOWTO (R_NIOS2_JUMP_SLOT, 617 0, 618 2, 619 32, 620 FALSE, 621 0, 622 complain_overflow_dont, 623 bfd_elf_generic_reloc, 624 "R_NIOS2_JUMP_SLOT", 625 FALSE, 626 0xffffffff, 627 0xffffffff, 628 FALSE), 629 630 HOWTO (R_NIOS2_RELATIVE, 631 0, 632 2, 633 32, 634 FALSE, 635 0, 636 complain_overflow_dont, 637 bfd_elf_generic_reloc, 638 "R_NIOS2_RELATIVE", 639 FALSE, 640 0xffffffff, 641 0xffffffff, 642 FALSE), 643 644 HOWTO (R_NIOS2_GOTOFF, 645 0, 646 2, 647 32, 648 FALSE, 649 0, 650 complain_overflow_dont, 651 bfd_elf_generic_reloc, 652 "R_NIOS2_GOTOFF", 653 FALSE, 654 0xffffffff, 655 0xffffffff, 656 FALSE), 657 658 /* Add other relocations here. */ 659 }; 660 661 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1]; 662 663 /* Return the howto for relocation RTYPE. */ 664 static reloc_howto_type * 665 lookup_howto (unsigned int rtype) 666 { 667 static int initialized = 0; 668 int i; 669 int howto_tbl_size = (int) (sizeof (elf_nios2_howto_table_rel) 670 / sizeof (elf_nios2_howto_table_rel[0])); 671 672 if (!initialized) 673 { 674 initialized = 1; 675 memset (elf_code_to_howto_index, 0xff, 676 sizeof (elf_code_to_howto_index)); 677 for (i = 0; i < howto_tbl_size; i++) 678 elf_code_to_howto_index[elf_nios2_howto_table_rel[i].type] = i; 679 } 680 681 BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL); 682 i = elf_code_to_howto_index[rtype]; 683 if (i >= howto_tbl_size) 684 return 0; 685 return elf_nios2_howto_table_rel + i; 686 } 687 688 /* Map for converting BFD reloc types to Nios II reloc types. */ 689 struct elf_reloc_map 690 { 691 bfd_reloc_code_real_type bfd_val; 692 enum elf_nios2_reloc_type elf_val; 693 }; 694 695 static const struct elf_reloc_map nios2_reloc_map[] = { 696 {BFD_RELOC_NIOS2_S16, R_NIOS2_S16}, 697 {BFD_RELOC_NIOS2_U16, R_NIOS2_U16}, 698 {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16}, 699 {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26}, 700 {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5}, 701 {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX}, 702 {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6}, 703 {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8}, 704 {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16}, 705 {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16}, 706 {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16}, 707 {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32}, 708 {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16}, 709 {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8}, 710 {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL}, 711 {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT}, 712 {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY}, 713 {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP}, 714 {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP}, 715 {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR}, 716 {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN}, 717 {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16}, 718 {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16}, 719 {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO}, 720 {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA}, 721 {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO}, 722 {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA}, 723 {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16}, 724 {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16}, 725 {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16}, 726 {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16}, 727 {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16}, 728 {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD}, 729 {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL}, 730 {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL}, 731 {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY}, 732 {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT}, 733 {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT}, 734 {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE}, 735 {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF} 736 }; 737 738 /* The Nios II linker needs to keep track of the number of relocs that it 739 decides to copy as dynamic relocs in check_relocs for each symbol. 740 This is so that it can later discard them if they are found to be 741 unnecessary. We store the information in a field extending the 742 regular ELF linker hash table. */ 743 744 struct elf32_nios2_dyn_relocs 745 { 746 struct elf32_nios2_dyn_relocs *next; 747 748 /* The input section of the reloc. */ 749 asection *sec; 750 751 /* Total number of relocs copied for the input section. */ 752 bfd_size_type count; 753 754 /* Number of pc-relative relocs copied for the input section. */ 755 bfd_size_type pc_count; 756 }; 757 758 /* Nios II ELF linker hash entry. */ 759 760 struct elf32_nios2_link_hash_entry 761 { 762 struct elf_link_hash_entry root; 763 764 /* Track dynamic relocs copied for this symbol. */ 765 struct elf32_nios2_dyn_relocs *dyn_relocs; 766 767 #define GOT_UNKNOWN 0 768 #define GOT_NORMAL 1 769 #define GOT_TLS_GD 2 770 #define GOT_TLS_IE 4 771 unsigned char tls_type; 772 773 /* We need to detect and take special action for symbols which are only 774 referenced with %call() and not with %got(). Such symbols do not need 775 a dynamic GOT reloc in shared objects, only a dynamic PLT reloc. Lazy 776 linking will not work if the dynamic GOT reloc exists. 777 To check for this condition efficiently, we compare got_types_used against 778 CALL16_USED, meaning 779 (got_types_used & (GOT16_USED | CALL16_USED)) == CALL16_USED. */ 780 #define GOT16_USED 1 781 #define CALL16_USED 2 782 unsigned char got_types_used; 783 }; 784 785 #define elf32_nios2_hash_entry(ent) \ 786 ((struct elf32_nios2_link_hash_entry *) (ent)) 787 788 /* Get the Nios II elf linker hash table from a link_info structure. */ 789 #define elf32_nios2_hash_table(info) \ 790 ((struct elf32_nios2_link_hash_table *) ((info)->hash)) 791 792 /* Nios II ELF linker hash table. */ 793 struct elf32_nios2_link_hash_table 794 { 795 /* The main hash table. */ 796 struct elf_link_hash_table root; 797 798 /* Short-cuts to get to dynamic linker sections. */ 799 asection *sdynbss; 800 asection *srelbss; 801 asection *sbss; 802 803 union { 804 bfd_signed_vma refcount; 805 bfd_vma offset; 806 } tls_ldm_got; 807 808 /* Small local sym cache. */ 809 struct sym_cache sym_cache; 810 811 bfd_vma res_n_size; 812 }; 813 814 struct nios2_elf32_obj_tdata 815 { 816 struct elf_obj_tdata root; 817 818 /* tls_type for each local got entry. */ 819 char *local_got_tls_type; 820 821 /* TRUE if TLS GD relocs have been seen for this object. */ 822 bfd_boolean has_tlsgd; 823 }; 824 825 #define elf32_nios2_tdata(abfd) \ 826 ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any) 827 828 #define elf32_nios2_local_got_tls_type(abfd) \ 829 (elf32_nios2_tdata (abfd)->local_got_tls_type) 830 831 /* The name of the dynamic interpreter. This is put in the .interp 832 section. */ 833 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" 834 835 /* PLT implementation for position-dependent code. */ 836 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */ 837 0x03c00034, /* movhi r15, %hiadj(plt_got_slot_address) */ 838 0x7bc00017, /* ldw r15, %lo(plt_got_slot_address)(r15) */ 839 0x7800683a /* jmp r15 */ 840 }; 841 842 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */ 843 0x03800034, /* movhi r14, %hiadj(res_0) */ 844 0x73800004, /* addi r14, r14, %lo(res_0) */ 845 0x7b9fc83a, /* sub r15, r15, r14 */ 846 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */ 847 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */ 848 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */ 849 0x6800683a /* jmp r13 */ 850 }; 851 852 /* PLT implementation for position-independent code. */ 853 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */ 854 0x03c00034, /* movhi r15, %hiadj(index * 4) */ 855 0x7bc00004, /* addi r15, r15, %lo(index * 4) */ 856 0x00000006 /* br .PLTresolve */ 857 }; 858 859 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */ 860 0x001ce03a, /* nextpc r14 */ 861 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */ 862 0x6b9b883a, /* add r13, r13, r14 */ 863 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */ 864 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */ 865 0x6800683a /* jmp r13 */ 866 }; 867 868 /* Implement elf_backend_grok_prstatus: 869 Support for core dump NOTE sections. */ 870 static bfd_boolean 871 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 872 { 873 int offset; 874 size_t size; 875 876 switch (note->descsz) 877 { 878 default: 879 return FALSE; 880 881 case 212: /* Linux/Nios II */ 882 /* pr_cursig */ 883 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 884 885 /* pr_pid */ 886 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24); 887 888 /* pr_reg */ 889 offset = 72; 890 size = 136; 891 892 break; 893 } 894 895 /* Make a ".reg/999" section. */ 896 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 897 size, note->descpos + offset); 898 } 899 900 /* Implement elf_backend_grok_psinfo. */ 901 static bfd_boolean 902 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 903 { 904 switch (note->descsz) 905 { 906 default: 907 return FALSE; 908 909 case 124: /* Linux/Nios II elf_prpsinfo */ 910 elf_tdata (abfd)->core->program 911 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 912 elf_tdata (abfd)->core->command 913 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 914 } 915 916 /* Note that for some reason, a spurious space is tacked 917 onto the end of the args in some (at least one anyway) 918 implementations, so strip it off if it exists. */ 919 920 { 921 char *command = elf_tdata (abfd)->core->command; 922 int n = strlen (command); 923 924 if (0 < n && command[n - 1] == ' ') 925 command[n - 1] = '\0'; 926 } 927 928 return TRUE; 929 } 930 931 /* Create an entry in a Nios II ELF linker hash table. */ 932 static struct bfd_hash_entry * 933 link_hash_newfunc (struct bfd_hash_entry *entry, 934 struct bfd_hash_table *table, const char *string) 935 { 936 /* Allocate the structure if it has not already been allocated by a 937 subclass. */ 938 if (entry == NULL) 939 { 940 entry = bfd_hash_allocate (table, 941 sizeof (struct elf32_nios2_link_hash_entry)); 942 if (entry == NULL) 943 return entry; 944 } 945 946 /* Call the allocation method of the superclass. */ 947 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 948 if (entry) 949 { 950 struct elf32_nios2_link_hash_entry *eh; 951 952 eh = (struct elf32_nios2_link_hash_entry *) entry; 953 eh->dyn_relocs = NULL; 954 eh->tls_type = GOT_UNKNOWN; 955 eh->got_types_used = 0; 956 } 957 958 return entry; 959 } 960 961 /* Implement bfd_elf32_bfd_reloc_type_lookup: 962 Given a BFD reloc type, return a howto structure. */ 963 static reloc_howto_type * 964 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 965 bfd_reloc_code_real_type code) 966 { 967 int i; 968 for (i = 0; 969 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map)); 970 ++i) 971 if (nios2_reloc_map[i].bfd_val == code) 972 return &elf_nios2_howto_table_rel[(int) nios2_reloc_map[i].elf_val]; 973 return NULL; 974 } 975 976 /* Implement bfd_elf32_bfd_reloc_name_lookup: 977 Given a reloc name, return a howto structure. */ 978 static reloc_howto_type * 979 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 980 const char *r_name) 981 { 982 unsigned int i; 983 for (i = 0; 984 i < (sizeof (elf_nios2_howto_table_rel) 985 / sizeof (elf_nios2_howto_table_rel[0])); 986 i++) 987 if (elf_nios2_howto_table_rel[i].name 988 && strcasecmp (elf_nios2_howto_table_rel[i].name, r_name) == 0) 989 return &elf_nios2_howto_table_rel[i]; 990 991 return NULL; 992 } 993 994 /* Implement elf_info_to_howto: 995 Given a ELF32 relocation, fill in a arelent structure. */ 996 static void 997 nios2_elf32_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, 998 Elf_Internal_Rela *dst) 999 { 1000 unsigned int r_type; 1001 1002 r_type = ELF32_R_TYPE (dst->r_info); 1003 BFD_ASSERT (r_type < R_NIOS2_ILLEGAL); 1004 cache_ptr->howto = &elf_nios2_howto_table_rel[r_type]; 1005 } 1006 1007 /* Return the base VMA address which should be subtracted from real addresses 1008 when resolving @dtpoff relocation. 1009 This is PT_TLS segment p_vaddr. */ 1010 static bfd_vma 1011 dtpoff_base (struct bfd_link_info *info) 1012 { 1013 /* If tls_sec is NULL, we should have signalled an error already. */ 1014 if (elf_hash_table (info)->tls_sec == NULL) 1015 return 0; 1016 return elf_hash_table (info)->tls_sec->vma; 1017 } 1018 1019 /* Return the relocation value for @tpoff relocation 1020 if STT_TLS virtual address is ADDRESS. */ 1021 static bfd_vma 1022 tpoff (struct bfd_link_info *info, bfd_vma address) 1023 { 1024 struct elf_link_hash_table *htab = elf_hash_table (info); 1025 1026 /* If tls_sec is NULL, we should have signalled an error already. */ 1027 if (htab->tls_sec == NULL) 1028 return 0; 1029 return address - htab->tls_sec->vma; 1030 } 1031 1032 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a 1033 dangerous relocation. */ 1034 static bfd_boolean 1035 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info) 1036 { 1037 1038 bfd_boolean gp_found; 1039 struct bfd_hash_entry *h; 1040 struct bfd_link_hash_entry *lh; 1041 1042 /* If we've already figured out what GP will be, just return it. */ 1043 *pgp = _bfd_get_gp_value (output_bfd); 1044 if (*pgp) 1045 return TRUE; 1046 1047 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE); 1048 lh = (struct bfd_link_hash_entry *) h; 1049 lookup: 1050 if (lh) 1051 { 1052 switch (lh->type) 1053 { 1054 case bfd_link_hash_undefined: 1055 case bfd_link_hash_undefweak: 1056 case bfd_link_hash_common: 1057 gp_found = FALSE; 1058 break; 1059 case bfd_link_hash_defined: 1060 case bfd_link_hash_defweak: 1061 gp_found = TRUE; 1062 *pgp = lh->u.def.value; 1063 break; 1064 case bfd_link_hash_indirect: 1065 case bfd_link_hash_warning: 1066 lh = lh->u.i.link; 1067 /* @@FIXME ignoring warning for now */ 1068 goto lookup; 1069 case bfd_link_hash_new: 1070 default: 1071 abort (); 1072 } 1073 } 1074 else 1075 gp_found = FALSE; 1076 1077 if (!gp_found) 1078 { 1079 /* Only get the error once. */ 1080 *pgp = 4; 1081 _bfd_set_gp_value (output_bfd, *pgp); 1082 return FALSE; 1083 } 1084 1085 _bfd_set_gp_value (output_bfd, *pgp); 1086 1087 return TRUE; 1088 } 1089 1090 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous 1091 if it's not available as we don't have a link_info pointer available here 1092 to look it up in the output symbol table. We don't need to adjust the 1093 symbol value for an external symbol if we are producing relocatable 1094 output. */ 1095 static bfd_reloc_status_type 1096 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 1097 char **error_message, bfd_vma *pgp) 1098 { 1099 if (bfd_is_und_section (symbol->section) && !relocatable) 1100 { 1101 *pgp = 0; 1102 return bfd_reloc_undefined; 1103 } 1104 1105 *pgp = _bfd_get_gp_value (output_bfd); 1106 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)) 1107 { 1108 if (relocatable) 1109 { 1110 /* Make up a value. */ 1111 *pgp = symbol->section->output_section->vma + 0x4000; 1112 _bfd_set_gp_value (output_bfd, *pgp); 1113 } 1114 else 1115 { 1116 *error_message 1117 = (char *) _("global pointer relative relocation when _gp not defined"); 1118 return bfd_reloc_dangerous; 1119 } 1120 } 1121 1122 return bfd_reloc_ok; 1123 } 1124 1125 /* The usual way of loading a 32-bit constant into a Nios II register is to 1126 load the high 16 bits in one instruction and then add the low 16 bits with 1127 a signed add. This means that the high halfword needs to be adjusted to 1128 compensate for the sign bit of the low halfword. This function returns the 1129 adjusted high halfword for a given 32-bit constant. */ 1130 static 1131 bfd_vma hiadj (bfd_vma symbol_value) 1132 { 1133 return ((symbol_value + 0x8000) >> 16) & 0xffff; 1134 } 1135 1136 /* Do the relocations that require special handling. */ 1137 static bfd_reloc_status_type 1138 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto, 1139 asection *input_section, 1140 bfd_byte *data, bfd_vma offset, 1141 bfd_vma symbol_value, bfd_vma addend) 1142 { 1143 symbol_value = symbol_value + addend; 1144 addend = 0; 1145 symbol_value = (symbol_value >> 16) & 0xffff; 1146 return _bfd_final_link_relocate (howto, abfd, input_section, 1147 data, offset, symbol_value, addend); 1148 } 1149 1150 static bfd_reloc_status_type 1151 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto, 1152 asection *input_section, 1153 bfd_byte *data, bfd_vma offset, 1154 bfd_vma symbol_value, bfd_vma addend) 1155 { 1156 symbol_value = symbol_value + addend; 1157 addend = 0; 1158 symbol_value = symbol_value & 0xffff; 1159 return _bfd_final_link_relocate (howto, abfd, input_section, 1160 data, offset, symbol_value, addend); 1161 } 1162 1163 static bfd_reloc_status_type 1164 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto, 1165 asection *input_section, 1166 bfd_byte *data, bfd_vma offset, 1167 bfd_vma symbol_value, bfd_vma addend) 1168 { 1169 symbol_value = symbol_value + addend; 1170 addend = 0; 1171 symbol_value = hiadj(symbol_value); 1172 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset, 1173 symbol_value, addend); 1174 } 1175 1176 static bfd_reloc_status_type 1177 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto, 1178 asection *input_section, 1179 bfd_byte *data, bfd_vma offset, 1180 bfd_vma symbol_value, bfd_vma addend) 1181 { 1182 symbol_value = symbol_value + addend; 1183 addend = 0; 1184 symbol_value = symbol_value & 0xffff; 1185 return _bfd_final_link_relocate (howto, abfd, input_section, 1186 data, offset, symbol_value, addend); 1187 } 1188 1189 static bfd_reloc_status_type 1190 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto, 1191 asection *input_section, 1192 bfd_byte *data, bfd_vma offset, 1193 bfd_vma symbol_value, bfd_vma addend) 1194 { 1195 symbol_value = symbol_value + addend; 1196 symbol_value -= (input_section->output_section->vma 1197 + input_section->output_offset); 1198 symbol_value -= offset; 1199 addend = 0; 1200 symbol_value = hiadj(symbol_value); 1201 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset, 1202 symbol_value, addend); 1203 } 1204 1205 static bfd_reloc_status_type 1206 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto, 1207 asection *input_section, 1208 bfd_byte *data, bfd_vma offset, 1209 bfd_vma symbol_value, bfd_vma addend) 1210 { 1211 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction 1212 so we need to subtract 4 before doing a final_link_relocate. */ 1213 symbol_value = symbol_value + addend - 4; 1214 addend = 0; 1215 return _bfd_final_link_relocate (howto, abfd, input_section, 1216 data, offset, symbol_value, addend); 1217 } 1218 1219 static bfd_reloc_status_type 1220 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto, 1221 asection *input_section, 1222 bfd_byte *data, bfd_vma offset, 1223 bfd_vma symbol_value, bfd_vma addend) 1224 { 1225 /* Check that the relocation is in the same page as the current address. */ 1226 if (((symbol_value + addend) & 0xf0000000) 1227 != ((input_section->output_section->vma + offset) & 0xf0000000)) 1228 return bfd_reloc_overflow; 1229 1230 return _bfd_final_link_relocate (howto, abfd, input_section, 1231 data, offset, symbol_value, addend); 1232 } 1233 1234 static bfd_reloc_status_type 1235 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto, 1236 asection *input_section, 1237 bfd_byte *data, bfd_vma offset, 1238 bfd_vma symbol_value, bfd_vma addend) 1239 { 1240 /* Because we need the output_bfd, the special handling is done 1241 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */ 1242 return _bfd_final_link_relocate (howto, abfd, input_section, 1243 data, offset, symbol_value, addend); 1244 } 1245 1246 static bfd_reloc_status_type 1247 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto, 1248 asection *input_section, 1249 bfd_byte *data, bfd_vma offset, 1250 bfd_vma symbol_value, bfd_vma addend) 1251 { 1252 bfd_vma symbol_lo16, symbol_hi16; 1253 bfd_reloc_status_type r; 1254 symbol_value = symbol_value + addend; 1255 addend = 0; 1256 symbol_hi16 = (symbol_value >> 16) & 0xffff; 1257 symbol_lo16 = symbol_value & 0xffff; 1258 1259 r = _bfd_final_link_relocate (howto, abfd, input_section, 1260 data, offset, symbol_hi16, addend); 1261 1262 if (r == bfd_reloc_ok) 1263 return _bfd_final_link_relocate (howto, abfd, input_section, 1264 data, offset + 4, symbol_lo16, addend); 1265 1266 return r; 1267 } 1268 1269 static bfd_reloc_status_type 1270 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto, 1271 asection *input_section, 1272 bfd_byte *data, bfd_vma offset, 1273 bfd_vma symbol_value, bfd_vma addend) 1274 { 1275 bfd_vma symbol_lo16, symbol_hi16; 1276 bfd_reloc_status_type r; 1277 symbol_value = symbol_value + addend; 1278 addend = 0; 1279 symbol_hi16 = (symbol_value >> 16) & 0xffff; 1280 symbol_lo16 = symbol_value & 0xffff; 1281 1282 r = _bfd_final_link_relocate (howto, abfd, input_section, 1283 data, offset, symbol_hi16, addend); 1284 1285 if (r == bfd_reloc_ok) 1286 return _bfd_final_link_relocate (howto, abfd, input_section, 1287 data, offset + 4, symbol_lo16, addend); 1288 1289 return r; 1290 } 1291 1292 static bfd_reloc_status_type 1293 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto, 1294 asection *input_section, 1295 bfd_byte *data, bfd_vma offset, 1296 bfd_vma symbol_value, bfd_vma addend) 1297 { 1298 bfd_vma symbol_lo16, symbol_hi16; 1299 bfd_reloc_status_type r; 1300 symbol_value = symbol_value + addend; 1301 addend = 0; 1302 symbol_hi16 = (symbol_value >> 16) & 0xffff; 1303 symbol_lo16 = symbol_value & 0xffff; 1304 1305 r = _bfd_final_link_relocate (howto, abfd, input_section, 1306 data, offset, symbol_hi16, addend); 1307 1308 if (r == bfd_reloc_ok) 1309 return _bfd_final_link_relocate (howto, abfd, input_section, 1310 data, offset + 4, symbol_lo16, addend); 1311 1312 return r; 1313 } 1314 1315 /* HOWTO handlers for relocations that require special handling. */ 1316 1317 /* This is for relocations used only when relaxing to ensure 1318 changes in size of section don't screw up .align. */ 1319 static bfd_reloc_status_type 1320 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 1321 asymbol *symbol ATTRIBUTE_UNUSED, 1322 void *data ATTRIBUTE_UNUSED, asection *input_section, 1323 bfd *output_bfd, 1324 char **error_message ATTRIBUTE_UNUSED) 1325 { 1326 if (output_bfd != NULL) 1327 reloc_entry->address += input_section->output_offset; 1328 return bfd_reloc_ok; 1329 } 1330 1331 static bfd_reloc_status_type 1332 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1333 void *data, asection *input_section, 1334 bfd *output_bfd, 1335 char **error_message ATTRIBUTE_UNUSED) 1336 { 1337 /* This part is from bfd_elf_generic_reloc. */ 1338 if (output_bfd != NULL 1339 && (symbol->flags & BSF_SECTION_SYM) == 0 1340 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1341 { 1342 reloc_entry->address += input_section->output_offset; 1343 return bfd_reloc_ok; 1344 } 1345 1346 if (output_bfd != NULL) 1347 /* FIXME: See bfd_perform_relocation. Is this right? */ 1348 return bfd_reloc_continue; 1349 1350 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto, 1351 input_section, 1352 data, reloc_entry->address, 1353 (symbol->value 1354 + symbol->section->output_section->vma 1355 + symbol->section->output_offset), 1356 reloc_entry->addend); 1357 } 1358 1359 static bfd_reloc_status_type 1360 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1361 void *data, asection *input_section, 1362 bfd *output_bfd, 1363 char **error_message ATTRIBUTE_UNUSED) 1364 { 1365 /* This part is from bfd_elf_generic_reloc. */ 1366 if (output_bfd != NULL 1367 && (symbol->flags & BSF_SECTION_SYM) == 0 1368 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1369 { 1370 reloc_entry->address += input_section->output_offset; 1371 return bfd_reloc_ok; 1372 } 1373 1374 if (output_bfd != NULL) 1375 /* FIXME: See bfd_perform_relocation. Is this right? */ 1376 return bfd_reloc_continue; 1377 1378 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto, 1379 input_section, 1380 data, reloc_entry->address, 1381 (symbol->value 1382 + symbol->section->output_section->vma 1383 + symbol->section->output_offset), 1384 reloc_entry->addend); 1385 } 1386 1387 static bfd_reloc_status_type 1388 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1389 void *data, asection *input_section, 1390 bfd *output_bfd, 1391 char **error_message ATTRIBUTE_UNUSED) 1392 { 1393 /* This part is from bfd_elf_generic_reloc. */ 1394 if (output_bfd != NULL 1395 && (symbol->flags & BSF_SECTION_SYM) == 0 1396 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1397 { 1398 reloc_entry->address += input_section->output_offset; 1399 return bfd_reloc_ok; 1400 } 1401 1402 if (output_bfd != NULL) 1403 /* FIXME: See bfd_perform_relocation. Is this right? */ 1404 return bfd_reloc_continue; 1405 1406 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto, 1407 input_section, 1408 data, reloc_entry->address, 1409 (symbol->value 1410 + symbol->section->output_section->vma 1411 + symbol->section->output_offset), 1412 reloc_entry->addend); 1413 } 1414 1415 static bfd_reloc_status_type 1416 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry, 1417 asymbol *symbol, void *data, 1418 asection *input_section, bfd *output_bfd, 1419 char **error_message ATTRIBUTE_UNUSED) 1420 { 1421 /* This part is from bfd_elf_generic_reloc. */ 1422 if (output_bfd != NULL 1423 && (symbol->flags & BSF_SECTION_SYM) == 0 1424 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1425 { 1426 reloc_entry->address += input_section->output_offset; 1427 return bfd_reloc_ok; 1428 } 1429 1430 if (output_bfd != NULL) 1431 /* FIXME: See bfd_perform_relocation. Is this right? */ 1432 return bfd_reloc_continue; 1433 1434 return nios2_elf32_do_pcrel_lo16_relocate ( 1435 abfd, reloc_entry->howto, input_section, data, reloc_entry->address, 1436 (symbol->value + symbol->section->output_section->vma 1437 + symbol->section->output_offset), 1438 reloc_entry->addend); 1439 } 1440 1441 static bfd_reloc_status_type 1442 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, 1443 asymbol *symbol, void *data, 1444 asection *input_section, bfd *output_bfd, 1445 char **error_message ATTRIBUTE_UNUSED) 1446 { 1447 /* This part is from bfd_elf_generic_reloc. */ 1448 if (output_bfd != NULL 1449 && (symbol->flags & BSF_SECTION_SYM) == 0 1450 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1451 { 1452 reloc_entry->address += input_section->output_offset; 1453 return bfd_reloc_ok; 1454 } 1455 1456 if (output_bfd != NULL) 1457 /* FIXME: See bfd_perform_relocation. Is this right? */ 1458 return bfd_reloc_continue; 1459 1460 return nios2_elf32_do_pcrel_hiadj16_relocate ( 1461 abfd, reloc_entry->howto, input_section, data, reloc_entry->address, 1462 (symbol->value + symbol->section->output_section->vma 1463 + symbol->section->output_offset), 1464 reloc_entry->addend); 1465 } 1466 1467 static bfd_reloc_status_type 1468 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1469 void *data, asection *input_section, 1470 bfd *output_bfd, 1471 char **error_message ATTRIBUTE_UNUSED) 1472 { 1473 /* This part is from bfd_elf_generic_reloc. */ 1474 if (output_bfd != NULL 1475 && (symbol->flags & BSF_SECTION_SYM) == 0 1476 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1477 { 1478 reloc_entry->address += input_section->output_offset; 1479 return bfd_reloc_ok; 1480 } 1481 1482 if (output_bfd != NULL) 1483 /* FIXME: See bfd_perform_relocation. Is this right? */ 1484 return bfd_reloc_continue; 1485 1486 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto, 1487 input_section, 1488 data, reloc_entry->address, 1489 (symbol->value 1490 + symbol->section->output_section->vma 1491 + symbol->section->output_offset), 1492 reloc_entry->addend); 1493 } 1494 1495 static bfd_reloc_status_type 1496 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1497 void *data, asection *input_section, 1498 bfd *output_bfd, 1499 char **error_message ATTRIBUTE_UNUSED) 1500 { 1501 /* This part is from bfd_elf_generic_reloc. */ 1502 if (output_bfd != NULL 1503 && (symbol->flags & BSF_SECTION_SYM) == 0 1504 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1505 { 1506 reloc_entry->address += input_section->output_offset; 1507 return bfd_reloc_ok; 1508 } 1509 1510 if (output_bfd != NULL) 1511 /* FIXME: See bfd_perform_relocation. Is this right? */ 1512 return bfd_reloc_continue; 1513 1514 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto, 1515 input_section, 1516 data, reloc_entry->address, 1517 (symbol->value 1518 + symbol->section->output_section->vma 1519 + symbol->section->output_offset), 1520 reloc_entry->addend); 1521 } 1522 1523 static bfd_reloc_status_type 1524 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1525 void *data, asection *input_section, 1526 bfd *output_bfd, char **msg) 1527 { 1528 bfd_vma relocation; 1529 bfd_vma gp; 1530 bfd_reloc_status_type r; 1531 1532 1533 /* This part is from bfd_elf_generic_reloc. */ 1534 if (output_bfd != NULL 1535 && (symbol->flags & BSF_SECTION_SYM) == 0 1536 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1537 { 1538 reloc_entry->address += input_section->output_offset; 1539 return bfd_reloc_ok; 1540 } 1541 1542 if (output_bfd != NULL) 1543 /* FIXME: See bfd_perform_relocation. Is this right? */ 1544 return bfd_reloc_continue; 1545 1546 relocation = (symbol->value 1547 + symbol->section->output_section->vma 1548 + symbol->section->output_offset); 1549 1550 /* This assumes we've already cached the _gp symbol. */ 1551 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp); 1552 if (r == bfd_reloc_ok) 1553 { 1554 relocation = relocation + reloc_entry->addend - gp; 1555 reloc_entry->addend = 0; 1556 if ((signed) relocation < -32768 || (signed) relocation > 32767) 1557 { 1558 *msg = _("global pointer relative address out of range"); 1559 r = bfd_reloc_outofrange; 1560 } 1561 else 1562 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto, 1563 input_section, 1564 data, reloc_entry->address, 1565 relocation, reloc_entry->addend); 1566 } 1567 1568 return r; 1569 } 1570 1571 static bfd_reloc_status_type 1572 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1573 void *data, asection *input_section, 1574 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 1575 { 1576 /* This part is from bfd_elf_generic_reloc. */ 1577 if (output_bfd != NULL 1578 && (symbol->flags & BSF_SECTION_SYM) == 0 1579 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1580 { 1581 reloc_entry->address += input_section->output_offset; 1582 return bfd_reloc_ok; 1583 } 1584 1585 if (output_bfd != NULL) 1586 /* FIXME: See bfd_perform_relocation. Is this right? */ 1587 return bfd_reloc_continue; 1588 1589 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto, 1590 input_section, 1591 data, reloc_entry->address, 1592 (symbol->value 1593 + symbol->section->output_section->vma 1594 + symbol->section->output_offset), 1595 reloc_entry->addend); 1596 } 1597 1598 static bfd_reloc_status_type 1599 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1600 void *data, asection *input_section, 1601 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 1602 { 1603 /* This part is from bfd_elf_generic_reloc. */ 1604 if (output_bfd != NULL 1605 && (symbol->flags & BSF_SECTION_SYM) == 0 1606 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1607 { 1608 reloc_entry->address += input_section->output_offset; 1609 return bfd_reloc_ok; 1610 } 1611 1612 if (output_bfd != NULL) 1613 /* FIXME: See bfd_perform_relocation. Is this right? */ 1614 return bfd_reloc_continue; 1615 1616 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto, 1617 input_section, 1618 data, reloc_entry->address, 1619 (symbol->value 1620 + symbol->section->output_section->vma 1621 + symbol->section->output_offset), 1622 reloc_entry->addend); 1623 } 1624 1625 static bfd_reloc_status_type 1626 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 1627 void *data, asection *input_section, 1628 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 1629 { 1630 /* This part is from bfd_elf_generic_reloc. */ 1631 if (output_bfd != NULL 1632 && (symbol->flags & BSF_SECTION_SYM) == 0 1633 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 1634 { 1635 reloc_entry->address += input_section->output_offset; 1636 return bfd_reloc_ok; 1637 } 1638 1639 if (output_bfd != NULL) 1640 /* FIXME: See bfd_perform_relocation. Is this right? */ 1641 return bfd_reloc_continue; 1642 1643 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto, 1644 input_section, 1645 data, reloc_entry->address, 1646 (symbol->value 1647 + symbol->section->output_section->vma 1648 + symbol->section->output_offset), 1649 reloc_entry->addend); 1650 } 1651 1652 1653 /* Implement elf_backend_relocate_section. */ 1654 static bfd_boolean 1655 nios2_elf32_relocate_section (bfd *output_bfd, 1656 struct bfd_link_info *info, 1657 bfd *input_bfd, 1658 asection *input_section, 1659 bfd_byte *contents, 1660 Elf_Internal_Rela *relocs, 1661 Elf_Internal_Sym *local_syms, 1662 asection **local_sections) 1663 { 1664 Elf_Internal_Shdr *symtab_hdr; 1665 struct elf_link_hash_entry **sym_hashes; 1666 Elf_Internal_Rela *rel; 1667 Elf_Internal_Rela *relend; 1668 struct elf32_nios2_link_hash_table *htab; 1669 asection *sgot; 1670 asection *splt; 1671 asection *sreloc = NULL; 1672 bfd_vma *local_got_offsets; 1673 1674 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 1675 sym_hashes = elf_sym_hashes (input_bfd); 1676 relend = relocs + input_section->reloc_count; 1677 1678 htab = elf32_nios2_hash_table (info); 1679 sgot = htab->root.sgot; 1680 splt = htab->root.splt; 1681 local_got_offsets = elf_local_got_offsets (input_bfd); 1682 1683 for (rel = relocs; rel < relend; rel++) 1684 { 1685 reloc_howto_type *howto; 1686 unsigned long r_symndx; 1687 Elf_Internal_Sym *sym; 1688 asection *sec; 1689 struct elf_link_hash_entry *h; 1690 struct elf32_nios2_link_hash_entry *eh; 1691 bfd_vma relocation; 1692 bfd_vma gp; 1693 bfd_vma reloc_address; 1694 bfd_reloc_status_type r = bfd_reloc_ok; 1695 const char *name = NULL; 1696 int r_type; 1697 const char *format; 1698 char msgbuf[256]; 1699 const char* msg = (const char*) NULL; 1700 bfd_boolean unresolved_reloc; 1701 bfd_vma off; 1702 int use_plt; 1703 1704 r_type = ELF32_R_TYPE (rel->r_info); 1705 r_symndx = ELF32_R_SYM (rel->r_info); 1706 1707 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info)); 1708 h = NULL; 1709 sym = NULL; 1710 sec = NULL; 1711 1712 if (r_symndx < symtab_hdr->sh_info) 1713 { 1714 sym = local_syms + r_symndx; 1715 sec = local_sections[r_symndx]; 1716 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 1717 } 1718 else 1719 { 1720 bfd_boolean warned, ignored; 1721 1722 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 1723 r_symndx, symtab_hdr, sym_hashes, 1724 h, sec, relocation, 1725 unresolved_reloc, warned, ignored); 1726 } 1727 1728 if (sec && discarded_section (sec)) 1729 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 1730 rel, 1, relend, howto, 0, contents); 1731 1732 /* Nothing more to do unless this is a final link. */ 1733 if (info->relocatable) 1734 continue; 1735 1736 if (sec && sec->output_section) 1737 reloc_address = (sec->output_section->vma + sec->output_offset 1738 + rel->r_offset); 1739 else 1740 reloc_address = 0; 1741 1742 if (howto) 1743 { 1744 switch (howto->type) 1745 { 1746 case R_NIOS2_HI16: 1747 r = nios2_elf32_do_hi16_relocate (input_bfd, howto, 1748 input_section, 1749 contents, rel->r_offset, 1750 relocation, rel->r_addend); 1751 break; 1752 case R_NIOS2_LO16: 1753 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 1754 input_section, 1755 contents, rel->r_offset, 1756 relocation, rel->r_addend); 1757 break; 1758 case R_NIOS2_PCREL_LO: 1759 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto, 1760 input_section, 1761 contents, 1762 rel->r_offset, 1763 relocation, 1764 rel->r_addend); 1765 break; 1766 case R_NIOS2_HIADJ16: 1767 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 1768 input_section, contents, 1769 rel->r_offset, relocation, 1770 rel->r_addend); 1771 break; 1772 case R_NIOS2_PCREL_HA: 1773 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto, 1774 input_section, 1775 contents, 1776 rel->r_offset, 1777 relocation, 1778 rel->r_addend); 1779 break; 1780 case R_NIOS2_PCREL16: 1781 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto, 1782 input_section, contents, 1783 rel->r_offset, relocation, 1784 rel->r_addend); 1785 break; 1786 case R_NIOS2_GPREL: 1787 /* Turns an absolute address into a gp-relative address. */ 1788 if (!nios2_elf_assign_gp (output_bfd, &gp, info)) 1789 { 1790 format = _("global pointer relative relocation at address " 1791 "0x%08x when _gp not defined\n"); 1792 sprintf (msgbuf, format, reloc_address); 1793 msg = msgbuf; 1794 r = bfd_reloc_dangerous; 1795 } 1796 else 1797 { 1798 bfd_vma symbol_address = rel->r_addend + relocation; 1799 relocation = relocation + rel->r_addend - gp; 1800 rel->r_addend = 0; 1801 if (((signed) relocation < -32768 1802 || (signed) relocation > 32767) 1803 && (!h 1804 || h->root.type == bfd_link_hash_defined 1805 || h->root.type == bfd_link_hash_defweak)) 1806 { 1807 format = _("Unable to reach %s (at 0x%08x) from the " 1808 "global pointer (at 0x%08x) because the " 1809 "offset (%d) is out of the allowed range, " 1810 "-32678 to 32767.\n" ); 1811 sprintf (msgbuf, format, name, symbol_address, gp, 1812 (signed)relocation); 1813 msg = msgbuf; 1814 r = bfd_reloc_outofrange; 1815 } 1816 else 1817 r = _bfd_final_link_relocate (howto, input_bfd, 1818 input_section, contents, 1819 rel->r_offset, relocation, 1820 rel->r_addend); 1821 } 1822 1823 break; 1824 case R_NIOS2_UJMP: 1825 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto, 1826 input_section, 1827 contents, rel->r_offset, 1828 relocation, rel->r_addend); 1829 break; 1830 case R_NIOS2_CJMP: 1831 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto, 1832 input_section, 1833 contents, rel->r_offset, 1834 relocation, rel->r_addend); 1835 break; 1836 case R_NIOS2_CALLR: 1837 r = nios2_elf32_do_callr_relocate (input_bfd, howto, 1838 input_section, contents, 1839 rel->r_offset, relocation, 1840 rel->r_addend); 1841 break; 1842 case R_NIOS2_CALL26: 1843 /* If we have a call to an undefined weak symbol, we just want 1844 to stuff a zero in the bits of the call instruction and 1845 bypass the normal call26 relocation handling, because it'll 1846 diagnose an overflow error if address 0 isn't in the same 1847 256MB segment as the call site. Presumably the call 1848 should be guarded by a null check anyway. */ 1849 if (h != NULL && h->root.type == bfd_link_hash_undefweak) 1850 { 1851 BFD_ASSERT (relocation == 0 && rel->r_addend == 0); 1852 r = _bfd_final_link_relocate (howto, input_bfd, 1853 input_section, contents, 1854 rel->r_offset, relocation, 1855 rel->r_addend); 1856 break; 1857 } 1858 /* Handle relocations which should use the PLT entry. 1859 NIOS2_BFD_RELOC_32 relocations will use the symbol's value, 1860 which may point to a PLT entry, but we don't need to handle 1861 that here. If we created a PLT entry, all branches in this 1862 object should go to it. */ 1863 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1) 1864 { 1865 /* If we've created a .plt section, and assigned a PLT entry 1866 to this function, it should not be known to bind locally. 1867 If it were, we would have cleared the PLT entry. */ 1868 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h)); 1869 1870 relocation = (splt->output_section->vma 1871 + splt->output_offset 1872 + h->plt.offset); 1873 1874 unresolved_reloc = FALSE; 1875 } 1876 r = nios2_elf32_do_call26_relocate (input_bfd, howto, 1877 input_section, contents, 1878 rel->r_offset, relocation, 1879 rel->r_addend); 1880 break; 1881 case R_NIOS2_ALIGN: 1882 r = bfd_reloc_ok; 1883 /* For symmetry this would be 1884 r = nios2_elf32_do_ignore_reloc (input_bfd, howto, 1885 input_section, contents, 1886 rel->r_offset, relocation, 1887 rel->r_addend); 1888 but do_ignore_reloc would do no more than return 1889 bfd_reloc_ok. */ 1890 break; 1891 1892 case R_NIOS2_GOT16: 1893 case R_NIOS2_CALL16: 1894 /* Relocation is to the entry for this symbol in the 1895 global offset table. */ 1896 if (sgot == NULL) 1897 { 1898 r = bfd_reloc_notsupported; 1899 break; 1900 } 1901 1902 use_plt = 0; 1903 1904 if (h != NULL) 1905 { 1906 bfd_boolean dyn; 1907 1908 eh = (struct elf32_nios2_link_hash_entry *)h; 1909 use_plt = (eh->got_types_used == CALL16_USED 1910 && h->plt.offset != (bfd_vma) -1); 1911 1912 off = h->got.offset; 1913 BFD_ASSERT (off != (bfd_vma) -1); 1914 dyn = elf_hash_table (info)->dynamic_sections_created; 1915 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) 1916 || (info->shared 1917 && SYMBOL_REFERENCES_LOCAL (info, h)) 1918 || (ELF_ST_VISIBILITY (h->other) 1919 && h->root.type == bfd_link_hash_undefweak)) 1920 { 1921 /* This is actually a static link, or it is a -Bsymbolic 1922 link and the symbol is defined locally. We must 1923 initialize this entry in the global offset table. 1924 Since the offset must always be a multiple of 4, we 1925 use the least significant bit to record whether we 1926 have initialized it already. 1927 1928 When doing a dynamic link, we create a .rela.got 1929 relocation entry to initialize the value. This is 1930 done in the finish_dynamic_symbol routine. */ 1931 if ((off & 1) != 0) 1932 off &= ~1; 1933 else 1934 { 1935 bfd_put_32 (output_bfd, relocation, 1936 sgot->contents + off); 1937 h->got.offset |= 1; 1938 } 1939 } 1940 else 1941 unresolved_reloc = FALSE; 1942 } 1943 else 1944 { 1945 BFD_ASSERT (local_got_offsets != NULL 1946 && local_got_offsets[r_symndx] != (bfd_vma) -1); 1947 1948 off = local_got_offsets[r_symndx]; 1949 1950 /* The offset must always be a multiple of 4. We use the 1951 least significant bit to record whether we have already 1952 generated the necessary reloc. */ 1953 if ((off & 1) != 0) 1954 off &= ~1; 1955 else 1956 { 1957 bfd_put_32 (output_bfd, relocation, 1958 sgot->contents + off); 1959 1960 if (info->shared) 1961 { 1962 asection *srelgot; 1963 Elf_Internal_Rela outrel; 1964 bfd_byte *loc; 1965 1966 srelgot = htab->root.srelgot; 1967 BFD_ASSERT (srelgot != NULL); 1968 1969 outrel.r_addend = relocation; 1970 outrel.r_offset = (sgot->output_section->vma 1971 + sgot->output_offset 1972 + off); 1973 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 1974 loc = srelgot->contents; 1975 loc += (srelgot->reloc_count++ * 1976 sizeof (Elf32_External_Rela)); 1977 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 1978 } 1979 1980 local_got_offsets[r_symndx] |= 1; 1981 } 1982 } 1983 1984 if (use_plt && info->shared) 1985 { 1986 off = ((h->plt.offset - 24) / 12 + 3) * 4; 1987 relocation = htab->root.sgotplt->output_offset + off; 1988 } 1989 else 1990 relocation = sgot->output_offset + off; 1991 1992 /* This relocation does not use the addend. */ 1993 rel->r_addend = 0; 1994 1995 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 1996 contents, rel->r_offset, 1997 relocation, rel->r_addend); 1998 break; 1999 2000 case R_NIOS2_GOTOFF_LO: 2001 case R_NIOS2_GOTOFF_HA: 2002 case R_NIOS2_GOTOFF: 2003 /* Relocation is relative to the start of the 2004 global offset table. */ 2005 2006 BFD_ASSERT (sgot != NULL); 2007 if (sgot == NULL) 2008 { 2009 r = bfd_reloc_notsupported; 2010 break; 2011 } 2012 2013 /* Note that sgot->output_offset is not involved in this 2014 calculation. We always want the start of .got. If we 2015 define _GLOBAL_OFFSET_TABLE in a different way, as is 2016 permitted by the ABI, we might have to change this 2017 calculation. */ 2018 relocation -= sgot->output_section->vma; 2019 switch (howto->type) 2020 { 2021 case R_NIOS2_GOTOFF_LO: 2022 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 2023 input_section, contents, 2024 rel->r_offset, relocation, 2025 rel->r_addend); 2026 break; 2027 case R_NIOS2_GOTOFF_HA: 2028 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 2029 input_section, contents, 2030 rel->r_offset, 2031 relocation, 2032 rel->r_addend); 2033 break; 2034 default: 2035 r = _bfd_final_link_relocate (howto, input_bfd, 2036 input_section, contents, 2037 rel->r_offset, relocation, 2038 rel->r_addend); 2039 break; 2040 } 2041 break; 2042 2043 case R_NIOS2_TLS_LDO16: 2044 relocation -= dtpoff_base (info) + DTP_OFFSET; 2045 2046 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 2047 contents, rel->r_offset, 2048 relocation, rel->r_addend); 2049 break; 2050 case R_NIOS2_TLS_LDM16: 2051 if (htab->root.sgot == NULL) 2052 abort (); 2053 2054 off = htab->tls_ldm_got.offset; 2055 2056 if ((off & 1) != 0) 2057 off &= ~1; 2058 else 2059 { 2060 /* If we don't know the module number, create a relocation 2061 for it. */ 2062 if (info->shared) 2063 { 2064 Elf_Internal_Rela outrel; 2065 bfd_byte *loc; 2066 2067 if (htab->root.srelgot == NULL) 2068 abort (); 2069 2070 outrel.r_addend = 0; 2071 outrel.r_offset = (htab->root.sgot->output_section->vma 2072 + htab->root.sgot->output_offset 2073 + off); 2074 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD); 2075 2076 loc = htab->root.srelgot->contents; 2077 loc += (htab->root.srelgot->reloc_count++ 2078 * sizeof (Elf32_External_Rela)); 2079 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 2080 } 2081 else 2082 bfd_put_32 (output_bfd, 1, 2083 htab->root.sgot->contents + off); 2084 2085 htab->tls_ldm_got.offset |= 1; 2086 } 2087 2088 relocation = (htab->root.sgot->output_offset + off); 2089 2090 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 2091 contents, rel->r_offset, 2092 relocation, rel->r_addend); 2093 2094 break; 2095 case R_NIOS2_TLS_GD16: 2096 case R_NIOS2_TLS_IE16: 2097 { 2098 int indx; 2099 char tls_type; 2100 2101 if (htab->root.sgot == NULL) 2102 abort (); 2103 2104 indx = 0; 2105 if (h != NULL) 2106 { 2107 bfd_boolean dyn; 2108 dyn = htab->root.dynamic_sections_created; 2109 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) 2110 && (!info->shared 2111 || !SYMBOL_REFERENCES_LOCAL (info, h))) 2112 { 2113 unresolved_reloc = FALSE; 2114 indx = h->dynindx; 2115 } 2116 off = h->got.offset; 2117 tls_type = (((struct elf32_nios2_link_hash_entry *) h) 2118 ->tls_type); 2119 } 2120 else 2121 { 2122 if (local_got_offsets == NULL) 2123 abort (); 2124 off = local_got_offsets[r_symndx]; 2125 tls_type = (elf32_nios2_local_got_tls_type (input_bfd) 2126 [r_symndx]); 2127 } 2128 2129 if (tls_type == GOT_UNKNOWN) 2130 abort (); 2131 2132 if ((off & 1) != 0) 2133 off &= ~1; 2134 else 2135 { 2136 bfd_boolean need_relocs = FALSE; 2137 Elf_Internal_Rela outrel; 2138 bfd_byte *loc = NULL; 2139 int cur_off = off; 2140 2141 /* The GOT entries have not been initialized yet. Do it 2142 now, and emit any relocations. If both an IE GOT and a 2143 GD GOT are necessary, we emit the GD first. */ 2144 2145 if ((info->shared || indx != 0) 2146 && (h == NULL 2147 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 2148 || h->root.type != bfd_link_hash_undefweak)) 2149 { 2150 need_relocs = TRUE; 2151 if (htab->root.srelgot == NULL) 2152 abort (); 2153 loc = htab->root.srelgot->contents; 2154 loc += (htab->root.srelgot->reloc_count * 2155 sizeof (Elf32_External_Rela)); 2156 } 2157 2158 if (tls_type & GOT_TLS_GD) 2159 { 2160 if (need_relocs) 2161 { 2162 outrel.r_addend = 0; 2163 outrel.r_offset = (htab->root.sgot->output_section->vma 2164 + htab->root.sgot->output_offset 2165 + cur_off); 2166 outrel.r_info = ELF32_R_INFO (indx, 2167 R_NIOS2_TLS_DTPMOD); 2168 2169 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 2170 loc); 2171 htab->root.srelgot->reloc_count++; 2172 loc += sizeof (Elf32_External_Rela); 2173 2174 if (indx == 0) 2175 bfd_put_32 (output_bfd, 2176 (relocation - dtpoff_base (info) - 2177 DTP_OFFSET), 2178 htab->root.sgot->contents + cur_off + 4); 2179 else 2180 { 2181 outrel.r_addend = 0; 2182 outrel.r_info = ELF32_R_INFO (indx, 2183 R_NIOS2_TLS_DTPREL); 2184 outrel.r_offset += 4; 2185 2186 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 2187 loc); 2188 htab->root.srelgot->reloc_count++; 2189 loc += sizeof (Elf32_External_Rela); 2190 } 2191 } 2192 else 2193 { 2194 /* If we are not emitting relocations for a 2195 general dynamic reference, then we must be in a 2196 static link or an executable link with the 2197 symbol binding locally. Mark it as belonging 2198 to module 1, the executable. */ 2199 bfd_put_32 (output_bfd, 1, 2200 htab->root.sgot->contents + cur_off); 2201 bfd_put_32 (output_bfd, (relocation - 2202 dtpoff_base (info) - 2203 DTP_OFFSET), 2204 htab->root.sgot->contents + cur_off + 4); 2205 } 2206 2207 cur_off += 8; 2208 } 2209 2210 if (tls_type & GOT_TLS_IE) 2211 { 2212 if (need_relocs) 2213 { 2214 if (indx == 0) 2215 outrel.r_addend = (relocation - 2216 dtpoff_base (info)); 2217 else 2218 outrel.r_addend = 0; 2219 outrel.r_offset = (htab->root.sgot->output_section->vma 2220 + htab->root.sgot->output_offset 2221 + cur_off); 2222 outrel.r_info = ELF32_R_INFO (indx, 2223 R_NIOS2_TLS_TPREL); 2224 2225 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 2226 loc); 2227 htab->root.srelgot->reloc_count++; 2228 loc += sizeof (Elf32_External_Rela); 2229 } 2230 else 2231 bfd_put_32 (output_bfd, (tpoff (info, relocation) 2232 - TP_OFFSET), 2233 htab->root.sgot->contents + cur_off); 2234 cur_off += 4; 2235 } 2236 2237 if (h != NULL) 2238 h->got.offset |= 1; 2239 else 2240 local_got_offsets[r_symndx] |= 1; 2241 } 2242 2243 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16) 2244 off += 8; 2245 relocation = (htab->root.sgot->output_offset + off); 2246 2247 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 2248 contents, rel->r_offset, 2249 relocation, rel->r_addend); 2250 } 2251 2252 break; 2253 case R_NIOS2_TLS_LE16: 2254 if (info->shared && !info->pie) 2255 { 2256 (*_bfd_error_handler) 2257 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not " 2258 "permitted in shared object"), 2259 input_bfd, input_section, 2260 (long) rel->r_offset, howto->name); 2261 return FALSE; 2262 } 2263 else 2264 relocation = tpoff (info, relocation) - TP_OFFSET; 2265 2266 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 2267 contents, rel->r_offset, 2268 relocation, rel->r_addend); 2269 break; 2270 2271 case R_NIOS2_BFD_RELOC_32: 2272 if (info->shared 2273 && (input_section->flags & SEC_ALLOC) != 0 2274 && (h == NULL 2275 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 2276 || h->root.type != bfd_link_hash_undefweak)) 2277 { 2278 Elf_Internal_Rela outrel; 2279 bfd_byte *loc; 2280 bfd_boolean skip, relocate; 2281 2282 /* When generating a shared object, these relocations 2283 are copied into the output file to be resolved at run 2284 time. */ 2285 2286 skip = FALSE; 2287 relocate = FALSE; 2288 2289 outrel.r_offset 2290 = _bfd_elf_section_offset (output_bfd, info, 2291 input_section, rel->r_offset); 2292 if (outrel.r_offset == (bfd_vma) -1) 2293 skip = TRUE; 2294 else if (outrel.r_offset == (bfd_vma) -2) 2295 skip = TRUE, relocate = TRUE; 2296 outrel.r_offset += (input_section->output_section->vma 2297 + input_section->output_offset); 2298 2299 if (skip) 2300 memset (&outrel, 0, sizeof outrel); 2301 else if (h != NULL 2302 && h->dynindx != -1 2303 && (!info->shared 2304 || !info->symbolic 2305 || !h->def_regular)) 2306 { 2307 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); 2308 outrel.r_addend = rel->r_addend; 2309 } 2310 else 2311 { 2312 /* This symbol is local, or marked to become local. */ 2313 outrel.r_addend = relocation + rel->r_addend; 2314 relocate = TRUE; 2315 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 2316 } 2317 2318 sreloc = elf_section_data (input_section)->sreloc; 2319 if (sreloc == NULL) 2320 abort (); 2321 2322 loc = sreloc->contents; 2323 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela); 2324 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 2325 2326 /* This reloc will be computed at runtime, so there's no 2327 need to do anything now, except for R_NIOS2_BFD_RELOC_32 2328 relocations that have been turned into 2329 R_NIOS2_RELATIVE. */ 2330 if (!relocate) 2331 break; 2332 } 2333 2334 r = _bfd_final_link_relocate (howto, input_bfd, 2335 input_section, contents, 2336 rel->r_offset, relocation, 2337 rel->r_addend); 2338 break; 2339 2340 case R_NIOS2_TLS_DTPREL: 2341 relocation -= dtpoff_base (info); 2342 /* Fall through. */ 2343 2344 default: 2345 r = _bfd_final_link_relocate (howto, input_bfd, 2346 input_section, contents, 2347 rel->r_offset, relocation, 2348 rel->r_addend); 2349 break; 2350 } 2351 } 2352 else 2353 r = bfd_reloc_notsupported; 2354 2355 if (r != bfd_reloc_ok) 2356 { 2357 if (h != NULL) 2358 name = h->root.root.string; 2359 else 2360 { 2361 name = bfd_elf_string_from_elf_section (input_bfd, 2362 symtab_hdr->sh_link, 2363 sym->st_name); 2364 if (name == NULL || *name == '\0') 2365 name = bfd_section_name (input_bfd, sec); 2366 } 2367 2368 switch (r) 2369 { 2370 case bfd_reloc_overflow: 2371 r = info->callbacks->reloc_overflow (info, NULL, name, 2372 howto->name, (bfd_vma) 0, 2373 input_bfd, input_section, 2374 rel->r_offset); 2375 break; 2376 2377 case bfd_reloc_undefined: 2378 r = info->callbacks->undefined_symbol (info, name, input_bfd, 2379 input_section, 2380 rel->r_offset, TRUE); 2381 break; 2382 2383 case bfd_reloc_outofrange: 2384 if (msg == NULL) 2385 msg = _("relocation out of range"); 2386 break; 2387 2388 case bfd_reloc_notsupported: 2389 if (msg == NULL) 2390 msg = _("unsupported relocation"); 2391 break; 2392 2393 case bfd_reloc_dangerous: 2394 if (msg == NULL) 2395 msg = _("dangerous relocation"); 2396 break; 2397 2398 default: 2399 if (msg == NULL) 2400 msg = _("unknown error"); 2401 break; 2402 } 2403 2404 if (msg) 2405 { 2406 r = info->callbacks->warning 2407 (info, msg, name, input_bfd, input_section, rel->r_offset); 2408 return FALSE; 2409 } 2410 } 2411 } 2412 return TRUE; 2413 } 2414 2415 /* Implement elf-backend_section_flags: 2416 Convert NIOS2 specific section flags to bfd internal section flags. */ 2417 static bfd_boolean 2418 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr) 2419 { 2420 if (hdr->sh_flags & SHF_NIOS2_GPREL) 2421 *flags |= SEC_SMALL_DATA; 2422 2423 return TRUE; 2424 } 2425 2426 /* Implement elf_backend_fake_sections: 2427 Set the correct type for an NIOS2 ELF section. We do this by the 2428 section name, which is a hack, but ought to work. */ 2429 static bfd_boolean 2430 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED, 2431 Elf_Internal_Shdr *hdr, asection *sec) 2432 { 2433 register const char *name = bfd_get_section_name (abfd, sec); 2434 2435 if ((sec->flags & SEC_SMALL_DATA) 2436 || strcmp (name, ".sdata") == 0 2437 || strcmp (name, ".sbss") == 0 2438 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0) 2439 hdr->sh_flags |= SHF_NIOS2_GPREL; 2440 2441 return TRUE; 2442 } 2443 2444 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up 2445 shortcuts to them in our hash table. */ 2446 static bfd_boolean 2447 create_got_section (bfd *dynobj, struct bfd_link_info *info) 2448 { 2449 struct elf32_nios2_link_hash_table *htab; 2450 2451 htab = elf32_nios2_hash_table (info); 2452 2453 if (! _bfd_elf_create_got_section (dynobj, info)) 2454 return FALSE; 2455 2456 /* In order for the two loads in .PLTresolve to share the same %hiadj, 2457 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */ 2458 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4)) 2459 return FALSE; 2460 2461 return TRUE; 2462 } 2463 2464 /* Implement elf_backend_create_dynamic_sections: 2465 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and 2466 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our 2467 hash table. */ 2468 static bfd_boolean 2469 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) 2470 { 2471 struct elf32_nios2_link_hash_table *htab; 2472 2473 htab = elf32_nios2_hash_table (info); 2474 if (!htab->root.sgot && !create_got_section (dynobj, info)) 2475 return FALSE; 2476 2477 _bfd_elf_create_dynamic_sections (dynobj, info); 2478 2479 /* In order for the two loads in a shared object .PLTresolve to share the 2480 same %hiadj, the start of the PLT (as well as the GOT) must be aligned 2481 to a 16-byte boundary. This is because the addresses for these loads 2482 include the -(.plt+4) PIC correction. */ 2483 if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4)) 2484 return FALSE; 2485 2486 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); 2487 if (!htab->sdynbss) 2488 return FALSE; 2489 if (!info->shared) 2490 { 2491 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); 2492 if (!htab->srelbss) 2493 return FALSE; 2494 } 2495 2496 return TRUE; 2497 } 2498 2499 /* Implement elf_backend_copy_indirect_symbol: 2500 Copy the extra info we tack onto an elf_link_hash_entry. */ 2501 static void 2502 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info, 2503 struct elf_link_hash_entry *dir, 2504 struct elf_link_hash_entry *ind) 2505 { 2506 struct elf32_nios2_link_hash_entry *edir, *eind; 2507 2508 edir = (struct elf32_nios2_link_hash_entry *) dir; 2509 eind = (struct elf32_nios2_link_hash_entry *) ind; 2510 2511 if (eind->dyn_relocs != NULL) 2512 { 2513 if (edir->dyn_relocs != NULL) 2514 { 2515 struct elf32_nios2_dyn_relocs **pp; 2516 struct elf32_nios2_dyn_relocs *p; 2517 2518 /* Add reloc counts against the indirect sym to the direct sym 2519 list. Merge any entries against the same section. */ 2520 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 2521 { 2522 struct elf32_nios2_dyn_relocs *q; 2523 2524 for (q = edir->dyn_relocs; q != NULL; q = q->next) 2525 if (q->sec == p->sec) 2526 { 2527 q->pc_count += p->pc_count; 2528 q->count += p->count; 2529 *pp = p->next; 2530 break; 2531 } 2532 if (q == NULL) 2533 pp = &p->next; 2534 } 2535 *pp = edir->dyn_relocs; 2536 } 2537 2538 edir->dyn_relocs = eind->dyn_relocs; 2539 eind->dyn_relocs = NULL; 2540 } 2541 2542 if (ind->root.type == bfd_link_hash_indirect 2543 && dir->got.refcount <= 0) 2544 { 2545 edir->tls_type = eind->tls_type; 2546 eind->tls_type = GOT_UNKNOWN; 2547 } 2548 2549 edir->got_types_used |= eind->got_types_used; 2550 2551 _bfd_elf_link_hash_copy_indirect (info, dir, ind); 2552 } 2553 2554 /* Implement elf_backend_check_relocs: 2555 Look through the relocs for a section during the first phase. */ 2556 static bfd_boolean 2557 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info, 2558 asection *sec, const Elf_Internal_Rela *relocs) 2559 { 2560 bfd *dynobj; 2561 Elf_Internal_Shdr *symtab_hdr; 2562 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; 2563 const Elf_Internal_Rela *rel; 2564 const Elf_Internal_Rela *rel_end; 2565 struct elf32_nios2_link_hash_table *htab; 2566 asection *sgot; 2567 asection *srelgot; 2568 asection *sreloc = NULL; 2569 bfd_signed_vma *local_got_refcounts; 2570 2571 if (info->relocatable) 2572 return TRUE; 2573 2574 dynobj = elf_hash_table (info)->dynobj; 2575 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 2576 sym_hashes = elf_sym_hashes (abfd); 2577 sym_hashes_end = (sym_hashes 2578 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym)); 2579 if (!elf_bad_symtab (abfd)) 2580 sym_hashes_end -= symtab_hdr->sh_info; 2581 local_got_refcounts = elf_local_got_refcounts (abfd); 2582 2583 htab = elf32_nios2_hash_table (info); 2584 sgot = htab->root.sgot; 2585 srelgot = htab->root.srelgot; 2586 2587 rel_end = relocs + sec->reloc_count; 2588 for (rel = relocs; rel < rel_end; rel++) 2589 { 2590 unsigned int r_type; 2591 struct elf_link_hash_entry *h; 2592 unsigned long r_symndx; 2593 2594 r_symndx = ELF32_R_SYM (rel->r_info); 2595 if (r_symndx < symtab_hdr->sh_info) 2596 h = NULL; 2597 else 2598 { 2599 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2600 while (h->root.type == bfd_link_hash_indirect 2601 || h->root.type == bfd_link_hash_warning) 2602 h = (struct elf_link_hash_entry *) h->root.u.i.link; 2603 2604 /* PR15323, ref flags aren't set for references in the same 2605 object. */ 2606 h->root.non_ir_ref = 1; 2607 } 2608 2609 r_type = ELF32_R_TYPE (rel->r_info); 2610 2611 switch (r_type) 2612 { 2613 case R_NIOS2_GOT16: 2614 case R_NIOS2_CALL16: 2615 case R_NIOS2_TLS_GD16: 2616 case R_NIOS2_TLS_IE16: 2617 /* This symbol requires a global offset table entry. */ 2618 { 2619 int tls_type, old_tls_type; 2620 2621 switch (r_type) 2622 { 2623 default: 2624 case R_NIOS2_GOT16: 2625 case R_NIOS2_CALL16: 2626 tls_type = GOT_NORMAL; 2627 break; 2628 case R_NIOS2_TLS_GD16: 2629 tls_type = GOT_TLS_GD; 2630 break; 2631 case R_NIOS2_TLS_IE16: 2632 tls_type = GOT_TLS_IE; 2633 break; 2634 } 2635 2636 if (dynobj == NULL) 2637 { 2638 /* Create the .got section. */ 2639 elf_hash_table (info)->dynobj = dynobj = abfd; 2640 nios2_elf32_create_dynamic_sections (dynobj, info); 2641 } 2642 2643 if (sgot == NULL) 2644 { 2645 sgot = htab->root.sgot; 2646 BFD_ASSERT (sgot != NULL); 2647 } 2648 2649 if (srelgot == NULL 2650 && (h != NULL || info->shared)) 2651 { 2652 srelgot = htab->root.srelgot; 2653 BFD_ASSERT (srelgot != NULL); 2654 } 2655 2656 if (h != NULL) 2657 { 2658 struct elf32_nios2_link_hash_entry *eh 2659 = (struct elf32_nios2_link_hash_entry *)h; 2660 h->got.refcount++; 2661 old_tls_type = elf32_nios2_hash_entry(h)->tls_type; 2662 if (r_type == R_NIOS2_CALL16) 2663 { 2664 /* Make sure a plt entry is created for this symbol if 2665 it turns out to be a function defined by a dynamic 2666 object. */ 2667 h->plt.refcount++; 2668 h->needs_plt = 1; 2669 h->type = STT_FUNC; 2670 eh->got_types_used |= CALL16_USED; 2671 } 2672 else 2673 eh->got_types_used |= GOT16_USED; 2674 } 2675 else 2676 { 2677 /* This is a global offset table entry for a local symbol. */ 2678 if (local_got_refcounts == NULL) 2679 { 2680 bfd_size_type size; 2681 2682 size = symtab_hdr->sh_info; 2683 size *= (sizeof (bfd_signed_vma) + sizeof (char)); 2684 local_got_refcounts 2685 = ((bfd_signed_vma *) bfd_zalloc (abfd, size)); 2686 if (local_got_refcounts == NULL) 2687 return FALSE; 2688 elf_local_got_refcounts (abfd) = local_got_refcounts; 2689 elf32_nios2_local_got_tls_type (abfd) 2690 = (char *) (local_got_refcounts + symtab_hdr->sh_info); 2691 } 2692 local_got_refcounts[r_symndx]++; 2693 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx]; 2694 } 2695 2696 /* We will already have issued an error message if there is a 2697 TLS / non-TLS mismatch, based on the symbol type. We don't 2698 support any linker relaxations. So just combine any TLS 2699 types needed. */ 2700 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL 2701 && tls_type != GOT_NORMAL) 2702 tls_type |= old_tls_type; 2703 2704 if (old_tls_type != tls_type) 2705 { 2706 if (h != NULL) 2707 elf32_nios2_hash_entry (h)->tls_type = tls_type; 2708 else 2709 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type; 2710 } 2711 } 2712 /* Fall through */ 2713 case R_NIOS2_TLS_LDM16: 2714 if (r_type == R_NIOS2_TLS_LDM16) 2715 htab->tls_ldm_got.refcount++; 2716 2717 if (htab->root.sgot == NULL) 2718 { 2719 if (htab->root.dynobj == NULL) 2720 htab->root.dynobj = abfd; 2721 if (!create_got_section (htab->root.dynobj, info)) 2722 return FALSE; 2723 } 2724 break; 2725 2726 /* This relocation describes the C++ object vtable hierarchy. 2727 Reconstruct it for later use during GC. */ 2728 case R_NIOS2_GNU_VTINHERIT: 2729 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 2730 return FALSE; 2731 break; 2732 2733 /* This relocation describes which C++ vtable entries are actually 2734 used. Record for later use during GC. */ 2735 case R_NIOS2_GNU_VTENTRY: 2736 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 2737 return FALSE; 2738 break; 2739 2740 case R_NIOS2_BFD_RELOC_32: 2741 case R_NIOS2_CALL26: 2742 case R_NIOS2_HIADJ16: 2743 case R_NIOS2_LO16: 2744 2745 if (h != NULL) 2746 { 2747 /* If this reloc is in a read-only section, we might 2748 need a copy reloc. We can't check reliably at this 2749 stage whether the section is read-only, as input 2750 sections have not yet been mapped to output sections. 2751 Tentatively set the flag for now, and correct in 2752 adjust_dynamic_symbol. */ 2753 if (!info->shared) 2754 h->non_got_ref = 1; 2755 2756 /* Make sure a plt entry is created for this symbol if it 2757 turns out to be a function defined by a dynamic object. */ 2758 h->plt.refcount++; 2759 2760 if (r_type == R_NIOS2_CALL26) 2761 h->needs_plt = 1; 2762 } 2763 2764 /* If we are creating a shared library, we need to copy the 2765 reloc into the shared library. */ 2766 if (info->shared 2767 && (sec->flags & SEC_ALLOC) != 0 2768 && (r_type == R_NIOS2_BFD_RELOC_32 2769 || (h != NULL && ! h->needs_plt 2770 && (! info->symbolic || ! h->def_regular)))) 2771 { 2772 struct elf32_nios2_dyn_relocs *p; 2773 struct elf32_nios2_dyn_relocs **head; 2774 2775 /* When creating a shared object, we must copy these 2776 reloc types into the output file. We create a reloc 2777 section in dynobj and make room for this reloc. */ 2778 if (sreloc == NULL) 2779 { 2780 sreloc = _bfd_elf_make_dynamic_reloc_section 2781 (sec, dynobj, 2, abfd, TRUE); 2782 if (sreloc == NULL) 2783 return FALSE; 2784 } 2785 2786 /* If this is a global symbol, we count the number of 2787 relocations we need for this symbol. */ 2788 if (h != NULL) 2789 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs; 2790 else 2791 { 2792 /* Track dynamic relocs needed for local syms too. 2793 We really need local syms available to do this 2794 easily. Oh well. */ 2795 2796 asection *s; 2797 void *vpp; 2798 Elf_Internal_Sym *isym; 2799 2800 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 2801 abfd, r_symndx); 2802 if (isym == NULL) 2803 return FALSE; 2804 2805 s = bfd_section_from_elf_index (abfd, isym->st_shndx); 2806 if (s == NULL) 2807 s = sec; 2808 2809 vpp = &elf_section_data (s)->local_dynrel; 2810 head = (struct elf32_nios2_dyn_relocs **) vpp; 2811 } 2812 2813 p = *head; 2814 if (p == NULL || p->sec != sec) 2815 { 2816 bfd_size_type amt = sizeof *p; 2817 p = ((struct elf32_nios2_dyn_relocs *) 2818 bfd_alloc (htab->root.dynobj, amt)); 2819 if (p == NULL) 2820 return FALSE; 2821 p->next = *head; 2822 *head = p; 2823 p->sec = sec; 2824 p->count = 0; 2825 p->pc_count = 0; 2826 } 2827 2828 p->count += 1; 2829 2830 } 2831 break; 2832 } 2833 } 2834 2835 return TRUE; 2836 } 2837 2838 2839 /* Implement elf_backend_gc_mark_hook: 2840 Return the section that should be marked against GC for a given 2841 relocation. */ 2842 static asection * 2843 nios2_elf32_gc_mark_hook (asection *sec, 2844 struct bfd_link_info *info, 2845 Elf_Internal_Rela *rel, 2846 struct elf_link_hash_entry *h, 2847 Elf_Internal_Sym *sym) 2848 { 2849 if (h != NULL) 2850 switch (ELF32_R_TYPE (rel->r_info)) 2851 { 2852 case R_NIOS2_GNU_VTINHERIT: 2853 case R_NIOS2_GNU_VTENTRY: 2854 return NULL; 2855 } 2856 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); 2857 } 2858 2859 /* Implement elf_backend_gc_sweep_hook: 2860 Update the got entry reference counts for the section being removed. */ 2861 static bfd_boolean 2862 nios2_elf32_gc_sweep_hook (bfd *abfd, 2863 struct bfd_link_info *info, 2864 asection *sec, 2865 const Elf_Internal_Rela *relocs) 2866 { 2867 Elf_Internal_Shdr *symtab_hdr; 2868 struct elf_link_hash_entry **sym_hashes; 2869 bfd_signed_vma *local_got_refcounts; 2870 const Elf_Internal_Rela *rel, *relend; 2871 bfd *dynobj; 2872 2873 if (info->relocatable) 2874 return TRUE; 2875 2876 elf_section_data (sec)->local_dynrel = NULL; 2877 2878 dynobj = elf_hash_table (info)->dynobj; 2879 if (dynobj == NULL) 2880 return TRUE; 2881 2882 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 2883 sym_hashes = elf_sym_hashes (abfd); 2884 local_got_refcounts = elf_local_got_refcounts (abfd); 2885 2886 relend = relocs + sec->reloc_count; 2887 for (rel = relocs; rel < relend; rel++) 2888 { 2889 unsigned long r_symndx; 2890 struct elf_link_hash_entry *h = NULL; 2891 int r_type; 2892 2893 r_symndx = ELF32_R_SYM (rel->r_info); 2894 if (r_symndx >= symtab_hdr->sh_info) 2895 { 2896 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2897 while (h->root.type == bfd_link_hash_indirect 2898 || h->root.type == bfd_link_hash_warning) 2899 h = (struct elf_link_hash_entry *) h->root.u.i.link; 2900 } 2901 2902 r_type = ELF32_R_TYPE (rel->r_info); 2903 switch (r_type) 2904 { 2905 case R_NIOS2_GOT16: 2906 case R_NIOS2_CALL16: 2907 if (h != NULL) 2908 { 2909 if (h->got.refcount > 0) 2910 --h->got.refcount; 2911 } 2912 else if (local_got_refcounts != NULL) 2913 { 2914 if (local_got_refcounts[r_symndx] > 0) 2915 --local_got_refcounts[r_symndx]; 2916 } 2917 break; 2918 2919 case R_NIOS2_PCREL_LO: 2920 case R_NIOS2_PCREL_HA: 2921 case R_NIOS2_BFD_RELOC_32: 2922 case R_NIOS2_CALL26: 2923 if (h != NULL) 2924 { 2925 struct elf32_nios2_link_hash_entry *eh; 2926 struct elf32_nios2_dyn_relocs **pp; 2927 struct elf32_nios2_dyn_relocs *p; 2928 2929 eh = (struct elf32_nios2_link_hash_entry *) h; 2930 2931 if (h->plt.refcount > 0) 2932 --h->plt.refcount; 2933 2934 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA 2935 || r_type == R_NIOS2_BFD_RELOC_32) 2936 { 2937 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; 2938 pp = &p->next) 2939 if (p->sec == sec) 2940 { 2941 p->count -= 1; 2942 if (p->count == 0) 2943 *pp = p->next; 2944 break; 2945 } 2946 } 2947 } 2948 break; 2949 2950 default: 2951 break; 2952 } 2953 } 2954 2955 return TRUE; 2956 } 2957 2958 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC. */ 2959 static void 2960 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value) 2961 { 2962 bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset); 2963 2964 BFD_ASSERT(value <= 0xffff); 2965 2966 bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6), 2967 sec->contents + offset); 2968 } 2969 2970 /* Install COUNT 32-bit values DATA starting at offset OFFSET into 2971 section SEC. */ 2972 static void 2973 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset, 2974 int count) 2975 { 2976 while (count--) 2977 { 2978 bfd_put_32 (sec->owner, *data, sec->contents + offset); 2979 offset += 4; 2980 ++data; 2981 } 2982 } 2983 2984 /* Implement elf_backend_finish_dynamic_symbols: 2985 Finish up dynamic symbol handling. We set the contents of various 2986 dynamic sections here. */ 2987 static bfd_boolean 2988 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd, 2989 struct bfd_link_info *info, 2990 struct elf_link_hash_entry *h, 2991 Elf_Internal_Sym *sym) 2992 { 2993 struct elf32_nios2_link_hash_table *htab; 2994 struct elf32_nios2_link_hash_entry *eh 2995 = (struct elf32_nios2_link_hash_entry *)h; 2996 int use_plt; 2997 2998 htab = elf32_nios2_hash_table (info); 2999 3000 if (h->plt.offset != (bfd_vma) -1) 3001 { 3002 asection *splt; 3003 asection *sgotplt; 3004 asection *srela; 3005 bfd_vma plt_index; 3006 bfd_vma got_offset; 3007 Elf_Internal_Rela rela; 3008 bfd_byte *loc; 3009 bfd_vma got_address; 3010 3011 /* This symbol has an entry in the procedure linkage table. Set 3012 it up. */ 3013 BFD_ASSERT (h->dynindx != -1); 3014 splt = htab->root.splt; 3015 sgotplt = htab->root.sgotplt; 3016 srela = htab->root.srelplt; 3017 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL); 3018 3019 /* Emit the PLT entry. */ 3020 if (info->shared) 3021 { 3022 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset, 3023 3); 3024 plt_index = (h->plt.offset - 24) / 12; 3025 got_offset = (plt_index + 3) * 4; 3026 nios2_elf32_install_imm16 (splt, h->plt.offset, 3027 hiadj(plt_index * 4)); 3028 nios2_elf32_install_imm16 (splt, h->plt.offset + 4, 3029 (plt_index * 4) & 0xffff); 3030 nios2_elf32_install_imm16 (splt, h->plt.offset + 8, 3031 0xfff4 - h->plt.offset); 3032 got_address = (sgotplt->output_section->vma + sgotplt->output_offset 3033 + got_offset); 3034 3035 /* Fill in the entry in the global offset table. There are no 3036 res_n slots for a shared object PLT, instead the .got.plt entries 3037 point to the PLT entries. */ 3038 bfd_put_32 (output_bfd, 3039 splt->output_section->vma + splt->output_offset 3040 + h->plt.offset, sgotplt->contents + got_offset); 3041 } 3042 else 3043 { 3044 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12; 3045 got_offset = (plt_index + 3) * 4; 3046 3047 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3); 3048 got_address = (sgotplt->output_section->vma + sgotplt->output_offset 3049 + got_offset); 3050 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address)); 3051 nios2_elf32_install_imm16 (splt, h->plt.offset + 4, 3052 got_address & 0xffff); 3053 3054 /* Fill in the entry in the global offset table. */ 3055 bfd_put_32 (output_bfd, 3056 splt->output_section->vma + splt->output_offset 3057 + plt_index * 4, sgotplt->contents + got_offset); 3058 } 3059 3060 /* Fill in the entry in the .rela.plt section. */ 3061 rela.r_offset = got_address; 3062 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT); 3063 rela.r_addend = 0; 3064 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela); 3065 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 3066 3067 if (!h->def_regular) 3068 { 3069 /* Mark the symbol as undefined, rather than as defined in 3070 the .plt section. Leave the value alone. */ 3071 sym->st_shndx = SHN_UNDEF; 3072 /* If the symbol is weak, we do need to clear the value. 3073 Otherwise, the PLT entry would provide a definition for 3074 the symbol even if the symbol wasn't defined anywhere, 3075 and so the symbol would never be NULL. */ 3076 if (!h->ref_regular_nonweak) 3077 sym->st_value = 0; 3078 } 3079 } 3080 3081 use_plt = (eh->got_types_used == CALL16_USED 3082 && h->plt.offset != (bfd_vma) -1); 3083 3084 if (!use_plt && h->got.offset != (bfd_vma) -1 3085 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0 3086 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0) 3087 { 3088 asection *sgot; 3089 asection *srela; 3090 Elf_Internal_Rela rela; 3091 bfd_byte *loc; 3092 bfd_vma offset; 3093 3094 /* This symbol has an entry in the global offset table. Set it 3095 up. */ 3096 sgot = htab->root.sgot; 3097 srela = htab->root.srelgot; 3098 BFD_ASSERT (sgot != NULL && srela != NULL); 3099 3100 offset = (h->got.offset & ~(bfd_vma) 1); 3101 rela.r_offset = (sgot->output_section->vma 3102 + sgot->output_offset + offset); 3103 3104 /* If this is a -Bsymbolic link, and the symbol is defined 3105 locally, we just want to emit a RELATIVE reloc. Likewise if 3106 the symbol was forced to be local because of a version file. 3107 The entry in the global offset table will already have been 3108 initialized in the relocate_section function. */ 3109 3110 if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h)) 3111 { 3112 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 3113 rela.r_addend = bfd_get_signed_32 (output_bfd, 3114 (sgot->contents + offset)); 3115 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset); 3116 } 3117 else 3118 { 3119 bfd_put_32 (output_bfd, (bfd_vma) 0, 3120 sgot->contents + offset); 3121 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT); 3122 rela.r_addend = 0; 3123 } 3124 3125 loc = srela->contents; 3126 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela); 3127 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 3128 } 3129 3130 if (use_plt && h->got.offset != (bfd_vma) -1) 3131 { 3132 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1); 3133 asection *sgot = htab->root.sgot; 3134 asection *splt = htab->root.splt; 3135 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset 3136 + h->plt.offset), 3137 sgot->contents + offset); 3138 } 3139 3140 if (h->needs_copy) 3141 { 3142 asection *s; 3143 Elf_Internal_Rela rela; 3144 bfd_byte *loc; 3145 3146 /* This symbol needs a copy reloc. Set it up. */ 3147 BFD_ASSERT (h->dynindx != -1 3148 && (h->root.type == bfd_link_hash_defined 3149 || h->root.type == bfd_link_hash_defweak)); 3150 3151 s = htab->srelbss; 3152 BFD_ASSERT (s != NULL); 3153 3154 rela.r_offset = (h->root.u.def.value 3155 + h->root.u.def.section->output_section->vma 3156 + h->root.u.def.section->output_offset); 3157 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY); 3158 rela.r_addend = 0; 3159 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); 3160 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 3161 } 3162 3163 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ 3164 if (strcmp (h->root.root.string, "_DYNAMIC") == 0 3165 || h == elf_hash_table (info)->hgot) 3166 sym->st_shndx = SHN_ABS; 3167 3168 return TRUE; 3169 } 3170 3171 /* Implement elf_backend_finish_dynamic_sections. */ 3172 static bfd_boolean 3173 nios2_elf32_finish_dynamic_sections (bfd *output_bfd, 3174 struct bfd_link_info *info) 3175 { 3176 bfd *dynobj; 3177 asection *sgotplt; 3178 asection *sdyn; 3179 struct elf32_nios2_link_hash_table *htab; 3180 3181 htab = elf32_nios2_hash_table (info); 3182 dynobj = elf_hash_table (info)->dynobj; 3183 sgotplt = htab->root.sgotplt; 3184 BFD_ASSERT (sgotplt != NULL); 3185 sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 3186 3187 if (elf_hash_table (info)->dynamic_sections_created) 3188 { 3189 asection *splt; 3190 Elf32_External_Dyn *dyncon, *dynconend; 3191 3192 splt = htab->root.splt; 3193 BFD_ASSERT (splt != NULL && sdyn != NULL); 3194 3195 dyncon = (Elf32_External_Dyn *) sdyn->contents; 3196 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); 3197 for (; dyncon < dynconend; dyncon++) 3198 { 3199 Elf_Internal_Dyn dyn; 3200 asection *s; 3201 3202 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); 3203 3204 switch (dyn.d_tag) 3205 { 3206 default: 3207 break; 3208 3209 case DT_PLTGOT: 3210 s = htab->root.sgot; 3211 BFD_ASSERT (s != NULL); 3212 dyn.d_un.d_ptr = s->output_section->vma; 3213 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3214 break; 3215 3216 case DT_JMPREL: 3217 s = htab->root.srelplt; 3218 BFD_ASSERT (s != NULL); 3219 dyn.d_un.d_ptr = s->output_section->vma; 3220 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3221 break; 3222 3223 case DT_PLTRELSZ: 3224 s = htab->root.srelplt; 3225 BFD_ASSERT (s != NULL); 3226 dyn.d_un.d_val = s->size; 3227 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3228 break; 3229 3230 case DT_RELASZ: 3231 /* The procedure linkage table relocs (DT_JMPREL) should 3232 not be included in the overall relocs (DT_RELA). 3233 Therefore, we override the DT_RELASZ entry here to 3234 make it not include the JMPREL relocs. Since the 3235 linker script arranges for .rela.plt to follow all 3236 other relocation sections, we don't have to worry 3237 about changing the DT_RELA entry. */ 3238 s = htab->root.srelplt; 3239 if (s != NULL) 3240 dyn.d_un.d_val -= s->size; 3241 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3242 break; 3243 3244 case DT_NIOS2_GP: 3245 s = htab->root.sgot; 3246 BFD_ASSERT (s != NULL); 3247 dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0; 3248 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 3249 break; 3250 } 3251 } 3252 3253 /* Fill in the first entry in the procedure linkage table. */ 3254 if (splt->size > 0) 3255 { 3256 bfd_vma got_address = (sgotplt->output_section->vma 3257 + sgotplt->output_offset); 3258 if (info->shared) 3259 { 3260 bfd_vma corrected = got_address - (splt->output_section->vma 3261 + splt->output_offset + 4); 3262 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6); 3263 nios2_elf32_install_imm16 (splt, 4, hiadj (corrected)); 3264 nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4); 3265 nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8); 3266 } 3267 else 3268 { 3269 /* Divide by 4 here, not 3 because we already corrected for the 3270 res_N branches. */ 3271 bfd_vma res_size = (splt->size - 28) / 4; 3272 bfd_vma res_start = (splt->output_section->vma 3273 + splt->output_offset); 3274 bfd_vma res_offset; 3275 3276 for (res_offset = 0; res_offset < res_size; res_offset += 4) 3277 bfd_put_32 (output_bfd, 3278 6 | ((res_size - (res_offset + 4)) << 6), 3279 splt->contents + res_offset); 3280 3281 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7); 3282 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start)); 3283 nios2_elf32_install_imm16 (splt, res_size + 4, 3284 res_start & 0xffff); 3285 nios2_elf32_install_imm16 (splt, res_size + 12, 3286 hiadj (got_address)); 3287 nios2_elf32_install_imm16 (splt, res_size + 16, 3288 (got_address & 0xffff) + 4); 3289 nios2_elf32_install_imm16 (splt, res_size + 20, 3290 (got_address & 0xffff) + 8); 3291 } 3292 } 3293 } 3294 /* Fill in the first three entries in the global offset table. */ 3295 if (sgotplt->size > 0) 3296 { 3297 if (sdyn == NULL) 3298 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents); 3299 else 3300 bfd_put_32 (output_bfd, 3301 sdyn->output_section->vma + sdyn->output_offset, 3302 sgotplt->contents); 3303 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4); 3304 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8); 3305 } 3306 3307 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4; 3308 3309 return TRUE; 3310 } 3311 3312 /* Implement elf_backend_adjust_dynamic_symbol: 3313 Adjust a symbol defined by a dynamic object and referenced by a 3314 regular object. The current definition is in some section of the 3315 dynamic object, but we're not including those sections. We have to 3316 change the definition to something the rest of the link can 3317 understand. */ 3318 static bfd_boolean 3319 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info, 3320 struct elf_link_hash_entry *h) 3321 { 3322 struct elf32_nios2_link_hash_table *htab; 3323 bfd *dynobj; 3324 asection *s; 3325 unsigned align2; 3326 3327 htab = elf32_nios2_hash_table (info); 3328 dynobj = elf_hash_table (info)->dynobj; 3329 3330 /* Make sure we know what is going on here. */ 3331 BFD_ASSERT (dynobj != NULL 3332 && (h->needs_plt 3333 || h->u.weakdef != NULL 3334 || (h->def_dynamic 3335 && h->ref_regular 3336 && !h->def_regular))); 3337 3338 /* If this is a function, put it in the procedure linkage table. We 3339 will fill in the contents of the procedure linkage table later, 3340 when we know the address of the .got section. */ 3341 if (h->type == STT_FUNC || h->needs_plt) 3342 { 3343 if (h->plt.refcount <= 0 3344 || SYMBOL_CALLS_LOCAL (info, h) 3345 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 3346 && h->root.type == bfd_link_hash_undefweak)) 3347 { 3348 /* This case can occur if we saw a PLT reloc in an input 3349 file, but the symbol was never referred to by a dynamic 3350 object, or if all references were garbage collected. In 3351 such a case, we don't actually need to build a procedure 3352 linkage table, and we can just do a PCREL reloc instead. */ 3353 h->plt.offset = (bfd_vma) -1; 3354 h->needs_plt = 0; 3355 } 3356 3357 return TRUE; 3358 } 3359 3360 /* Reinitialize the plt offset now that it is not used as a reference 3361 count any more. */ 3362 h->plt.offset = (bfd_vma) -1; 3363 3364 /* If this is a weak symbol, and there is a real definition, the 3365 processor independent code will have arranged for us to see the 3366 real definition first, and we can just use the same value. */ 3367 if (h->u.weakdef != NULL) 3368 { 3369 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined 3370 || h->u.weakdef->root.type == bfd_link_hash_defweak); 3371 h->root.u.def.section = h->u.weakdef->root.u.def.section; 3372 h->root.u.def.value = h->u.weakdef->root.u.def.value; 3373 return TRUE; 3374 } 3375 3376 /* If there are no non-GOT references, we do not need a copy 3377 relocation. */ 3378 if (!h->non_got_ref) 3379 return TRUE; 3380 3381 /* This is a reference to a symbol defined by a dynamic object which 3382 is not a function. 3383 If we are creating a shared library, we must presume that the 3384 only references to the symbol are via the global offset table. 3385 For such cases we need not do anything here; the relocations will 3386 be handled correctly by relocate_section. */ 3387 if (info->shared) 3388 return TRUE; 3389 3390 if (h->size == 0) 3391 { 3392 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"), 3393 h->root.root.string); 3394 return TRUE; 3395 } 3396 3397 /* We must allocate the symbol in our .dynbss section, which will 3398 become part of the .bss section of the executable. There will be 3399 an entry for this symbol in the .dynsym section. The dynamic 3400 object will contain position independent code, so all references 3401 from the dynamic object to this symbol will go through the global 3402 offset table. The dynamic linker will use the .dynsym entry to 3403 determine the address it must put in the global offset table, so 3404 both the dynamic object and the regular object will refer to the 3405 same memory location for the variable. */ 3406 s = htab->sdynbss; 3407 BFD_ASSERT (s != NULL); 3408 3409 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to 3410 copy the initial value out of the dynamic object and into the 3411 runtime process image. We need to remember the offset into the 3412 .rela.bss section we are going to use. */ 3413 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) 3414 { 3415 asection *srel; 3416 3417 srel = htab->srelbss; 3418 BFD_ASSERT (srel != NULL); 3419 srel->size += sizeof (Elf32_External_Rela); 3420 h->needs_copy = 1; 3421 } 3422 3423 align2 = bfd_log2 (h->size); 3424 if (align2 > h->root.u.def.section->alignment_power) 3425 align2 = h->root.u.def.section->alignment_power; 3426 3427 /* Align dynbss. */ 3428 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2); 3429 if (align2 > bfd_get_section_alignment (dynobj, s) 3430 && !bfd_set_section_alignment (dynobj, s, align2)) 3431 return FALSE; 3432 3433 /* Define the symbol as being at this point in the section. */ 3434 h->root.u.def.section = s; 3435 h->root.u.def.value = s->size; 3436 3437 /* Increment the section size to make room for the symbol. */ 3438 s->size += h->size; 3439 3440 return TRUE; 3441 } 3442 3443 /* Worker function for nios2_elf32_size_dynamic_sections. */ 3444 static bfd_boolean 3445 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf) 3446 { 3447 struct bfd_link_info *info; 3448 struct elf32_nios2_link_hash_table *htab; 3449 3450 if (h->root.type == bfd_link_hash_indirect) 3451 return TRUE; 3452 3453 if (h->root.type == bfd_link_hash_warning) 3454 /* When warning symbols are created, they **replace** the "real" 3455 entry in the hash table, thus we never get to see the real 3456 symbol in a hash traversal. So look at it now. */ 3457 h = (struct elf_link_hash_entry *) h->root.u.i.link; 3458 3459 info = (struct bfd_link_info *) inf; 3460 htab = elf32_nios2_hash_table (info); 3461 3462 if (h->plt.offset != (bfd_vma)-1) 3463 h->plt.offset += htab->res_n_size; 3464 if (htab->root.splt == h->root.u.def.section) 3465 h->root.u.def.value += htab->res_n_size; 3466 3467 return TRUE; 3468 } 3469 3470 /* Another worker function for nios2_elf32_size_dynamic_sections. 3471 Allocate space in .plt, .got and associated reloc sections for 3472 dynamic relocs. */ 3473 static bfd_boolean 3474 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf) 3475 { 3476 struct bfd_link_info *info; 3477 struct elf32_nios2_link_hash_table *htab; 3478 struct elf32_nios2_link_hash_entry *eh; 3479 struct elf32_nios2_dyn_relocs *p; 3480 int use_plt; 3481 3482 if (h->root.type == bfd_link_hash_indirect) 3483 return TRUE; 3484 3485 if (h->root.type == bfd_link_hash_warning) 3486 /* When warning symbols are created, they **replace** the "real" 3487 entry in the hash table, thus we never get to see the real 3488 symbol in a hash traversal. So look at it now. */ 3489 h = (struct elf_link_hash_entry *) h->root.u.i.link; 3490 3491 info = (struct bfd_link_info *) inf; 3492 htab = elf32_nios2_hash_table (info); 3493 3494 if (htab->root.dynamic_sections_created 3495 && h->plt.refcount > 0) 3496 { 3497 /* Make sure this symbol is output as a dynamic symbol. 3498 Undefined weak syms won't yet be marked as dynamic. */ 3499 if (h->dynindx == -1 3500 && !h->forced_local 3501 && !bfd_elf_link_record_dynamic_symbol (info, h)) 3502 return FALSE; 3503 3504 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h)) 3505 { 3506 asection *s = htab->root.splt; 3507 3508 /* Allocate room for the header. */ 3509 if (s->size == 0) 3510 { 3511 if (info->shared) 3512 s->size = 24; 3513 else 3514 s->size = 28; 3515 } 3516 3517 h->plt.offset = s->size; 3518 3519 /* If this symbol is not defined in a regular file, and we are 3520 not generating a shared library, then set the symbol to this 3521 location in the .plt. This is required to make function 3522 pointers compare as equal between the normal executable and 3523 the shared library. */ 3524 if (! info->shared 3525 && !h->def_regular) 3526 { 3527 h->root.u.def.section = s; 3528 h->root.u.def.value = h->plt.offset; 3529 } 3530 3531 /* Make room for this entry. */ 3532 s->size += 12; 3533 3534 /* We also need to make an entry in the .rela.plt section. */ 3535 htab->root.srelplt->size += sizeof (Elf32_External_Rela); 3536 3537 /* And the .got.plt section. */ 3538 htab->root.sgotplt->size += 4; 3539 } 3540 else 3541 { 3542 h->plt.offset = (bfd_vma) -1; 3543 h->needs_plt = 0; 3544 } 3545 } 3546 else 3547 { 3548 h->plt.offset = (bfd_vma) -1; 3549 h->needs_plt = 0; 3550 } 3551 3552 eh = (struct elf32_nios2_link_hash_entry *) h; 3553 use_plt = (eh->got_types_used == CALL16_USED 3554 && h->plt.offset != (bfd_vma) -1); 3555 3556 if (h->got.refcount > 0) 3557 { 3558 asection *s; 3559 bfd_boolean dyn; 3560 int tls_type = eh->tls_type; 3561 int indx; 3562 3563 /* Make sure this symbol is output as a dynamic symbol. 3564 Undefined weak syms won't yet be marked as dynamic. */ 3565 if (h->dynindx == -1 3566 && !h->forced_local 3567 && !bfd_elf_link_record_dynamic_symbol (info, h)) 3568 return FALSE; 3569 3570 s = htab->root.sgot; 3571 h->got.offset = s->size; 3572 3573 if (tls_type == GOT_UNKNOWN) 3574 abort (); 3575 3576 if (tls_type == GOT_NORMAL) 3577 /* Non-TLS symbols need one GOT slot. */ 3578 s->size += 4; 3579 else 3580 { 3581 if (tls_type & GOT_TLS_GD) 3582 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */ 3583 s->size += 8; 3584 if (tls_type & GOT_TLS_IE) 3585 /* R_NIOS2_TLS_IE16 needs one GOT slot. */ 3586 s->size += 4; 3587 } 3588 3589 dyn = htab->root.dynamic_sections_created; 3590 3591 indx = 0; 3592 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) 3593 && (!info->shared 3594 || !SYMBOL_REFERENCES_LOCAL (info, h))) 3595 indx = h->dynindx; 3596 3597 if (tls_type != GOT_NORMAL 3598 && (info->shared || indx != 0) 3599 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 3600 || h->root.type != bfd_link_hash_undefweak)) 3601 { 3602 if (tls_type & GOT_TLS_IE) 3603 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 3604 3605 if (tls_type & GOT_TLS_GD) 3606 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 3607 3608 if ((tls_type & GOT_TLS_GD) && indx != 0) 3609 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 3610 } 3611 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 3612 || h->root.type != bfd_link_hash_undefweak) 3613 && !use_plt 3614 && (info->shared 3615 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) 3616 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 3617 } 3618 else 3619 h->got.offset = (bfd_vma) -1; 3620 3621 if (eh->dyn_relocs == NULL) 3622 return TRUE; 3623 3624 /* In the shared -Bsymbolic case, discard space allocated for 3625 dynamic pc-relative relocs against symbols which turn out to be 3626 defined in regular objects. For the normal shared case, discard 3627 space for pc-relative relocs that have become local due to symbol 3628 visibility changes. */ 3629 3630 if (info->shared) 3631 { 3632 if (h->def_regular 3633 && (h->forced_local || info->symbolic)) 3634 { 3635 struct elf32_nios2_dyn_relocs **pp; 3636 3637 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 3638 { 3639 p->count -= p->pc_count; 3640 p->pc_count = 0; 3641 if (p->count == 0) 3642 *pp = p->next; 3643 else 3644 pp = &p->next; 3645 } 3646 } 3647 3648 /* Also discard relocs on undefined weak syms with non-default 3649 visibility. */ 3650 if (eh->dyn_relocs != NULL 3651 && h->root.type == bfd_link_hash_undefweak) 3652 { 3653 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 3654 eh->dyn_relocs = NULL; 3655 3656 /* Make sure undefined weak symbols are output as a dynamic 3657 symbol in PIEs. */ 3658 else if (h->dynindx == -1 3659 && !h->forced_local 3660 && !bfd_elf_link_record_dynamic_symbol (info, h)) 3661 return FALSE; 3662 } 3663 } 3664 else 3665 { 3666 /* For the non-shared case, discard space for relocs against 3667 symbols which turn out to need copy relocs or are not 3668 dynamic. */ 3669 3670 if (!h->non_got_ref 3671 && ((h->def_dynamic && !h->def_regular) 3672 || (htab->root.dynamic_sections_created 3673 && (h->root.type == bfd_link_hash_undefweak 3674 || h->root.type == bfd_link_hash_undefined)))) 3675 { 3676 /* Make sure this symbol is output as a dynamic symbol. 3677 Undefined weak syms won't yet be marked as dynamic. */ 3678 if (h->dynindx == -1 3679 && !h->forced_local 3680 && !bfd_elf_link_record_dynamic_symbol (info, h)) 3681 return FALSE; 3682 3683 /* If that succeeded, we know we'll be keeping all the 3684 relocs. */ 3685 if (h->dynindx != -1) 3686 goto keep; 3687 } 3688 3689 eh->dyn_relocs = NULL; 3690 3691 keep: ; 3692 } 3693 3694 /* Finally, allocate space. */ 3695 for (p = eh->dyn_relocs; p != NULL; p = p->next) 3696 { 3697 asection *sreloc = elf_section_data (p->sec)->sreloc; 3698 sreloc->size += p->count * sizeof (Elf32_External_Rela); 3699 } 3700 3701 return TRUE; 3702 } 3703 3704 /* Implement elf_backend_size_dynamic_sections: 3705 Set the sizes of the dynamic sections. */ 3706 static bfd_boolean 3707 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 3708 struct bfd_link_info *info) 3709 { 3710 bfd *dynobj; 3711 asection *s; 3712 bfd_boolean plt; 3713 bfd_boolean got; 3714 bfd_boolean relocs; 3715 bfd *ibfd; 3716 struct elf32_nios2_link_hash_table *htab; 3717 3718 htab = elf32_nios2_hash_table (info); 3719 dynobj = elf_hash_table (info)->dynobj; 3720 BFD_ASSERT (dynobj != NULL); 3721 3722 htab->res_n_size = 0; 3723 if (elf_hash_table (info)->dynamic_sections_created) 3724 { 3725 /* Set the contents of the .interp section to the interpreter. */ 3726 if (info->executable) 3727 { 3728 s = bfd_get_linker_section (dynobj, ".interp"); 3729 BFD_ASSERT (s != NULL); 3730 s->size = sizeof ELF_DYNAMIC_INTERPRETER; 3731 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 3732 } 3733 } 3734 else 3735 { 3736 /* We may have created entries in the .rela.got section. 3737 However, if we are not creating the dynamic sections, we will 3738 not actually use these entries. Reset the size of .rela.got, 3739 which will cause it to get stripped from the output file 3740 below. */ 3741 s = htab->root.srelgot; 3742 if (s != NULL) 3743 s->size = 0; 3744 } 3745 3746 /* Set up .got offsets for local syms, and space for local dynamic 3747 relocs. */ 3748 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) 3749 { 3750 bfd_signed_vma *local_got; 3751 bfd_signed_vma *end_local_got; 3752 char *local_tls_type; 3753 bfd_size_type locsymcount; 3754 Elf_Internal_Shdr *symtab_hdr; 3755 asection *srel; 3756 3757 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 3758 continue; 3759 3760 for (s = ibfd->sections; s != NULL; s = s->next) 3761 { 3762 struct elf32_nios2_dyn_relocs *p; 3763 3764 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) 3765 { 3766 if (!bfd_is_abs_section (p->sec) 3767 && bfd_is_abs_section (p->sec->output_section)) 3768 { 3769 /* Input section has been discarded, either because 3770 it is a copy of a linkonce section or due to 3771 linker script /DISCARD/, so we'll be discarding 3772 the relocs too. */ 3773 } 3774 else if (p->count != 0) 3775 { 3776 srel = elf_section_data (p->sec)->sreloc; 3777 srel->size += p->count * sizeof (Elf32_External_Rela); 3778 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 3779 info->flags |= DF_TEXTREL; 3780 } 3781 } 3782 } 3783 3784 local_got = elf_local_got_refcounts (ibfd); 3785 if (!local_got) 3786 continue; 3787 3788 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 3789 locsymcount = symtab_hdr->sh_info; 3790 end_local_got = local_got + locsymcount; 3791 local_tls_type = elf32_nios2_local_got_tls_type (ibfd); 3792 s = htab->root.sgot; 3793 srel = htab->root.srelgot; 3794 for (; local_got < end_local_got; ++local_got, ++local_tls_type) 3795 { 3796 if (*local_got > 0) 3797 { 3798 *local_got = s->size; 3799 if (*local_tls_type & GOT_TLS_GD) 3800 /* TLS_GD relocs need an 8-byte structure in the GOT. */ 3801 s->size += 8; 3802 if (*local_tls_type & GOT_TLS_IE) 3803 s->size += 4; 3804 if (*local_tls_type == GOT_NORMAL) 3805 s->size += 4; 3806 3807 if (info->shared || *local_tls_type == GOT_TLS_GD) 3808 srel->size += sizeof (Elf32_External_Rela); 3809 } 3810 else 3811 *local_got = (bfd_vma) -1; 3812 } 3813 } 3814 3815 if (htab->tls_ldm_got.refcount > 0) 3816 { 3817 /* Allocate two GOT entries and one dynamic relocation (if necessary) 3818 for R_NIOS2_TLS_LDM16 relocations. */ 3819 htab->tls_ldm_got.offset = htab->root.sgot->size; 3820 htab->root.sgot->size += 8; 3821 if (info->shared) 3822 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 3823 } 3824 else 3825 htab->tls_ldm_got.offset = -1; 3826 3827 /* Allocate global sym .plt and .got entries, and space for global 3828 sym dynamic relocs. */ 3829 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info); 3830 3831 /* The check_relocs and adjust_dynamic_symbol entry points have 3832 determined the sizes of the various dynamic sections. Allocate 3833 memory for them. */ 3834 plt = FALSE; 3835 got = FALSE; 3836 relocs = FALSE; 3837 for (s = dynobj->sections; s != NULL; s = s->next) 3838 { 3839 const char *name; 3840 3841 if ((s->flags & SEC_LINKER_CREATED) == 0) 3842 continue; 3843 3844 /* It's OK to base decisions on the section name, because none 3845 of the dynobj section names depend upon the input files. */ 3846 name = bfd_get_section_name (dynobj, s); 3847 3848 if (strcmp (name, ".plt") == 0) 3849 { 3850 /* Remember whether there is a PLT. */ 3851 plt = s->size != 0; 3852 3853 /* Correct for the number of res_N branches. */ 3854 if (plt && !info->shared) 3855 { 3856 htab->res_n_size = (s->size-28) / 3; 3857 s->size += htab->res_n_size; 3858 } 3859 } 3860 else if (CONST_STRNEQ (name, ".rela")) 3861 { 3862 if (s->size != 0) 3863 { 3864 relocs = TRUE; 3865 3866 /* We use the reloc_count field as a counter if we need 3867 to copy relocs into the output file. */ 3868 s->reloc_count = 0; 3869 } 3870 } 3871 else if (CONST_STRNEQ (name, ".got")) 3872 got = s->size != 0; 3873 else if (strcmp (name, ".dynbss") != 0) 3874 /* It's not one of our sections, so don't allocate space. */ 3875 continue; 3876 3877 if (s->size == 0) 3878 { 3879 /* If we don't need this section, strip it from the 3880 output file. This is mostly to handle .rela.bss and 3881 .rela.plt. We must create both sections in 3882 create_dynamic_sections, because they must be created 3883 before the linker maps input sections to output 3884 sections. The linker does that before 3885 adjust_dynamic_symbol is called, and it is that 3886 function which decides whether anything needs to go 3887 into these sections. */ 3888 s->flags |= SEC_EXCLUDE; 3889 continue; 3890 } 3891 3892 if ((s->flags & SEC_HAS_CONTENTS) == 0) 3893 continue; 3894 3895 /* Allocate memory for the section contents. */ 3896 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc. 3897 Unused entries should be reclaimed before the section's contents 3898 are written out, but at the moment this does not happen. Thus in 3899 order to prevent writing out garbage, we initialize the section's 3900 contents to zero. */ 3901 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); 3902 if (s->contents == NULL) 3903 return FALSE; 3904 } 3905 3906 /* Adjust dynamic symbols that point to the plt to account for the 3907 now-known number of resN slots. */ 3908 if (htab->res_n_size) 3909 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info); 3910 3911 if (elf_hash_table (info)->dynamic_sections_created) 3912 { 3913 /* Add some entries to the .dynamic section. We fill in the 3914 values later, in elf_nios2_finish_dynamic_sections, but we 3915 must add the entries now so that we get the correct size for 3916 the .dynamic section. The DT_DEBUG entry is filled in by the 3917 dynamic linker and used by the debugger. */ 3918 #define add_dynamic_entry(TAG, VAL) \ 3919 _bfd_elf_add_dynamic_entry (info, TAG, VAL) 3920 3921 if (!info->shared && !add_dynamic_entry (DT_DEBUG, 0)) 3922 return FALSE; 3923 3924 if (got && !add_dynamic_entry (DT_PLTGOT, 0)) 3925 return FALSE; 3926 3927 if (plt 3928 && (!add_dynamic_entry (DT_PLTRELSZ, 0) 3929 || !add_dynamic_entry (DT_PLTREL, DT_RELA) 3930 || !add_dynamic_entry (DT_JMPREL, 0))) 3931 return FALSE; 3932 3933 if (relocs 3934 && (!add_dynamic_entry (DT_RELA, 0) 3935 || !add_dynamic_entry (DT_RELASZ, 0) 3936 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))) 3937 return FALSE; 3938 3939 if (!info->shared && !add_dynamic_entry (DT_NIOS2_GP, 0)) 3940 return FALSE; 3941 3942 if ((info->flags & DF_TEXTREL) != 0 3943 && !add_dynamic_entry (DT_TEXTREL, 0)) 3944 return FALSE; 3945 } 3946 #undef add_dynamic_entry 3947 3948 return TRUE; 3949 } 3950 3951 /* Implement bfd_elf32_bfd_link_hash_table_create. */ 3952 static struct bfd_link_hash_table * 3953 nios2_elf32_link_hash_table_create (bfd *abfd) 3954 { 3955 struct elf32_nios2_link_hash_table *ret; 3956 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table); 3957 3958 ret = bfd_zmalloc (amt); 3959 if (ret == NULL) 3960 return NULL; 3961 3962 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 3963 link_hash_newfunc, 3964 sizeof (struct 3965 elf32_nios2_link_hash_entry), 3966 NIOS2_ELF_DATA)) 3967 { 3968 free (ret); 3969 return NULL; 3970 } 3971 3972 return &ret->root.root; 3973 } 3974 3975 /* Implement elf_backend_reloc_type_class. */ 3976 static enum elf_reloc_type_class 3977 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, 3978 const asection *rel_sec ATTRIBUTE_UNUSED, 3979 const Elf_Internal_Rela *rela) 3980 { 3981 switch ((int) ELF32_R_TYPE (rela->r_info)) 3982 { 3983 case R_NIOS2_RELATIVE: 3984 return reloc_class_relative; 3985 case R_NIOS2_JUMP_SLOT: 3986 return reloc_class_plt; 3987 case R_NIOS2_COPY: 3988 return reloc_class_copy; 3989 default: 3990 return reloc_class_normal; 3991 } 3992 } 3993 3994 /* Return 1 if target is one of ours. */ 3995 static bfd_boolean 3996 is_nios2_elf_target (const struct bfd_target *targ) 3997 { 3998 return (targ == &bfd_elf32_littlenios2_vec 3999 || targ == &bfd_elf32_bignios2_vec); 4000 } 4001 4002 /* Implement elf_backend_add_symbol_hook. 4003 This hook is called by the linker when adding symbols from an object 4004 file. We use it to put .comm items in .sbss, and not .bss. */ 4005 static bfd_boolean 4006 nios2_elf_add_symbol_hook (bfd *abfd, 4007 struct bfd_link_info *info, 4008 Elf_Internal_Sym *sym, 4009 const char **namep ATTRIBUTE_UNUSED, 4010 flagword *flagsp ATTRIBUTE_UNUSED, 4011 asection **secp, 4012 bfd_vma *valp) 4013 { 4014 bfd *dynobj; 4015 4016 if (sym->st_shndx == SHN_COMMON 4017 && !info->relocatable 4018 && sym->st_size <= elf_gp_size (abfd) 4019 && is_nios2_elf_target (info->output_bfd->xvec)) 4020 { 4021 /* Common symbols less than or equal to -G nn bytes are automatically 4022 put into .sbss. */ 4023 struct elf32_nios2_link_hash_table *htab; 4024 4025 htab = elf32_nios2_hash_table (info); 4026 if (htab->sbss == NULL) 4027 { 4028 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED; 4029 4030 dynobj = elf_hash_table (info)->dynobj; 4031 if (!dynobj) 4032 dynobj = abfd; 4033 4034 htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss", 4035 flags); 4036 if (htab->sbss == NULL) 4037 return FALSE; 4038 } 4039 4040 *secp = htab->sbss; 4041 *valp = sym->st_size; 4042 } 4043 4044 return TRUE; 4045 } 4046 4047 /* Implement elf_backend_can_make_relative_eh_frame: 4048 Decide whether to attempt to turn absptr or lsda encodings in 4049 shared libraries into pcrel within the given input section. */ 4050 static bfd_boolean 4051 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED, 4052 struct bfd_link_info *info 4053 ATTRIBUTE_UNUSED, 4054 asection *eh_frame_section 4055 ATTRIBUTE_UNUSED) 4056 { 4057 /* We can't use PC-relative encodings in the .eh_frame section. */ 4058 return FALSE; 4059 } 4060 4061 /* Implement elf_backend_special_sections. */ 4062 const struct bfd_elf_special_section elf32_nios2_special_sections[] = 4063 { 4064 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, 4065 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL }, 4066 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, 4067 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL }, 4068 { NULL, 0, 0, 0, 0 } 4069 }; 4070 4071 #define ELF_ARCH bfd_arch_nios2 4072 #define ELF_TARGET_ID NIOS2_ELF_DATA 4073 #define ELF_MACHINE_CODE EM_ALTERA_NIOS2 4074 4075 /* The Nios II MMU uses a 4K page size. */ 4076 4077 #define ELF_MAXPAGESIZE 0x1000 4078 4079 #define bfd_elf32_bfd_link_hash_table_create \ 4080 nios2_elf32_link_hash_table_create 4081 4082 /* Relocation table lookup macros. */ 4083 4084 #define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup 4085 #define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup 4086 4087 /* JUMP_TABLE_LINK macros. */ 4088 4089 /* elf_info_to_howto (using RELA relocations). */ 4090 4091 #define elf_info_to_howto nios2_elf32_info_to_howto 4092 4093 /* elf backend functions. */ 4094 4095 #define elf_backend_can_gc_sections 1 4096 #define elf_backend_can_refcount 1 4097 #define elf_backend_plt_readonly 1 4098 #define elf_backend_want_got_plt 1 4099 #define elf_backend_rela_normal 1 4100 4101 #define elf_backend_relocate_section nios2_elf32_relocate_section 4102 #define elf_backend_section_flags nios2_elf32_section_flags 4103 #define elf_backend_fake_sections nios2_elf32_fake_sections 4104 #define elf_backend_check_relocs nios2_elf32_check_relocs 4105 4106 #define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook 4107 #define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook 4108 #define elf_backend_create_dynamic_sections \ 4109 nios2_elf32_create_dynamic_sections 4110 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol 4111 #define elf_backend_finish_dynamic_sections \ 4112 nios2_elf32_finish_dynamic_sections 4113 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol 4114 #define elf_backend_reloc_type_class nios2_elf32_reloc_type_class 4115 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections 4116 #define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook 4117 #define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol 4118 4119 #define elf_backend_grok_prstatus nios2_grok_prstatus 4120 #define elf_backend_grok_psinfo nios2_grok_psinfo 4121 4122 #undef elf_backend_can_make_relative_eh_frame 4123 #define elf_backend_can_make_relative_eh_frame \ 4124 nios2_elf32_can_make_relative_eh_frame 4125 4126 #define elf_backend_special_sections elf32_nios2_special_sections 4127 4128 #define TARGET_LITTLE_SYM bfd_elf32_littlenios2_vec 4129 #define TARGET_LITTLE_NAME "elf32-littlenios2" 4130 #define TARGET_BIG_SYM bfd_elf32_bignios2_vec 4131 #define TARGET_BIG_NAME "elf32-bignios2" 4132 4133 #define elf_backend_got_header_size 12 4134 4135 #include "elf32-target.h" 4136