1 /* 32-bit ELF support for Nios II. 2 Copyright (C) 2012-2015 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 #include "elf32-nios2.h" 34 35 /* Use RELA relocations. */ 36 #ifndef USE_RELA 37 #define USE_RELA 38 #endif 39 40 #ifdef USE_REL 41 #undef USE_REL 42 #endif 43 44 /* Forward declarations. */ 45 static bfd_reloc_status_type nios2_elf32_ignore_reloc 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 47 static bfd_reloc_status_type nios2_elf32_hi16_relocate 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 49 static bfd_reloc_status_type nios2_elf32_lo16_relocate 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 51 static bfd_reloc_status_type nios2_elf32_hiadj16_relocate 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 53 static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 55 static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 57 static bfd_reloc_status_type nios2_elf32_pcrel16_relocate 58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 59 static bfd_reloc_status_type nios2_elf32_call26_relocate 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 61 static bfd_reloc_status_type nios2_elf32_gprel_relocate 62 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 63 static bfd_reloc_status_type nios2_elf32_ujmp_relocate 64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 65 static bfd_reloc_status_type nios2_elf32_cjmp_relocate 66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 67 static bfd_reloc_status_type nios2_elf32_callr_relocate 68 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 69 70 /* Target vector. */ 71 extern const bfd_target nios2_elf32_le_vec; 72 extern const bfd_target nios2_elf32_be_vec; 73 74 /* Offset of tp and dtp pointers from start of TLS block. */ 75 #define TP_OFFSET 0x7000 76 #define DTP_OFFSET 0x8000 77 78 /* The relocation tables used for SHT_REL sections. There are separate 79 tables for R1 and R2 encodings. */ 80 static reloc_howto_type elf_nios2_r1_howto_table_rel[] = { 81 /* No relocation. */ 82 HOWTO (R_NIOS2_NONE, /* type */ 83 0, /* rightshift */ 84 3, /* size (0 = byte, 1 = short, 2 = long) */ 85 0, /* bitsize */ 86 FALSE, /* pc_relative */ 87 0, /* bitpos */ 88 complain_overflow_dont, /* complain_on_overflow */ 89 bfd_elf_generic_reloc, /* special_function */ 90 "R_NIOS2_NONE", /* name */ 91 FALSE, /* partial_inplace */ 92 0, /* src_mask */ 93 0, /* dst_mask */ 94 FALSE), /* pcrel_offset */ 95 96 /* 16-bit signed immediate relocation. */ 97 HOWTO (R_NIOS2_S16, /* type */ 98 0, /* rightshift */ 99 2, /* size (0 = byte, 1 = short, 2 = long) */ 100 16, /* bitsize */ 101 FALSE, /* pc_relative */ 102 6, /* bitpos */ 103 complain_overflow_signed, /* complain on overflow */ 104 bfd_elf_generic_reloc, /* special function */ 105 "R_NIOS2_S16", /* name */ 106 FALSE, /* partial_inplace */ 107 0x003fffc0, /* src_mask */ 108 0x003fffc0, /* dest_mask */ 109 FALSE), /* pcrel_offset */ 110 111 /* 16-bit unsigned immediate relocation. */ 112 HOWTO (R_NIOS2_U16, /* type */ 113 0, /* rightshift */ 114 2, /* size (0 = byte, 1 = short, 2 = long) */ 115 16, /* bitsize */ 116 FALSE, /* pc_relative */ 117 6, /* bitpos */ 118 complain_overflow_unsigned, /* complain on overflow */ 119 bfd_elf_generic_reloc, /* special function */ 120 "R_NIOS2_U16", /* name */ 121 FALSE, /* partial_inplace */ 122 0x003fffc0, /* src_mask */ 123 0x003fffc0, /* dest_mask */ 124 FALSE), /* pcrel_offset */ 125 126 HOWTO (R_NIOS2_PCREL16, /* type */ 127 0, /* rightshift */ 128 2, /* size (0 = byte, 1 = short, 2 = long) */ 129 16, /* bitsize */ 130 TRUE, /* pc_relative */ 131 6, /* bitpos */ 132 complain_overflow_signed, /* complain on overflow */ 133 nios2_elf32_pcrel16_relocate, /* special function */ 134 "R_NIOS2_PCREL16", /* name */ 135 FALSE, /* partial_inplace */ 136 0x003fffc0, /* src_mask */ 137 0x003fffc0, /* dest_mask */ 138 TRUE), /* pcrel_offset */ 139 140 HOWTO (R_NIOS2_CALL26, /* type */ 141 2, /* rightshift */ 142 2, /* size (0 = byte, 1 = short, 2 = long) */ 143 26, /* bitsize */ 144 FALSE, /* pc_relative */ 145 6, /* bitpos */ 146 complain_overflow_dont, /* complain on overflow */ 147 nios2_elf32_call26_relocate, /* special function */ 148 "R_NIOS2_CALL26", /* name */ 149 FALSE, /* partial_inplace */ 150 0xffffffc0, /* src_mask */ 151 0xffffffc0, /* dst_mask */ 152 FALSE), /* pcrel_offset */ 153 154 HOWTO (R_NIOS2_IMM5, 155 0, 156 2, 157 5, 158 FALSE, 159 6, 160 complain_overflow_bitfield, 161 bfd_elf_generic_reloc, 162 "R_NIOS2_IMM5", 163 FALSE, 164 0x000007c0, 165 0x000007c0, 166 FALSE), 167 168 HOWTO (R_NIOS2_CACHE_OPX, 169 0, 170 2, 171 5, 172 FALSE, 173 22, 174 complain_overflow_bitfield, 175 bfd_elf_generic_reloc, 176 "R_NIOS2_CACHE_OPX", 177 FALSE, 178 0x07c00000, 179 0x07c00000, 180 FALSE), 181 182 HOWTO (R_NIOS2_IMM6, 183 0, 184 2, 185 6, 186 FALSE, 187 6, 188 complain_overflow_bitfield, 189 bfd_elf_generic_reloc, 190 "R_NIOS2_IMM6", 191 FALSE, 192 0x00000fc0, 193 0x00000fc0, 194 FALSE), 195 196 HOWTO (R_NIOS2_IMM8, 197 0, 198 2, 199 8, 200 FALSE, 201 6, 202 complain_overflow_bitfield, 203 bfd_elf_generic_reloc, 204 "R_NIOS2_IMM8", 205 FALSE, 206 0x00003fc0, 207 0x00003fc0, 208 FALSE), 209 210 HOWTO (R_NIOS2_HI16, 211 0, 212 2, 213 32, 214 FALSE, 215 6, 216 complain_overflow_dont, 217 nios2_elf32_hi16_relocate, 218 "R_NIOS2_HI16", 219 FALSE, 220 0x003fffc0, 221 0x003fffc0, 222 FALSE), 223 224 HOWTO (R_NIOS2_LO16, 225 0, 226 2, 227 32, 228 FALSE, 229 6, 230 complain_overflow_dont, 231 nios2_elf32_lo16_relocate, 232 "R_NIOS2_LO16", 233 FALSE, 234 0x003fffc0, 235 0x003fffc0, 236 FALSE), 237 238 HOWTO (R_NIOS2_HIADJ16, 239 0, 240 2, 241 32, 242 FALSE, 243 6, 244 complain_overflow_dont, 245 nios2_elf32_hiadj16_relocate, 246 "R_NIOS2_HIADJ16", 247 FALSE, 248 0x003fffc0, 249 0x003fffc0, 250 FALSE), 251 252 HOWTO (R_NIOS2_BFD_RELOC_32, 253 0, 254 2, /* long */ 255 32, 256 FALSE, 257 0, 258 complain_overflow_dont, 259 bfd_elf_generic_reloc, 260 "R_NIOS2_BFD_RELOC32", 261 FALSE, 262 0xffffffff, 263 0xffffffff, 264 FALSE), 265 266 HOWTO (R_NIOS2_BFD_RELOC_16, 267 0, 268 1, /* short */ 269 16, 270 FALSE, 271 0, 272 complain_overflow_bitfield, 273 bfd_elf_generic_reloc, 274 "R_NIOS2_BFD_RELOC16", 275 FALSE, 276 0x0000ffff, 277 0x0000ffff, 278 FALSE), 279 280 HOWTO (R_NIOS2_BFD_RELOC_8, 281 0, 282 0, /* byte */ 283 8, 284 FALSE, 285 0, 286 complain_overflow_bitfield, 287 bfd_elf_generic_reloc, 288 "R_NIOS2_BFD_RELOC8", 289 FALSE, 290 0x000000ff, 291 0x000000ff, 292 FALSE), 293 294 HOWTO (R_NIOS2_GPREL, 295 0, 296 2, 297 32, 298 FALSE, 299 6, 300 complain_overflow_dont, 301 nios2_elf32_gprel_relocate, 302 "R_NIOS2_GPREL", 303 FALSE, 304 0x003fffc0, 305 0x003fffc0, 306 FALSE), 307 308 HOWTO (R_NIOS2_GNU_VTINHERIT, 309 0, 310 2, /* short */ 311 0, 312 FALSE, 313 0, 314 complain_overflow_dont, 315 NULL, 316 "R_NIOS2_GNU_VTINHERIT", 317 FALSE, 318 0, 319 0, 320 FALSE), 321 322 HOWTO (R_NIOS2_GNU_VTENTRY, 323 0, 324 2, /* byte */ 325 0, 326 FALSE, 327 0, 328 complain_overflow_dont, 329 _bfd_elf_rel_vtable_reloc_fn, 330 "R_NIOS2_GNU_VTENTRY", 331 FALSE, 332 0, 333 0, 334 FALSE), 335 336 HOWTO (R_NIOS2_UJMP, 337 0, 338 2, 339 32, 340 FALSE, 341 6, 342 complain_overflow_dont, 343 nios2_elf32_ujmp_relocate, 344 "R_NIOS2_UJMP", 345 FALSE, 346 0x003fffc0, 347 0x003fffc0, 348 FALSE), 349 350 HOWTO (R_NIOS2_CJMP, 351 0, 352 2, 353 32, 354 FALSE, 355 6, 356 complain_overflow_dont, 357 nios2_elf32_cjmp_relocate, 358 "R_NIOS2_CJMP", 359 FALSE, 360 0x003fffc0, 361 0x003fffc0, 362 FALSE), 363 364 HOWTO (R_NIOS2_CALLR, 365 0, 366 2, 367 32, 368 FALSE, 369 6, 370 complain_overflow_dont, 371 nios2_elf32_callr_relocate, 372 "R_NIOS2_CALLR", 373 FALSE, 374 0x003fffc0, 375 0x003fffc0, 376 FALSE), 377 378 HOWTO (R_NIOS2_ALIGN, 379 0, 380 2, 381 0, 382 FALSE, 383 0, 384 complain_overflow_dont, 385 nios2_elf32_ignore_reloc, 386 "R_NIOS2_ALIGN", 387 FALSE, 388 0, 389 0, 390 TRUE), 391 392 393 HOWTO (R_NIOS2_GOT16, 394 0, 395 2, 396 16, 397 FALSE, 398 6, 399 complain_overflow_bitfield, 400 bfd_elf_generic_reloc, 401 "R_NIOS2_GOT16", 402 FALSE, 403 0x003fffc0, 404 0x003fffc0, 405 FALSE), 406 407 HOWTO (R_NIOS2_CALL16, 408 0, 409 2, 410 16, 411 FALSE, 412 6, 413 complain_overflow_bitfield, 414 bfd_elf_generic_reloc, 415 "R_NIOS2_CALL16", 416 FALSE, 417 0x003fffc0, 418 0x003fffc0, 419 FALSE), 420 421 HOWTO (R_NIOS2_GOTOFF_LO, 422 0, 423 2, 424 16, 425 FALSE, 426 6, 427 complain_overflow_dont, 428 bfd_elf_generic_reloc, 429 "R_NIOS2_GOTOFF_LO", 430 FALSE, 431 0x003fffc0, 432 0x003fffc0, 433 FALSE), 434 435 HOWTO (R_NIOS2_GOTOFF_HA, 436 0, 437 2, 438 16, 439 FALSE, 440 6, 441 complain_overflow_dont, 442 bfd_elf_generic_reloc, 443 "R_NIOS2_GOTOFF_HA", 444 FALSE, 445 0x003fffc0, 446 0x003fffc0, 447 FALSE), 448 449 HOWTO (R_NIOS2_PCREL_LO, 450 0, 451 2, 452 16, 453 TRUE, 454 6, 455 complain_overflow_dont, 456 nios2_elf32_pcrel_lo16_relocate, 457 "R_NIOS2_PCREL_LO", 458 FALSE, 459 0x003fffc0, 460 0x003fffc0, 461 TRUE), 462 463 HOWTO (R_NIOS2_PCREL_HA, 464 0, 465 2, 466 16, 467 FALSE, /* This is a PC-relative relocation, but we need to subtract 468 PC ourselves before the HIADJ. */ 469 6, 470 complain_overflow_dont, 471 nios2_elf32_pcrel_hiadj16_relocate, 472 "R_NIOS2_PCREL_HA", 473 FALSE, 474 0x003fffc0, 475 0x003fffc0, 476 TRUE), 477 478 HOWTO (R_NIOS2_TLS_GD16, 479 0, 480 2, 481 16, 482 FALSE, 483 6, 484 complain_overflow_bitfield, 485 bfd_elf_generic_reloc, 486 "R_NIOS2_TLS_GD16", 487 FALSE, 488 0x003fffc0, 489 0x003fffc0, 490 FALSE), 491 492 HOWTO (R_NIOS2_TLS_LDM16, 493 0, 494 2, 495 16, 496 FALSE, 497 6, 498 complain_overflow_bitfield, 499 bfd_elf_generic_reloc, 500 "R_NIOS2_TLS_LDM16", 501 FALSE, 502 0x003fffc0, 503 0x003fffc0, 504 FALSE), 505 506 HOWTO (R_NIOS2_TLS_LDO16, 507 0, 508 2, 509 16, 510 FALSE, 511 6, 512 complain_overflow_bitfield, 513 bfd_elf_generic_reloc, 514 "R_NIOS2_TLS_LDO16", 515 FALSE, 516 0x003fffc0, 517 0x003fffc0, 518 FALSE), 519 520 HOWTO (R_NIOS2_TLS_IE16, 521 0, 522 2, 523 16, 524 FALSE, 525 6, 526 complain_overflow_bitfield, 527 bfd_elf_generic_reloc, 528 "R_NIOS2_TLS_IE16", 529 FALSE, 530 0x003fffc0, 531 0x003fffc0, 532 FALSE), 533 534 HOWTO (R_NIOS2_TLS_LE16, 535 0, 536 2, 537 16, 538 FALSE, 539 6, 540 complain_overflow_bitfield, 541 bfd_elf_generic_reloc, 542 "R_NIOS2_TLS_LE16", 543 FALSE, 544 0x003fffc0, 545 0x003fffc0, 546 FALSE), 547 548 HOWTO (R_NIOS2_TLS_DTPMOD, 549 0, 550 2, 551 32, 552 FALSE, 553 0, 554 complain_overflow_dont, 555 bfd_elf_generic_reloc, 556 "R_NIOS2_TLS_DTPMOD", 557 FALSE, 558 0xffffffff, 559 0xffffffff, 560 FALSE), 561 562 HOWTO (R_NIOS2_TLS_DTPREL, 563 0, 564 2, 565 32, 566 FALSE, 567 0, 568 complain_overflow_dont, 569 bfd_elf_generic_reloc, 570 "R_NIOS2_TLS_DTPREL", 571 FALSE, 572 0xffffffff, 573 0xffffffff, 574 FALSE), 575 576 HOWTO (R_NIOS2_TLS_TPREL, 577 0, 578 2, 579 32, 580 FALSE, 581 0, 582 complain_overflow_dont, 583 bfd_elf_generic_reloc, 584 "R_NIOS2_TLS_TPREL", 585 FALSE, 586 0xffffffff, 587 0xffffffff, 588 FALSE), 589 590 HOWTO (R_NIOS2_COPY, 591 0, 592 2, 593 32, 594 FALSE, 595 0, 596 complain_overflow_dont, 597 bfd_elf_generic_reloc, 598 "R_NIOS2_COPY", 599 FALSE, 600 0, 601 0, 602 FALSE), 603 604 HOWTO (R_NIOS2_GLOB_DAT, 605 0, 606 2, 607 32, 608 FALSE, 609 0, 610 complain_overflow_dont, 611 bfd_elf_generic_reloc, 612 "R_NIOS2_GLOB_DAT", 613 FALSE, 614 0xffffffff, 615 0xffffffff, 616 FALSE), 617 618 HOWTO (R_NIOS2_JUMP_SLOT, 619 0, 620 2, 621 32, 622 FALSE, 623 0, 624 complain_overflow_dont, 625 bfd_elf_generic_reloc, 626 "R_NIOS2_JUMP_SLOT", 627 FALSE, 628 0xffffffff, 629 0xffffffff, 630 FALSE), 631 632 HOWTO (R_NIOS2_RELATIVE, 633 0, 634 2, 635 32, 636 FALSE, 637 0, 638 complain_overflow_dont, 639 bfd_elf_generic_reloc, 640 "R_NIOS2_RELATIVE", 641 FALSE, 642 0xffffffff, 643 0xffffffff, 644 FALSE), 645 646 HOWTO (R_NIOS2_GOTOFF, 647 0, 648 2, 649 32, 650 FALSE, 651 0, 652 complain_overflow_dont, 653 bfd_elf_generic_reloc, 654 "R_NIOS2_GOTOFF", 655 FALSE, 656 0xffffffff, 657 0xffffffff, 658 FALSE), 659 660 HOWTO (R_NIOS2_CALL26_NOAT, /* type */ 661 2, /* rightshift */ 662 2, /* size (0 = byte, 1 = short, 2 = long) */ 663 26, /* bitsize */ 664 FALSE, /* pc_relative */ 665 6, /* bitpos */ 666 complain_overflow_dont, /* complain on overflow */ 667 nios2_elf32_call26_relocate, /* special function */ 668 "R_NIOS2_CALL26_NOAT", /* name */ 669 FALSE, /* partial_inplace */ 670 0xffffffc0, /* src_mask */ 671 0xffffffc0, /* dst_mask */ 672 FALSE), /* pcrel_offset */ 673 674 HOWTO (R_NIOS2_GOT_LO, 675 0, 676 2, 677 16, 678 FALSE, 679 6, 680 complain_overflow_dont, 681 bfd_elf_generic_reloc, 682 "R_NIOS2_GOT_LO", 683 FALSE, 684 0x003fffc0, 685 0x003fffc0, 686 FALSE), 687 688 HOWTO (R_NIOS2_GOT_HA, 689 0, 690 2, 691 16, 692 FALSE, 693 6, 694 complain_overflow_dont, 695 bfd_elf_generic_reloc, 696 "R_NIOS2_GOT_HA", 697 FALSE, 698 0x003fffc0, 699 0x003fffc0, 700 FALSE), 701 702 HOWTO (R_NIOS2_CALL_LO, 703 0, 704 2, 705 16, 706 FALSE, 707 6, 708 complain_overflow_dont, 709 bfd_elf_generic_reloc, 710 "R_NIOS2_CALL_LO", 711 FALSE, 712 0x003fffc0, 713 0x003fffc0, 714 FALSE), 715 716 HOWTO (R_NIOS2_CALL_HA, 717 0, 718 2, 719 16, 720 FALSE, 721 6, 722 complain_overflow_dont, 723 bfd_elf_generic_reloc, 724 "R_NIOS2_CALL_HA", 725 FALSE, 726 0x003fffc0, 727 0x003fffc0, 728 FALSE), 729 730 /* Add other relocations here. */ 731 }; 732 733 static reloc_howto_type elf_nios2_r2_howto_table_rel[] = { 734 /* No relocation. */ 735 HOWTO (R_NIOS2_NONE, /* type */ 736 0, /* rightshift */ 737 0, /* size (0 = byte, 1 = short, 2 = long) */ 738 0, /* bitsize */ 739 FALSE, /* pc_relative */ 740 0, /* bitpos */ 741 complain_overflow_dont, /* complain_on_overflow */ 742 bfd_elf_generic_reloc, /* special_function */ 743 "R_NIOS2_NONE", /* name */ 744 FALSE, /* partial_inplace */ 745 0, /* src_mask */ 746 0, /* dst_mask */ 747 FALSE), /* pcrel_offset */ 748 749 /* 16-bit signed immediate relocation. */ 750 HOWTO (R_NIOS2_S16, /* type */ 751 0, /* rightshift */ 752 2, /* size (0 = byte, 1 = short, 2 = long) */ 753 16, /* bitsize */ 754 FALSE, /* pc_relative */ 755 16, /* bitpos */ 756 complain_overflow_signed, /* complain on overflow */ 757 bfd_elf_generic_reloc, /* special function */ 758 "R_NIOS2_S16", /* name */ 759 FALSE, /* partial_inplace */ 760 0xffff0000, /* src_mask */ 761 0xffff0000, /* dest_mask */ 762 FALSE), /* pcrel_offset */ 763 764 /* 16-bit unsigned immediate relocation. */ 765 HOWTO (R_NIOS2_U16, /* type */ 766 0, /* rightshift */ 767 2, /* size (0 = byte, 1 = short, 2 = long) */ 768 16, /* bitsize */ 769 FALSE, /* pc_relative */ 770 16, /* bitpos */ 771 complain_overflow_unsigned, /* complain on overflow */ 772 bfd_elf_generic_reloc, /* special function */ 773 "R_NIOS2_U16", /* name */ 774 FALSE, /* partial_inplace */ 775 0xffff0000, /* src_mask */ 776 0xffff0000, /* dest_mask */ 777 FALSE), /* pcrel_offset */ 778 779 HOWTO (R_NIOS2_PCREL16, /* type */ 780 0, /* rightshift */ 781 2, /* size (0 = byte, 1 = short, 2 = long) */ 782 16, /* bitsize */ 783 TRUE, /* pc_relative */ 784 16, /* bitpos */ 785 complain_overflow_signed, /* complain on overflow */ 786 nios2_elf32_pcrel16_relocate, /* special function */ 787 "R_NIOS2_PCREL16", /* name */ 788 FALSE, /* partial_inplace */ 789 0xffff0000, /* src_mask */ 790 0xffff0000, /* dest_mask */ 791 TRUE), /* pcrel_offset */ 792 793 HOWTO (R_NIOS2_CALL26, /* type */ 794 2, /* rightshift */ 795 2, /* size (0 = byte, 1 = short, 2 = long) */ 796 26, /* bitsize */ 797 FALSE, /* pc_relative */ 798 6, /* bitpos */ 799 complain_overflow_dont, /* complain on overflow */ 800 nios2_elf32_call26_relocate, /* special function */ 801 "R_NIOS2_CALL26", /* name */ 802 FALSE, /* partial_inplace */ 803 0xffffffc0, /* src_mask */ 804 0xffffffc0, /* dst_mask */ 805 FALSE), /* pcrel_offset */ 806 807 HOWTO (R_NIOS2_IMM5, 808 0, 809 2, 810 5, 811 FALSE, 812 21, 813 complain_overflow_bitfield, 814 bfd_elf_generic_reloc, 815 "R_NIOS2_IMM5", 816 FALSE, 817 0x03e00000, 818 0x03e00000, 819 FALSE), 820 821 HOWTO (R_NIOS2_CACHE_OPX, 822 0, 823 2, 824 5, 825 FALSE, 826 11, 827 complain_overflow_bitfield, 828 bfd_elf_generic_reloc, 829 "R_NIOS2_CACHE_OPX", 830 FALSE, 831 0x0000f800, 832 0x0000f800, 833 FALSE), 834 835 HOWTO (R_NIOS2_IMM6, 836 0, 837 2, 838 6, 839 FALSE, 840 26, 841 complain_overflow_bitfield, 842 bfd_elf_generic_reloc, 843 "R_NIOS2_IMM6", 844 FALSE, 845 0xfc000000, 846 0xfc000000, 847 FALSE), 848 849 HOWTO (R_NIOS2_IMM8, 850 0, 851 2, 852 8, 853 FALSE, 854 24, 855 complain_overflow_bitfield, 856 bfd_elf_generic_reloc, 857 "R_NIOS2_IMM8", 858 FALSE, 859 0xff000000, 860 0xff000000, 861 FALSE), 862 863 HOWTO (R_NIOS2_HI16, 864 0, 865 2, 866 32, 867 FALSE, 868 16, 869 complain_overflow_dont, 870 nios2_elf32_hi16_relocate, 871 "R_NIOS2_HI16", 872 FALSE, 873 0xffff0000, 874 0xffff0000, 875 FALSE), 876 877 HOWTO (R_NIOS2_LO16, 878 0, 879 2, 880 32, 881 FALSE, 882 16, 883 complain_overflow_dont, 884 nios2_elf32_lo16_relocate, 885 "R_NIOS2_LO16", 886 FALSE, 887 0xffff0000, 888 0xffff0000, 889 FALSE), 890 891 HOWTO (R_NIOS2_HIADJ16, 892 0, 893 2, 894 32, 895 FALSE, 896 16, 897 complain_overflow_dont, 898 nios2_elf32_hiadj16_relocate, 899 "R_NIOS2_HIADJ16", 900 FALSE, 901 0xffff0000, 902 0xffff0000, 903 FALSE), 904 905 HOWTO (R_NIOS2_BFD_RELOC_32, 906 0, 907 2, /* long */ 908 32, 909 FALSE, 910 0, 911 complain_overflow_dont, 912 bfd_elf_generic_reloc, 913 "R_NIOS2_BFD_RELOC32", 914 FALSE, 915 0xffffffff, 916 0xffffffff, 917 FALSE), 918 919 HOWTO (R_NIOS2_BFD_RELOC_16, 920 0, 921 1, /* short */ 922 16, 923 FALSE, 924 0, 925 complain_overflow_bitfield, 926 bfd_elf_generic_reloc, 927 "R_NIOS2_BFD_RELOC16", 928 FALSE, 929 0x0000ffff, 930 0x0000ffff, 931 FALSE), 932 933 HOWTO (R_NIOS2_BFD_RELOC_8, 934 0, 935 0, /* byte */ 936 8, 937 FALSE, 938 0, 939 complain_overflow_bitfield, 940 bfd_elf_generic_reloc, 941 "R_NIOS2_BFD_RELOC8", 942 FALSE, 943 0x000000ff, 944 0x000000ff, 945 FALSE), 946 947 HOWTO (R_NIOS2_GPREL, 948 0, 949 2, 950 32, 951 FALSE, 952 16, 953 complain_overflow_dont, 954 nios2_elf32_gprel_relocate, 955 "R_NIOS2_GPREL", 956 FALSE, 957 0xffff0000, 958 0xffff0000, 959 FALSE), 960 961 HOWTO (R_NIOS2_GNU_VTINHERIT, 962 0, 963 2, /* short */ 964 0, 965 FALSE, 966 0, 967 complain_overflow_dont, 968 NULL, 969 "R_NIOS2_GNU_VTINHERIT", 970 FALSE, 971 0, 972 0, 973 FALSE), 974 975 HOWTO (R_NIOS2_GNU_VTENTRY, 976 0, 977 2, /* byte */ 978 0, 979 FALSE, 980 0, 981 complain_overflow_dont, 982 _bfd_elf_rel_vtable_reloc_fn, 983 "R_NIOS2_GNU_VTENTRY", 984 FALSE, 985 0, 986 0, 987 FALSE), 988 989 HOWTO (R_NIOS2_UJMP, 990 0, 991 2, 992 32, 993 FALSE, 994 16, 995 complain_overflow_dont, 996 nios2_elf32_ujmp_relocate, 997 "R_NIOS2_UJMP", 998 FALSE, 999 0xffff0000, 1000 0xffff0000, 1001 FALSE), 1002 1003 HOWTO (R_NIOS2_CJMP, 1004 0, 1005 2, 1006 32, 1007 FALSE, 1008 16, 1009 complain_overflow_dont, 1010 nios2_elf32_cjmp_relocate, 1011 "R_NIOS2_CJMP", 1012 FALSE, 1013 0xffff0000, 1014 0xffff0000, 1015 FALSE), 1016 1017 HOWTO (R_NIOS2_CALLR, 1018 0, 1019 2, 1020 32, 1021 FALSE, 1022 16, 1023 complain_overflow_dont, 1024 nios2_elf32_callr_relocate, 1025 "R_NIOS2_CALLR", 1026 FALSE, 1027 0xffff0000, 1028 0xffff0000, 1029 FALSE), 1030 1031 HOWTO (R_NIOS2_ALIGN, 1032 0, 1033 2, 1034 0, 1035 FALSE, 1036 0, 1037 complain_overflow_dont, 1038 nios2_elf32_ignore_reloc, 1039 "R_NIOS2_ALIGN", 1040 FALSE, 1041 0, 1042 0, 1043 TRUE), 1044 1045 HOWTO (R_NIOS2_GOT16, 1046 0, 1047 2, 1048 16, 1049 FALSE, 1050 16, 1051 complain_overflow_bitfield, 1052 bfd_elf_generic_reloc, 1053 "R_NIOS2_GOT16", 1054 FALSE, 1055 0xffff0000, 1056 0xffff0000, 1057 FALSE), 1058 1059 HOWTO (R_NIOS2_CALL16, 1060 0, 1061 2, 1062 16, 1063 FALSE, 1064 16, 1065 complain_overflow_bitfield, 1066 bfd_elf_generic_reloc, 1067 "R_NIOS2_CALL16", 1068 FALSE, 1069 0xffff0000, 1070 0xffff0000, 1071 FALSE), 1072 1073 HOWTO (R_NIOS2_GOTOFF_LO, 1074 0, 1075 2, 1076 16, 1077 FALSE, 1078 16, 1079 complain_overflow_dont, 1080 bfd_elf_generic_reloc, 1081 "R_NIOS2_GOTOFF_LO", 1082 FALSE, 1083 0xffff0000, 1084 0xffff0000, 1085 FALSE), 1086 1087 HOWTO (R_NIOS2_GOTOFF_HA, 1088 0, 1089 2, 1090 16, 1091 FALSE, 1092 16, 1093 complain_overflow_dont, 1094 bfd_elf_generic_reloc, 1095 "R_NIOS2_GOTOFF_HA", 1096 FALSE, 1097 0xffff0000, 1098 0xffff0000, 1099 FALSE), 1100 1101 HOWTO (R_NIOS2_PCREL_LO, 1102 0, 1103 2, 1104 16, 1105 TRUE, 1106 16, 1107 complain_overflow_dont, 1108 nios2_elf32_pcrel_lo16_relocate, 1109 "R_NIOS2_PCREL_LO", 1110 FALSE, 1111 0xffff0000, 1112 0xffff0000, 1113 TRUE), 1114 1115 HOWTO (R_NIOS2_PCREL_HA, 1116 0, 1117 2, 1118 16, 1119 FALSE, /* This is a PC-relative relocation, but we need to subtract 1120 PC ourselves before the HIADJ. */ 1121 16, 1122 complain_overflow_dont, 1123 nios2_elf32_pcrel_hiadj16_relocate, 1124 "R_NIOS2_PCREL_HA", 1125 FALSE, 1126 0xffff0000, 1127 0xffff0000, 1128 TRUE), 1129 1130 HOWTO (R_NIOS2_TLS_GD16, 1131 0, 1132 2, 1133 16, 1134 FALSE, 1135 16, 1136 complain_overflow_bitfield, 1137 bfd_elf_generic_reloc, 1138 "R_NIOS2_TLS_GD16", 1139 FALSE, 1140 0xffff0000, 1141 0xffff0000, 1142 FALSE), 1143 1144 HOWTO (R_NIOS2_TLS_LDM16, 1145 0, 1146 2, 1147 16, 1148 FALSE, 1149 16, 1150 complain_overflow_bitfield, 1151 bfd_elf_generic_reloc, 1152 "R_NIOS2_TLS_LDM16", 1153 FALSE, 1154 0xffff0000, 1155 0xffff0000, 1156 FALSE), 1157 1158 HOWTO (R_NIOS2_TLS_LDO16, 1159 0, 1160 2, 1161 16, 1162 FALSE, 1163 16, 1164 complain_overflow_bitfield, 1165 bfd_elf_generic_reloc, 1166 "R_NIOS2_TLS_LDO16", 1167 FALSE, 1168 0xffff0000, 1169 0xffff0000, 1170 FALSE), 1171 1172 HOWTO (R_NIOS2_TLS_IE16, 1173 0, 1174 2, 1175 16, 1176 FALSE, 1177 16, 1178 complain_overflow_bitfield, 1179 bfd_elf_generic_reloc, 1180 "R_NIOS2_TLS_IE16", 1181 FALSE, 1182 0xffff0000, 1183 0xffff0000, 1184 FALSE), 1185 1186 HOWTO (R_NIOS2_TLS_LE16, 1187 0, 1188 2, 1189 16, 1190 FALSE, 1191 16, 1192 complain_overflow_bitfield, 1193 bfd_elf_generic_reloc, 1194 "R_NIOS2_TLS_LE16", 1195 FALSE, 1196 0xffff0000, 1197 0xffff0000, 1198 FALSE), 1199 1200 HOWTO (R_NIOS2_TLS_DTPMOD, 1201 0, 1202 2, 1203 32, 1204 FALSE, 1205 0, 1206 complain_overflow_dont, 1207 bfd_elf_generic_reloc, 1208 "R_NIOS2_TLS_DTPMOD", 1209 FALSE, 1210 0xffffffff, 1211 0xffffffff, 1212 FALSE), 1213 1214 HOWTO (R_NIOS2_TLS_DTPREL, 1215 0, 1216 2, 1217 32, 1218 FALSE, 1219 0, 1220 complain_overflow_dont, 1221 bfd_elf_generic_reloc, 1222 "R_NIOS2_TLS_DTPREL", 1223 FALSE, 1224 0xffffffff, 1225 0xffffffff, 1226 FALSE), 1227 1228 HOWTO (R_NIOS2_TLS_TPREL, 1229 0, 1230 2, 1231 32, 1232 FALSE, 1233 0, 1234 complain_overflow_dont, 1235 bfd_elf_generic_reloc, 1236 "R_NIOS2_TLS_TPREL", 1237 FALSE, 1238 0xffffffff, 1239 0xffffffff, 1240 FALSE), 1241 1242 HOWTO (R_NIOS2_COPY, 1243 0, 1244 2, 1245 32, 1246 FALSE, 1247 0, 1248 complain_overflow_dont, 1249 bfd_elf_generic_reloc, 1250 "R_NIOS2_COPY", 1251 FALSE, 1252 0, 1253 0, 1254 FALSE), 1255 1256 HOWTO (R_NIOS2_GLOB_DAT, 1257 0, 1258 2, 1259 32, 1260 FALSE, 1261 0, 1262 complain_overflow_dont, 1263 bfd_elf_generic_reloc, 1264 "R_NIOS2_GLOB_DAT", 1265 FALSE, 1266 0xffffffff, 1267 0xffffffff, 1268 FALSE), 1269 1270 HOWTO (R_NIOS2_JUMP_SLOT, 1271 0, 1272 2, 1273 32, 1274 FALSE, 1275 0, 1276 complain_overflow_dont, 1277 bfd_elf_generic_reloc, 1278 "R_NIOS2_JUMP_SLOT", 1279 FALSE, 1280 0xffffffff, 1281 0xffffffff, 1282 FALSE), 1283 1284 HOWTO (R_NIOS2_RELATIVE, 1285 0, 1286 2, 1287 32, 1288 FALSE, 1289 0, 1290 complain_overflow_dont, 1291 bfd_elf_generic_reloc, 1292 "R_NIOS2_RELATIVE", 1293 FALSE, 1294 0xffffffff, 1295 0xffffffff, 1296 FALSE), 1297 1298 HOWTO (R_NIOS2_GOTOFF, 1299 0, 1300 2, 1301 32, 1302 FALSE, 1303 0, 1304 complain_overflow_dont, 1305 bfd_elf_generic_reloc, 1306 "R_NIOS2_GOTOFF", 1307 FALSE, 1308 0xffffffff, 1309 0xffffffff, 1310 FALSE), 1311 1312 HOWTO (R_NIOS2_CALL26_NOAT, /* type */ 1313 2, /* rightshift */ 1314 2, /* size (0 = byte, 1 = short, 2 = long) */ 1315 26, /* bitsize */ 1316 FALSE, /* pc_relative */ 1317 6, /* bitpos */ 1318 complain_overflow_dont, /* complain on overflow */ 1319 nios2_elf32_call26_relocate, /* special function */ 1320 "R_NIOS2_CALL26_NOAT", /* name */ 1321 FALSE, /* partial_inplace */ 1322 0xffffffc0, /* src_mask */ 1323 0xffffffc0, /* dst_mask */ 1324 FALSE), /* pcrel_offset */ 1325 1326 HOWTO (R_NIOS2_GOT_LO, 1327 0, 1328 2, 1329 16, 1330 FALSE, 1331 16, 1332 complain_overflow_dont, 1333 bfd_elf_generic_reloc, 1334 "R_NIOS2_GOT_LO", 1335 FALSE, 1336 0xffff0000, 1337 0xffff0000, 1338 FALSE), 1339 1340 HOWTO (R_NIOS2_GOT_HA, 1341 0, 1342 2, 1343 16, 1344 FALSE, 1345 16, 1346 complain_overflow_dont, 1347 bfd_elf_generic_reloc, 1348 "R_NIOS2_GOT_HA", 1349 FALSE, 1350 0xffff0000, 1351 0xffff0000, 1352 FALSE), 1353 1354 HOWTO (R_NIOS2_CALL_LO, 1355 0, 1356 2, 1357 16, 1358 FALSE, 1359 16, 1360 complain_overflow_dont, 1361 bfd_elf_generic_reloc, 1362 "R_NIOS2_CALL_LO", 1363 FALSE, 1364 0xffff0000, 1365 0xffff0000, 1366 FALSE), 1367 1368 HOWTO (R_NIOS2_CALL_HA, 1369 0, 1370 2, 1371 16, 1372 FALSE, 1373 16, 1374 complain_overflow_dont, 1375 bfd_elf_generic_reloc, 1376 "R_NIOS2_CALL_HA", 1377 FALSE, 1378 0xffff0000, 1379 0xffff0000, 1380 FALSE), 1381 1382 HOWTO (R_NIOS2_R2_S12, 1383 0, 1384 2, 1385 12, 1386 FALSE, 1387 16, 1388 complain_overflow_signed, 1389 bfd_elf_generic_reloc, 1390 "R_NIOS2_R2_S12", 1391 FALSE, 1392 0x0fff0000, 1393 0x0fff0000, 1394 FALSE), 1395 1396 HOWTO (R_NIOS2_R2_I10_1_PCREL, 1397 1, 1398 1, 1399 10, 1400 TRUE, 1401 6, 1402 complain_overflow_signed, 1403 bfd_elf_generic_reloc, /* FIXME? */ 1404 "R_NIOS2_R2_I10_1_PCREL", 1405 FALSE, 1406 0xffc0, 1407 0xffc0, 1408 TRUE), 1409 1410 HOWTO (R_NIOS2_R2_T1I7_1_PCREL, 1411 1, 1412 1, 1413 7, 1414 TRUE, 1415 9, 1416 complain_overflow_signed, 1417 bfd_elf_generic_reloc, /* FIXME? */ 1418 "R_NIOS2_R2_T1I7_1_PCREL", 1419 FALSE, 1420 0xfe00, 1421 0xfe00, 1422 TRUE), 1423 1424 HOWTO (R_NIOS2_R2_T1I7_2, 1425 2, 1426 1, 1427 7, 1428 FALSE, 1429 9, 1430 complain_overflow_unsigned, 1431 bfd_elf_generic_reloc, 1432 "R_NIOS2_R2_T1I7_2", 1433 FALSE, 1434 0xfe00, 1435 0xfe00, 1436 FALSE), 1437 1438 HOWTO (R_NIOS2_R2_T2I4, 1439 0, 1440 1, 1441 4, 1442 FALSE, 1443 12, 1444 complain_overflow_unsigned, 1445 bfd_elf_generic_reloc, 1446 "R_NIOS2_R2_T2I4", 1447 FALSE, 1448 0xf000, 1449 0xf000, 1450 FALSE), 1451 1452 HOWTO (R_NIOS2_R2_T2I4_1, 1453 1, 1454 1, 1455 4, 1456 FALSE, 1457 12, 1458 complain_overflow_unsigned, 1459 bfd_elf_generic_reloc, 1460 "R_NIOS2_R2_T2I4_1", 1461 FALSE, 1462 0xf000, 1463 0xf000, 1464 FALSE), 1465 1466 HOWTO (R_NIOS2_R2_T2I4_2, 1467 2, 1468 1, 1469 4, 1470 FALSE, 1471 12, 1472 complain_overflow_unsigned, 1473 bfd_elf_generic_reloc, 1474 "R_NIOS2_R2_T2I4_2", 1475 FALSE, 1476 0xf000, 1477 0xf000, 1478 FALSE), 1479 1480 HOWTO (R_NIOS2_R2_X1I7_2, 1481 2, 1482 1, 1483 7, 1484 FALSE, 1485 6, 1486 complain_overflow_unsigned, 1487 bfd_elf_generic_reloc, 1488 "R_NIOS2_R2_X1I7_2", 1489 FALSE, 1490 0x1fc0, 1491 0x1fc0, 1492 FALSE), 1493 1494 HOWTO (R_NIOS2_R2_X2L5, 1495 0, 1496 1, 1497 5, 1498 FALSE, 1499 6, 1500 complain_overflow_unsigned, 1501 bfd_elf_generic_reloc, 1502 "R_NIOS2_R2_X2L5", 1503 FALSE, 1504 0x07c0, 1505 0x07c0, 1506 FALSE), 1507 1508 HOWTO (R_NIOS2_R2_F1I5_2, 1509 2, 1510 1, 1511 5, 1512 FALSE, 1513 6, 1514 complain_overflow_unsigned, 1515 bfd_elf_generic_reloc, 1516 "R_NIOS2_R2_F1L5_2", 1517 FALSE, 1518 0x07c0, 1519 0x07c0, 1520 FALSE), 1521 1522 HOWTO (R_NIOS2_R2_L5I4X1, 1523 2, 1524 1, 1525 4, 1526 FALSE, 1527 6, 1528 complain_overflow_unsigned, 1529 bfd_elf_generic_reloc, 1530 "R_NIOS2_R2_L5I4X1", 1531 FALSE, 1532 0x03c0, 1533 0x03c0, 1534 FALSE), 1535 1536 HOWTO (R_NIOS2_R2_T1X1I6, 1537 0, 1538 1, 1539 6, 1540 FALSE, 1541 9, 1542 complain_overflow_unsigned, 1543 bfd_elf_generic_reloc, 1544 "R_NIOS2_R2_T1X1I6", 1545 FALSE, 1546 0x7e00, 1547 0x7e00, 1548 FALSE), 1549 1550 HOWTO (R_NIOS2_R2_T1X1I6_2, 1551 2, 1552 2, 1553 6, 1554 FALSE, 1555 9, 1556 complain_overflow_unsigned, 1557 bfd_elf_generic_reloc, 1558 "R_NIOS2_R2_T1I1X6_2", 1559 FALSE, 1560 0x7e00, 1561 0x7e00, 1562 FALSE), 1563 1564 /* Add other relocations here. */ 1565 }; 1566 1567 static unsigned char elf_code_to_howto_index[R_NIOS2_ILLEGAL + 1]; 1568 1569 1570 /* Return true if producing output for a R2 BFD. */ 1571 #define BFD_IS_R2(abfd) (bfd_get_mach (abfd) == bfd_mach_nios2r2) 1572 1573 /* Return the howto for relocation RTYPE. */ 1574 static reloc_howto_type * 1575 lookup_howto (unsigned int rtype, bfd *abfd) 1576 { 1577 static int initialized = 0; 1578 int i; 1579 /* R2 relocations are a superset of R1, so use that for the lookup 1580 table. */ 1581 int r1_howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel) 1582 / sizeof (elf_nios2_r1_howto_table_rel[0])); 1583 int r2_howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel) 1584 / sizeof (elf_nios2_r2_howto_table_rel[0])); 1585 1586 if (!initialized) 1587 { 1588 initialized = 1; 1589 memset (elf_code_to_howto_index, 0xff, 1590 sizeof (elf_code_to_howto_index)); 1591 for (i = 0; i < r2_howto_tbl_size; i++) 1592 { 1593 elf_code_to_howto_index[elf_nios2_r2_howto_table_rel[i].type] = i; 1594 if (i < r1_howto_tbl_size) 1595 BFD_ASSERT (elf_nios2_r2_howto_table_rel[i].type 1596 == elf_nios2_r1_howto_table_rel[i].type); 1597 } 1598 } 1599 1600 BFD_ASSERT (rtype <= R_NIOS2_ILLEGAL); 1601 i = elf_code_to_howto_index[rtype]; 1602 if (BFD_IS_R2 (abfd)) 1603 { 1604 if (i >= r2_howto_tbl_size) 1605 return 0; 1606 return elf_nios2_r2_howto_table_rel + i; 1607 } 1608 else 1609 { 1610 if (i >= r1_howto_tbl_size) 1611 return 0; 1612 return elf_nios2_r1_howto_table_rel + i; 1613 } 1614 } 1615 1616 /* Map for converting BFD reloc types to Nios II reloc types. */ 1617 struct elf_reloc_map 1618 { 1619 bfd_reloc_code_real_type bfd_val; 1620 enum elf_nios2_reloc_type elf_val; 1621 }; 1622 1623 static const struct elf_reloc_map nios2_reloc_map[] = { 1624 {BFD_RELOC_NONE, R_NIOS2_NONE}, 1625 {BFD_RELOC_NIOS2_S16, R_NIOS2_S16}, 1626 {BFD_RELOC_NIOS2_U16, R_NIOS2_U16}, 1627 {BFD_RELOC_16_PCREL, R_NIOS2_PCREL16}, 1628 {BFD_RELOC_NIOS2_CALL26, R_NIOS2_CALL26}, 1629 {BFD_RELOC_NIOS2_IMM5, R_NIOS2_IMM5}, 1630 {BFD_RELOC_NIOS2_CACHE_OPX, R_NIOS2_CACHE_OPX}, 1631 {BFD_RELOC_NIOS2_IMM6, R_NIOS2_IMM6}, 1632 {BFD_RELOC_NIOS2_IMM8, R_NIOS2_IMM8}, 1633 {BFD_RELOC_NIOS2_HI16, R_NIOS2_HI16}, 1634 {BFD_RELOC_NIOS2_LO16, R_NIOS2_LO16}, 1635 {BFD_RELOC_NIOS2_HIADJ16, R_NIOS2_HIADJ16}, 1636 {BFD_RELOC_32, R_NIOS2_BFD_RELOC_32}, 1637 {BFD_RELOC_16, R_NIOS2_BFD_RELOC_16}, 1638 {BFD_RELOC_8, R_NIOS2_BFD_RELOC_8}, 1639 {BFD_RELOC_NIOS2_GPREL, R_NIOS2_GPREL}, 1640 {BFD_RELOC_VTABLE_INHERIT, R_NIOS2_GNU_VTINHERIT}, 1641 {BFD_RELOC_VTABLE_ENTRY, R_NIOS2_GNU_VTENTRY}, 1642 {BFD_RELOC_NIOS2_UJMP, R_NIOS2_UJMP}, 1643 {BFD_RELOC_NIOS2_CJMP, R_NIOS2_CJMP}, 1644 {BFD_RELOC_NIOS2_CALLR, R_NIOS2_CALLR}, 1645 {BFD_RELOC_NIOS2_ALIGN, R_NIOS2_ALIGN}, 1646 {BFD_RELOC_NIOS2_GOT16, R_NIOS2_GOT16}, 1647 {BFD_RELOC_NIOS2_CALL16, R_NIOS2_CALL16}, 1648 {BFD_RELOC_NIOS2_GOTOFF_LO, R_NIOS2_GOTOFF_LO}, 1649 {BFD_RELOC_NIOS2_GOTOFF_HA, R_NIOS2_GOTOFF_HA}, 1650 {BFD_RELOC_NIOS2_PCREL_LO, R_NIOS2_PCREL_LO}, 1651 {BFD_RELOC_NIOS2_PCREL_HA, R_NIOS2_PCREL_HA}, 1652 {BFD_RELOC_NIOS2_TLS_GD16, R_NIOS2_TLS_GD16}, 1653 {BFD_RELOC_NIOS2_TLS_LDM16, R_NIOS2_TLS_LDM16}, 1654 {BFD_RELOC_NIOS2_TLS_LDO16, R_NIOS2_TLS_LDO16}, 1655 {BFD_RELOC_NIOS2_TLS_IE16, R_NIOS2_TLS_IE16}, 1656 {BFD_RELOC_NIOS2_TLS_LE16, R_NIOS2_TLS_LE16}, 1657 {BFD_RELOC_NIOS2_TLS_DTPMOD, R_NIOS2_TLS_DTPMOD}, 1658 {BFD_RELOC_NIOS2_TLS_DTPREL, R_NIOS2_TLS_DTPREL}, 1659 {BFD_RELOC_NIOS2_TLS_TPREL, R_NIOS2_TLS_TPREL}, 1660 {BFD_RELOC_NIOS2_COPY, R_NIOS2_COPY}, 1661 {BFD_RELOC_NIOS2_GLOB_DAT, R_NIOS2_GLOB_DAT}, 1662 {BFD_RELOC_NIOS2_JUMP_SLOT, R_NIOS2_JUMP_SLOT}, 1663 {BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE}, 1664 {BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF}, 1665 {BFD_RELOC_NIOS2_CALL26_NOAT, R_NIOS2_CALL26_NOAT}, 1666 {BFD_RELOC_NIOS2_GOT_LO, R_NIOS2_GOT_LO}, 1667 {BFD_RELOC_NIOS2_GOT_HA, R_NIOS2_GOT_HA}, 1668 {BFD_RELOC_NIOS2_CALL_LO, R_NIOS2_CALL_LO}, 1669 {BFD_RELOC_NIOS2_CALL_HA, R_NIOS2_CALL_HA}, 1670 {BFD_RELOC_NIOS2_R2_S12, R_NIOS2_R2_S12}, 1671 {BFD_RELOC_NIOS2_R2_I10_1_PCREL, R_NIOS2_R2_I10_1_PCREL}, 1672 {BFD_RELOC_NIOS2_R2_T1I7_1_PCREL, R_NIOS2_R2_T1I7_1_PCREL}, 1673 {BFD_RELOC_NIOS2_R2_T1I7_2, R_NIOS2_R2_T1I7_2}, 1674 {BFD_RELOC_NIOS2_R2_T2I4, R_NIOS2_R2_T2I4}, 1675 {BFD_RELOC_NIOS2_R2_T2I4_1, R_NIOS2_R2_T2I4_1}, 1676 {BFD_RELOC_NIOS2_R2_T2I4_2, R_NIOS2_R2_T2I4_2}, 1677 {BFD_RELOC_NIOS2_R2_X1I7_2, R_NIOS2_R2_X1I7_2}, 1678 {BFD_RELOC_NIOS2_R2_X2L5, R_NIOS2_R2_X2L5}, 1679 {BFD_RELOC_NIOS2_R2_F1I5_2, R_NIOS2_R2_F1I5_2}, 1680 {BFD_RELOC_NIOS2_R2_L5I4X1, R_NIOS2_R2_L5I4X1}, 1681 {BFD_RELOC_NIOS2_R2_T1X1I6, R_NIOS2_R2_T1X1I6}, 1682 {BFD_RELOC_NIOS2_R2_T1X1I6_2, R_NIOS2_R2_T1X1I6_2}, 1683 }; 1684 1685 enum elf32_nios2_stub_type 1686 { 1687 nios2_stub_call26_before, 1688 nios2_stub_call26_after, 1689 nios2_stub_none 1690 }; 1691 1692 struct elf32_nios2_stub_hash_entry 1693 { 1694 /* Base hash table entry structure. */ 1695 struct bfd_hash_entry bh_root; 1696 1697 /* The stub section. */ 1698 asection *stub_sec; 1699 1700 /* Offset within stub_sec of the beginning of this stub. */ 1701 bfd_vma stub_offset; 1702 1703 /* Given the symbol's value and its section we can determine its final 1704 value when building the stubs (so the stub knows where to jump. */ 1705 bfd_vma target_value; 1706 asection *target_section; 1707 1708 enum elf32_nios2_stub_type stub_type; 1709 1710 /* The symbol table entry, if any, that this was derived from. */ 1711 struct elf32_nios2_link_hash_entry *hh; 1712 1713 /* And the reloc addend that this was derived from. */ 1714 bfd_vma addend; 1715 1716 /* Where this stub is being called from, or, in the case of combined 1717 stub sections, the first input section in the group. */ 1718 asection *id_sec; 1719 }; 1720 1721 #define nios2_stub_hash_entry(ent) \ 1722 ((struct elf32_nios2_stub_hash_entry *)(ent)) 1723 1724 #define nios2_stub_hash_lookup(table, string, create, copy) \ 1725 ((struct elf32_nios2_stub_hash_entry *) \ 1726 bfd_hash_lookup ((table), (string), (create), (copy))) 1727 1728 1729 /* The Nios II linker needs to keep track of the number of relocs that it 1730 decides to copy as dynamic relocs in check_relocs for each symbol. 1731 This is so that it can later discard them if they are found to be 1732 unnecessary. We store the information in a field extending the 1733 regular ELF linker hash table. */ 1734 1735 struct elf32_nios2_dyn_relocs 1736 { 1737 struct elf32_nios2_dyn_relocs *next; 1738 1739 /* The input section of the reloc. */ 1740 asection *sec; 1741 1742 /* Total number of relocs copied for the input section. */ 1743 bfd_size_type count; 1744 1745 /* Number of pc-relative relocs copied for the input section. */ 1746 bfd_size_type pc_count; 1747 }; 1748 1749 /* Nios II ELF linker hash entry. */ 1750 1751 struct elf32_nios2_link_hash_entry 1752 { 1753 struct elf_link_hash_entry root; 1754 1755 /* A pointer to the most recently used stub hash entry against this 1756 symbol. */ 1757 struct elf32_nios2_stub_hash_entry *hsh_cache; 1758 1759 /* Track dynamic relocs copied for this symbol. */ 1760 struct elf32_nios2_dyn_relocs *dyn_relocs; 1761 1762 #define GOT_UNKNOWN 0 1763 #define GOT_NORMAL 1 1764 #define GOT_TLS_GD 2 1765 #define GOT_TLS_IE 4 1766 unsigned char tls_type; 1767 1768 /* We need to detect and take special action for symbols which are only 1769 referenced with %call() and not with %got(). Such symbols do not need 1770 a dynamic GOT reloc in shared objects, only a dynamic PLT reloc. Lazy 1771 linking will not work if the dynamic GOT reloc exists. 1772 To check for this condition efficiently, we compare got_types_used against 1773 CALL_USED, meaning 1774 (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED. 1775 */ 1776 #define GOT_USED 1 1777 #define CALL_USED 2 1778 unsigned char got_types_used; 1779 }; 1780 1781 #define elf32_nios2_hash_entry(ent) \ 1782 ((struct elf32_nios2_link_hash_entry *) (ent)) 1783 1784 /* Get the Nios II elf linker hash table from a link_info structure. */ 1785 #define elf32_nios2_hash_table(info) \ 1786 ((struct elf32_nios2_link_hash_table *) ((info)->hash)) 1787 1788 /* Nios II ELF linker hash table. */ 1789 struct elf32_nios2_link_hash_table 1790 { 1791 /* The main hash table. */ 1792 struct elf_link_hash_table root; 1793 1794 /* The stub hash table. */ 1795 struct bfd_hash_table bstab; 1796 1797 /* Linker stub bfd. */ 1798 bfd *stub_bfd; 1799 1800 /* Linker call-backs. */ 1801 asection * (*add_stub_section) (const char *, asection *, bfd_boolean); 1802 void (*layout_sections_again) (void); 1803 1804 /* Array to keep track of which stub sections have been created, and 1805 information on stub grouping. */ 1806 struct map_stub 1807 { 1808 /* These are the section to which stubs in the group will be 1809 attached. */ 1810 asection *first_sec, *last_sec; 1811 /* The stub sections. There might be stubs inserted either before 1812 or after the real section.*/ 1813 asection *first_stub_sec, *last_stub_sec; 1814 } *stub_group; 1815 1816 /* Assorted information used by nios2_elf32_size_stubs. */ 1817 unsigned int bfd_count; 1818 unsigned int top_index; 1819 asection **input_list; 1820 Elf_Internal_Sym **all_local_syms; 1821 1822 /* Short-cuts to get to dynamic linker sections. */ 1823 asection *sdynbss; 1824 asection *srelbss; 1825 asection *sbss; 1826 1827 /* GOT pointer symbol _gp_got. */ 1828 struct elf_link_hash_entry *h_gp_got; 1829 1830 union { 1831 bfd_signed_vma refcount; 1832 bfd_vma offset; 1833 } tls_ldm_got; 1834 1835 /* Small local sym cache. */ 1836 struct sym_cache sym_cache; 1837 1838 bfd_vma res_n_size; 1839 }; 1840 1841 struct nios2_elf32_obj_tdata 1842 { 1843 struct elf_obj_tdata root; 1844 1845 /* tls_type for each local got entry. */ 1846 char *local_got_tls_type; 1847 1848 /* TRUE if TLS GD relocs have been seen for this object. */ 1849 bfd_boolean has_tlsgd; 1850 }; 1851 1852 #define elf32_nios2_tdata(abfd) \ 1853 ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any) 1854 1855 #define elf32_nios2_local_got_tls_type(abfd) \ 1856 (elf32_nios2_tdata (abfd)->local_got_tls_type) 1857 1858 /* The name of the dynamic interpreter. This is put in the .interp 1859 section. */ 1860 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" 1861 1862 /* PLT implementation for position-dependent code. */ 1863 static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */ 1864 0x03c00034, /* movhi r15, %hiadj(plt_got_slot_address) */ 1865 0x7bc00017, /* ldw r15, %lo(plt_got_slot_address)(r15) */ 1866 0x7800683a /* jmp r15 */ 1867 }; 1868 1869 static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */ 1870 0x03800034, /* movhi r14, %hiadj(res_0) */ 1871 0x73800004, /* addi r14, r14, %lo(res_0) */ 1872 0x7b9fc83a, /* sub r15, r15, r14 */ 1873 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */ 1874 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */ 1875 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */ 1876 0x6800683a /* jmp r13 */ 1877 }; 1878 1879 /* PLT implementation for position-independent code. */ 1880 static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */ 1881 0x03c00034, /* movhi r15, %hiadj(index * 4) */ 1882 0x7bc00004, /* addi r15, r15, %lo(index * 4) */ 1883 0x00000006 /* br .PLTresolve */ 1884 }; 1885 1886 static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */ 1887 0x001ce03a, /* nextpc r14 */ 1888 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */ 1889 0x6b9b883a, /* add r13, r13, r14 */ 1890 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */ 1891 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */ 1892 0x6800683a /* jmp r13 */ 1893 }; 1894 1895 /* CALL26 stub. */ 1896 static const bfd_vma nios2_call26_stub_entry[] = { 1897 0x00400034, /* orhi at, r0, %hiadj(dest) */ 1898 0x08400004, /* addi at, at, %lo(dest) */ 1899 0x0800683a /* jmp at */ 1900 }; 1901 1902 /* Install 16-bit immediate value VALUE at offset OFFSET into section SEC. */ 1903 static void 1904 nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value) 1905 { 1906 bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset); 1907 1908 BFD_ASSERT(value <= 0xffff); 1909 1910 bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6), 1911 sec->contents + offset); 1912 } 1913 1914 /* Install COUNT 32-bit values DATA starting at offset OFFSET into 1915 section SEC. */ 1916 static void 1917 nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset, 1918 int count) 1919 { 1920 while (count--) 1921 { 1922 bfd_put_32 (sec->owner, *data, sec->contents + offset); 1923 offset += 4; 1924 ++data; 1925 } 1926 } 1927 1928 /* The usual way of loading a 32-bit constant into a Nios II register is to 1929 load the high 16 bits in one instruction and then add the low 16 bits with 1930 a signed add. This means that the high halfword needs to be adjusted to 1931 compensate for the sign bit of the low halfword. This function returns the 1932 adjusted high halfword for a given 32-bit constant. */ 1933 static 1934 bfd_vma hiadj (bfd_vma symbol_value) 1935 { 1936 return ((symbol_value + 0x8000) >> 16) & 0xffff; 1937 } 1938 1939 /* Implement elf_backend_grok_prstatus: 1940 Support for core dump NOTE sections. */ 1941 static bfd_boolean 1942 nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 1943 { 1944 int offset; 1945 size_t size; 1946 1947 switch (note->descsz) 1948 { 1949 default: 1950 return FALSE; 1951 1952 case 212: /* Linux/Nios II */ 1953 /* pr_cursig */ 1954 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 1955 1956 /* pr_pid */ 1957 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24); 1958 1959 /* pr_reg */ 1960 offset = 72; 1961 size = 136; 1962 1963 break; 1964 } 1965 1966 /* Make a ".reg/999" section. */ 1967 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 1968 size, note->descpos + offset); 1969 } 1970 1971 /* Implement elf_backend_grok_psinfo. */ 1972 static bfd_boolean 1973 nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 1974 { 1975 switch (note->descsz) 1976 { 1977 default: 1978 return FALSE; 1979 1980 case 124: /* Linux/Nios II elf_prpsinfo */ 1981 elf_tdata (abfd)->core->program 1982 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 1983 elf_tdata (abfd)->core->command 1984 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 1985 } 1986 1987 /* Note that for some reason, a spurious space is tacked 1988 onto the end of the args in some (at least one anyway) 1989 implementations, so strip it off if it exists. */ 1990 1991 { 1992 char *command = elf_tdata (abfd)->core->command; 1993 int n = strlen (command); 1994 1995 if (0 < n && command[n - 1] == ' ') 1996 command[n - 1] = '\0'; 1997 } 1998 1999 return TRUE; 2000 } 2001 2002 /* Assorted hash table functions. */ 2003 2004 /* Initialize an entry in the stub hash table. */ 2005 static struct bfd_hash_entry * 2006 stub_hash_newfunc (struct bfd_hash_entry *entry, 2007 struct bfd_hash_table *table, 2008 const char *string) 2009 { 2010 /* Allocate the structure if it has not already been allocated by a 2011 subclass. */ 2012 if (entry == NULL) 2013 { 2014 entry = bfd_hash_allocate (table, 2015 sizeof (struct elf32_nios2_stub_hash_entry)); 2016 if (entry == NULL) 2017 return entry; 2018 } 2019 2020 /* Call the allocation method of the superclass. */ 2021 entry = bfd_hash_newfunc (entry, table, string); 2022 if (entry != NULL) 2023 { 2024 struct elf32_nios2_stub_hash_entry *hsh; 2025 2026 /* Initialize the local fields. */ 2027 hsh = (struct elf32_nios2_stub_hash_entry *) entry; 2028 hsh->stub_sec = NULL; 2029 hsh->stub_offset = 0; 2030 hsh->target_value = 0; 2031 hsh->target_section = NULL; 2032 hsh->stub_type = nios2_stub_none; 2033 hsh->hh = NULL; 2034 hsh->id_sec = NULL; 2035 } 2036 2037 return entry; 2038 } 2039 2040 /* Create an entry in a Nios II ELF linker hash table. */ 2041 static struct bfd_hash_entry * 2042 link_hash_newfunc (struct bfd_hash_entry *entry, 2043 struct bfd_hash_table *table, const char *string) 2044 { 2045 /* Allocate the structure if it has not already been allocated by a 2046 subclass. */ 2047 if (entry == NULL) 2048 { 2049 entry = bfd_hash_allocate (table, 2050 sizeof (struct elf32_nios2_link_hash_entry)); 2051 if (entry == NULL) 2052 return entry; 2053 } 2054 2055 /* Call the allocation method of the superclass. */ 2056 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 2057 if (entry) 2058 { 2059 struct elf32_nios2_link_hash_entry *eh; 2060 2061 eh = (struct elf32_nios2_link_hash_entry *) entry; 2062 eh->hsh_cache = NULL; 2063 eh->dyn_relocs = NULL; 2064 eh->tls_type = GOT_UNKNOWN; 2065 eh->got_types_used = 0; 2066 } 2067 2068 return entry; 2069 } 2070 2071 /* Section name for stubs is the associated section name plus this 2072 string. */ 2073 #define STUB_SUFFIX ".stub" 2074 2075 /* Build a name for an entry in the stub hash table. */ 2076 static char * 2077 nios2_stub_name (const asection *input_section, 2078 const asection *sym_sec, 2079 const struct elf32_nios2_link_hash_entry *hh, 2080 const Elf_Internal_Rela *rel, 2081 enum elf32_nios2_stub_type stub_type) 2082 { 2083 char *stub_name; 2084 bfd_size_type len; 2085 char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a'; 2086 2087 if (hh) 2088 { 2089 len = 8 + 1 + 1 + 1+ strlen (hh->root.root.root.string) + 1 + 8 + 1; 2090 stub_name = bfd_malloc (len); 2091 if (stub_name != NULL) 2092 { 2093 sprintf (stub_name, "%08x_%c_%s+%x", 2094 input_section->id & 0xffffffff, 2095 stubpos, 2096 hh->root.root.root.string, 2097 (int) rel->r_addend & 0xffffffff); 2098 } 2099 } 2100 else 2101 { 2102 len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1; 2103 stub_name = bfd_malloc (len); 2104 if (stub_name != NULL) 2105 { 2106 sprintf (stub_name, "%08x_%c_%x:%x+%x", 2107 input_section->id & 0xffffffff, 2108 stubpos, 2109 sym_sec->id & 0xffffffff, 2110 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff, 2111 (int) rel->r_addend & 0xffffffff); 2112 } 2113 } 2114 return stub_name; 2115 } 2116 2117 /* Look up an entry in the stub hash. Stub entries are cached because 2118 creating the stub name takes a bit of time. */ 2119 static struct elf32_nios2_stub_hash_entry * 2120 nios2_get_stub_entry (const asection *input_section, 2121 const asection *sym_sec, 2122 struct elf32_nios2_link_hash_entry *hh, 2123 const Elf_Internal_Rela *rel, 2124 struct elf32_nios2_link_hash_table *htab, 2125 enum elf32_nios2_stub_type stub_type) 2126 { 2127 struct elf32_nios2_stub_hash_entry *hsh; 2128 const asection *id_sec; 2129 2130 /* If this input section is part of a group of sections sharing one 2131 stub section, then use the id of the first/last section in the group, 2132 depending on the stub section placement relative to the group. 2133 Stub names need to include a section id, as there may well be 2134 more than one stub used to reach say, printf, and we need to 2135 distinguish between them. */ 2136 if (stub_type == nios2_stub_call26_before) 2137 id_sec = htab->stub_group[input_section->id].first_sec; 2138 else 2139 id_sec = htab->stub_group[input_section->id].last_sec; 2140 2141 if (hh != NULL && hh->hsh_cache != NULL 2142 && hh->hsh_cache->hh == hh 2143 && hh->hsh_cache->id_sec == id_sec 2144 && hh->hsh_cache->stub_type == stub_type) 2145 { 2146 hsh = hh->hsh_cache; 2147 } 2148 else 2149 { 2150 char *stub_name; 2151 2152 stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type); 2153 if (stub_name == NULL) 2154 return NULL; 2155 2156 hsh = nios2_stub_hash_lookup (&htab->bstab, 2157 stub_name, FALSE, FALSE); 2158 2159 if (hh != NULL) 2160 hh->hsh_cache = hsh; 2161 2162 free (stub_name); 2163 } 2164 2165 return hsh; 2166 } 2167 2168 /* Add a new stub entry to the stub hash. Not all fields of the new 2169 stub entry are initialised. */ 2170 static struct elf32_nios2_stub_hash_entry * 2171 nios2_add_stub (const char *stub_name, 2172 asection *section, 2173 struct elf32_nios2_link_hash_table *htab, 2174 enum elf32_nios2_stub_type stub_type) 2175 { 2176 asection *link_sec; 2177 asection *stub_sec; 2178 asection **secptr, **linkptr; 2179 struct elf32_nios2_stub_hash_entry *hsh; 2180 bfd_boolean afterp; 2181 2182 if (stub_type == nios2_stub_call26_before) 2183 { 2184 link_sec = htab->stub_group[section->id].first_sec; 2185 secptr = &(htab->stub_group[section->id].first_stub_sec); 2186 linkptr = &(htab->stub_group[link_sec->id].first_stub_sec); 2187 afterp = FALSE; 2188 } 2189 else 2190 { 2191 link_sec = htab->stub_group[section->id].last_sec; 2192 secptr = &(htab->stub_group[section->id].last_stub_sec); 2193 linkptr = &(htab->stub_group[link_sec->id].last_stub_sec); 2194 afterp = TRUE; 2195 } 2196 stub_sec = *secptr; 2197 if (stub_sec == NULL) 2198 { 2199 stub_sec = *linkptr; 2200 if (stub_sec == NULL) 2201 { 2202 size_t namelen; 2203 bfd_size_type len; 2204 char *s_name; 2205 2206 namelen = strlen (link_sec->name); 2207 len = namelen + sizeof (STUB_SUFFIX); 2208 s_name = bfd_alloc (htab->stub_bfd, len); 2209 if (s_name == NULL) 2210 return NULL; 2211 2212 memcpy (s_name, link_sec->name, namelen); 2213 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX)); 2214 2215 stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp); 2216 if (stub_sec == NULL) 2217 return NULL; 2218 *linkptr = stub_sec; 2219 } 2220 *secptr = stub_sec; 2221 } 2222 2223 /* Enter this entry into the linker stub hash table. */ 2224 hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name, 2225 TRUE, FALSE); 2226 if (hsh == NULL) 2227 { 2228 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"), 2229 section->owner, 2230 stub_name); 2231 return NULL; 2232 } 2233 2234 hsh->stub_sec = stub_sec; 2235 hsh->stub_offset = 0; 2236 hsh->id_sec = link_sec; 2237 return hsh; 2238 } 2239 2240 /* Set up various things so that we can make a list of input sections 2241 for each output section included in the link. Returns -1 on error, 2242 0 when no stubs will be needed, and 1 on success. */ 2243 int 2244 nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info) 2245 { 2246 bfd *input_bfd; 2247 unsigned int bfd_count; 2248 unsigned int top_id, top_index; 2249 asection *section; 2250 asection **input_list, **list; 2251 bfd_size_type amt; 2252 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2253 2254 /* Count the number of input BFDs and find the top input section id. */ 2255 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0; 2256 input_bfd != NULL; 2257 input_bfd = input_bfd->link.next) 2258 { 2259 bfd_count += 1; 2260 for (section = input_bfd->sections; 2261 section != NULL; 2262 section = section->next) 2263 { 2264 if (top_id < section->id) 2265 top_id = section->id; 2266 } 2267 } 2268 2269 htab->bfd_count = bfd_count; 2270 2271 amt = sizeof (struct map_stub) * (top_id + 1); 2272 htab->stub_group = bfd_zmalloc (amt); 2273 if (htab->stub_group == NULL) 2274 return -1; 2275 2276 /* We can't use output_bfd->section_count here to find the top output 2277 section index as some sections may have been removed, and 2278 strip_excluded_output_sections doesn't renumber the indices. */ 2279 for (section = output_bfd->sections, top_index = 0; 2280 section != NULL; 2281 section = section->next) 2282 { 2283 if (top_index < section->index) 2284 top_index = section->index; 2285 } 2286 2287 htab->top_index = top_index; 2288 amt = sizeof (asection *) * (top_index + 1); 2289 input_list = bfd_malloc (amt); 2290 htab->input_list = input_list; 2291 if (input_list == NULL) 2292 return -1; 2293 2294 /* For sections we aren't interested in, mark their entries with a 2295 value we can check later. */ 2296 list = input_list + top_index; 2297 do 2298 *list = bfd_abs_section_ptr; 2299 while (list-- != input_list); 2300 2301 for (section = output_bfd->sections; 2302 section != NULL; 2303 section = section->next) 2304 { 2305 /* FIXME: This is a bit of hack. Currently our .ctors and .dtors 2306 * have PC relative relocs in them but no code flag set. */ 2307 if (((section->flags & SEC_CODE) != 0) || 2308 strcmp(".ctors", section->name) || 2309 strcmp(".dtors", section->name)) 2310 input_list[section->index] = NULL; 2311 } 2312 2313 return 1; 2314 } 2315 2316 /* The linker repeatedly calls this function for each input section, 2317 in the order that input sections are linked into output sections. 2318 Build lists of input sections to determine groupings between which 2319 we may insert linker stubs. */ 2320 void 2321 nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec) 2322 { 2323 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2324 2325 if (isec->output_section->index <= htab->top_index) 2326 { 2327 asection **list = htab->input_list + isec->output_section->index; 2328 if (*list != bfd_abs_section_ptr) 2329 { 2330 /* Steal the last_sec pointer for our list. 2331 This happens to make the list in reverse order, 2332 which is what we want. */ 2333 htab->stub_group[isec->id].last_sec = *list; 2334 *list = isec; 2335 } 2336 } 2337 } 2338 2339 /* Segment mask for CALL26 relocation relaxation. */ 2340 #define CALL26_SEGMENT(x) ((x) & 0xf0000000) 2341 2342 /* Fudge factor for approximate maximum size of all stubs that might 2343 be inserted by the linker. This does not actually limit the number 2344 of stubs that might be inserted, and only affects strategy for grouping 2345 and placement of stubs. Perhaps this should be computed based on number 2346 of relocations seen, or be specifiable on the command line. */ 2347 #define MAX_STUB_SECTION_SIZE 0xffff 2348 2349 /* See whether we can group stub sections together. Grouping stub 2350 sections may result in fewer stubs. More importantly, we need to 2351 put all .init* and .fini* stubs at the end of the .init or 2352 .fini output sections respectively, because glibc splits the 2353 _init and _fini functions into multiple parts. Putting a stub in 2354 the middle of a function is not a good idea. 2355 Rather than computing groups of a maximum fixed size, for Nios II 2356 CALL26 relaxation it makes more sense to compute the groups based on 2357 sections that fit within a 256MB address segment. Also do not allow 2358 a group to span more than one output section, since different output 2359 sections might correspond to different memory banks on a bare-metal 2360 target, etc. */ 2361 static void 2362 group_sections (struct elf32_nios2_link_hash_table *htab) 2363 { 2364 asection **list = htab->input_list + htab->top_index; 2365 do 2366 { 2367 /* The list is in reverse order so we'll search backwards looking 2368 for the first section that begins in the same memory segment, 2369 marking sections along the way to point at the tail for this 2370 group. */ 2371 asection *tail = *list; 2372 if (tail == bfd_abs_section_ptr) 2373 continue; 2374 while (tail != NULL) 2375 { 2376 bfd_vma start = tail->output_section->vma + tail->output_offset; 2377 bfd_vma end = start + tail->size; 2378 bfd_vma segment = CALL26_SEGMENT (end); 2379 asection *prev; 2380 2381 if (segment != CALL26_SEGMENT (start) 2382 || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE)) 2383 /* This section spans more than one memory segment, or is 2384 close enough to the end of the segment that adding stub 2385 sections before it might cause it to move so that it 2386 spans memory segments, or that stubs added at the end of 2387 this group might overflow into the next memory segment. 2388 Put it in a group by itself to localize the effects. */ 2389 { 2390 prev = htab->stub_group[tail->id].last_sec; 2391 htab->stub_group[tail->id].last_sec = tail; 2392 htab->stub_group[tail->id].first_sec = tail; 2393 } 2394 else 2395 /* Collect more sections for this group. */ 2396 { 2397 asection *curr, *first; 2398 for (curr = tail; ; curr = prev) 2399 { 2400 prev = htab->stub_group[curr->id].last_sec; 2401 if (!prev 2402 || tail->output_section != prev->output_section 2403 || (CALL26_SEGMENT (prev->output_section->vma 2404 + prev->output_offset) 2405 != segment)) 2406 break; 2407 } 2408 first = curr; 2409 for (curr = tail; ; curr = prev) 2410 { 2411 prev = htab->stub_group[curr->id].last_sec; 2412 htab->stub_group[curr->id].last_sec = tail; 2413 htab->stub_group[curr->id].first_sec = first; 2414 if (curr == first) 2415 break; 2416 } 2417 } 2418 2419 /* Reset tail for the next group. */ 2420 tail = prev; 2421 } 2422 } 2423 while (list-- != htab->input_list); 2424 free (htab->input_list); 2425 } 2426 2427 /* Determine the type of stub needed, if any, for a call. */ 2428 static enum elf32_nios2_stub_type 2429 nios2_type_of_stub (asection *input_sec, 2430 const Elf_Internal_Rela *rel, 2431 struct elf32_nios2_link_hash_entry *hh, 2432 struct elf32_nios2_link_hash_table *htab, 2433 bfd_vma destination, 2434 struct bfd_link_info *info ATTRIBUTE_UNUSED) 2435 { 2436 bfd_vma location, segment, start, end; 2437 asection *s0, *s1, *s; 2438 2439 if (hh != NULL && 2440 !(hh->root.root.type == bfd_link_hash_defined 2441 || hh->root.root.type == bfd_link_hash_defweak)) 2442 return nios2_stub_none; 2443 2444 /* Determine where the call point is. */ 2445 location = (input_sec->output_section->vma 2446 + input_sec->output_offset + rel->r_offset); 2447 segment = CALL26_SEGMENT (location); 2448 2449 /* Nios II CALL and JMPI instructions can transfer control to addresses 2450 within the same 256MB segment as the PC. */ 2451 if (segment == CALL26_SEGMENT (destination)) 2452 return nios2_stub_none; 2453 2454 /* Find the start and end addresses of the stub group. Also account for 2455 any already-created stub sections for this group. Note that for stubs 2456 in the end section, only the first instruction of the last stub 2457 (12 bytes long) needs to be within range. */ 2458 s0 = htab->stub_group[input_sec->id].first_sec; 2459 s = htab->stub_group[s0->id].first_stub_sec; 2460 if (s != NULL && s->size > 0) 2461 start = s->output_section->vma + s->output_offset; 2462 else 2463 start = s0->output_section->vma + s0->output_offset; 2464 2465 s1 = htab->stub_group[input_sec->id].last_sec; 2466 s = htab->stub_group[s1->id].last_stub_sec; 2467 if (s != NULL && s->size > 0) 2468 end = s->output_section->vma + s->output_offset + s->size - 8; 2469 else 2470 end = s1->output_section->vma + s1->output_offset + s1->size; 2471 2472 BFD_ASSERT (start < end); 2473 BFD_ASSERT (start <= location); 2474 BFD_ASSERT (location < end); 2475 2476 /* Put stubs at the end of the group unless that is not a valid 2477 location and the beginning of the group is. It might be that 2478 neither the beginning nor end works if we have an input section 2479 so large that it spans multiple segment boundaries. In that 2480 case, punt; the end result will be a relocation overflow error no 2481 matter what we do here. 2482 2483 Note that adding stubs pushes up the addresses of all subsequent 2484 sections, so that stubs allocated on one pass through the 2485 relaxation loop may not be valid on the next pass. (E.g., we may 2486 allocate a stub at the beginning of the section on one pass and 2487 find that the call site has been bumped into the next memory 2488 segment on the next pass.) The important thing to note is that 2489 we never try to reclaim the space allocated to such unused stubs, 2490 so code size and section addresses can only increase with each 2491 iteration. Accounting for the start and end addresses of the 2492 already-created stub sections ensures that when the algorithm 2493 converges, it converges accurately, with the entire appropriate 2494 stub section accessible from the call site and not just the 2495 address at the start or end of the stub group proper. */ 2496 2497 if (segment == CALL26_SEGMENT (end)) 2498 return nios2_stub_call26_after; 2499 else if (segment == CALL26_SEGMENT (start)) 2500 return nios2_stub_call26_before; 2501 else 2502 /* Perhaps this should be a dedicated error code. */ 2503 return nios2_stub_none; 2504 } 2505 2506 static bfd_boolean 2507 nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED) 2508 { 2509 struct elf32_nios2_stub_hash_entry *hsh 2510 = (struct elf32_nios2_stub_hash_entry *) gen_entry; 2511 asection *stub_sec = hsh->stub_sec; 2512 bfd_vma sym_value; 2513 2514 /* Make a note of the offset within the stubs for this entry. */ 2515 hsh->stub_offset = stub_sec->size; 2516 2517 switch (hsh->stub_type) 2518 { 2519 case nios2_stub_call26_before: 2520 case nios2_stub_call26_after: 2521 /* A call26 stub looks like: 2522 orhi at, %hiadj(dest) 2523 addi at, at, %lo(dest) 2524 jmp at 2525 Note that call/jmpi instructions can't be used in PIC code 2526 so there is no reason for the stub to be PIC, either. */ 2527 sym_value = (hsh->target_value 2528 + hsh->target_section->output_offset 2529 + hsh->target_section->output_section->vma 2530 + hsh->addend); 2531 2532 nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry, 2533 hsh->stub_offset, 3); 2534 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset, 2535 hiadj (sym_value)); 2536 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4, 2537 (sym_value & 0xffff)); 2538 stub_sec->size += 12; 2539 break; 2540 default: 2541 BFD_FAIL (); 2542 return FALSE; 2543 } 2544 2545 return TRUE; 2546 } 2547 2548 /* As above, but don't actually build the stub. Just bump offset so 2549 we know stub section sizes. */ 2550 static bfd_boolean 2551 nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED) 2552 { 2553 struct elf32_nios2_stub_hash_entry *hsh 2554 = (struct elf32_nios2_stub_hash_entry *) gen_entry; 2555 2556 switch (hsh->stub_type) 2557 { 2558 case nios2_stub_call26_before: 2559 case nios2_stub_call26_after: 2560 hsh->stub_sec->size += 12; 2561 break; 2562 default: 2563 BFD_FAIL (); 2564 return FALSE; 2565 } 2566 return TRUE; 2567 } 2568 2569 /* Read in all local syms for all input bfds. 2570 Returns -1 on error, 0 otherwise. */ 2571 2572 static int 2573 get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd, 2574 struct bfd_link_info *info) 2575 { 2576 unsigned int bfd_indx; 2577 Elf_Internal_Sym *local_syms, **all_local_syms; 2578 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2579 2580 /* We want to read in symbol extension records only once. To do this 2581 we need to read in the local symbols in parallel and save them for 2582 later use; so hold pointers to the local symbols in an array. */ 2583 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count; 2584 all_local_syms = bfd_zmalloc (amt); 2585 htab->all_local_syms = all_local_syms; 2586 if (all_local_syms == NULL) 2587 return -1; 2588 2589 /* Walk over all the input BFDs, swapping in local symbols. */ 2590 for (bfd_indx = 0; 2591 input_bfd != NULL; 2592 input_bfd = input_bfd->link.next, bfd_indx++) 2593 { 2594 Elf_Internal_Shdr *symtab_hdr; 2595 2596 /* We'll need the symbol table in a second. */ 2597 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 2598 if (symtab_hdr->sh_info == 0) 2599 continue; 2600 2601 /* We need an array of the local symbols attached to the input bfd. */ 2602 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents; 2603 if (local_syms == NULL) 2604 { 2605 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, 2606 symtab_hdr->sh_info, 0, 2607 NULL, NULL, NULL); 2608 /* Cache them for elf_link_input_bfd. */ 2609 symtab_hdr->contents = (unsigned char *) local_syms; 2610 } 2611 if (local_syms == NULL) 2612 return -1; 2613 2614 all_local_syms[bfd_indx] = local_syms; 2615 } 2616 2617 return 0; 2618 } 2619 2620 /* Determine and set the size of the stub section for a final link. */ 2621 bfd_boolean 2622 nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd, 2623 struct bfd_link_info *info, 2624 asection *(*add_stub_section) (const char *, 2625 asection *, bfd_boolean), 2626 void (*layout_sections_again) (void)) 2627 { 2628 bfd_boolean stub_changed = FALSE; 2629 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2630 2631 /* Stash our params away. */ 2632 htab->stub_bfd = stub_bfd; 2633 htab->add_stub_section = add_stub_section; 2634 htab->layout_sections_again = layout_sections_again; 2635 2636 /* FIXME: We only compute the section groups once. This could cause 2637 problems if adding a large stub section causes following sections, 2638 or parts of them, to move into another segment. However, this seems 2639 to be consistent with the way other back ends handle this.... */ 2640 group_sections (htab); 2641 2642 if (get_local_syms (output_bfd, info->input_bfds, info)) 2643 { 2644 if (htab->all_local_syms) 2645 goto error_ret_free_local; 2646 return FALSE; 2647 } 2648 2649 while (1) 2650 { 2651 bfd *input_bfd; 2652 unsigned int bfd_indx; 2653 asection *stub_sec; 2654 2655 for (input_bfd = info->input_bfds, bfd_indx = 0; 2656 input_bfd != NULL; 2657 input_bfd = input_bfd->link.next, bfd_indx++) 2658 { 2659 Elf_Internal_Shdr *symtab_hdr; 2660 asection *section; 2661 Elf_Internal_Sym *local_syms; 2662 2663 /* We'll need the symbol table in a second. */ 2664 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 2665 if (symtab_hdr->sh_info == 0) 2666 continue; 2667 2668 local_syms = htab->all_local_syms[bfd_indx]; 2669 2670 /* Walk over each section attached to the input bfd. */ 2671 for (section = input_bfd->sections; 2672 section != NULL; 2673 section = section->next) 2674 { 2675 Elf_Internal_Rela *internal_relocs, *irelaend, *irela; 2676 2677 /* If there aren't any relocs, then there's nothing more 2678 to do. */ 2679 if ((section->flags & SEC_RELOC) == 0 2680 || section->reloc_count == 0) 2681 continue; 2682 2683 /* If this section is a link-once section that will be 2684 discarded, then don't create any stubs. */ 2685 if (section->output_section == NULL 2686 || section->output_section->owner != output_bfd) 2687 continue; 2688 2689 /* Get the relocs. */ 2690 internal_relocs 2691 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL, 2692 info->keep_memory); 2693 if (internal_relocs == NULL) 2694 goto error_ret_free_local; 2695 2696 /* Now examine each relocation. */ 2697 irela = internal_relocs; 2698 irelaend = irela + section->reloc_count; 2699 for (; irela < irelaend; irela++) 2700 { 2701 unsigned int r_type, r_indx; 2702 enum elf32_nios2_stub_type stub_type; 2703 struct elf32_nios2_stub_hash_entry *hsh; 2704 asection *sym_sec; 2705 bfd_vma sym_value; 2706 bfd_vma destination; 2707 struct elf32_nios2_link_hash_entry *hh; 2708 char *stub_name; 2709 const asection *id_sec; 2710 2711 r_type = ELF32_R_TYPE (irela->r_info); 2712 r_indx = ELF32_R_SYM (irela->r_info); 2713 2714 if (r_type >= (unsigned int) R_NIOS2_ILLEGAL) 2715 { 2716 bfd_set_error (bfd_error_bad_value); 2717 error_ret_free_internal: 2718 if (elf_section_data (section)->relocs == NULL) 2719 free (internal_relocs); 2720 goto error_ret_free_local; 2721 } 2722 2723 /* Only look for stubs on CALL and JMPI instructions. */ 2724 if (r_type != (unsigned int) R_NIOS2_CALL26) 2725 continue; 2726 2727 /* Now determine the call target, its name, value, 2728 section. */ 2729 sym_sec = NULL; 2730 sym_value = 0; 2731 destination = 0; 2732 hh = NULL; 2733 if (r_indx < symtab_hdr->sh_info) 2734 { 2735 /* It's a local symbol. */ 2736 Elf_Internal_Sym *sym; 2737 Elf_Internal_Shdr *hdr; 2738 unsigned int shndx; 2739 2740 sym = local_syms + r_indx; 2741 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION) 2742 sym_value = sym->st_value; 2743 shndx = sym->st_shndx; 2744 if (shndx < elf_numsections (input_bfd)) 2745 { 2746 hdr = elf_elfsections (input_bfd)[shndx]; 2747 sym_sec = hdr->bfd_section; 2748 destination = (sym_value + irela->r_addend 2749 + sym_sec->output_offset 2750 + sym_sec->output_section->vma); 2751 } 2752 } 2753 else 2754 { 2755 /* It's an external symbol. */ 2756 int e_indx; 2757 2758 e_indx = r_indx - symtab_hdr->sh_info; 2759 hh = ((struct elf32_nios2_link_hash_entry *) 2760 elf_sym_hashes (input_bfd)[e_indx]); 2761 2762 while (hh->root.root.type == bfd_link_hash_indirect 2763 || hh->root.root.type == bfd_link_hash_warning) 2764 hh = ((struct elf32_nios2_link_hash_entry *) 2765 hh->root.root.u.i.link); 2766 2767 if (hh->root.root.type == bfd_link_hash_defined 2768 || hh->root.root.type == bfd_link_hash_defweak) 2769 { 2770 sym_sec = hh->root.root.u.def.section; 2771 sym_value = hh->root.root.u.def.value; 2772 2773 if (sym_sec->output_section != NULL) 2774 destination = (sym_value + irela->r_addend 2775 + sym_sec->output_offset 2776 + sym_sec->output_section->vma); 2777 else 2778 continue; 2779 } 2780 else if (hh->root.root.type == bfd_link_hash_undefweak) 2781 { 2782 if (! bfd_link_pic (info)) 2783 continue; 2784 } 2785 else if (hh->root.root.type == bfd_link_hash_undefined) 2786 { 2787 if (! (info->unresolved_syms_in_objects == RM_IGNORE 2788 && (ELF_ST_VISIBILITY (hh->root.other) 2789 == STV_DEFAULT))) 2790 continue; 2791 } 2792 else 2793 { 2794 bfd_set_error (bfd_error_bad_value); 2795 goto error_ret_free_internal; 2796 } 2797 } 2798 2799 /* Determine what (if any) linker stub is needed. */ 2800 stub_type = nios2_type_of_stub (section, irela, hh, htab, 2801 destination, info); 2802 if (stub_type == nios2_stub_none) 2803 continue; 2804 2805 /* Support for grouping stub sections. */ 2806 if (stub_type == nios2_stub_call26_before) 2807 id_sec = htab->stub_group[section->id].first_sec; 2808 else 2809 id_sec = htab->stub_group[section->id].last_sec; 2810 2811 /* Get the name of this stub. */ 2812 stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela, 2813 stub_type); 2814 if (!stub_name) 2815 goto error_ret_free_internal; 2816 2817 hsh = nios2_stub_hash_lookup (&htab->bstab, 2818 stub_name, 2819 FALSE, FALSE); 2820 if (hsh != NULL) 2821 { 2822 /* The proper stub has already been created. */ 2823 free (stub_name); 2824 continue; 2825 } 2826 2827 hsh = nios2_add_stub (stub_name, section, htab, stub_type); 2828 if (hsh == NULL) 2829 { 2830 free (stub_name); 2831 goto error_ret_free_internal; 2832 } 2833 hsh->target_value = sym_value; 2834 hsh->target_section = sym_sec; 2835 hsh->stub_type = stub_type; 2836 hsh->hh = hh; 2837 hsh->addend = irela->r_addend; 2838 stub_changed = TRUE; 2839 } 2840 2841 /* We're done with the internal relocs, free them. */ 2842 if (elf_section_data (section)->relocs == NULL) 2843 free (internal_relocs); 2844 } 2845 } 2846 2847 if (!stub_changed) 2848 break; 2849 2850 /* OK, we've added some stubs. Find out the new size of the 2851 stub sections. */ 2852 for (stub_sec = htab->stub_bfd->sections; 2853 stub_sec != NULL; 2854 stub_sec = stub_sec->next) 2855 stub_sec->size = 0; 2856 2857 bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab); 2858 2859 /* Ask the linker to do its stuff. */ 2860 (*htab->layout_sections_again) (); 2861 stub_changed = FALSE; 2862 } 2863 2864 free (htab->all_local_syms); 2865 return TRUE; 2866 2867 error_ret_free_local: 2868 free (htab->all_local_syms); 2869 return FALSE; 2870 } 2871 2872 /* Build all the stubs associated with the current output file. The 2873 stubs are kept in a hash table attached to the main linker hash 2874 table. This function is called via nios2elf_finish in the linker. */ 2875 bfd_boolean 2876 nios2_elf32_build_stubs (struct bfd_link_info *info) 2877 { 2878 asection *stub_sec; 2879 struct bfd_hash_table *table; 2880 struct elf32_nios2_link_hash_table *htab; 2881 2882 htab = elf32_nios2_hash_table (info); 2883 2884 for (stub_sec = htab->stub_bfd->sections; 2885 stub_sec != NULL; 2886 stub_sec = stub_sec->next) 2887 /* The stub_bfd may contain non-stub sections if it is also the 2888 dynobj. Any such non-stub sections are created with the 2889 SEC_LINKER_CREATED flag set, while stub sections do not 2890 have that flag. Ignore any non-stub sections here. */ 2891 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0) 2892 { 2893 bfd_size_type size; 2894 2895 /* Allocate memory to hold the linker stubs. */ 2896 size = stub_sec->size; 2897 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size); 2898 if (stub_sec->contents == NULL && size != 0) 2899 return FALSE; 2900 stub_sec->size = 0; 2901 } 2902 2903 /* Build the stubs as directed by the stub hash table. */ 2904 table = &htab->bstab; 2905 bfd_hash_traverse (table, nios2_build_one_stub, info); 2906 2907 return TRUE; 2908 } 2909 2910 2911 #define is_nios2_elf(bfd) \ 2912 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ 2913 && elf_object_id (bfd) == NIOS2_ELF_DATA) 2914 2915 /* Merge backend specific data from an object file to the output 2916 object file when linking. */ 2917 2918 static bfd_boolean 2919 nios2_elf32_merge_private_bfd_data (bfd *ibfd, bfd *obfd) 2920 { 2921 flagword old_flags; 2922 flagword new_flags; 2923 2924 if (!is_nios2_elf (ibfd) || !is_nios2_elf (obfd)) 2925 return TRUE; 2926 2927 /* Check if we have the same endianness. */ 2928 if (! _bfd_generic_verify_endian_match (ibfd, obfd)) 2929 return FALSE; 2930 2931 new_flags = elf_elfheader (ibfd)->e_flags; 2932 old_flags = elf_elfheader (obfd)->e_flags; 2933 if (!elf_flags_init (obfd)) 2934 { 2935 /* First call, no flags set. */ 2936 elf_flags_init (obfd) = TRUE; 2937 elf_elfheader (obfd)->e_flags = new_flags; 2938 2939 switch (new_flags) 2940 { 2941 default: 2942 case EF_NIOS2_ARCH_R1: 2943 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r1); 2944 break; 2945 case EF_NIOS2_ARCH_R2: 2946 if (bfd_big_endian (ibfd)) 2947 { 2948 (*_bfd_error_handler) 2949 (_("error: %B: Big-endian R2 is not supported."), ibfd); 2950 bfd_set_error (bfd_error_bad_value); 2951 return FALSE; 2952 } 2953 bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r2); 2954 break; 2955 } 2956 } 2957 2958 /* Incompatible flags. */ 2959 else if (new_flags != old_flags) 2960 { 2961 /* So far, the only incompatible flags denote incompatible 2962 architectures. */ 2963 (*_bfd_error_handler) 2964 (_("error: %B: Conflicting CPU architectures %d/%d"), 2965 ibfd, new_flags, old_flags); 2966 bfd_set_error (bfd_error_bad_value); 2967 return FALSE; 2968 } 2969 2970 /* Merge Tag_compatibility attributes and any common GNU ones. */ 2971 _bfd_elf_merge_object_attributes (ibfd, obfd); 2972 2973 return TRUE; 2974 } 2975 2976 2977 /* Implement bfd_elf32_bfd_reloc_type_lookup: 2978 Given a BFD reloc type, return a howto structure. */ 2979 static reloc_howto_type * 2980 nios2_elf32_bfd_reloc_type_lookup (bfd *abfd, 2981 bfd_reloc_code_real_type code) 2982 { 2983 int i; 2984 2985 for (i = 0; 2986 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map)); 2987 ++i) 2988 if (nios2_reloc_map[i].bfd_val == code) 2989 return lookup_howto (nios2_reloc_map[i].elf_val, abfd); 2990 return NULL; 2991 } 2992 2993 /* Implement bfd_elf32_bfd_reloc_name_lookup: 2994 Given a reloc name, return a howto structure. */ 2995 static reloc_howto_type * 2996 nios2_elf32_bfd_reloc_name_lookup (bfd *abfd, 2997 const char *r_name) 2998 { 2999 int i; 3000 reloc_howto_type *howto_tbl; 3001 int howto_tbl_size; 3002 3003 if (BFD_IS_R2 (abfd)) 3004 { 3005 howto_tbl = elf_nios2_r2_howto_table_rel; 3006 howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel) 3007 / sizeof (elf_nios2_r2_howto_table_rel[0])); 3008 } 3009 else 3010 { 3011 howto_tbl = elf_nios2_r1_howto_table_rel; 3012 howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel) 3013 / sizeof (elf_nios2_r1_howto_table_rel[0])); 3014 } 3015 3016 for (i = 0; i < howto_tbl_size; i++) 3017 if (howto_tbl[i].name && strcasecmp (howto_tbl[i].name, r_name) == 0) 3018 return howto_tbl + i; 3019 return NULL; 3020 } 3021 3022 /* Implement elf_info_to_howto: 3023 Given a ELF32 relocation, fill in a arelent structure. */ 3024 static void 3025 nios2_elf32_info_to_howto (bfd *abfd, arelent *cache_ptr, 3026 Elf_Internal_Rela *dst) 3027 { 3028 unsigned int r_type; 3029 3030 r_type = ELF32_R_TYPE (dst->r_info); 3031 cache_ptr->howto = lookup_howto (r_type, abfd); 3032 } 3033 3034 /* Return the base VMA address which should be subtracted from real addresses 3035 when resolving @dtpoff relocation. 3036 This is PT_TLS segment p_vaddr. */ 3037 static bfd_vma 3038 dtpoff_base (struct bfd_link_info *info) 3039 { 3040 /* If tls_sec is NULL, we should have signalled an error already. */ 3041 if (elf_hash_table (info)->tls_sec == NULL) 3042 return 0; 3043 return elf_hash_table (info)->tls_sec->vma; 3044 } 3045 3046 /* Return the relocation value for @tpoff relocation 3047 if STT_TLS virtual address is ADDRESS. */ 3048 static bfd_vma 3049 tpoff (struct bfd_link_info *info, bfd_vma address) 3050 { 3051 struct elf_link_hash_table *htab = elf_hash_table (info); 3052 3053 /* If tls_sec is NULL, we should have signalled an error already. */ 3054 if (htab->tls_sec == NULL) 3055 return 0; 3056 return address - htab->tls_sec->vma; 3057 } 3058 3059 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a 3060 dangerous relocation. */ 3061 static bfd_boolean 3062 nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info) 3063 { 3064 3065 bfd_boolean gp_found; 3066 struct bfd_hash_entry *h; 3067 struct bfd_link_hash_entry *lh; 3068 3069 /* If we've already figured out what GP will be, just return it. */ 3070 *pgp = _bfd_get_gp_value (output_bfd); 3071 if (*pgp) 3072 return TRUE; 3073 3074 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE); 3075 lh = (struct bfd_link_hash_entry *) h; 3076 lookup: 3077 if (lh) 3078 { 3079 switch (lh->type) 3080 { 3081 case bfd_link_hash_undefined: 3082 case bfd_link_hash_undefweak: 3083 case bfd_link_hash_common: 3084 gp_found = FALSE; 3085 break; 3086 case bfd_link_hash_defined: 3087 case bfd_link_hash_defweak: 3088 gp_found = TRUE; 3089 *pgp = lh->u.def.value; 3090 break; 3091 case bfd_link_hash_indirect: 3092 case bfd_link_hash_warning: 3093 lh = lh->u.i.link; 3094 /* @@FIXME ignoring warning for now */ 3095 goto lookup; 3096 case bfd_link_hash_new: 3097 default: 3098 abort (); 3099 } 3100 } 3101 else 3102 gp_found = FALSE; 3103 3104 if (!gp_found) 3105 { 3106 /* Only get the error once. */ 3107 *pgp = 4; 3108 _bfd_set_gp_value (output_bfd, *pgp); 3109 return FALSE; 3110 } 3111 3112 _bfd_set_gp_value (output_bfd, *pgp); 3113 3114 return TRUE; 3115 } 3116 3117 /* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous 3118 if it's not available as we don't have a link_info pointer available here 3119 to look it up in the output symbol table. We don't need to adjust the 3120 symbol value for an external symbol if we are producing relocatable 3121 output. */ 3122 static bfd_reloc_status_type 3123 nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 3124 char **error_message, bfd_vma *pgp) 3125 { 3126 if (bfd_is_und_section (symbol->section) && !relocatable) 3127 { 3128 *pgp = 0; 3129 return bfd_reloc_undefined; 3130 } 3131 3132 *pgp = _bfd_get_gp_value (output_bfd); 3133 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)) 3134 { 3135 if (relocatable) 3136 { 3137 /* Make up a value. */ 3138 *pgp = symbol->section->output_section->vma + 0x4000; 3139 _bfd_set_gp_value (output_bfd, *pgp); 3140 } 3141 else 3142 { 3143 *error_message 3144 = (char *) _("global pointer relative relocation when _gp not defined"); 3145 return bfd_reloc_dangerous; 3146 } 3147 } 3148 3149 return bfd_reloc_ok; 3150 } 3151 3152 /* Do the relocations that require special handling. */ 3153 static bfd_reloc_status_type 3154 nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto, 3155 asection *input_section, 3156 bfd_byte *data, bfd_vma offset, 3157 bfd_vma symbol_value, bfd_vma addend) 3158 { 3159 symbol_value = symbol_value + addend; 3160 addend = 0; 3161 symbol_value = (symbol_value >> 16) & 0xffff; 3162 return _bfd_final_link_relocate (howto, abfd, input_section, 3163 data, offset, symbol_value, addend); 3164 } 3165 3166 static bfd_reloc_status_type 3167 nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto, 3168 asection *input_section, 3169 bfd_byte *data, bfd_vma offset, 3170 bfd_vma symbol_value, bfd_vma addend) 3171 { 3172 symbol_value = symbol_value + addend; 3173 addend = 0; 3174 symbol_value = symbol_value & 0xffff; 3175 return _bfd_final_link_relocate (howto, abfd, input_section, 3176 data, offset, symbol_value, addend); 3177 } 3178 3179 static bfd_reloc_status_type 3180 nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto, 3181 asection *input_section, 3182 bfd_byte *data, bfd_vma offset, 3183 bfd_vma symbol_value, bfd_vma addend) 3184 { 3185 symbol_value = symbol_value + addend; 3186 addend = 0; 3187 symbol_value = hiadj(symbol_value); 3188 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset, 3189 symbol_value, addend); 3190 } 3191 3192 static bfd_reloc_status_type 3193 nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto, 3194 asection *input_section, 3195 bfd_byte *data, bfd_vma offset, 3196 bfd_vma symbol_value, bfd_vma addend) 3197 { 3198 symbol_value = symbol_value + addend; 3199 addend = 0; 3200 symbol_value = symbol_value & 0xffff; 3201 return _bfd_final_link_relocate (howto, abfd, input_section, 3202 data, offset, symbol_value, addend); 3203 } 3204 3205 static bfd_reloc_status_type 3206 nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto, 3207 asection *input_section, 3208 bfd_byte *data, bfd_vma offset, 3209 bfd_vma symbol_value, bfd_vma addend) 3210 { 3211 symbol_value = symbol_value + addend; 3212 symbol_value -= (input_section->output_section->vma 3213 + input_section->output_offset); 3214 symbol_value -= offset; 3215 addend = 0; 3216 symbol_value = hiadj(symbol_value); 3217 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset, 3218 symbol_value, addend); 3219 } 3220 3221 static bfd_reloc_status_type 3222 nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto, 3223 asection *input_section, 3224 bfd_byte *data, bfd_vma offset, 3225 bfd_vma symbol_value, bfd_vma addend) 3226 { 3227 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction 3228 so we need to subtract 4 before doing a final_link_relocate. */ 3229 symbol_value = symbol_value + addend - 4; 3230 addend = 0; 3231 return _bfd_final_link_relocate (howto, abfd, input_section, 3232 data, offset, symbol_value, addend); 3233 } 3234 3235 static bfd_reloc_status_type 3236 nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto, 3237 asection *input_section, 3238 bfd_byte *data, bfd_vma offset, 3239 bfd_vma symbol_value, bfd_vma addend) 3240 { 3241 /* Check that the relocation is in the same page as the current address. */ 3242 if (CALL26_SEGMENT (symbol_value + addend) 3243 != CALL26_SEGMENT (input_section->output_section->vma 3244 + input_section->output_offset 3245 + offset)) 3246 return bfd_reloc_overflow; 3247 3248 /* Check that the target address is correctly aligned on a 4-byte 3249 boundary. */ 3250 if ((symbol_value + addend) & 0x3) 3251 return bfd_reloc_overflow; 3252 3253 return _bfd_final_link_relocate (howto, abfd, input_section, 3254 data, offset, symbol_value, addend); 3255 } 3256 3257 static bfd_reloc_status_type 3258 nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto, 3259 asection *input_section, 3260 bfd_byte *data, bfd_vma offset, 3261 bfd_vma symbol_value, bfd_vma addend) 3262 { 3263 /* Because we need the output_bfd, the special handling is done 3264 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */ 3265 return _bfd_final_link_relocate (howto, abfd, input_section, 3266 data, offset, symbol_value, addend); 3267 } 3268 3269 static bfd_reloc_status_type 3270 nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto, 3271 asection *input_section, 3272 bfd_byte *data, bfd_vma offset, 3273 bfd_vma symbol_value, bfd_vma addend) 3274 { 3275 bfd_vma symbol_lo16, symbol_hi16; 3276 bfd_reloc_status_type r; 3277 symbol_value = symbol_value + addend; 3278 addend = 0; 3279 symbol_hi16 = (symbol_value >> 16) & 0xffff; 3280 symbol_lo16 = symbol_value & 0xffff; 3281 3282 r = _bfd_final_link_relocate (howto, abfd, input_section, 3283 data, offset, symbol_hi16, addend); 3284 3285 if (r == bfd_reloc_ok) 3286 return _bfd_final_link_relocate (howto, abfd, input_section, 3287 data, offset + 4, symbol_lo16, addend); 3288 3289 return r; 3290 } 3291 3292 static bfd_reloc_status_type 3293 nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto, 3294 asection *input_section, 3295 bfd_byte *data, bfd_vma offset, 3296 bfd_vma symbol_value, bfd_vma addend) 3297 { 3298 bfd_vma symbol_lo16, symbol_hi16; 3299 bfd_reloc_status_type r; 3300 symbol_value = symbol_value + addend; 3301 addend = 0; 3302 symbol_hi16 = (symbol_value >> 16) & 0xffff; 3303 symbol_lo16 = symbol_value & 0xffff; 3304 3305 r = _bfd_final_link_relocate (howto, abfd, input_section, 3306 data, offset, symbol_hi16, addend); 3307 3308 if (r == bfd_reloc_ok) 3309 return _bfd_final_link_relocate (howto, abfd, input_section, 3310 data, offset + 4, symbol_lo16, addend); 3311 3312 return r; 3313 } 3314 3315 static bfd_reloc_status_type 3316 nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto, 3317 asection *input_section, 3318 bfd_byte *data, bfd_vma offset, 3319 bfd_vma symbol_value, bfd_vma addend) 3320 { 3321 bfd_vma symbol_lo16, symbol_hi16; 3322 bfd_reloc_status_type r; 3323 symbol_value = symbol_value + addend; 3324 addend = 0; 3325 symbol_hi16 = (symbol_value >> 16) & 0xffff; 3326 symbol_lo16 = symbol_value & 0xffff; 3327 3328 r = _bfd_final_link_relocate (howto, abfd, input_section, 3329 data, offset, symbol_hi16, addend); 3330 3331 if (r == bfd_reloc_ok) 3332 return _bfd_final_link_relocate (howto, abfd, input_section, 3333 data, offset + 4, symbol_lo16, addend); 3334 3335 return r; 3336 } 3337 3338 /* HOWTO handlers for relocations that require special handling. */ 3339 3340 /* This is for relocations used only when relaxing to ensure 3341 changes in size of section don't screw up .align. */ 3342 static bfd_reloc_status_type 3343 nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 3344 asymbol *symbol ATTRIBUTE_UNUSED, 3345 void *data ATTRIBUTE_UNUSED, asection *input_section, 3346 bfd *output_bfd, 3347 char **error_message ATTRIBUTE_UNUSED) 3348 { 3349 if (output_bfd != NULL) 3350 reloc_entry->address += input_section->output_offset; 3351 return bfd_reloc_ok; 3352 } 3353 3354 static bfd_reloc_status_type 3355 nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3356 void *data, asection *input_section, 3357 bfd *output_bfd, 3358 char **error_message ATTRIBUTE_UNUSED) 3359 { 3360 /* This part is from bfd_elf_generic_reloc. */ 3361 if (output_bfd != NULL 3362 && (symbol->flags & BSF_SECTION_SYM) == 0 3363 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3364 { 3365 reloc_entry->address += input_section->output_offset; 3366 return bfd_reloc_ok; 3367 } 3368 3369 if (output_bfd != NULL) 3370 /* FIXME: See bfd_perform_relocation. Is this right? */ 3371 return bfd_reloc_continue; 3372 3373 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto, 3374 input_section, 3375 data, reloc_entry->address, 3376 (symbol->value 3377 + symbol->section->output_section->vma 3378 + symbol->section->output_offset), 3379 reloc_entry->addend); 3380 } 3381 3382 static bfd_reloc_status_type 3383 nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3384 void *data, asection *input_section, 3385 bfd *output_bfd, 3386 char **error_message ATTRIBUTE_UNUSED) 3387 { 3388 /* This part is from bfd_elf_generic_reloc. */ 3389 if (output_bfd != NULL 3390 && (symbol->flags & BSF_SECTION_SYM) == 0 3391 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3392 { 3393 reloc_entry->address += input_section->output_offset; 3394 return bfd_reloc_ok; 3395 } 3396 3397 if (output_bfd != NULL) 3398 /* FIXME: See bfd_perform_relocation. Is this right? */ 3399 return bfd_reloc_continue; 3400 3401 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto, 3402 input_section, 3403 data, reloc_entry->address, 3404 (symbol->value 3405 + symbol->section->output_section->vma 3406 + symbol->section->output_offset), 3407 reloc_entry->addend); 3408 } 3409 3410 static bfd_reloc_status_type 3411 nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3412 void *data, asection *input_section, 3413 bfd *output_bfd, 3414 char **error_message ATTRIBUTE_UNUSED) 3415 { 3416 /* This part is from bfd_elf_generic_reloc. */ 3417 if (output_bfd != NULL 3418 && (symbol->flags & BSF_SECTION_SYM) == 0 3419 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3420 { 3421 reloc_entry->address += input_section->output_offset; 3422 return bfd_reloc_ok; 3423 } 3424 3425 if (output_bfd != NULL) 3426 /* FIXME: See bfd_perform_relocation. Is this right? */ 3427 return bfd_reloc_continue; 3428 3429 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto, 3430 input_section, 3431 data, reloc_entry->address, 3432 (symbol->value 3433 + symbol->section->output_section->vma 3434 + symbol->section->output_offset), 3435 reloc_entry->addend); 3436 } 3437 3438 static bfd_reloc_status_type 3439 nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry, 3440 asymbol *symbol, void *data, 3441 asection *input_section, bfd *output_bfd, 3442 char **error_message ATTRIBUTE_UNUSED) 3443 { 3444 /* This part is from bfd_elf_generic_reloc. */ 3445 if (output_bfd != NULL 3446 && (symbol->flags & BSF_SECTION_SYM) == 0 3447 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3448 { 3449 reloc_entry->address += input_section->output_offset; 3450 return bfd_reloc_ok; 3451 } 3452 3453 if (output_bfd != NULL) 3454 /* FIXME: See bfd_perform_relocation. Is this right? */ 3455 return bfd_reloc_continue; 3456 3457 return nios2_elf32_do_pcrel_lo16_relocate ( 3458 abfd, reloc_entry->howto, input_section, data, reloc_entry->address, 3459 (symbol->value + symbol->section->output_section->vma 3460 + symbol->section->output_offset), 3461 reloc_entry->addend); 3462 } 3463 3464 static bfd_reloc_status_type 3465 nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, 3466 asymbol *symbol, void *data, 3467 asection *input_section, bfd *output_bfd, 3468 char **error_message ATTRIBUTE_UNUSED) 3469 { 3470 /* This part is from bfd_elf_generic_reloc. */ 3471 if (output_bfd != NULL 3472 && (symbol->flags & BSF_SECTION_SYM) == 0 3473 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3474 { 3475 reloc_entry->address += input_section->output_offset; 3476 return bfd_reloc_ok; 3477 } 3478 3479 if (output_bfd != NULL) 3480 /* FIXME: See bfd_perform_relocation. Is this right? */ 3481 return bfd_reloc_continue; 3482 3483 return nios2_elf32_do_pcrel_hiadj16_relocate ( 3484 abfd, reloc_entry->howto, input_section, data, reloc_entry->address, 3485 (symbol->value + symbol->section->output_section->vma 3486 + symbol->section->output_offset), 3487 reloc_entry->addend); 3488 } 3489 3490 static bfd_reloc_status_type 3491 nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3492 void *data, asection *input_section, 3493 bfd *output_bfd, 3494 char **error_message ATTRIBUTE_UNUSED) 3495 { 3496 /* This part is from bfd_elf_generic_reloc. */ 3497 if (output_bfd != NULL 3498 && (symbol->flags & BSF_SECTION_SYM) == 0 3499 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3500 { 3501 reloc_entry->address += input_section->output_offset; 3502 return bfd_reloc_ok; 3503 } 3504 3505 if (output_bfd != NULL) 3506 /* FIXME: See bfd_perform_relocation. Is this right? */ 3507 return bfd_reloc_continue; 3508 3509 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto, 3510 input_section, 3511 data, reloc_entry->address, 3512 (symbol->value 3513 + symbol->section->output_section->vma 3514 + symbol->section->output_offset), 3515 reloc_entry->addend); 3516 } 3517 3518 static bfd_reloc_status_type 3519 nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3520 void *data, asection *input_section, 3521 bfd *output_bfd, 3522 char **error_message ATTRIBUTE_UNUSED) 3523 { 3524 /* This part is from bfd_elf_generic_reloc. */ 3525 if (output_bfd != NULL 3526 && (symbol->flags & BSF_SECTION_SYM) == 0 3527 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3528 { 3529 reloc_entry->address += input_section->output_offset; 3530 return bfd_reloc_ok; 3531 } 3532 3533 if (output_bfd != NULL) 3534 /* FIXME: See bfd_perform_relocation. Is this right? */ 3535 return bfd_reloc_continue; 3536 3537 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto, 3538 input_section, 3539 data, reloc_entry->address, 3540 (symbol->value 3541 + symbol->section->output_section->vma 3542 + symbol->section->output_offset), 3543 reloc_entry->addend); 3544 } 3545 3546 static bfd_reloc_status_type 3547 nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3548 void *data, asection *input_section, 3549 bfd *output_bfd, char **msg) 3550 { 3551 bfd_vma relocation; 3552 bfd_vma gp; 3553 bfd_reloc_status_type r; 3554 3555 3556 /* This part is from bfd_elf_generic_reloc. */ 3557 if (output_bfd != NULL 3558 && (symbol->flags & BSF_SECTION_SYM) == 0 3559 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3560 { 3561 reloc_entry->address += input_section->output_offset; 3562 return bfd_reloc_ok; 3563 } 3564 3565 if (output_bfd != NULL) 3566 /* FIXME: See bfd_perform_relocation. Is this right? */ 3567 return bfd_reloc_continue; 3568 3569 relocation = (symbol->value 3570 + symbol->section->output_section->vma 3571 + symbol->section->output_offset); 3572 3573 /* This assumes we've already cached the _gp symbol. */ 3574 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp); 3575 if (r == bfd_reloc_ok) 3576 { 3577 relocation = relocation + reloc_entry->addend - gp; 3578 reloc_entry->addend = 0; 3579 if ((signed) relocation < -32768 || (signed) relocation > 32767) 3580 { 3581 *msg = _("global pointer relative address out of range"); 3582 r = bfd_reloc_outofrange; 3583 } 3584 else 3585 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto, 3586 input_section, 3587 data, reloc_entry->address, 3588 relocation, reloc_entry->addend); 3589 } 3590 3591 return r; 3592 } 3593 3594 static bfd_reloc_status_type 3595 nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3596 void *data, asection *input_section, 3597 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 3598 { 3599 /* This part is from bfd_elf_generic_reloc. */ 3600 if (output_bfd != NULL 3601 && (symbol->flags & BSF_SECTION_SYM) == 0 3602 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3603 { 3604 reloc_entry->address += input_section->output_offset; 3605 return bfd_reloc_ok; 3606 } 3607 3608 if (output_bfd != NULL) 3609 /* FIXME: See bfd_perform_relocation. Is this right? */ 3610 return bfd_reloc_continue; 3611 3612 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto, 3613 input_section, 3614 data, reloc_entry->address, 3615 (symbol->value 3616 + symbol->section->output_section->vma 3617 + symbol->section->output_offset), 3618 reloc_entry->addend); 3619 } 3620 3621 static bfd_reloc_status_type 3622 nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3623 void *data, asection *input_section, 3624 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 3625 { 3626 /* This part is from bfd_elf_generic_reloc. */ 3627 if (output_bfd != NULL 3628 && (symbol->flags & BSF_SECTION_SYM) == 0 3629 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3630 { 3631 reloc_entry->address += input_section->output_offset; 3632 return bfd_reloc_ok; 3633 } 3634 3635 if (output_bfd != NULL) 3636 /* FIXME: See bfd_perform_relocation. Is this right? */ 3637 return bfd_reloc_continue; 3638 3639 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto, 3640 input_section, 3641 data, reloc_entry->address, 3642 (symbol->value 3643 + symbol->section->output_section->vma 3644 + symbol->section->output_offset), 3645 reloc_entry->addend); 3646 } 3647 3648 static bfd_reloc_status_type 3649 nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3650 void *data, asection *input_section, 3651 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 3652 { 3653 /* This part is from bfd_elf_generic_reloc. */ 3654 if (output_bfd != NULL 3655 && (symbol->flags & BSF_SECTION_SYM) == 0 3656 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3657 { 3658 reloc_entry->address += input_section->output_offset; 3659 return bfd_reloc_ok; 3660 } 3661 3662 if (output_bfd != NULL) 3663 /* FIXME: See bfd_perform_relocation. Is this right? */ 3664 return bfd_reloc_continue; 3665 3666 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto, 3667 input_section, 3668 data, reloc_entry->address, 3669 (symbol->value 3670 + symbol->section->output_section->vma 3671 + symbol->section->output_offset), 3672 reloc_entry->addend); 3673 } 3674 3675 3676 /* Implement elf_backend_relocate_section. */ 3677 static bfd_boolean 3678 nios2_elf32_relocate_section (bfd *output_bfd, 3679 struct bfd_link_info *info, 3680 bfd *input_bfd, 3681 asection *input_section, 3682 bfd_byte *contents, 3683 Elf_Internal_Rela *relocs, 3684 Elf_Internal_Sym *local_syms, 3685 asection **local_sections) 3686 { 3687 Elf_Internal_Shdr *symtab_hdr; 3688 struct elf_link_hash_entry **sym_hashes; 3689 Elf_Internal_Rela *rel; 3690 Elf_Internal_Rela *relend; 3691 struct elf32_nios2_link_hash_table *htab; 3692 asection *sgot; 3693 asection *splt; 3694 asection *sreloc = NULL; 3695 bfd_vma *local_got_offsets; 3696 bfd_vma got_base; 3697 3698 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 3699 sym_hashes = elf_sym_hashes (input_bfd); 3700 relend = relocs + input_section->reloc_count; 3701 3702 htab = elf32_nios2_hash_table (info); 3703 sgot = htab->root.sgot; 3704 splt = htab->root.splt; 3705 local_got_offsets = elf_local_got_offsets (input_bfd); 3706 3707 if (elf32_nios2_hash_table (info)->h_gp_got == NULL) 3708 got_base = 0; 3709 else 3710 got_base = elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value; 3711 3712 for (rel = relocs; rel < relend; rel++) 3713 { 3714 reloc_howto_type *howto; 3715 unsigned long r_symndx; 3716 Elf_Internal_Sym *sym; 3717 asection *sec; 3718 struct elf_link_hash_entry *h; 3719 struct elf32_nios2_link_hash_entry *eh; 3720 bfd_vma relocation; 3721 bfd_vma gp; 3722 bfd_vma reloc_address; 3723 bfd_reloc_status_type r = bfd_reloc_ok; 3724 const char *name = NULL; 3725 int r_type; 3726 const char *format; 3727 char msgbuf[256]; 3728 const char* msg = (const char*) NULL; 3729 bfd_boolean unresolved_reloc; 3730 bfd_vma off; 3731 int use_plt; 3732 3733 r_type = ELF32_R_TYPE (rel->r_info); 3734 r_symndx = ELF32_R_SYM (rel->r_info); 3735 3736 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info), output_bfd); 3737 h = NULL; 3738 sym = NULL; 3739 sec = NULL; 3740 3741 if (r_symndx < symtab_hdr->sh_info) 3742 { 3743 sym = local_syms + r_symndx; 3744 sec = local_sections[r_symndx]; 3745 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 3746 } 3747 else 3748 { 3749 bfd_boolean warned, ignored; 3750 3751 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 3752 r_symndx, symtab_hdr, sym_hashes, 3753 h, sec, relocation, 3754 unresolved_reloc, warned, ignored); 3755 } 3756 3757 if (sec && discarded_section (sec)) 3758 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 3759 rel, 1, relend, howto, 0, contents); 3760 3761 /* Nothing more to do unless this is a final link. */ 3762 if (bfd_link_relocatable (info)) 3763 continue; 3764 3765 if (sec && sec->output_section) 3766 reloc_address = (sec->output_section->vma + sec->output_offset 3767 + rel->r_offset); 3768 else 3769 reloc_address = 0; 3770 3771 if (howto) 3772 { 3773 switch (howto->type) 3774 { 3775 case R_NIOS2_HI16: 3776 r = nios2_elf32_do_hi16_relocate (input_bfd, howto, 3777 input_section, 3778 contents, rel->r_offset, 3779 relocation, rel->r_addend); 3780 break; 3781 case R_NIOS2_LO16: 3782 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 3783 input_section, 3784 contents, rel->r_offset, 3785 relocation, rel->r_addend); 3786 break; 3787 case R_NIOS2_PCREL_LO: 3788 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto, 3789 input_section, 3790 contents, 3791 rel->r_offset, 3792 relocation, 3793 rel->r_addend); 3794 break; 3795 case R_NIOS2_HIADJ16: 3796 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 3797 input_section, contents, 3798 rel->r_offset, relocation, 3799 rel->r_addend); 3800 break; 3801 case R_NIOS2_PCREL_HA: 3802 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto, 3803 input_section, 3804 contents, 3805 rel->r_offset, 3806 relocation, 3807 rel->r_addend); 3808 break; 3809 case R_NIOS2_PCREL16: 3810 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto, 3811 input_section, contents, 3812 rel->r_offset, relocation, 3813 rel->r_addend); 3814 break; 3815 case R_NIOS2_GPREL: 3816 /* Turns an absolute address into a gp-relative address. */ 3817 if (!nios2_elf_assign_gp (output_bfd, &gp, info)) 3818 { 3819 format = _("global pointer relative relocation at address " 3820 "0x%08x when _gp not defined\n"); 3821 sprintf (msgbuf, format, reloc_address); 3822 msg = msgbuf; 3823 r = bfd_reloc_dangerous; 3824 } 3825 else 3826 { 3827 bfd_vma symbol_address = rel->r_addend + relocation; 3828 relocation = relocation + rel->r_addend - gp; 3829 rel->r_addend = 0; 3830 if (((signed) relocation < -32768 3831 || (signed) relocation > 32767) 3832 && (!h 3833 || h->root.type == bfd_link_hash_defined 3834 || h->root.type == bfd_link_hash_defweak)) 3835 { 3836 format = _("Unable to reach %s (at 0x%08x) from the " 3837 "global pointer (at 0x%08x) because the " 3838 "offset (%d) is out of the allowed range, " 3839 "-32678 to 32767.\n" ); 3840 sprintf (msgbuf, format, name, symbol_address, gp, 3841 (signed)relocation); 3842 msg = msgbuf; 3843 r = bfd_reloc_outofrange; 3844 } 3845 else 3846 r = _bfd_final_link_relocate (howto, input_bfd, 3847 input_section, contents, 3848 rel->r_offset, relocation, 3849 rel->r_addend); 3850 } 3851 3852 break; 3853 case R_NIOS2_UJMP: 3854 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto, 3855 input_section, 3856 contents, rel->r_offset, 3857 relocation, rel->r_addend); 3858 break; 3859 case R_NIOS2_CJMP: 3860 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto, 3861 input_section, 3862 contents, rel->r_offset, 3863 relocation, rel->r_addend); 3864 break; 3865 case R_NIOS2_CALLR: 3866 r = nios2_elf32_do_callr_relocate (input_bfd, howto, 3867 input_section, contents, 3868 rel->r_offset, relocation, 3869 rel->r_addend); 3870 break; 3871 case R_NIOS2_CALL26: 3872 case R_NIOS2_CALL26_NOAT: 3873 /* If we have a call to an undefined weak symbol, we just want 3874 to stuff a zero in the bits of the call instruction and 3875 bypass the normal call26 relocation handling, because it'll 3876 diagnose an overflow error if address 0 isn't in the same 3877 256MB segment as the call site. Presumably the call 3878 should be guarded by a null check anyway. */ 3879 if (h != NULL && h->root.type == bfd_link_hash_undefweak) 3880 { 3881 BFD_ASSERT (relocation == 0 && rel->r_addend == 0); 3882 r = _bfd_final_link_relocate (howto, input_bfd, 3883 input_section, contents, 3884 rel->r_offset, relocation, 3885 rel->r_addend); 3886 break; 3887 } 3888 /* Handle relocations which should use the PLT entry. 3889 NIOS2_BFD_RELOC_32 relocations will use the symbol's value, 3890 which may point to a PLT entry, but we don't need to handle 3891 that here. If we created a PLT entry, all branches in this 3892 object should go to it. */ 3893 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1) 3894 { 3895 /* If we've created a .plt section, and assigned a PLT entry 3896 to this function, it should not be known to bind locally. 3897 If it were, we would have cleared the PLT entry. */ 3898 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h)); 3899 3900 relocation = (splt->output_section->vma 3901 + splt->output_offset 3902 + h->plt.offset); 3903 3904 unresolved_reloc = FALSE; 3905 } 3906 /* Detect R_NIOS2_CALL26 relocations that would overflow the 3907 256MB segment. Replace the target with a reference to a 3908 trampoline instead. 3909 Note that htab->stub_group is null if relaxation has been 3910 disabled by the --no-relax linker command-line option, so 3911 we can use that to skip this processing entirely. */ 3912 if (howto->type == R_NIOS2_CALL26 && htab->stub_group) 3913 { 3914 bfd_vma dest = relocation + rel->r_addend; 3915 enum elf32_nios2_stub_type stub_type; 3916 3917 eh = (struct elf32_nios2_link_hash_entry *)h; 3918 stub_type = nios2_type_of_stub (input_section, rel, eh, 3919 htab, dest, NULL); 3920 3921 if (stub_type != nios2_stub_none) 3922 { 3923 struct elf32_nios2_stub_hash_entry *hsh; 3924 3925 hsh = nios2_get_stub_entry (input_section, sec, 3926 eh, rel, htab, stub_type); 3927 if (hsh == NULL) 3928 { 3929 r = bfd_reloc_undefined; 3930 break; 3931 } 3932 3933 dest = (hsh->stub_offset 3934 + hsh->stub_sec->output_offset 3935 + hsh->stub_sec->output_section->vma); 3936 r = nios2_elf32_do_call26_relocate (input_bfd, howto, 3937 input_section, 3938 contents, 3939 rel->r_offset, 3940 dest, 0); 3941 break; 3942 } 3943 } 3944 3945 /* Normal case. */ 3946 r = nios2_elf32_do_call26_relocate (input_bfd, howto, 3947 input_section, contents, 3948 rel->r_offset, relocation, 3949 rel->r_addend); 3950 break; 3951 case R_NIOS2_ALIGN: 3952 r = bfd_reloc_ok; 3953 /* For symmetry this would be 3954 r = nios2_elf32_do_ignore_reloc (input_bfd, howto, 3955 input_section, contents, 3956 rel->r_offset, relocation, 3957 rel->r_addend); 3958 but do_ignore_reloc would do no more than return 3959 bfd_reloc_ok. */ 3960 break; 3961 3962 case R_NIOS2_GOT16: 3963 case R_NIOS2_CALL16: 3964 case R_NIOS2_GOT_LO: 3965 case R_NIOS2_GOT_HA: 3966 case R_NIOS2_CALL_LO: 3967 case R_NIOS2_CALL_HA: 3968 /* Relocation is to the entry for this symbol in the 3969 global offset table. */ 3970 if (sgot == NULL) 3971 { 3972 r = bfd_reloc_notsupported; 3973 break; 3974 } 3975 3976 use_plt = 0; 3977 3978 if (h != NULL) 3979 { 3980 bfd_boolean dyn; 3981 3982 eh = (struct elf32_nios2_link_hash_entry *)h; 3983 use_plt = (eh->got_types_used == CALL_USED 3984 && h->plt.offset != (bfd_vma) -1); 3985 3986 off = h->got.offset; 3987 BFD_ASSERT (off != (bfd_vma) -1); 3988 dyn = elf_hash_table (info)->dynamic_sections_created; 3989 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 3990 bfd_link_pic (info), 3991 h) 3992 || (bfd_link_pic (info) 3993 && SYMBOL_REFERENCES_LOCAL (info, h)) 3994 || (ELF_ST_VISIBILITY (h->other) 3995 && h->root.type == bfd_link_hash_undefweak)) 3996 { 3997 /* This is actually a static link, or it is a -Bsymbolic 3998 link and the symbol is defined locally. We must 3999 initialize this entry in the global offset table. 4000 Since the offset must always be a multiple of 4, we 4001 use the least significant bit to record whether we 4002 have initialized it already. 4003 4004 When doing a dynamic link, we create a .rela.got 4005 relocation entry to initialize the value. This is 4006 done in the finish_dynamic_symbol routine. */ 4007 if ((off & 1) != 0) 4008 off &= ~1; 4009 else 4010 { 4011 bfd_put_32 (output_bfd, relocation, 4012 sgot->contents + off); 4013 h->got.offset |= 1; 4014 } 4015 } 4016 else 4017 unresolved_reloc = FALSE; 4018 } 4019 else 4020 { 4021 BFD_ASSERT (local_got_offsets != NULL 4022 && local_got_offsets[r_symndx] != (bfd_vma) -1); 4023 4024 off = local_got_offsets[r_symndx]; 4025 4026 /* The offset must always be a multiple of 4. We use the 4027 least significant bit to record whether we have already 4028 generated the necessary reloc. */ 4029 if ((off & 1) != 0) 4030 off &= ~1; 4031 else 4032 { 4033 bfd_put_32 (output_bfd, relocation, 4034 sgot->contents + off); 4035 4036 if (bfd_link_pic (info)) 4037 { 4038 asection *srelgot; 4039 Elf_Internal_Rela outrel; 4040 bfd_byte *loc; 4041 4042 srelgot = htab->root.srelgot; 4043 BFD_ASSERT (srelgot != NULL); 4044 4045 outrel.r_addend = relocation; 4046 outrel.r_offset = (sgot->output_section->vma 4047 + sgot->output_offset 4048 + off); 4049 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 4050 loc = srelgot->contents; 4051 loc += (srelgot->reloc_count++ * 4052 sizeof (Elf32_External_Rela)); 4053 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4054 } 4055 4056 local_got_offsets[r_symndx] |= 1; 4057 } 4058 } 4059 4060 if (use_plt && bfd_link_pic (info)) 4061 { 4062 off = ((h->plt.offset - 24) / 12 + 3) * 4; 4063 relocation = (htab->root.sgotplt->output_offset + off 4064 - got_base); 4065 } 4066 else 4067 relocation = sgot->output_offset + off - got_base; 4068 4069 /* This relocation does not use the addend. */ 4070 rel->r_addend = 0; 4071 4072 switch (howto->type) 4073 { 4074 case R_NIOS2_GOT_LO: 4075 case R_NIOS2_CALL_LO: 4076 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 4077 input_section, contents, 4078 rel->r_offset, relocation, 4079 rel->r_addend); 4080 break; 4081 case R_NIOS2_GOT_HA: 4082 case R_NIOS2_CALL_HA: 4083 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 4084 input_section, contents, 4085 rel->r_offset, 4086 relocation, 4087 rel->r_addend); 4088 break; 4089 default: 4090 r = _bfd_final_link_relocate (howto, input_bfd, 4091 input_section, contents, 4092 rel->r_offset, relocation, 4093 rel->r_addend); 4094 break; 4095 } 4096 break; 4097 4098 case R_NIOS2_GOTOFF_LO: 4099 case R_NIOS2_GOTOFF_HA: 4100 case R_NIOS2_GOTOFF: 4101 /* Relocation is relative to the global offset table pointer. */ 4102 4103 BFD_ASSERT (sgot != NULL); 4104 if (sgot == NULL) 4105 { 4106 r = bfd_reloc_notsupported; 4107 break; 4108 } 4109 4110 /* Note that sgot->output_offset is not involved in this 4111 calculation. We always want the start of .got. */ 4112 relocation -= sgot->output_section->vma; 4113 4114 /* Now we adjust the relocation to be relative to the GOT pointer 4115 (the _gp_got symbol), which possibly contains the 0x8000 bias. */ 4116 relocation -= got_base; 4117 4118 switch (howto->type) 4119 { 4120 case R_NIOS2_GOTOFF_LO: 4121 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 4122 input_section, contents, 4123 rel->r_offset, relocation, 4124 rel->r_addend); 4125 break; 4126 case R_NIOS2_GOTOFF_HA: 4127 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 4128 input_section, contents, 4129 rel->r_offset, 4130 relocation, 4131 rel->r_addend); 4132 break; 4133 default: 4134 r = _bfd_final_link_relocate (howto, input_bfd, 4135 input_section, contents, 4136 rel->r_offset, relocation, 4137 rel->r_addend); 4138 break; 4139 } 4140 break; 4141 4142 case R_NIOS2_TLS_LDO16: 4143 relocation -= dtpoff_base (info) + DTP_OFFSET; 4144 4145 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4146 contents, rel->r_offset, 4147 relocation, rel->r_addend); 4148 break; 4149 case R_NIOS2_TLS_LDM16: 4150 if (htab->root.sgot == NULL) 4151 abort (); 4152 4153 off = htab->tls_ldm_got.offset; 4154 4155 if ((off & 1) != 0) 4156 off &= ~1; 4157 else 4158 { 4159 /* If we don't know the module number, create a relocation 4160 for it. */ 4161 if (bfd_link_pic (info)) 4162 { 4163 Elf_Internal_Rela outrel; 4164 bfd_byte *loc; 4165 4166 if (htab->root.srelgot == NULL) 4167 abort (); 4168 4169 outrel.r_addend = 0; 4170 outrel.r_offset = (htab->root.sgot->output_section->vma 4171 + htab->root.sgot->output_offset 4172 + off); 4173 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD); 4174 4175 loc = htab->root.srelgot->contents; 4176 loc += (htab->root.srelgot->reloc_count++ 4177 * sizeof (Elf32_External_Rela)); 4178 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4179 } 4180 else 4181 bfd_put_32 (output_bfd, 1, 4182 htab->root.sgot->contents + off); 4183 4184 htab->tls_ldm_got.offset |= 1; 4185 } 4186 4187 relocation = htab->root.sgot->output_offset + off - got_base; 4188 4189 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4190 contents, rel->r_offset, 4191 relocation, rel->r_addend); 4192 4193 break; 4194 case R_NIOS2_TLS_GD16: 4195 case R_NIOS2_TLS_IE16: 4196 { 4197 int indx; 4198 char tls_type; 4199 4200 if (htab->root.sgot == NULL) 4201 abort (); 4202 4203 indx = 0; 4204 if (h != NULL) 4205 { 4206 bfd_boolean dyn; 4207 dyn = htab->root.dynamic_sections_created; 4208 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 4209 bfd_link_pic (info), 4210 h) 4211 && (!bfd_link_pic (info) 4212 || !SYMBOL_REFERENCES_LOCAL (info, h))) 4213 { 4214 unresolved_reloc = FALSE; 4215 indx = h->dynindx; 4216 } 4217 off = h->got.offset; 4218 tls_type = (((struct elf32_nios2_link_hash_entry *) h) 4219 ->tls_type); 4220 } 4221 else 4222 { 4223 if (local_got_offsets == NULL) 4224 abort (); 4225 off = local_got_offsets[r_symndx]; 4226 tls_type = (elf32_nios2_local_got_tls_type (input_bfd) 4227 [r_symndx]); 4228 } 4229 4230 if (tls_type == GOT_UNKNOWN) 4231 abort (); 4232 4233 if ((off & 1) != 0) 4234 off &= ~1; 4235 else 4236 { 4237 bfd_boolean need_relocs = FALSE; 4238 Elf_Internal_Rela outrel; 4239 bfd_byte *loc = NULL; 4240 int cur_off = off; 4241 4242 /* The GOT entries have not been initialized yet. Do it 4243 now, and emit any relocations. If both an IE GOT and a 4244 GD GOT are necessary, we emit the GD first. */ 4245 4246 if ((bfd_link_pic (info) || indx != 0) 4247 && (h == NULL 4248 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 4249 || h->root.type != bfd_link_hash_undefweak)) 4250 { 4251 need_relocs = TRUE; 4252 if (htab->root.srelgot == NULL) 4253 abort (); 4254 loc = htab->root.srelgot->contents; 4255 loc += (htab->root.srelgot->reloc_count * 4256 sizeof (Elf32_External_Rela)); 4257 } 4258 4259 if (tls_type & GOT_TLS_GD) 4260 { 4261 if (need_relocs) 4262 { 4263 outrel.r_addend = 0; 4264 outrel.r_offset = (htab->root.sgot->output_section->vma 4265 + htab->root.sgot->output_offset 4266 + cur_off); 4267 outrel.r_info = ELF32_R_INFO (indx, 4268 R_NIOS2_TLS_DTPMOD); 4269 4270 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 4271 loc); 4272 htab->root.srelgot->reloc_count++; 4273 loc += sizeof (Elf32_External_Rela); 4274 4275 if (indx == 0) 4276 bfd_put_32 (output_bfd, 4277 (relocation - dtpoff_base (info) - 4278 DTP_OFFSET), 4279 htab->root.sgot->contents + cur_off + 4); 4280 else 4281 { 4282 outrel.r_addend = 0; 4283 outrel.r_info = ELF32_R_INFO (indx, 4284 R_NIOS2_TLS_DTPREL); 4285 outrel.r_offset += 4; 4286 4287 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 4288 loc); 4289 htab->root.srelgot->reloc_count++; 4290 loc += sizeof (Elf32_External_Rela); 4291 } 4292 } 4293 else 4294 { 4295 /* If we are not emitting relocations for a 4296 general dynamic reference, then we must be in a 4297 static link or an executable link with the 4298 symbol binding locally. Mark it as belonging 4299 to module 1, the executable. */ 4300 bfd_put_32 (output_bfd, 1, 4301 htab->root.sgot->contents + cur_off); 4302 bfd_put_32 (output_bfd, (relocation - 4303 dtpoff_base (info) - 4304 DTP_OFFSET), 4305 htab->root.sgot->contents + cur_off + 4); 4306 } 4307 4308 cur_off += 8; 4309 } 4310 4311 if (tls_type & GOT_TLS_IE) 4312 { 4313 if (need_relocs) 4314 { 4315 if (indx == 0) 4316 outrel.r_addend = (relocation - 4317 dtpoff_base (info)); 4318 else 4319 outrel.r_addend = 0; 4320 outrel.r_offset = (htab->root.sgot->output_section->vma 4321 + htab->root.sgot->output_offset 4322 + cur_off); 4323 outrel.r_info = ELF32_R_INFO (indx, 4324 R_NIOS2_TLS_TPREL); 4325 4326 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 4327 loc); 4328 htab->root.srelgot->reloc_count++; 4329 loc += sizeof (Elf32_External_Rela); 4330 } 4331 else 4332 bfd_put_32 (output_bfd, (tpoff (info, relocation) 4333 - TP_OFFSET), 4334 htab->root.sgot->contents + cur_off); 4335 cur_off += 4; 4336 } 4337 4338 if (h != NULL) 4339 h->got.offset |= 1; 4340 else 4341 local_got_offsets[r_symndx] |= 1; 4342 } 4343 4344 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16) 4345 off += 8; 4346 relocation = htab->root.sgot->output_offset + off - got_base; 4347 4348 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4349 contents, rel->r_offset, 4350 relocation, rel->r_addend); 4351 } 4352 4353 break; 4354 case R_NIOS2_TLS_LE16: 4355 if (bfd_link_dll (info)) 4356 { 4357 (*_bfd_error_handler) 4358 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not " 4359 "permitted in shared object"), 4360 input_bfd, input_section, 4361 (long) rel->r_offset, howto->name); 4362 return FALSE; 4363 } 4364 else 4365 relocation = tpoff (info, relocation) - TP_OFFSET; 4366 4367 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4368 contents, rel->r_offset, 4369 relocation, rel->r_addend); 4370 break; 4371 4372 case R_NIOS2_BFD_RELOC_32: 4373 if (bfd_link_pic (info) 4374 && (input_section->flags & SEC_ALLOC) != 0 4375 && (h == NULL 4376 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 4377 || h->root.type != bfd_link_hash_undefweak)) 4378 { 4379 Elf_Internal_Rela outrel; 4380 bfd_byte *loc; 4381 bfd_boolean skip, relocate; 4382 4383 /* When generating a shared object, these relocations 4384 are copied into the output file to be resolved at run 4385 time. */ 4386 4387 skip = FALSE; 4388 relocate = FALSE; 4389 4390 outrel.r_offset 4391 = _bfd_elf_section_offset (output_bfd, info, 4392 input_section, rel->r_offset); 4393 if (outrel.r_offset == (bfd_vma) -1) 4394 skip = TRUE; 4395 else if (outrel.r_offset == (bfd_vma) -2) 4396 skip = TRUE, relocate = TRUE; 4397 outrel.r_offset += (input_section->output_section->vma 4398 + input_section->output_offset); 4399 4400 if (skip) 4401 memset (&outrel, 0, sizeof outrel); 4402 else if (h != NULL 4403 && h->dynindx != -1 4404 && (!bfd_link_pic (info) 4405 || !SYMBOLIC_BIND (info, h) 4406 || !h->def_regular)) 4407 { 4408 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); 4409 outrel.r_addend = rel->r_addend; 4410 } 4411 else 4412 { 4413 /* This symbol is local, or marked to become local. */ 4414 outrel.r_addend = relocation + rel->r_addend; 4415 relocate = TRUE; 4416 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 4417 } 4418 4419 sreloc = elf_section_data (input_section)->sreloc; 4420 if (sreloc == NULL) 4421 abort (); 4422 4423 loc = sreloc->contents; 4424 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela); 4425 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4426 4427 /* This reloc will be computed at runtime, so there's no 4428 need to do anything now, except for R_NIOS2_BFD_RELOC_32 4429 relocations that have been turned into 4430 R_NIOS2_RELATIVE. */ 4431 if (!relocate) 4432 break; 4433 } 4434 4435 r = _bfd_final_link_relocate (howto, input_bfd, 4436 input_section, contents, 4437 rel->r_offset, relocation, 4438 rel->r_addend); 4439 break; 4440 4441 case R_NIOS2_TLS_DTPREL: 4442 relocation -= dtpoff_base (info); 4443 /* Fall through. */ 4444 4445 default: 4446 r = _bfd_final_link_relocate (howto, input_bfd, 4447 input_section, contents, 4448 rel->r_offset, relocation, 4449 rel->r_addend); 4450 break; 4451 } 4452 } 4453 else 4454 r = bfd_reloc_notsupported; 4455 4456 if (r != bfd_reloc_ok) 4457 { 4458 if (h != NULL) 4459 name = h->root.root.string; 4460 else 4461 { 4462 name = bfd_elf_string_from_elf_section (input_bfd, 4463 symtab_hdr->sh_link, 4464 sym->st_name); 4465 if (name == NULL || *name == '\0') 4466 name = bfd_section_name (input_bfd, sec); 4467 } 4468 4469 switch (r) 4470 { 4471 case bfd_reloc_overflow: 4472 r = info->callbacks->reloc_overflow (info, NULL, name, 4473 howto->name, (bfd_vma) 0, 4474 input_bfd, input_section, 4475 rel->r_offset); 4476 break; 4477 4478 case bfd_reloc_undefined: 4479 r = info->callbacks->undefined_symbol (info, name, input_bfd, 4480 input_section, 4481 rel->r_offset, TRUE); 4482 break; 4483 4484 case bfd_reloc_outofrange: 4485 if (msg == NULL) 4486 msg = _("relocation out of range"); 4487 break; 4488 4489 case bfd_reloc_notsupported: 4490 if (msg == NULL) 4491 msg = _("unsupported relocation"); 4492 break; 4493 4494 case bfd_reloc_dangerous: 4495 if (msg == NULL) 4496 msg = _("dangerous relocation"); 4497 break; 4498 4499 default: 4500 if (msg == NULL) 4501 msg = _("unknown error"); 4502 break; 4503 } 4504 4505 if (msg) 4506 { 4507 r = info->callbacks->warning 4508 (info, msg, name, input_bfd, input_section, rel->r_offset); 4509 return FALSE; 4510 } 4511 } 4512 } 4513 return TRUE; 4514 } 4515 4516 /* Implement elf-backend_section_flags: 4517 Convert NIOS2 specific section flags to bfd internal section flags. */ 4518 static bfd_boolean 4519 nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr) 4520 { 4521 if (hdr->sh_flags & SHF_NIOS2_GPREL) 4522 *flags |= SEC_SMALL_DATA; 4523 4524 return TRUE; 4525 } 4526 4527 /* Implement elf_backend_fake_sections: 4528 Set the correct type for an NIOS2 ELF section. We do this by the 4529 section name, which is a hack, but ought to work. */ 4530 static bfd_boolean 4531 nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED, 4532 Elf_Internal_Shdr *hdr, asection *sec) 4533 { 4534 register const char *name = bfd_get_section_name (abfd, sec); 4535 4536 if ((sec->flags & SEC_SMALL_DATA) 4537 || strcmp (name, ".sdata") == 0 4538 || strcmp (name, ".sbss") == 0 4539 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0) 4540 hdr->sh_flags |= SHF_NIOS2_GPREL; 4541 4542 return TRUE; 4543 } 4544 4545 /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up 4546 shortcuts to them in our hash table. */ 4547 static bfd_boolean 4548 create_got_section (bfd *dynobj, struct bfd_link_info *info) 4549 { 4550 struct elf32_nios2_link_hash_table *htab; 4551 struct elf_link_hash_entry *h; 4552 4553 htab = elf32_nios2_hash_table (info); 4554 4555 if (! _bfd_elf_create_got_section (dynobj, info)) 4556 return FALSE; 4557 4558 /* In order for the two loads in .PLTresolve to share the same %hiadj, 4559 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */ 4560 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4)) 4561 return FALSE; 4562 4563 /* The Nios II ABI specifies that GOT-relative relocations are relative 4564 to the linker-created symbol _gp_got, rather than using 4565 _GLOBAL_OFFSET_TABLE_ directly. In particular, the latter always 4566 points to the base of the GOT while _gp_got may include a bias. */ 4567 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt, 4568 "_gp_got"); 4569 elf32_nios2_hash_table (info)->h_gp_got = h; 4570 if (h == NULL) 4571 return FALSE; 4572 4573 return TRUE; 4574 } 4575 4576 /* Implement elf_backend_create_dynamic_sections: 4577 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and 4578 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our 4579 hash table. */ 4580 static bfd_boolean 4581 nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) 4582 { 4583 struct elf32_nios2_link_hash_table *htab; 4584 4585 htab = elf32_nios2_hash_table (info); 4586 if (!htab->root.sgot && !create_got_section (dynobj, info)) 4587 return FALSE; 4588 4589 _bfd_elf_create_dynamic_sections (dynobj, info); 4590 4591 /* In order for the two loads in a shared object .PLTresolve to share the 4592 same %hiadj, the start of the PLT (as well as the GOT) must be aligned 4593 to a 16-byte boundary. This is because the addresses for these loads 4594 include the -(.plt+4) PIC correction. */ 4595 if (!bfd_set_section_alignment (dynobj, htab->root.splt, 4)) 4596 return FALSE; 4597 4598 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); 4599 if (!htab->sdynbss) 4600 return FALSE; 4601 if (!bfd_link_pic (info)) 4602 { 4603 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); 4604 if (!htab->srelbss) 4605 return FALSE; 4606 } 4607 4608 return TRUE; 4609 } 4610 4611 /* Implement elf_backend_copy_indirect_symbol: 4612 Copy the extra info we tack onto an elf_link_hash_entry. */ 4613 static void 4614 nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info, 4615 struct elf_link_hash_entry *dir, 4616 struct elf_link_hash_entry *ind) 4617 { 4618 struct elf32_nios2_link_hash_entry *edir, *eind; 4619 4620 edir = (struct elf32_nios2_link_hash_entry *) dir; 4621 eind = (struct elf32_nios2_link_hash_entry *) ind; 4622 4623 if (eind->dyn_relocs != NULL) 4624 { 4625 if (edir->dyn_relocs != NULL) 4626 { 4627 struct elf32_nios2_dyn_relocs **pp; 4628 struct elf32_nios2_dyn_relocs *p; 4629 4630 /* Add reloc counts against the indirect sym to the direct sym 4631 list. Merge any entries against the same section. */ 4632 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 4633 { 4634 struct elf32_nios2_dyn_relocs *q; 4635 4636 for (q = edir->dyn_relocs; q != NULL; q = q->next) 4637 if (q->sec == p->sec) 4638 { 4639 q->pc_count += p->pc_count; 4640 q->count += p->count; 4641 *pp = p->next; 4642 break; 4643 } 4644 if (q == NULL) 4645 pp = &p->next; 4646 } 4647 *pp = edir->dyn_relocs; 4648 } 4649 4650 edir->dyn_relocs = eind->dyn_relocs; 4651 eind->dyn_relocs = NULL; 4652 } 4653 4654 if (ind->root.type == bfd_link_hash_indirect 4655 && dir->got.refcount <= 0) 4656 { 4657 edir->tls_type = eind->tls_type; 4658 eind->tls_type = GOT_UNKNOWN; 4659 } 4660 4661 edir->got_types_used |= eind->got_types_used; 4662 4663 _bfd_elf_link_hash_copy_indirect (info, dir, ind); 4664 } 4665 4666 /* Set the right machine number for a NIOS2 ELF file. */ 4667 4668 static bfd_boolean 4669 nios2_elf32_object_p (bfd *abfd) 4670 { 4671 unsigned long mach; 4672 4673 mach = elf_elfheader (abfd)->e_flags; 4674 4675 switch (mach) 4676 { 4677 default: 4678 case EF_NIOS2_ARCH_R1: 4679 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1); 4680 break; 4681 case EF_NIOS2_ARCH_R2: 4682 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2); 4683 break; 4684 } 4685 4686 return TRUE; 4687 } 4688 4689 /* Implement elf_backend_check_relocs: 4690 Look through the relocs for a section during the first phase. */ 4691 static bfd_boolean 4692 nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info, 4693 asection *sec, const Elf_Internal_Rela *relocs) 4694 { 4695 bfd *dynobj; 4696 Elf_Internal_Shdr *symtab_hdr; 4697 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; 4698 const Elf_Internal_Rela *rel; 4699 const Elf_Internal_Rela *rel_end; 4700 struct elf32_nios2_link_hash_table *htab; 4701 asection *sgot; 4702 asection *srelgot; 4703 asection *sreloc = NULL; 4704 bfd_signed_vma *local_got_refcounts; 4705 4706 if (bfd_link_relocatable (info)) 4707 return TRUE; 4708 4709 dynobj = elf_hash_table (info)->dynobj; 4710 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 4711 sym_hashes = elf_sym_hashes (abfd); 4712 sym_hashes_end = (sym_hashes 4713 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym)); 4714 if (!elf_bad_symtab (abfd)) 4715 sym_hashes_end -= symtab_hdr->sh_info; 4716 local_got_refcounts = elf_local_got_refcounts (abfd); 4717 4718 htab = elf32_nios2_hash_table (info); 4719 sgot = htab->root.sgot; 4720 srelgot = htab->root.srelgot; 4721 4722 rel_end = relocs + sec->reloc_count; 4723 for (rel = relocs; rel < rel_end; rel++) 4724 { 4725 unsigned int r_type; 4726 struct elf_link_hash_entry *h; 4727 unsigned long r_symndx; 4728 4729 r_symndx = ELF32_R_SYM (rel->r_info); 4730 if (r_symndx < symtab_hdr->sh_info) 4731 h = NULL; 4732 else 4733 { 4734 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 4735 while (h->root.type == bfd_link_hash_indirect 4736 || h->root.type == bfd_link_hash_warning) 4737 h = (struct elf_link_hash_entry *) h->root.u.i.link; 4738 4739 /* PR15323, ref flags aren't set for references in the same 4740 object. */ 4741 h->root.non_ir_ref = 1; 4742 } 4743 4744 r_type = ELF32_R_TYPE (rel->r_info); 4745 4746 switch (r_type) 4747 { 4748 case R_NIOS2_GOT16: 4749 case R_NIOS2_GOT_LO: 4750 case R_NIOS2_GOT_HA: 4751 case R_NIOS2_CALL16: 4752 case R_NIOS2_CALL_LO: 4753 case R_NIOS2_CALL_HA: 4754 case R_NIOS2_TLS_GD16: 4755 case R_NIOS2_TLS_IE16: 4756 /* This symbol requires a global offset table entry. */ 4757 { 4758 int tls_type, old_tls_type; 4759 4760 switch (r_type) 4761 { 4762 default: 4763 case R_NIOS2_GOT16: 4764 case R_NIOS2_GOT_LO: 4765 case R_NIOS2_GOT_HA: 4766 case R_NIOS2_CALL16: 4767 case R_NIOS2_CALL_LO: 4768 case R_NIOS2_CALL_HA: 4769 tls_type = GOT_NORMAL; 4770 break; 4771 case R_NIOS2_TLS_GD16: 4772 tls_type = GOT_TLS_GD; 4773 break; 4774 case R_NIOS2_TLS_IE16: 4775 tls_type = GOT_TLS_IE; 4776 break; 4777 } 4778 4779 if (dynobj == NULL) 4780 { 4781 /* Create the .got section. */ 4782 elf_hash_table (info)->dynobj = dynobj = abfd; 4783 nios2_elf32_create_dynamic_sections (dynobj, info); 4784 } 4785 4786 if (sgot == NULL) 4787 { 4788 sgot = htab->root.sgot; 4789 BFD_ASSERT (sgot != NULL); 4790 } 4791 4792 if (srelgot == NULL 4793 && (h != NULL || bfd_link_pic (info))) 4794 { 4795 srelgot = htab->root.srelgot; 4796 BFD_ASSERT (srelgot != NULL); 4797 } 4798 4799 if (h != NULL) 4800 { 4801 struct elf32_nios2_link_hash_entry *eh 4802 = (struct elf32_nios2_link_hash_entry *)h; 4803 h->got.refcount++; 4804 old_tls_type = elf32_nios2_hash_entry(h)->tls_type; 4805 if (r_type == R_NIOS2_CALL16 4806 || r_type == R_NIOS2_CALL_LO 4807 || r_type == R_NIOS2_CALL_HA) 4808 { 4809 /* Make sure a plt entry is created for this symbol if 4810 it turns out to be a function defined by a dynamic 4811 object. */ 4812 h->plt.refcount++; 4813 h->needs_plt = 1; 4814 h->type = STT_FUNC; 4815 eh->got_types_used |= CALL_USED; 4816 } 4817 else 4818 eh->got_types_used |= GOT_USED; 4819 } 4820 else 4821 { 4822 /* This is a global offset table entry for a local symbol. */ 4823 if (local_got_refcounts == NULL) 4824 { 4825 bfd_size_type size; 4826 4827 size = symtab_hdr->sh_info; 4828 size *= (sizeof (bfd_signed_vma) + sizeof (char)); 4829 local_got_refcounts 4830 = ((bfd_signed_vma *) bfd_zalloc (abfd, size)); 4831 if (local_got_refcounts == NULL) 4832 return FALSE; 4833 elf_local_got_refcounts (abfd) = local_got_refcounts; 4834 elf32_nios2_local_got_tls_type (abfd) 4835 = (char *) (local_got_refcounts + symtab_hdr->sh_info); 4836 } 4837 local_got_refcounts[r_symndx]++; 4838 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx]; 4839 } 4840 4841 /* We will already have issued an error message if there is a 4842 TLS / non-TLS mismatch, based on the symbol type. We don't 4843 support any linker relaxations. So just combine any TLS 4844 types needed. */ 4845 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL 4846 && tls_type != GOT_NORMAL) 4847 tls_type |= old_tls_type; 4848 4849 if (old_tls_type != tls_type) 4850 { 4851 if (h != NULL) 4852 elf32_nios2_hash_entry (h)->tls_type = tls_type; 4853 else 4854 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type; 4855 } 4856 } 4857 /* Fall through */ 4858 case R_NIOS2_TLS_LDM16: 4859 if (r_type == R_NIOS2_TLS_LDM16) 4860 htab->tls_ldm_got.refcount++; 4861 4862 if (htab->root.sgot == NULL) 4863 { 4864 if (htab->root.dynobj == NULL) 4865 htab->root.dynobj = abfd; 4866 if (!create_got_section (htab->root.dynobj, info)) 4867 return FALSE; 4868 } 4869 break; 4870 4871 /* This relocation describes the C++ object vtable hierarchy. 4872 Reconstruct it for later use during GC. */ 4873 case R_NIOS2_GNU_VTINHERIT: 4874 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 4875 return FALSE; 4876 break; 4877 4878 /* This relocation describes which C++ vtable entries are actually 4879 used. Record for later use during GC. */ 4880 case R_NIOS2_GNU_VTENTRY: 4881 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 4882 return FALSE; 4883 break; 4884 4885 case R_NIOS2_BFD_RELOC_32: 4886 case R_NIOS2_CALL26: 4887 case R_NIOS2_CALL26_NOAT: 4888 case R_NIOS2_HIADJ16: 4889 case R_NIOS2_LO16: 4890 4891 if (h != NULL) 4892 { 4893 /* If this reloc is in a read-only section, we might 4894 need a copy reloc. We can't check reliably at this 4895 stage whether the section is read-only, as input 4896 sections have not yet been mapped to output sections. 4897 Tentatively set the flag for now, and correct in 4898 adjust_dynamic_symbol. */ 4899 if (!bfd_link_pic (info)) 4900 h->non_got_ref = 1; 4901 4902 /* Make sure a plt entry is created for this symbol if it 4903 turns out to be a function defined by a dynamic object. */ 4904 h->plt.refcount++; 4905 4906 if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT) 4907 h->needs_plt = 1; 4908 } 4909 4910 /* If we are creating a shared library, we need to copy the 4911 reloc into the shared library. */ 4912 if (bfd_link_pic (info) 4913 && (sec->flags & SEC_ALLOC) != 0 4914 && (r_type == R_NIOS2_BFD_RELOC_32 4915 || (h != NULL && ! h->needs_plt 4916 && (! SYMBOLIC_BIND (info, h) || ! h->def_regular)))) 4917 { 4918 struct elf32_nios2_dyn_relocs *p; 4919 struct elf32_nios2_dyn_relocs **head; 4920 4921 /* When creating a shared object, we must copy these 4922 reloc types into the output file. We create a reloc 4923 section in dynobj and make room for this reloc. */ 4924 if (sreloc == NULL) 4925 { 4926 sreloc = _bfd_elf_make_dynamic_reloc_section 4927 (sec, dynobj, 2, abfd, TRUE); 4928 if (sreloc == NULL) 4929 return FALSE; 4930 } 4931 4932 /* If this is a global symbol, we count the number of 4933 relocations we need for this symbol. */ 4934 if (h != NULL) 4935 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs; 4936 else 4937 { 4938 /* Track dynamic relocs needed for local syms too. 4939 We really need local syms available to do this 4940 easily. Oh well. */ 4941 4942 asection *s; 4943 void *vpp; 4944 Elf_Internal_Sym *isym; 4945 4946 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 4947 abfd, r_symndx); 4948 if (isym == NULL) 4949 return FALSE; 4950 4951 s = bfd_section_from_elf_index (abfd, isym->st_shndx); 4952 if (s == NULL) 4953 s = sec; 4954 4955 vpp = &elf_section_data (s)->local_dynrel; 4956 head = (struct elf32_nios2_dyn_relocs **) vpp; 4957 } 4958 4959 p = *head; 4960 if (p == NULL || p->sec != sec) 4961 { 4962 bfd_size_type amt = sizeof *p; 4963 p = ((struct elf32_nios2_dyn_relocs *) 4964 bfd_alloc (htab->root.dynobj, amt)); 4965 if (p == NULL) 4966 return FALSE; 4967 p->next = *head; 4968 *head = p; 4969 p->sec = sec; 4970 p->count = 0; 4971 p->pc_count = 0; 4972 } 4973 4974 p->count += 1; 4975 4976 } 4977 break; 4978 } 4979 } 4980 4981 return TRUE; 4982 } 4983 4984 4985 /* Implement elf_backend_gc_mark_hook: 4986 Return the section that should be marked against GC for a given 4987 relocation. */ 4988 static asection * 4989 nios2_elf32_gc_mark_hook (asection *sec, 4990 struct bfd_link_info *info, 4991 Elf_Internal_Rela *rel, 4992 struct elf_link_hash_entry *h, 4993 Elf_Internal_Sym *sym) 4994 { 4995 if (h != NULL) 4996 switch (ELF32_R_TYPE (rel->r_info)) 4997 { 4998 case R_NIOS2_GNU_VTINHERIT: 4999 case R_NIOS2_GNU_VTENTRY: 5000 return NULL; 5001 } 5002 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); 5003 } 5004 5005 /* Implement elf_backend_gc_sweep_hook: 5006 Update the got entry reference counts for the section being removed. */ 5007 static bfd_boolean 5008 nios2_elf32_gc_sweep_hook (bfd *abfd, 5009 struct bfd_link_info *info, 5010 asection *sec, 5011 const Elf_Internal_Rela *relocs) 5012 { 5013 Elf_Internal_Shdr *symtab_hdr; 5014 struct elf_link_hash_entry **sym_hashes; 5015 bfd_signed_vma *local_got_refcounts; 5016 const Elf_Internal_Rela *rel, *relend; 5017 bfd *dynobj; 5018 5019 if (bfd_link_relocatable (info)) 5020 return TRUE; 5021 5022 elf_section_data (sec)->local_dynrel = NULL; 5023 5024 dynobj = elf_hash_table (info)->dynobj; 5025 if (dynobj == NULL) 5026 return TRUE; 5027 5028 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 5029 sym_hashes = elf_sym_hashes (abfd); 5030 local_got_refcounts = elf_local_got_refcounts (abfd); 5031 5032 relend = relocs + sec->reloc_count; 5033 for (rel = relocs; rel < relend; rel++) 5034 { 5035 unsigned long r_symndx; 5036 struct elf_link_hash_entry *h = NULL; 5037 int r_type; 5038 5039 r_symndx = ELF32_R_SYM (rel->r_info); 5040 if (r_symndx >= symtab_hdr->sh_info) 5041 { 5042 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 5043 while (h->root.type == bfd_link_hash_indirect 5044 || h->root.type == bfd_link_hash_warning) 5045 h = (struct elf_link_hash_entry *) h->root.u.i.link; 5046 } 5047 5048 r_type = ELF32_R_TYPE (rel->r_info); 5049 switch (r_type) 5050 { 5051 case R_NIOS2_GOT16: 5052 case R_NIOS2_GOT_LO: 5053 case R_NIOS2_GOT_HA: 5054 case R_NIOS2_CALL16: 5055 case R_NIOS2_CALL_LO: 5056 case R_NIOS2_CALL_HA: 5057 if (h != NULL) 5058 { 5059 if (h->got.refcount > 0) 5060 --h->got.refcount; 5061 } 5062 else if (local_got_refcounts != NULL) 5063 { 5064 if (local_got_refcounts[r_symndx] > 0) 5065 --local_got_refcounts[r_symndx]; 5066 } 5067 break; 5068 5069 case R_NIOS2_PCREL_LO: 5070 case R_NIOS2_PCREL_HA: 5071 case R_NIOS2_BFD_RELOC_32: 5072 case R_NIOS2_CALL26: 5073 case R_NIOS2_CALL26_NOAT: 5074 if (h != NULL) 5075 { 5076 struct elf32_nios2_link_hash_entry *eh; 5077 struct elf32_nios2_dyn_relocs **pp; 5078 struct elf32_nios2_dyn_relocs *p; 5079 5080 eh = (struct elf32_nios2_link_hash_entry *) h; 5081 5082 if (h->plt.refcount > 0) 5083 --h->plt.refcount; 5084 5085 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA 5086 || r_type == R_NIOS2_BFD_RELOC_32) 5087 { 5088 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; 5089 pp = &p->next) 5090 if (p->sec == sec) 5091 { 5092 p->count -= 1; 5093 if (p->count == 0) 5094 *pp = p->next; 5095 break; 5096 } 5097 } 5098 } 5099 break; 5100 5101 default: 5102 break; 5103 } 5104 } 5105 5106 return TRUE; 5107 } 5108 5109 /* Implement elf_backend_finish_dynamic_symbols: 5110 Finish up dynamic symbol handling. We set the contents of various 5111 dynamic sections here. */ 5112 static bfd_boolean 5113 nios2_elf32_finish_dynamic_symbol (bfd *output_bfd, 5114 struct bfd_link_info *info, 5115 struct elf_link_hash_entry *h, 5116 Elf_Internal_Sym *sym) 5117 { 5118 struct elf32_nios2_link_hash_table *htab; 5119 struct elf32_nios2_link_hash_entry *eh 5120 = (struct elf32_nios2_link_hash_entry *)h; 5121 int use_plt; 5122 5123 htab = elf32_nios2_hash_table (info); 5124 5125 if (h->plt.offset != (bfd_vma) -1) 5126 { 5127 asection *splt; 5128 asection *sgotplt; 5129 asection *srela; 5130 bfd_vma plt_index; 5131 bfd_vma got_offset; 5132 Elf_Internal_Rela rela; 5133 bfd_byte *loc; 5134 bfd_vma got_address; 5135 5136 /* This symbol has an entry in the procedure linkage table. Set 5137 it up. */ 5138 BFD_ASSERT (h->dynindx != -1); 5139 splt = htab->root.splt; 5140 sgotplt = htab->root.sgotplt; 5141 srela = htab->root.srelplt; 5142 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL); 5143 5144 /* Emit the PLT entry. */ 5145 if (bfd_link_pic (info)) 5146 { 5147 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset, 5148 3); 5149 plt_index = (h->plt.offset - 24) / 12; 5150 got_offset = (plt_index + 3) * 4; 5151 nios2_elf32_install_imm16 (splt, h->plt.offset, 5152 hiadj(plt_index * 4)); 5153 nios2_elf32_install_imm16 (splt, h->plt.offset + 4, 5154 (plt_index * 4) & 0xffff); 5155 nios2_elf32_install_imm16 (splt, h->plt.offset + 8, 5156 0xfff4 - h->plt.offset); 5157 got_address = (sgotplt->output_section->vma + sgotplt->output_offset 5158 + got_offset); 5159 5160 /* Fill in the entry in the global offset table. There are no 5161 res_n slots for a shared object PLT, instead the .got.plt entries 5162 point to the PLT entries. */ 5163 bfd_put_32 (output_bfd, 5164 splt->output_section->vma + splt->output_offset 5165 + h->plt.offset, sgotplt->contents + got_offset); 5166 } 5167 else 5168 { 5169 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12; 5170 got_offset = (plt_index + 3) * 4; 5171 5172 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3); 5173 got_address = (sgotplt->output_section->vma + sgotplt->output_offset 5174 + got_offset); 5175 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address)); 5176 nios2_elf32_install_imm16 (splt, h->plt.offset + 4, 5177 got_address & 0xffff); 5178 5179 /* Fill in the entry in the global offset table. */ 5180 bfd_put_32 (output_bfd, 5181 splt->output_section->vma + splt->output_offset 5182 + plt_index * 4, sgotplt->contents + got_offset); 5183 } 5184 5185 /* Fill in the entry in the .rela.plt section. */ 5186 rela.r_offset = got_address; 5187 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT); 5188 rela.r_addend = 0; 5189 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela); 5190 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 5191 5192 if (!h->def_regular) 5193 { 5194 /* Mark the symbol as undefined, rather than as defined in 5195 the .plt section. Leave the value alone. */ 5196 sym->st_shndx = SHN_UNDEF; 5197 /* If the symbol is weak, we do need to clear the value. 5198 Otherwise, the PLT entry would provide a definition for 5199 the symbol even if the symbol wasn't defined anywhere, 5200 and so the symbol would never be NULL. */ 5201 if (!h->ref_regular_nonweak) 5202 sym->st_value = 0; 5203 } 5204 } 5205 5206 use_plt = (eh->got_types_used == CALL_USED 5207 && h->plt.offset != (bfd_vma) -1); 5208 5209 if (!use_plt && h->got.offset != (bfd_vma) -1 5210 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0 5211 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0) 5212 { 5213 asection *sgot; 5214 asection *srela; 5215 Elf_Internal_Rela rela; 5216 bfd_byte *loc; 5217 bfd_vma offset; 5218 5219 /* This symbol has an entry in the global offset table. Set it 5220 up. */ 5221 sgot = htab->root.sgot; 5222 srela = htab->root.srelgot; 5223 BFD_ASSERT (sgot != NULL && srela != NULL); 5224 5225 offset = (h->got.offset & ~(bfd_vma) 1); 5226 rela.r_offset = (sgot->output_section->vma 5227 + sgot->output_offset + offset); 5228 5229 /* If this is a -Bsymbolic link, and the symbol is defined 5230 locally, we just want to emit a RELATIVE reloc. Likewise if 5231 the symbol was forced to be local because of a version file. 5232 The entry in the global offset table will already have been 5233 initialized in the relocate_section function. */ 5234 5235 if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) 5236 { 5237 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 5238 rela.r_addend = bfd_get_signed_32 (output_bfd, 5239 (sgot->contents + offset)); 5240 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset); 5241 } 5242 else 5243 { 5244 bfd_put_32 (output_bfd, (bfd_vma) 0, 5245 sgot->contents + offset); 5246 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT); 5247 rela.r_addend = 0; 5248 } 5249 5250 loc = srela->contents; 5251 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela); 5252 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 5253 } 5254 5255 if (use_plt && h->got.offset != (bfd_vma) -1) 5256 { 5257 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1); 5258 asection *sgot = htab->root.sgot; 5259 asection *splt = htab->root.splt; 5260 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset 5261 + h->plt.offset), 5262 sgot->contents + offset); 5263 } 5264 5265 if (h->needs_copy) 5266 { 5267 asection *s; 5268 Elf_Internal_Rela rela; 5269 bfd_byte *loc; 5270 5271 /* This symbol needs a copy reloc. Set it up. */ 5272 BFD_ASSERT (h->dynindx != -1 5273 && (h->root.type == bfd_link_hash_defined 5274 || h->root.type == bfd_link_hash_defweak)); 5275 5276 s = htab->srelbss; 5277 BFD_ASSERT (s != NULL); 5278 5279 rela.r_offset = (h->root.u.def.value 5280 + h->root.u.def.section->output_section->vma 5281 + h->root.u.def.section->output_offset); 5282 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY); 5283 rela.r_addend = 0; 5284 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); 5285 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 5286 } 5287 5288 /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute. */ 5289 if (strcmp (h->root.root.string, "_DYNAMIC") == 0 5290 || h == elf_hash_table (info)->hgot 5291 || h == elf32_nios2_hash_table (info)->h_gp_got) 5292 sym->st_shndx = SHN_ABS; 5293 5294 return TRUE; 5295 } 5296 5297 /* Implement elf_backend_finish_dynamic_sections. */ 5298 static bfd_boolean 5299 nios2_elf32_finish_dynamic_sections (bfd *output_bfd, 5300 struct bfd_link_info *info) 5301 { 5302 bfd *dynobj; 5303 asection *sgotplt; 5304 asection *sdyn; 5305 struct elf32_nios2_link_hash_table *htab; 5306 5307 htab = elf32_nios2_hash_table (info); 5308 dynobj = elf_hash_table (info)->dynobj; 5309 sgotplt = htab->root.sgotplt; 5310 BFD_ASSERT (sgotplt != NULL); 5311 sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 5312 5313 if (elf_hash_table (info)->dynamic_sections_created) 5314 { 5315 asection *splt; 5316 Elf32_External_Dyn *dyncon, *dynconend; 5317 5318 splt = htab->root.splt; 5319 BFD_ASSERT (splt != NULL && sdyn != NULL); 5320 5321 dyncon = (Elf32_External_Dyn *) sdyn->contents; 5322 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); 5323 for (; dyncon < dynconend; dyncon++) 5324 { 5325 Elf_Internal_Dyn dyn; 5326 asection *s; 5327 5328 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); 5329 5330 switch (dyn.d_tag) 5331 { 5332 default: 5333 break; 5334 5335 case DT_PLTGOT: 5336 s = htab->root.sgot; 5337 BFD_ASSERT (s != NULL); 5338 dyn.d_un.d_ptr = s->output_section->vma; 5339 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5340 break; 5341 5342 case DT_JMPREL: 5343 s = htab->root.srelplt; 5344 BFD_ASSERT (s != NULL); 5345 dyn.d_un.d_ptr = s->output_section->vma; 5346 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5347 break; 5348 5349 case DT_PLTRELSZ: 5350 s = htab->root.srelplt; 5351 BFD_ASSERT (s != NULL); 5352 dyn.d_un.d_val = s->size; 5353 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5354 break; 5355 5356 case DT_RELASZ: 5357 /* The procedure linkage table relocs (DT_JMPREL) should 5358 not be included in the overall relocs (DT_RELA). 5359 Therefore, we override the DT_RELASZ entry here to 5360 make it not include the JMPREL relocs. Since the 5361 linker script arranges for .rela.plt to follow all 5362 other relocation sections, we don't have to worry 5363 about changing the DT_RELA entry. */ 5364 s = htab->root.srelplt; 5365 if (s != NULL) 5366 dyn.d_un.d_val -= s->size; 5367 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5368 break; 5369 5370 case DT_NIOS2_GP: 5371 s = htab->root.sgot; 5372 BFD_ASSERT (s != NULL); 5373 dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0; 5374 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5375 break; 5376 } 5377 } 5378 5379 /* Fill in the first entry in the procedure linkage table. */ 5380 if (splt->size > 0) 5381 { 5382 bfd_vma got_address = (sgotplt->output_section->vma 5383 + sgotplt->output_offset); 5384 if (bfd_link_pic (info)) 5385 { 5386 bfd_vma corrected = got_address - (splt->output_section->vma 5387 + splt->output_offset + 4); 5388 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6); 5389 nios2_elf32_install_imm16 (splt, 4, hiadj (corrected)); 5390 nios2_elf32_install_imm16 (splt, 12, (corrected & 0xffff) + 4); 5391 nios2_elf32_install_imm16 (splt, 16, (corrected & 0xffff) + 8); 5392 } 5393 else 5394 { 5395 /* Divide by 4 here, not 3 because we already corrected for the 5396 res_N branches. */ 5397 bfd_vma res_size = (splt->size - 28) / 4; 5398 bfd_vma res_start = (splt->output_section->vma 5399 + splt->output_offset); 5400 bfd_vma res_offset; 5401 5402 for (res_offset = 0; res_offset < res_size; res_offset += 4) 5403 bfd_put_32 (output_bfd, 5404 6 | ((res_size - (res_offset + 4)) << 6), 5405 splt->contents + res_offset); 5406 5407 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7); 5408 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start)); 5409 nios2_elf32_install_imm16 (splt, res_size + 4, 5410 res_start & 0xffff); 5411 nios2_elf32_install_imm16 (splt, res_size + 12, 5412 hiadj (got_address)); 5413 nios2_elf32_install_imm16 (splt, res_size + 16, 5414 (got_address & 0xffff) + 4); 5415 nios2_elf32_install_imm16 (splt, res_size + 20, 5416 (got_address & 0xffff) + 8); 5417 } 5418 } 5419 } 5420 /* Fill in the first three entries in the global offset table. */ 5421 if (sgotplt->size > 0) 5422 { 5423 if (sdyn == NULL) 5424 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents); 5425 else 5426 bfd_put_32 (output_bfd, 5427 sdyn->output_section->vma + sdyn->output_offset, 5428 sgotplt->contents); 5429 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4); 5430 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8); 5431 } 5432 5433 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4; 5434 5435 return TRUE; 5436 } 5437 5438 /* Implement elf_backend_adjust_dynamic_symbol: 5439 Adjust a symbol defined by a dynamic object and referenced by a 5440 regular object. The current definition is in some section of the 5441 dynamic object, but we're not including those sections. We have to 5442 change the definition to something the rest of the link can 5443 understand. */ 5444 static bfd_boolean 5445 nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info, 5446 struct elf_link_hash_entry *h) 5447 { 5448 struct elf32_nios2_link_hash_table *htab; 5449 bfd *dynobj; 5450 asection *s; 5451 unsigned align2; 5452 5453 htab = elf32_nios2_hash_table (info); 5454 dynobj = elf_hash_table (info)->dynobj; 5455 5456 /* Make sure we know what is going on here. */ 5457 BFD_ASSERT (dynobj != NULL 5458 && (h->needs_plt 5459 || h->u.weakdef != NULL 5460 || (h->def_dynamic 5461 && h->ref_regular 5462 && !h->def_regular))); 5463 5464 /* If this is a function, put it in the procedure linkage table. We 5465 will fill in the contents of the procedure linkage table later, 5466 when we know the address of the .got section. */ 5467 if (h->type == STT_FUNC || h->needs_plt) 5468 { 5469 if (h->plt.refcount <= 0 5470 || SYMBOL_CALLS_LOCAL (info, h) 5471 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 5472 && h->root.type == bfd_link_hash_undefweak)) 5473 { 5474 /* This case can occur if we saw a PLT reloc in an input 5475 file, but the symbol was never referred to by a dynamic 5476 object, or if all references were garbage collected. In 5477 such a case, we don't actually need to build a procedure 5478 linkage table, and we can just do a PCREL reloc instead. */ 5479 h->plt.offset = (bfd_vma) -1; 5480 h->needs_plt = 0; 5481 } 5482 5483 return TRUE; 5484 } 5485 5486 /* Reinitialize the plt offset now that it is not used as a reference 5487 count any more. */ 5488 h->plt.offset = (bfd_vma) -1; 5489 5490 /* If this is a weak symbol, and there is a real definition, the 5491 processor independent code will have arranged for us to see the 5492 real definition first, and we can just use the same value. */ 5493 if (h->u.weakdef != NULL) 5494 { 5495 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined 5496 || h->u.weakdef->root.type == bfd_link_hash_defweak); 5497 h->root.u.def.section = h->u.weakdef->root.u.def.section; 5498 h->root.u.def.value = h->u.weakdef->root.u.def.value; 5499 return TRUE; 5500 } 5501 5502 /* If there are no non-GOT references, we do not need a copy 5503 relocation. */ 5504 if (!h->non_got_ref) 5505 return TRUE; 5506 5507 /* This is a reference to a symbol defined by a dynamic object which 5508 is not a function. 5509 If we are creating a shared library, we must presume that the 5510 only references to the symbol are via the global offset table. 5511 For such cases we need not do anything here; the relocations will 5512 be handled correctly by relocate_section. */ 5513 if (bfd_link_pic (info)) 5514 return TRUE; 5515 5516 if (h->size == 0) 5517 { 5518 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"), 5519 h->root.root.string); 5520 return TRUE; 5521 } 5522 5523 /* We must allocate the symbol in our .dynbss section, which will 5524 become part of the .bss section of the executable. There will be 5525 an entry for this symbol in the .dynsym section. The dynamic 5526 object will contain position independent code, so all references 5527 from the dynamic object to this symbol will go through the global 5528 offset table. The dynamic linker will use the .dynsym entry to 5529 determine the address it must put in the global offset table, so 5530 both the dynamic object and the regular object will refer to the 5531 same memory location for the variable. */ 5532 s = htab->sdynbss; 5533 BFD_ASSERT (s != NULL); 5534 5535 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to 5536 copy the initial value out of the dynamic object and into the 5537 runtime process image. We need to remember the offset into the 5538 .rela.bss section we are going to use. */ 5539 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) 5540 { 5541 asection *srel; 5542 5543 srel = htab->srelbss; 5544 BFD_ASSERT (srel != NULL); 5545 srel->size += sizeof (Elf32_External_Rela); 5546 h->needs_copy = 1; 5547 } 5548 5549 align2 = bfd_log2 (h->size); 5550 if (align2 > h->root.u.def.section->alignment_power) 5551 align2 = h->root.u.def.section->alignment_power; 5552 5553 /* Align dynbss. */ 5554 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2); 5555 if (align2 > bfd_get_section_alignment (dynobj, s) 5556 && !bfd_set_section_alignment (dynobj, s, align2)) 5557 return FALSE; 5558 5559 /* Define the symbol as being at this point in the section. */ 5560 h->root.u.def.section = s; 5561 h->root.u.def.value = s->size; 5562 5563 /* Increment the section size to make room for the symbol. */ 5564 s->size += h->size; 5565 5566 return TRUE; 5567 } 5568 5569 /* Worker function for nios2_elf32_size_dynamic_sections. */ 5570 static bfd_boolean 5571 adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf) 5572 { 5573 struct bfd_link_info *info; 5574 struct elf32_nios2_link_hash_table *htab; 5575 5576 if (h->root.type == bfd_link_hash_indirect) 5577 return TRUE; 5578 5579 if (h->root.type == bfd_link_hash_warning) 5580 /* When warning symbols are created, they **replace** the "real" 5581 entry in the hash table, thus we never get to see the real 5582 symbol in a hash traversal. So look at it now. */ 5583 h = (struct elf_link_hash_entry *) h->root.u.i.link; 5584 5585 info = (struct bfd_link_info *) inf; 5586 htab = elf32_nios2_hash_table (info); 5587 5588 if (h->plt.offset != (bfd_vma)-1) 5589 h->plt.offset += htab->res_n_size; 5590 if (htab->root.splt == h->root.u.def.section) 5591 h->root.u.def.value += htab->res_n_size; 5592 5593 return TRUE; 5594 } 5595 5596 /* Another worker function for nios2_elf32_size_dynamic_sections. 5597 Allocate space in .plt, .got and associated reloc sections for 5598 dynamic relocs. */ 5599 static bfd_boolean 5600 allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf) 5601 { 5602 struct bfd_link_info *info; 5603 struct elf32_nios2_link_hash_table *htab; 5604 struct elf32_nios2_link_hash_entry *eh; 5605 struct elf32_nios2_dyn_relocs *p; 5606 int use_plt; 5607 5608 if (h->root.type == bfd_link_hash_indirect) 5609 return TRUE; 5610 5611 if (h->root.type == bfd_link_hash_warning) 5612 /* When warning symbols are created, they **replace** the "real" 5613 entry in the hash table, thus we never get to see the real 5614 symbol in a hash traversal. So look at it now. */ 5615 h = (struct elf_link_hash_entry *) h->root.u.i.link; 5616 5617 info = (struct bfd_link_info *) inf; 5618 htab = elf32_nios2_hash_table (info); 5619 5620 if (htab->root.dynamic_sections_created 5621 && h->plt.refcount > 0) 5622 { 5623 /* Make sure this symbol is output as a dynamic symbol. 5624 Undefined weak syms won't yet be marked as dynamic. */ 5625 if (h->dynindx == -1 5626 && !h->forced_local 5627 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5628 return FALSE; 5629 5630 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) 5631 { 5632 asection *s = htab->root.splt; 5633 5634 /* Allocate room for the header. */ 5635 if (s->size == 0) 5636 { 5637 if (bfd_link_pic (info)) 5638 s->size = 24; 5639 else 5640 s->size = 28; 5641 } 5642 5643 h->plt.offset = s->size; 5644 5645 /* If this symbol is not defined in a regular file, and we are 5646 not generating a shared library, then set the symbol to this 5647 location in the .plt. This is required to make function 5648 pointers compare as equal between the normal executable and 5649 the shared library. */ 5650 if (! bfd_link_pic (info) 5651 && !h->def_regular) 5652 { 5653 h->root.u.def.section = s; 5654 h->root.u.def.value = h->plt.offset; 5655 } 5656 5657 /* Make room for this entry. */ 5658 s->size += 12; 5659 5660 /* We also need to make an entry in the .rela.plt section. */ 5661 htab->root.srelplt->size += sizeof (Elf32_External_Rela); 5662 5663 /* And the .got.plt section. */ 5664 htab->root.sgotplt->size += 4; 5665 } 5666 else 5667 { 5668 h->plt.offset = (bfd_vma) -1; 5669 h->needs_plt = 0; 5670 } 5671 } 5672 else 5673 { 5674 h->plt.offset = (bfd_vma) -1; 5675 h->needs_plt = 0; 5676 } 5677 5678 eh = (struct elf32_nios2_link_hash_entry *) h; 5679 use_plt = (eh->got_types_used == CALL_USED 5680 && h->plt.offset != (bfd_vma) -1); 5681 5682 if (h->got.refcount > 0) 5683 { 5684 asection *s; 5685 bfd_boolean dyn; 5686 int tls_type = eh->tls_type; 5687 int indx; 5688 5689 /* Make sure this symbol is output as a dynamic symbol. 5690 Undefined weak syms won't yet be marked as dynamic. */ 5691 if (h->dynindx == -1 5692 && !h->forced_local 5693 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5694 return FALSE; 5695 5696 s = htab->root.sgot; 5697 h->got.offset = s->size; 5698 5699 if (tls_type == GOT_UNKNOWN) 5700 abort (); 5701 5702 if (tls_type == GOT_NORMAL) 5703 /* Non-TLS symbols need one GOT slot. */ 5704 s->size += 4; 5705 else 5706 { 5707 if (tls_type & GOT_TLS_GD) 5708 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */ 5709 s->size += 8; 5710 if (tls_type & GOT_TLS_IE) 5711 /* R_NIOS2_TLS_IE16 needs one GOT slot. */ 5712 s->size += 4; 5713 } 5714 5715 dyn = htab->root.dynamic_sections_created; 5716 5717 indx = 0; 5718 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h) 5719 && (!bfd_link_pic (info) 5720 || !SYMBOL_REFERENCES_LOCAL (info, h))) 5721 indx = h->dynindx; 5722 5723 if (tls_type != GOT_NORMAL 5724 && (bfd_link_pic (info) || indx != 0) 5725 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 5726 || h->root.type != bfd_link_hash_undefweak)) 5727 { 5728 if (tls_type & GOT_TLS_IE) 5729 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5730 5731 if (tls_type & GOT_TLS_GD) 5732 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5733 5734 if ((tls_type & GOT_TLS_GD) && indx != 0) 5735 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5736 } 5737 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 5738 || h->root.type != bfd_link_hash_undefweak) 5739 && !use_plt 5740 && (bfd_link_pic (info) 5741 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) 5742 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5743 } 5744 else 5745 h->got.offset = (bfd_vma) -1; 5746 5747 if (eh->dyn_relocs == NULL) 5748 return TRUE; 5749 5750 /* In the shared -Bsymbolic case, discard space allocated for 5751 dynamic pc-relative relocs against symbols which turn out to be 5752 defined in regular objects. For the normal shared case, discard 5753 space for pc-relative relocs that have become local due to symbol 5754 visibility changes. */ 5755 5756 if (bfd_link_pic (info)) 5757 { 5758 if (h->def_regular 5759 && (h->forced_local || SYMBOLIC_BIND (info, h))) 5760 { 5761 struct elf32_nios2_dyn_relocs **pp; 5762 5763 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 5764 { 5765 p->count -= p->pc_count; 5766 p->pc_count = 0; 5767 if (p->count == 0) 5768 *pp = p->next; 5769 else 5770 pp = &p->next; 5771 } 5772 } 5773 5774 /* Also discard relocs on undefined weak syms with non-default 5775 visibility. */ 5776 if (eh->dyn_relocs != NULL 5777 && h->root.type == bfd_link_hash_undefweak) 5778 { 5779 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 5780 eh->dyn_relocs = NULL; 5781 5782 /* Make sure undefined weak symbols are output as a dynamic 5783 symbol in PIEs. */ 5784 else if (h->dynindx == -1 5785 && !h->forced_local 5786 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5787 return FALSE; 5788 } 5789 } 5790 else 5791 { 5792 /* For the non-shared case, discard space for relocs against 5793 symbols which turn out to need copy relocs or are not 5794 dynamic. */ 5795 5796 if (!h->non_got_ref 5797 && ((h->def_dynamic && !h->def_regular) 5798 || (htab->root.dynamic_sections_created 5799 && (h->root.type == bfd_link_hash_undefweak 5800 || h->root.type == bfd_link_hash_undefined)))) 5801 { 5802 /* Make sure this symbol is output as a dynamic symbol. 5803 Undefined weak syms won't yet be marked as dynamic. */ 5804 if (h->dynindx == -1 5805 && !h->forced_local 5806 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5807 return FALSE; 5808 5809 /* If that succeeded, we know we'll be keeping all the 5810 relocs. */ 5811 if (h->dynindx != -1) 5812 goto keep; 5813 } 5814 5815 eh->dyn_relocs = NULL; 5816 5817 keep: ; 5818 } 5819 5820 /* Finally, allocate space. */ 5821 for (p = eh->dyn_relocs; p != NULL; p = p->next) 5822 { 5823 asection *sreloc = elf_section_data (p->sec)->sreloc; 5824 sreloc->size += p->count * sizeof (Elf32_External_Rela); 5825 } 5826 5827 return TRUE; 5828 } 5829 5830 /* Implement elf_backend_size_dynamic_sections: 5831 Set the sizes of the dynamic sections. */ 5832 static bfd_boolean 5833 nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 5834 struct bfd_link_info *info) 5835 { 5836 bfd *dynobj; 5837 asection *s; 5838 bfd_boolean plt; 5839 bfd_boolean got; 5840 bfd_boolean relocs; 5841 bfd *ibfd; 5842 struct elf32_nios2_link_hash_table *htab; 5843 5844 htab = elf32_nios2_hash_table (info); 5845 dynobj = elf_hash_table (info)->dynobj; 5846 BFD_ASSERT (dynobj != NULL); 5847 5848 htab->res_n_size = 0; 5849 if (elf_hash_table (info)->dynamic_sections_created) 5850 { 5851 /* Set the contents of the .interp section to the interpreter. */ 5852 if (bfd_link_executable (info) && !info->nointerp) 5853 { 5854 s = bfd_get_linker_section (dynobj, ".interp"); 5855 BFD_ASSERT (s != NULL); 5856 s->size = sizeof ELF_DYNAMIC_INTERPRETER; 5857 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 5858 } 5859 } 5860 else 5861 { 5862 /* We may have created entries in the .rela.got section. 5863 However, if we are not creating the dynamic sections, we will 5864 not actually use these entries. Reset the size of .rela.got, 5865 which will cause it to get stripped from the output file 5866 below. */ 5867 s = htab->root.srelgot; 5868 if (s != NULL) 5869 s->size = 0; 5870 } 5871 5872 /* Set up .got offsets for local syms, and space for local dynamic 5873 relocs. */ 5874 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 5875 { 5876 bfd_signed_vma *local_got; 5877 bfd_signed_vma *end_local_got; 5878 char *local_tls_type; 5879 bfd_size_type locsymcount; 5880 Elf_Internal_Shdr *symtab_hdr; 5881 asection *srel; 5882 5883 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 5884 continue; 5885 5886 for (s = ibfd->sections; s != NULL; s = s->next) 5887 { 5888 struct elf32_nios2_dyn_relocs *p; 5889 5890 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) 5891 { 5892 if (!bfd_is_abs_section (p->sec) 5893 && bfd_is_abs_section (p->sec->output_section)) 5894 { 5895 /* Input section has been discarded, either because 5896 it is a copy of a linkonce section or due to 5897 linker script /DISCARD/, so we'll be discarding 5898 the relocs too. */ 5899 } 5900 else if (p->count != 0) 5901 { 5902 srel = elf_section_data (p->sec)->sreloc; 5903 srel->size += p->count * sizeof (Elf32_External_Rela); 5904 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 5905 info->flags |= DF_TEXTREL; 5906 } 5907 } 5908 } 5909 5910 local_got = elf_local_got_refcounts (ibfd); 5911 if (!local_got) 5912 continue; 5913 5914 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 5915 locsymcount = symtab_hdr->sh_info; 5916 end_local_got = local_got + locsymcount; 5917 local_tls_type = elf32_nios2_local_got_tls_type (ibfd); 5918 s = htab->root.sgot; 5919 srel = htab->root.srelgot; 5920 for (; local_got < end_local_got; ++local_got, ++local_tls_type) 5921 { 5922 if (*local_got > 0) 5923 { 5924 *local_got = s->size; 5925 if (*local_tls_type & GOT_TLS_GD) 5926 /* TLS_GD relocs need an 8-byte structure in the GOT. */ 5927 s->size += 8; 5928 if (*local_tls_type & GOT_TLS_IE) 5929 s->size += 4; 5930 if (*local_tls_type == GOT_NORMAL) 5931 s->size += 4; 5932 5933 if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD) 5934 srel->size += sizeof (Elf32_External_Rela); 5935 } 5936 else 5937 *local_got = (bfd_vma) -1; 5938 } 5939 } 5940 5941 if (htab->tls_ldm_got.refcount > 0) 5942 { 5943 /* Allocate two GOT entries and one dynamic relocation (if necessary) 5944 for R_NIOS2_TLS_LDM16 relocations. */ 5945 htab->tls_ldm_got.offset = htab->root.sgot->size; 5946 htab->root.sgot->size += 8; 5947 if (bfd_link_pic (info)) 5948 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5949 } 5950 else 5951 htab->tls_ldm_got.offset = -1; 5952 5953 /* Allocate global sym .plt and .got entries, and space for global 5954 sym dynamic relocs. */ 5955 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info); 5956 5957 if (elf_hash_table (info)->dynamic_sections_created) 5958 { 5959 /* If the .got section is more than 0x8000 bytes, we add 5960 0x8000 to the value of _gp_got, so that 16-bit relocations 5961 have a greater chance of working. */ 5962 if (htab->root.sgot->size >= 0x8000 5963 && elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value == 0) 5964 elf32_nios2_hash_table (info)->h_gp_got->root.u.def.value = 0x8000; 5965 } 5966 5967 /* The check_relocs and adjust_dynamic_symbol entry points have 5968 determined the sizes of the various dynamic sections. Allocate 5969 memory for them. */ 5970 plt = FALSE; 5971 got = FALSE; 5972 relocs = FALSE; 5973 for (s = dynobj->sections; s != NULL; s = s->next) 5974 { 5975 const char *name; 5976 5977 if ((s->flags & SEC_LINKER_CREATED) == 0) 5978 continue; 5979 5980 /* It's OK to base decisions on the section name, because none 5981 of the dynobj section names depend upon the input files. */ 5982 name = bfd_get_section_name (dynobj, s); 5983 5984 if (strcmp (name, ".plt") == 0) 5985 { 5986 /* Remember whether there is a PLT. */ 5987 plt = s->size != 0; 5988 5989 /* Correct for the number of res_N branches. */ 5990 if (plt && !bfd_link_pic (info)) 5991 { 5992 htab->res_n_size = (s->size-28) / 3; 5993 s->size += htab->res_n_size; 5994 } 5995 } 5996 else if (CONST_STRNEQ (name, ".rela")) 5997 { 5998 if (s->size != 0) 5999 { 6000 relocs = TRUE; 6001 6002 /* We use the reloc_count field as a counter if we need 6003 to copy relocs into the output file. */ 6004 s->reloc_count = 0; 6005 } 6006 } 6007 else if (CONST_STRNEQ (name, ".got")) 6008 got = s->size != 0; 6009 else if (strcmp (name, ".dynbss") != 0) 6010 /* It's not one of our sections, so don't allocate space. */ 6011 continue; 6012 6013 if (s->size == 0) 6014 { 6015 /* If we don't need this section, strip it from the 6016 output file. This is mostly to handle .rela.bss and 6017 .rela.plt. We must create both sections in 6018 create_dynamic_sections, because they must be created 6019 before the linker maps input sections to output 6020 sections. The linker does that before 6021 adjust_dynamic_symbol is called, and it is that 6022 function which decides whether anything needs to go 6023 into these sections. */ 6024 s->flags |= SEC_EXCLUDE; 6025 continue; 6026 } 6027 6028 if ((s->flags & SEC_HAS_CONTENTS) == 0) 6029 continue; 6030 6031 /* Allocate memory for the section contents. */ 6032 /* FIXME: This should be a call to bfd_alloc not bfd_zalloc. 6033 Unused entries should be reclaimed before the section's contents 6034 are written out, but at the moment this does not happen. Thus in 6035 order to prevent writing out garbage, we initialize the section's 6036 contents to zero. */ 6037 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); 6038 if (s->contents == NULL) 6039 return FALSE; 6040 } 6041 6042 /* Adjust dynamic symbols that point to the plt to account for the 6043 now-known number of resN slots. */ 6044 if (htab->res_n_size) 6045 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info); 6046 6047 if (elf_hash_table (info)->dynamic_sections_created) 6048 { 6049 /* Add some entries to the .dynamic section. We fill in the 6050 values later, in elf_nios2_finish_dynamic_sections, but we 6051 must add the entries now so that we get the correct size for 6052 the .dynamic section. The DT_DEBUG entry is filled in by the 6053 dynamic linker and used by the debugger. */ 6054 #define add_dynamic_entry(TAG, VAL) \ 6055 _bfd_elf_add_dynamic_entry (info, TAG, VAL) 6056 6057 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_DEBUG, 0)) 6058 return FALSE; 6059 6060 if (got && !add_dynamic_entry (DT_PLTGOT, 0)) 6061 return FALSE; 6062 6063 if (plt 6064 && (!add_dynamic_entry (DT_PLTRELSZ, 0) 6065 || !add_dynamic_entry (DT_PLTREL, DT_RELA) 6066 || !add_dynamic_entry (DT_JMPREL, 0))) 6067 return FALSE; 6068 6069 if (relocs 6070 && (!add_dynamic_entry (DT_RELA, 0) 6071 || !add_dynamic_entry (DT_RELASZ, 0) 6072 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))) 6073 return FALSE; 6074 6075 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0)) 6076 return FALSE; 6077 6078 if ((info->flags & DF_TEXTREL) != 0 6079 && !add_dynamic_entry (DT_TEXTREL, 0)) 6080 return FALSE; 6081 } 6082 #undef add_dynamic_entry 6083 6084 return TRUE; 6085 } 6086 6087 /* Free the derived linker hash table. */ 6088 static void 6089 nios2_elf32_link_hash_table_free (bfd *obfd) 6090 { 6091 struct elf32_nios2_link_hash_table *htab 6092 = (struct elf32_nios2_link_hash_table *) obfd->link.hash; 6093 6094 bfd_hash_table_free (&htab->bstab); 6095 _bfd_elf_link_hash_table_free (obfd); 6096 } 6097 6098 /* Implement bfd_elf32_bfd_link_hash_table_create. */ 6099 static struct bfd_link_hash_table * 6100 nios2_elf32_link_hash_table_create (bfd *abfd) 6101 { 6102 struct elf32_nios2_link_hash_table *ret; 6103 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table); 6104 6105 ret = bfd_zmalloc (amt); 6106 if (ret == NULL) 6107 return NULL; 6108 6109 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 6110 link_hash_newfunc, 6111 sizeof (struct 6112 elf32_nios2_link_hash_entry), 6113 NIOS2_ELF_DATA)) 6114 { 6115 free (ret); 6116 return NULL; 6117 } 6118 6119 /* Init the stub hash table too. */ 6120 if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc, 6121 sizeof (struct elf32_nios2_stub_hash_entry))) 6122 { 6123 _bfd_elf_link_hash_table_free (abfd); 6124 return NULL; 6125 } 6126 ret->root.root.hash_table_free = nios2_elf32_link_hash_table_free; 6127 6128 return &ret->root.root; 6129 } 6130 6131 /* Implement elf_backend_reloc_type_class. */ 6132 static enum elf_reloc_type_class 6133 nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, 6134 const asection *rel_sec ATTRIBUTE_UNUSED, 6135 const Elf_Internal_Rela *rela) 6136 { 6137 switch ((int) ELF32_R_TYPE (rela->r_info)) 6138 { 6139 case R_NIOS2_RELATIVE: 6140 return reloc_class_relative; 6141 case R_NIOS2_JUMP_SLOT: 6142 return reloc_class_plt; 6143 case R_NIOS2_COPY: 6144 return reloc_class_copy; 6145 default: 6146 return reloc_class_normal; 6147 } 6148 } 6149 6150 /* Return 1 if target is one of ours. */ 6151 static bfd_boolean 6152 is_nios2_elf_target (const struct bfd_target *targ) 6153 { 6154 return (targ == &nios2_elf32_le_vec 6155 || targ == &nios2_elf32_be_vec); 6156 } 6157 6158 /* Implement elf_backend_add_symbol_hook. 6159 This hook is called by the linker when adding symbols from an object 6160 file. We use it to put .comm items in .sbss, and not .bss. */ 6161 static bfd_boolean 6162 nios2_elf_add_symbol_hook (bfd *abfd, 6163 struct bfd_link_info *info, 6164 Elf_Internal_Sym *sym, 6165 const char **namep ATTRIBUTE_UNUSED, 6166 flagword *flagsp ATTRIBUTE_UNUSED, 6167 asection **secp, 6168 bfd_vma *valp) 6169 { 6170 bfd *dynobj; 6171 6172 if (sym->st_shndx == SHN_COMMON 6173 && !bfd_link_relocatable (info) 6174 && sym->st_size <= elf_gp_size (abfd) 6175 && is_nios2_elf_target (info->output_bfd->xvec)) 6176 { 6177 /* Common symbols less than or equal to -G nn bytes are automatically 6178 put into .sbss. */ 6179 struct elf32_nios2_link_hash_table *htab; 6180 6181 htab = elf32_nios2_hash_table (info); 6182 if (htab->sbss == NULL) 6183 { 6184 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED; 6185 6186 dynobj = elf_hash_table (info)->dynobj; 6187 if (!dynobj) 6188 dynobj = abfd; 6189 6190 htab->sbss = bfd_make_section_anyway_with_flags (dynobj, ".sbss", 6191 flags); 6192 if (htab->sbss == NULL) 6193 return FALSE; 6194 } 6195 6196 *secp = htab->sbss; 6197 *valp = sym->st_size; 6198 } 6199 6200 return TRUE; 6201 } 6202 6203 /* Implement elf_backend_can_make_relative_eh_frame: 6204 Decide whether to attempt to turn absptr or lsda encodings in 6205 shared libraries into pcrel within the given input section. */ 6206 static bfd_boolean 6207 nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED, 6208 struct bfd_link_info *info 6209 ATTRIBUTE_UNUSED, 6210 asection *eh_frame_section 6211 ATTRIBUTE_UNUSED) 6212 { 6213 /* We can't use PC-relative encodings in the .eh_frame section. */ 6214 return FALSE; 6215 } 6216 6217 /* Implement elf_backend_special_sections. */ 6218 const struct bfd_elf_special_section elf32_nios2_special_sections[] = 6219 { 6220 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, 6221 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL }, 6222 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, 6223 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL }, 6224 { NULL, 0, 0, 0, 0 } 6225 }; 6226 6227 #define ELF_ARCH bfd_arch_nios2 6228 #define ELF_TARGET_ID NIOS2_ELF_DATA 6229 #define ELF_MACHINE_CODE EM_ALTERA_NIOS2 6230 6231 /* The Nios II MMU uses a 4K page size. */ 6232 6233 #define ELF_MAXPAGESIZE 0x1000 6234 6235 #define bfd_elf32_bfd_link_hash_table_create \ 6236 nios2_elf32_link_hash_table_create 6237 6238 #define bfd_elf32_bfd_merge_private_bfd_data \ 6239 nios2_elf32_merge_private_bfd_data 6240 6241 /* Relocation table lookup macros. */ 6242 6243 #define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup 6244 #define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup 6245 6246 /* JUMP_TABLE_LINK macros. */ 6247 6248 /* elf_info_to_howto (using RELA relocations). */ 6249 6250 #define elf_info_to_howto nios2_elf32_info_to_howto 6251 6252 /* elf backend functions. */ 6253 6254 #define elf_backend_can_gc_sections 1 6255 #define elf_backend_can_refcount 1 6256 #define elf_backend_plt_readonly 1 6257 #define elf_backend_want_got_plt 1 6258 #define elf_backend_rela_normal 1 6259 6260 #define elf_backend_relocate_section nios2_elf32_relocate_section 6261 #define elf_backend_section_flags nios2_elf32_section_flags 6262 #define elf_backend_fake_sections nios2_elf32_fake_sections 6263 #define elf_backend_check_relocs nios2_elf32_check_relocs 6264 6265 #define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook 6266 #define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook 6267 #define elf_backend_create_dynamic_sections \ 6268 nios2_elf32_create_dynamic_sections 6269 #define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol 6270 #define elf_backend_finish_dynamic_sections \ 6271 nios2_elf32_finish_dynamic_sections 6272 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol 6273 #define elf_backend_reloc_type_class nios2_elf32_reloc_type_class 6274 #define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections 6275 #define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook 6276 #define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol 6277 #define elf_backend_object_p nios2_elf32_object_p 6278 6279 #define elf_backend_grok_prstatus nios2_grok_prstatus 6280 #define elf_backend_grok_psinfo nios2_grok_psinfo 6281 6282 #undef elf_backend_can_make_relative_eh_frame 6283 #define elf_backend_can_make_relative_eh_frame \ 6284 nios2_elf32_can_make_relative_eh_frame 6285 6286 #define elf_backend_special_sections elf32_nios2_special_sections 6287 6288 #define TARGET_LITTLE_SYM nios2_elf32_le_vec 6289 #define TARGET_LITTLE_NAME "elf32-littlenios2" 6290 #define TARGET_BIG_SYM nios2_elf32_be_vec 6291 #define TARGET_BIG_NAME "elf32-bignios2" 6292 6293 #define elf_backend_got_header_size 12 6294 #define elf_backend_default_execstack 0 6295 6296 #include "elf32-target.h" 6297