1/* 32-bit ELF support for Nios II. 2 Copyright (C) 2012-2017 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. */ 45static bfd_reloc_status_type nios2_elf32_ignore_reloc 46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 47static bfd_reloc_status_type nios2_elf32_hi16_relocate 48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 49static bfd_reloc_status_type nios2_elf32_lo16_relocate 50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 51static bfd_reloc_status_type nios2_elf32_hiadj16_relocate 52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 53static bfd_reloc_status_type nios2_elf32_pcrel_lo16_relocate 54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 55static bfd_reloc_status_type nios2_elf32_pcrel_hiadj16_relocate 56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 57static bfd_reloc_status_type nios2_elf32_pcrel16_relocate 58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 59static bfd_reloc_status_type nios2_elf32_call26_relocate 60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 61static bfd_reloc_status_type nios2_elf32_gprel_relocate 62 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 63static bfd_reloc_status_type nios2_elf32_ujmp_relocate 64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 65static bfd_reloc_status_type nios2_elf32_cjmp_relocate 66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 67static bfd_reloc_status_type nios2_elf32_callr_relocate 68 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 69 70/* Target vector. */ 71extern const bfd_target nios2_elf32_le_vec; 72extern 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. */ 80static 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 733static 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 1567static 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. */ 1574static reloc_howto_type * 1575lookup_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. */ 1617struct elf_reloc_map 1618{ 1619 bfd_reloc_code_real_type bfd_val; 1620 enum elf_nios2_reloc_type elf_val; 1621}; 1622 1623static 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 1685enum elf32_nios2_stub_type 1686{ 1687 nios2_stub_call26_before, 1688 nios2_stub_call26_after, 1689 nios2_stub_none 1690}; 1691 1692struct 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 1735struct 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 1751struct 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. */ 1789struct 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 *sbss; 1824 1825 /* GOT pointer symbol _gp_got. */ 1826 struct elf_link_hash_entry *h_gp_got; 1827 1828 union { 1829 bfd_signed_vma refcount; 1830 bfd_vma offset; 1831 } tls_ldm_got; 1832 1833 /* Small local sym cache. */ 1834 struct sym_cache sym_cache; 1835 1836 bfd_vma res_n_size; 1837 }; 1838 1839struct nios2_elf32_obj_tdata 1840{ 1841 struct elf_obj_tdata root; 1842 1843 /* tls_type for each local got entry. */ 1844 char *local_got_tls_type; 1845 1846 /* TRUE if TLS GD relocs have been seen for this object. */ 1847 bfd_boolean has_tlsgd; 1848}; 1849 1850#define elf32_nios2_tdata(abfd) \ 1851 ((struct nios2_elf32_obj_tdata *) (abfd)->tdata.any) 1852 1853#define elf32_nios2_local_got_tls_type(abfd) \ 1854 (elf32_nios2_tdata (abfd)->local_got_tls_type) 1855 1856/* The name of the dynamic interpreter. This is put in the .interp 1857 section. */ 1858#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" 1859 1860/* PLT implementation for position-dependent code. */ 1861static const bfd_vma nios2_plt_entry[] = { /* .PLTn: */ 1862 0x03c00034, /* movhi r15, %hiadj(plt_got_slot_address) */ 1863 0x7bc00017, /* ldw r15, %lo(plt_got_slot_address)(r15) */ 1864 0x7800683a /* jmp r15 */ 1865}; 1866 1867static const bfd_vma nios2_plt0_entry[] = { /* .PLTresolve */ 1868 0x03800034, /* movhi r14, %hiadj(res_0) */ 1869 0x73800004, /* addi r14, r14, %lo(res_0) */ 1870 0x7b9fc83a, /* sub r15, r15, r14 */ 1871 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */ 1872 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */ 1873 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */ 1874 0x6800683a /* jmp r13 */ 1875}; 1876 1877/* PLT implementation for position-independent code. */ 1878static const bfd_vma nios2_so_plt_entry[] = { /* .PLTn */ 1879 0x03c00034, /* movhi r15, %hiadj(index * 4) */ 1880 0x7bc00004, /* addi r15, r15, %lo(index * 4) */ 1881 0x00000006 /* br .PLTresolve */ 1882}; 1883 1884static const bfd_vma nios2_so_plt0_entry[] = { /* .PLTresolve */ 1885 0x001ce03a, /* nextpc r14 */ 1886 0x03400034, /* movhi r13, %hiadj(_GLOBAL_OFFSET_TABLE_) */ 1887 0x6b9b883a, /* add r13, r13, r14 */ 1888 0x6b800017, /* ldw r14, %lo(_GLOBAL_OFFSET_TABLE_+4)(r13) */ 1889 0x6b400017, /* ldw r13, %lo(_GLOBAL_OFFSET_TABLE_+8)(r13) */ 1890 0x6800683a /* jmp r13 */ 1891}; 1892 1893/* CALL26 stub. */ 1894static const bfd_vma nios2_call26_stub_entry[] = { 1895 0x00400034, /* orhi at, r0, %hiadj(dest) */ 1896 0x08400004, /* addi at, at, %lo(dest) */ 1897 0x0800683a /* jmp at */ 1898}; 1899 1900/* Install 16-bit immediate value VALUE at offset OFFSET into section SEC. */ 1901static void 1902nios2_elf32_install_imm16 (asection *sec, bfd_vma offset, bfd_vma value) 1903{ 1904 bfd_vma word = bfd_get_32 (sec->owner, sec->contents + offset); 1905 1906 BFD_ASSERT (value <= 0xffff || ((bfd_signed_vma) value) >= -0xffff); 1907 1908 bfd_put_32 (sec->owner, word | ((value & 0xffff) << 6), 1909 sec->contents + offset); 1910} 1911 1912/* Install COUNT 32-bit values DATA starting at offset OFFSET into 1913 section SEC. */ 1914static void 1915nios2_elf32_install_data (asection *sec, const bfd_vma *data, bfd_vma offset, 1916 int count) 1917{ 1918 while (count--) 1919 { 1920 bfd_put_32 (sec->owner, *data, sec->contents + offset); 1921 offset += 4; 1922 ++data; 1923 } 1924} 1925 1926/* The usual way of loading a 32-bit constant into a Nios II register is to 1927 load the high 16 bits in one instruction and then add the low 16 bits with 1928 a signed add. This means that the high halfword needs to be adjusted to 1929 compensate for the sign bit of the low halfword. This function returns the 1930 adjusted high halfword for a given 32-bit constant. */ 1931static 1932bfd_vma hiadj (bfd_vma symbol_value) 1933{ 1934 return ((symbol_value + 0x8000) >> 16) & 0xffff; 1935} 1936 1937/* Implement elf_backend_grok_prstatus: 1938 Support for core dump NOTE sections. */ 1939static bfd_boolean 1940nios2_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 1941{ 1942 int offset; 1943 size_t size; 1944 1945 switch (note->descsz) 1946 { 1947 default: 1948 return FALSE; 1949 1950 case 212: /* Linux/Nios II */ 1951 /* pr_cursig */ 1952 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 1953 1954 /* pr_pid */ 1955 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 24); 1956 1957 /* pr_reg */ 1958 offset = 72; 1959 size = 136; 1960 1961 break; 1962 } 1963 1964 /* Make a ".reg/999" section. */ 1965 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 1966 size, note->descpos + offset); 1967} 1968 1969/* Implement elf_backend_grok_psinfo. */ 1970static bfd_boolean 1971nios2_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 1972{ 1973 switch (note->descsz) 1974 { 1975 default: 1976 return FALSE; 1977 1978 case 124: /* Linux/Nios II elf_prpsinfo */ 1979 elf_tdata (abfd)->core->program 1980 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 1981 elf_tdata (abfd)->core->command 1982 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 1983 } 1984 1985 /* Note that for some reason, a spurious space is tacked 1986 onto the end of the args in some (at least one anyway) 1987 implementations, so strip it off if it exists. */ 1988 1989 { 1990 char *command = elf_tdata (abfd)->core->command; 1991 int n = strlen (command); 1992 1993 if (0 < n && command[n - 1] == ' ') 1994 command[n - 1] = '\0'; 1995 } 1996 1997 return TRUE; 1998} 1999 2000/* Assorted hash table functions. */ 2001 2002/* Initialize an entry in the stub hash table. */ 2003static struct bfd_hash_entry * 2004stub_hash_newfunc (struct bfd_hash_entry *entry, 2005 struct bfd_hash_table *table, 2006 const char *string) 2007{ 2008 /* Allocate the structure if it has not already been allocated by a 2009 subclass. */ 2010 if (entry == NULL) 2011 { 2012 entry = bfd_hash_allocate (table, 2013 sizeof (struct elf32_nios2_stub_hash_entry)); 2014 if (entry == NULL) 2015 return entry; 2016 } 2017 2018 /* Call the allocation method of the superclass. */ 2019 entry = bfd_hash_newfunc (entry, table, string); 2020 if (entry != NULL) 2021 { 2022 struct elf32_nios2_stub_hash_entry *hsh; 2023 2024 /* Initialize the local fields. */ 2025 hsh = (struct elf32_nios2_stub_hash_entry *) entry; 2026 hsh->stub_sec = NULL; 2027 hsh->stub_offset = 0; 2028 hsh->target_value = 0; 2029 hsh->target_section = NULL; 2030 hsh->stub_type = nios2_stub_none; 2031 hsh->hh = NULL; 2032 hsh->id_sec = NULL; 2033 } 2034 2035 return entry; 2036} 2037 2038/* Create an entry in a Nios II ELF linker hash table. */ 2039static struct bfd_hash_entry * 2040link_hash_newfunc (struct bfd_hash_entry *entry, 2041 struct bfd_hash_table *table, const char *string) 2042{ 2043 /* Allocate the structure if it has not already been allocated by a 2044 subclass. */ 2045 if (entry == NULL) 2046 { 2047 entry = bfd_hash_allocate (table, 2048 sizeof (struct elf32_nios2_link_hash_entry)); 2049 if (entry == NULL) 2050 return entry; 2051 } 2052 2053 /* Call the allocation method of the superclass. */ 2054 entry = _bfd_elf_link_hash_newfunc (entry, table, string); 2055 if (entry) 2056 { 2057 struct elf32_nios2_link_hash_entry *eh; 2058 2059 eh = (struct elf32_nios2_link_hash_entry *) entry; 2060 eh->hsh_cache = NULL; 2061 eh->dyn_relocs = NULL; 2062 eh->tls_type = GOT_UNKNOWN; 2063 eh->got_types_used = 0; 2064 } 2065 2066 return entry; 2067} 2068 2069/* Section name for stubs is the associated section name plus this 2070 string. */ 2071#define STUB_SUFFIX ".stub" 2072 2073/* Build a name for an entry in the stub hash table. */ 2074static char * 2075nios2_stub_name (const asection *input_section, 2076 const asection *sym_sec, 2077 const struct elf32_nios2_link_hash_entry *hh, 2078 const Elf_Internal_Rela *rel, 2079 enum elf32_nios2_stub_type stub_type) 2080{ 2081 char *stub_name; 2082 bfd_size_type len; 2083 char stubpos = (stub_type == nios2_stub_call26_before) ? 'b' : 'a'; 2084 2085 if (hh) 2086 { 2087 len = 8 + 1 + 1 + 1+ strlen (hh->root.root.root.string) + 1 + 8 + 1; 2088 stub_name = bfd_malloc (len); 2089 if (stub_name != NULL) 2090 { 2091 sprintf (stub_name, "%08x_%c_%s+%x", 2092 input_section->id & 0xffffffff, 2093 stubpos, 2094 hh->root.root.root.string, 2095 (int) rel->r_addend & 0xffffffff); 2096 } 2097 } 2098 else 2099 { 2100 len = 8 + 1 + 1 + 1+ 8 + 1 + 8 + 1 + 8 + 1; 2101 stub_name = bfd_malloc (len); 2102 if (stub_name != NULL) 2103 { 2104 sprintf (stub_name, "%08x_%c_%x:%x+%x", 2105 input_section->id & 0xffffffff, 2106 stubpos, 2107 sym_sec->id & 0xffffffff, 2108 (int) ELF32_R_SYM (rel->r_info) & 0xffffffff, 2109 (int) rel->r_addend & 0xffffffff); 2110 } 2111 } 2112 return stub_name; 2113} 2114 2115/* Look up an entry in the stub hash. Stub entries are cached because 2116 creating the stub name takes a bit of time. */ 2117static struct elf32_nios2_stub_hash_entry * 2118nios2_get_stub_entry (const asection *input_section, 2119 const asection *sym_sec, 2120 struct elf32_nios2_link_hash_entry *hh, 2121 const Elf_Internal_Rela *rel, 2122 struct elf32_nios2_link_hash_table *htab, 2123 enum elf32_nios2_stub_type stub_type) 2124{ 2125 struct elf32_nios2_stub_hash_entry *hsh; 2126 const asection *id_sec; 2127 2128 /* If this input section is part of a group of sections sharing one 2129 stub section, then use the id of the first/last section in the group, 2130 depending on the stub section placement relative to the group. 2131 Stub names need to include a section id, as there may well be 2132 more than one stub used to reach say, printf, and we need to 2133 distinguish between them. */ 2134 if (stub_type == nios2_stub_call26_before) 2135 id_sec = htab->stub_group[input_section->id].first_sec; 2136 else 2137 id_sec = htab->stub_group[input_section->id].last_sec; 2138 2139 if (hh != NULL && hh->hsh_cache != NULL 2140 && hh->hsh_cache->hh == hh 2141 && hh->hsh_cache->id_sec == id_sec 2142 && hh->hsh_cache->stub_type == stub_type) 2143 { 2144 hsh = hh->hsh_cache; 2145 } 2146 else 2147 { 2148 char *stub_name; 2149 2150 stub_name = nios2_stub_name (id_sec, sym_sec, hh, rel, stub_type); 2151 if (stub_name == NULL) 2152 return NULL; 2153 2154 hsh = nios2_stub_hash_lookup (&htab->bstab, 2155 stub_name, FALSE, FALSE); 2156 2157 if (hh != NULL) 2158 hh->hsh_cache = hsh; 2159 2160 free (stub_name); 2161 } 2162 2163 return hsh; 2164} 2165 2166/* Add a new stub entry to the stub hash. Not all fields of the new 2167 stub entry are initialised. */ 2168static struct elf32_nios2_stub_hash_entry * 2169nios2_add_stub (const char *stub_name, 2170 asection *section, 2171 struct elf32_nios2_link_hash_table *htab, 2172 enum elf32_nios2_stub_type stub_type) 2173{ 2174 asection *link_sec; 2175 asection *stub_sec; 2176 asection **secptr, **linkptr; 2177 struct elf32_nios2_stub_hash_entry *hsh; 2178 bfd_boolean afterp; 2179 2180 if (stub_type == nios2_stub_call26_before) 2181 { 2182 link_sec = htab->stub_group[section->id].first_sec; 2183 secptr = &(htab->stub_group[section->id].first_stub_sec); 2184 linkptr = &(htab->stub_group[link_sec->id].first_stub_sec); 2185 afterp = FALSE; 2186 } 2187 else 2188 { 2189 link_sec = htab->stub_group[section->id].last_sec; 2190 secptr = &(htab->stub_group[section->id].last_stub_sec); 2191 linkptr = &(htab->stub_group[link_sec->id].last_stub_sec); 2192 afterp = TRUE; 2193 } 2194 stub_sec = *secptr; 2195 if (stub_sec == NULL) 2196 { 2197 stub_sec = *linkptr; 2198 if (stub_sec == NULL) 2199 { 2200 size_t namelen; 2201 bfd_size_type len; 2202 char *s_name; 2203 2204 namelen = strlen (link_sec->name); 2205 len = namelen + sizeof (STUB_SUFFIX); 2206 s_name = bfd_alloc (htab->stub_bfd, len); 2207 if (s_name == NULL) 2208 return NULL; 2209 2210 memcpy (s_name, link_sec->name, namelen); 2211 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX)); 2212 2213 stub_sec = (*htab->add_stub_section) (s_name, link_sec, afterp); 2214 if (stub_sec == NULL) 2215 return NULL; 2216 *linkptr = stub_sec; 2217 } 2218 *secptr = stub_sec; 2219 } 2220 2221 /* Enter this entry into the linker stub hash table. */ 2222 hsh = nios2_stub_hash_lookup (&htab->bstab, stub_name, 2223 TRUE, FALSE); 2224 if (hsh == NULL) 2225 { 2226 /* xgettext:c-format */ 2227 _bfd_error_handler (_("%B: cannot create stub entry %s"), 2228 section->owner, 2229 stub_name); 2230 return NULL; 2231 } 2232 2233 hsh->stub_sec = stub_sec; 2234 hsh->stub_offset = 0; 2235 hsh->id_sec = link_sec; 2236 return hsh; 2237} 2238 2239/* Set up various things so that we can make a list of input sections 2240 for each output section included in the link. Returns -1 on error, 2241 0 when no stubs will be needed, and 1 on success. */ 2242int 2243nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info) 2244{ 2245 bfd *input_bfd; 2246 unsigned int bfd_count; 2247 unsigned int top_id, top_index; 2248 asection *section; 2249 asection **input_list, **list; 2250 bfd_size_type amt; 2251 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2252 2253 /* Count the number of input BFDs and find the top input section id. */ 2254 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0; 2255 input_bfd != NULL; 2256 input_bfd = input_bfd->link.next) 2257 { 2258 bfd_count += 1; 2259 for (section = input_bfd->sections; 2260 section != NULL; 2261 section = section->next) 2262 { 2263 if (top_id < section->id) 2264 top_id = section->id; 2265 } 2266 } 2267 2268 htab->bfd_count = bfd_count; 2269 2270 amt = sizeof (struct map_stub) * (top_id + 1); 2271 htab->stub_group = bfd_zmalloc (amt); 2272 if (htab->stub_group == NULL) 2273 return -1; 2274 2275 /* We can't use output_bfd->section_count here to find the top output 2276 section index as some sections may have been removed, and 2277 strip_excluded_output_sections doesn't renumber the indices. */ 2278 for (section = output_bfd->sections, top_index = 0; 2279 section != NULL; 2280 section = section->next) 2281 { 2282 if (top_index < section->index) 2283 top_index = section->index; 2284 } 2285 2286 htab->top_index = top_index; 2287 amt = sizeof (asection *) * (top_index + 1); 2288 input_list = bfd_malloc (amt); 2289 htab->input_list = input_list; 2290 if (input_list == NULL) 2291 return -1; 2292 2293 /* For sections we aren't interested in, mark their entries with a 2294 value we can check later. */ 2295 list = input_list + top_index; 2296 do 2297 *list = bfd_abs_section_ptr; 2298 while (list-- != input_list); 2299 2300 for (section = output_bfd->sections; 2301 section != NULL; 2302 section = section->next) 2303 { 2304 /* FIXME: This is a bit of hack. Currently our .ctors and .dtors 2305 * have PC relative relocs in them but no code flag set. */ 2306 if (((section->flags & SEC_CODE) != 0) || 2307 strcmp(".ctors", section->name) || 2308 strcmp(".dtors", section->name)) 2309 input_list[section->index] = NULL; 2310 } 2311 2312 return 1; 2313} 2314 2315/* The linker repeatedly calls this function for each input section, 2316 in the order that input sections are linked into output sections. 2317 Build lists of input sections to determine groupings between which 2318 we may insert linker stubs. */ 2319void 2320nios2_elf32_next_input_section (struct bfd_link_info *info, asection *isec) 2321{ 2322 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2323 2324 if (isec->output_section->index <= htab->top_index) 2325 { 2326 asection **list = htab->input_list + isec->output_section->index; 2327 if (*list != bfd_abs_section_ptr) 2328 { 2329 /* Steal the last_sec pointer for our list. 2330 This happens to make the list in reverse order, 2331 which is what we want. */ 2332 htab->stub_group[isec->id].last_sec = *list; 2333 *list = isec; 2334 } 2335 } 2336} 2337 2338/* Segment mask for CALL26 relocation relaxation. */ 2339#define CALL26_SEGMENT(x) ((x) & 0xf0000000) 2340 2341/* Fudge factor for approximate maximum size of all stubs that might 2342 be inserted by the linker. This does not actually limit the number 2343 of stubs that might be inserted, and only affects strategy for grouping 2344 and placement of stubs. Perhaps this should be computed based on number 2345 of relocations seen, or be specifiable on the command line. */ 2346#define MAX_STUB_SECTION_SIZE 0xffff 2347 2348/* See whether we can group stub sections together. Grouping stub 2349 sections may result in fewer stubs. More importantly, we need to 2350 put all .init* and .fini* stubs at the end of the .init or 2351 .fini output sections respectively, because glibc splits the 2352 _init and _fini functions into multiple parts. Putting a stub in 2353 the middle of a function is not a good idea. 2354 Rather than computing groups of a maximum fixed size, for Nios II 2355 CALL26 relaxation it makes more sense to compute the groups based on 2356 sections that fit within a 256MB address segment. Also do not allow 2357 a group to span more than one output section, since different output 2358 sections might correspond to different memory banks on a bare-metal 2359 target, etc. */ 2360static void 2361group_sections (struct elf32_nios2_link_hash_table *htab) 2362{ 2363 asection **list = htab->input_list + htab->top_index; 2364 do 2365 { 2366 /* The list is in reverse order so we'll search backwards looking 2367 for the first section that begins in the same memory segment, 2368 marking sections along the way to point at the tail for this 2369 group. */ 2370 asection *tail = *list; 2371 if (tail == bfd_abs_section_ptr) 2372 continue; 2373 while (tail != NULL) 2374 { 2375 bfd_vma start = tail->output_section->vma + tail->output_offset; 2376 bfd_vma end = start + tail->size; 2377 bfd_vma segment = CALL26_SEGMENT (end); 2378 asection *prev; 2379 2380 if (segment != CALL26_SEGMENT (start) 2381 || segment != CALL26_SEGMENT (end + MAX_STUB_SECTION_SIZE)) 2382 /* This section spans more than one memory segment, or is 2383 close enough to the end of the segment that adding stub 2384 sections before it might cause it to move so that it 2385 spans memory segments, or that stubs added at the end of 2386 this group might overflow into the next memory segment. 2387 Put it in a group by itself to localize the effects. */ 2388 { 2389 prev = htab->stub_group[tail->id].last_sec; 2390 htab->stub_group[tail->id].last_sec = tail; 2391 htab->stub_group[tail->id].first_sec = tail; 2392 } 2393 else 2394 /* Collect more sections for this group. */ 2395 { 2396 asection *curr, *first; 2397 for (curr = tail; ; curr = prev) 2398 { 2399 prev = htab->stub_group[curr->id].last_sec; 2400 if (!prev 2401 || tail->output_section != prev->output_section 2402 || (CALL26_SEGMENT (prev->output_section->vma 2403 + prev->output_offset) 2404 != segment)) 2405 break; 2406 } 2407 first = curr; 2408 for (curr = tail; ; curr = prev) 2409 { 2410 prev = htab->stub_group[curr->id].last_sec; 2411 htab->stub_group[curr->id].last_sec = tail; 2412 htab->stub_group[curr->id].first_sec = first; 2413 if (curr == first) 2414 break; 2415 } 2416 } 2417 2418 /* Reset tail for the next group. */ 2419 tail = prev; 2420 } 2421 } 2422 while (list-- != htab->input_list); 2423 free (htab->input_list); 2424} 2425 2426/* Determine the type of stub needed, if any, for a call. */ 2427static enum elf32_nios2_stub_type 2428nios2_type_of_stub (asection *input_sec, 2429 const Elf_Internal_Rela *rel, 2430 struct elf32_nios2_link_hash_entry *hh, 2431 struct elf32_nios2_link_hash_table *htab, 2432 bfd_vma destination, 2433 struct bfd_link_info *info ATTRIBUTE_UNUSED) 2434{ 2435 bfd_vma location, segment, start, end; 2436 asection *s0, *s1, *s; 2437 2438 if (hh != NULL && 2439 !(hh->root.root.type == bfd_link_hash_defined 2440 || hh->root.root.type == bfd_link_hash_defweak)) 2441 return nios2_stub_none; 2442 2443 /* Determine where the call point is. */ 2444 location = (input_sec->output_section->vma 2445 + input_sec->output_offset + rel->r_offset); 2446 segment = CALL26_SEGMENT (location); 2447 2448 /* Nios II CALL and JMPI instructions can transfer control to addresses 2449 within the same 256MB segment as the PC. */ 2450 if (segment == CALL26_SEGMENT (destination)) 2451 return nios2_stub_none; 2452 2453 /* Find the start and end addresses of the stub group. Also account for 2454 any already-created stub sections for this group. Note that for stubs 2455 in the end section, only the first instruction of the last stub 2456 (12 bytes long) needs to be within range. */ 2457 s0 = htab->stub_group[input_sec->id].first_sec; 2458 s = htab->stub_group[s0->id].first_stub_sec; 2459 if (s != NULL && s->size > 0) 2460 start = s->output_section->vma + s->output_offset; 2461 else 2462 start = s0->output_section->vma + s0->output_offset; 2463 2464 s1 = htab->stub_group[input_sec->id].last_sec; 2465 s = htab->stub_group[s1->id].last_stub_sec; 2466 if (s != NULL && s->size > 0) 2467 end = s->output_section->vma + s->output_offset + s->size - 8; 2468 else 2469 end = s1->output_section->vma + s1->output_offset + s1->size; 2470 2471 BFD_ASSERT (start < end); 2472 BFD_ASSERT (start <= location); 2473 BFD_ASSERT (location < end); 2474 2475 /* Put stubs at the end of the group unless that is not a valid 2476 location and the beginning of the group is. It might be that 2477 neither the beginning nor end works if we have an input section 2478 so large that it spans multiple segment boundaries. In that 2479 case, punt; the end result will be a relocation overflow error no 2480 matter what we do here. 2481 2482 Note that adding stubs pushes up the addresses of all subsequent 2483 sections, so that stubs allocated on one pass through the 2484 relaxation loop may not be valid on the next pass. (E.g., we may 2485 allocate a stub at the beginning of the section on one pass and 2486 find that the call site has been bumped into the next memory 2487 segment on the next pass.) The important thing to note is that 2488 we never try to reclaim the space allocated to such unused stubs, 2489 so code size and section addresses can only increase with each 2490 iteration. Accounting for the start and end addresses of the 2491 already-created stub sections ensures that when the algorithm 2492 converges, it converges accurately, with the entire appropriate 2493 stub section accessible from the call site and not just the 2494 address at the start or end of the stub group proper. */ 2495 2496 if (segment == CALL26_SEGMENT (end)) 2497 return nios2_stub_call26_after; 2498 else if (segment == CALL26_SEGMENT (start)) 2499 return nios2_stub_call26_before; 2500 else 2501 /* Perhaps this should be a dedicated error code. */ 2502 return nios2_stub_none; 2503} 2504 2505static bfd_boolean 2506nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED) 2507{ 2508 struct elf32_nios2_stub_hash_entry *hsh 2509 = (struct elf32_nios2_stub_hash_entry *) gen_entry; 2510 asection *stub_sec = hsh->stub_sec; 2511 bfd_vma sym_value; 2512 2513 /* Make a note of the offset within the stubs for this entry. */ 2514 hsh->stub_offset = stub_sec->size; 2515 2516 switch (hsh->stub_type) 2517 { 2518 case nios2_stub_call26_before: 2519 case nios2_stub_call26_after: 2520 /* A call26 stub looks like: 2521 orhi at, %hiadj(dest) 2522 addi at, at, %lo(dest) 2523 jmp at 2524 Note that call/jmpi instructions can't be used in PIC code 2525 so there is no reason for the stub to be PIC, either. */ 2526 sym_value = (hsh->target_value 2527 + hsh->target_section->output_offset 2528 + hsh->target_section->output_section->vma 2529 + hsh->addend); 2530 2531 nios2_elf32_install_data (stub_sec, nios2_call26_stub_entry, 2532 hsh->stub_offset, 3); 2533 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset, 2534 hiadj (sym_value)); 2535 nios2_elf32_install_imm16 (stub_sec, hsh->stub_offset + 4, 2536 (sym_value & 0xffff)); 2537 stub_sec->size += 12; 2538 break; 2539 default: 2540 BFD_FAIL (); 2541 return FALSE; 2542 } 2543 2544 return TRUE; 2545} 2546 2547/* As above, but don't actually build the stub. Just bump offset so 2548 we know stub section sizes. */ 2549static bfd_boolean 2550nios2_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_UNUSED) 2551{ 2552 struct elf32_nios2_stub_hash_entry *hsh 2553 = (struct elf32_nios2_stub_hash_entry *) gen_entry; 2554 2555 switch (hsh->stub_type) 2556 { 2557 case nios2_stub_call26_before: 2558 case nios2_stub_call26_after: 2559 hsh->stub_sec->size += 12; 2560 break; 2561 default: 2562 BFD_FAIL (); 2563 return FALSE; 2564 } 2565 return TRUE; 2566} 2567 2568/* Read in all local syms for all input bfds. 2569 Returns -1 on error, 0 otherwise. */ 2570 2571static int 2572get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd, 2573 struct bfd_link_info *info) 2574{ 2575 unsigned int bfd_indx; 2576 Elf_Internal_Sym *local_syms, **all_local_syms; 2577 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2578 2579 /* We want to read in symbol extension records only once. To do this 2580 we need to read in the local symbols in parallel and save them for 2581 later use; so hold pointers to the local symbols in an array. */ 2582 bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count; 2583 all_local_syms = bfd_zmalloc (amt); 2584 htab->all_local_syms = all_local_syms; 2585 if (all_local_syms == NULL) 2586 return -1; 2587 2588 /* Walk over all the input BFDs, swapping in local symbols. */ 2589 for (bfd_indx = 0; 2590 input_bfd != NULL; 2591 input_bfd = input_bfd->link.next, bfd_indx++) 2592 { 2593 Elf_Internal_Shdr *symtab_hdr; 2594 2595 /* We'll need the symbol table in a second. */ 2596 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 2597 if (symtab_hdr->sh_info == 0) 2598 continue; 2599 2600 /* We need an array of the local symbols attached to the input bfd. */ 2601 local_syms = (Elf_Internal_Sym *) symtab_hdr->contents; 2602 if (local_syms == NULL) 2603 { 2604 local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, 2605 symtab_hdr->sh_info, 0, 2606 NULL, NULL, NULL); 2607 /* Cache them for elf_link_input_bfd. */ 2608 symtab_hdr->contents = (unsigned char *) local_syms; 2609 } 2610 if (local_syms == NULL) 2611 return -1; 2612 2613 all_local_syms[bfd_indx] = local_syms; 2614 } 2615 2616 return 0; 2617} 2618 2619/* Determine and set the size of the stub section for a final link. */ 2620bfd_boolean 2621nios2_elf32_size_stubs (bfd *output_bfd, bfd *stub_bfd, 2622 struct bfd_link_info *info, 2623 asection *(*add_stub_section) (const char *, 2624 asection *, bfd_boolean), 2625 void (*layout_sections_again) (void)) 2626{ 2627 bfd_boolean stub_changed = FALSE; 2628 struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); 2629 2630 /* Stash our params away. */ 2631 htab->stub_bfd = stub_bfd; 2632 htab->add_stub_section = add_stub_section; 2633 htab->layout_sections_again = layout_sections_again; 2634 2635 /* FIXME: We only compute the section groups once. This could cause 2636 problems if adding a large stub section causes following sections, 2637 or parts of them, to move into another segment. However, this seems 2638 to be consistent with the way other back ends handle this.... */ 2639 group_sections (htab); 2640 2641 if (get_local_syms (output_bfd, info->input_bfds, info)) 2642 { 2643 if (htab->all_local_syms) 2644 goto error_ret_free_local; 2645 return FALSE; 2646 } 2647 2648 while (1) 2649 { 2650 bfd *input_bfd; 2651 unsigned int bfd_indx; 2652 asection *stub_sec; 2653 2654 for (input_bfd = info->input_bfds, bfd_indx = 0; 2655 input_bfd != NULL; 2656 input_bfd = input_bfd->link.next, bfd_indx++) 2657 { 2658 Elf_Internal_Shdr *symtab_hdr; 2659 asection *section; 2660 Elf_Internal_Sym *local_syms; 2661 2662 /* We'll need the symbol table in a second. */ 2663 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 2664 if (symtab_hdr->sh_info == 0) 2665 continue; 2666 2667 local_syms = htab->all_local_syms[bfd_indx]; 2668 2669 /* Walk over each section attached to the input bfd. */ 2670 for (section = input_bfd->sections; 2671 section != NULL; 2672 section = section->next) 2673 { 2674 Elf_Internal_Rela *internal_relocs, *irelaend, *irela; 2675 2676 /* If there aren't any relocs, then there's nothing more 2677 to do. */ 2678 if ((section->flags & SEC_RELOC) == 0 2679 || section->reloc_count == 0) 2680 continue; 2681 2682 /* If this section is a link-once section that will be 2683 discarded, then don't create any stubs. */ 2684 if (section->output_section == NULL 2685 || section->output_section->owner != output_bfd) 2686 continue; 2687 2688 /* Get the relocs. */ 2689 internal_relocs 2690 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL, 2691 info->keep_memory); 2692 if (internal_relocs == NULL) 2693 goto error_ret_free_local; 2694 2695 /* Now examine each relocation. */ 2696 irela = internal_relocs; 2697 irelaend = irela + section->reloc_count; 2698 for (; irela < irelaend; irela++) 2699 { 2700 unsigned int r_type, r_indx; 2701 enum elf32_nios2_stub_type stub_type; 2702 struct elf32_nios2_stub_hash_entry *hsh; 2703 asection *sym_sec; 2704 bfd_vma sym_value; 2705 bfd_vma destination; 2706 struct elf32_nios2_link_hash_entry *hh; 2707 char *stub_name; 2708 const asection *id_sec; 2709 2710 r_type = ELF32_R_TYPE (irela->r_info); 2711 r_indx = ELF32_R_SYM (irela->r_info); 2712 2713 if (r_type >= (unsigned int) R_NIOS2_ILLEGAL) 2714 { 2715 bfd_set_error (bfd_error_bad_value); 2716 error_ret_free_internal: 2717 if (elf_section_data (section)->relocs == NULL) 2718 free (internal_relocs); 2719 goto error_ret_free_local; 2720 } 2721 2722 /* Only look for stubs on CALL and JMPI instructions. */ 2723 if (r_type != (unsigned int) R_NIOS2_CALL26) 2724 continue; 2725 2726 /* Now determine the call target, its name, value, 2727 section. */ 2728 sym_sec = NULL; 2729 sym_value = 0; 2730 destination = 0; 2731 hh = NULL; 2732 if (r_indx < symtab_hdr->sh_info) 2733 { 2734 /* It's a local symbol. */ 2735 Elf_Internal_Sym *sym; 2736 Elf_Internal_Shdr *hdr; 2737 unsigned int shndx; 2738 2739 sym = local_syms + r_indx; 2740 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION) 2741 sym_value = sym->st_value; 2742 shndx = sym->st_shndx; 2743 if (shndx < elf_numsections (input_bfd)) 2744 { 2745 hdr = elf_elfsections (input_bfd)[shndx]; 2746 sym_sec = hdr->bfd_section; 2747 destination = (sym_value + irela->r_addend 2748 + sym_sec->output_offset 2749 + sym_sec->output_section->vma); 2750 } 2751 } 2752 else 2753 { 2754 /* It's an external symbol. */ 2755 int e_indx; 2756 2757 e_indx = r_indx - symtab_hdr->sh_info; 2758 hh = ((struct elf32_nios2_link_hash_entry *) 2759 elf_sym_hashes (input_bfd)[e_indx]); 2760 2761 while (hh->root.root.type == bfd_link_hash_indirect 2762 || hh->root.root.type == bfd_link_hash_warning) 2763 hh = ((struct elf32_nios2_link_hash_entry *) 2764 hh->root.root.u.i.link); 2765 2766 if (hh->root.root.type == bfd_link_hash_defined 2767 || hh->root.root.type == bfd_link_hash_defweak) 2768 { 2769 sym_sec = hh->root.root.u.def.section; 2770 sym_value = hh->root.root.u.def.value; 2771 2772 if (sym_sec->output_section != NULL) 2773 destination = (sym_value + irela->r_addend 2774 + sym_sec->output_offset 2775 + sym_sec->output_section->vma); 2776 else 2777 continue; 2778 } 2779 else if (hh->root.root.type == bfd_link_hash_undefweak) 2780 { 2781 if (! bfd_link_pic (info)) 2782 continue; 2783 } 2784 else if (hh->root.root.type == bfd_link_hash_undefined) 2785 { 2786 if (! (info->unresolved_syms_in_objects == RM_IGNORE 2787 && (ELF_ST_VISIBILITY (hh->root.other) 2788 == STV_DEFAULT))) 2789 continue; 2790 } 2791 else 2792 { 2793 bfd_set_error (bfd_error_bad_value); 2794 goto error_ret_free_internal; 2795 } 2796 } 2797 2798 /* Determine what (if any) linker stub is needed. */ 2799 stub_type = nios2_type_of_stub (section, irela, hh, htab, 2800 destination, info); 2801 if (stub_type == nios2_stub_none) 2802 continue; 2803 2804 /* Support for grouping stub sections. */ 2805 if (stub_type == nios2_stub_call26_before) 2806 id_sec = htab->stub_group[section->id].first_sec; 2807 else 2808 id_sec = htab->stub_group[section->id].last_sec; 2809 2810 /* Get the name of this stub. */ 2811 stub_name = nios2_stub_name (id_sec, sym_sec, hh, irela, 2812 stub_type); 2813 if (!stub_name) 2814 goto error_ret_free_internal; 2815 2816 hsh = nios2_stub_hash_lookup (&htab->bstab, 2817 stub_name, 2818 FALSE, FALSE); 2819 if (hsh != NULL) 2820 { 2821 /* The proper stub has already been created. */ 2822 free (stub_name); 2823 continue; 2824 } 2825 2826 hsh = nios2_add_stub (stub_name, section, htab, stub_type); 2827 if (hsh == NULL) 2828 { 2829 free (stub_name); 2830 goto error_ret_free_internal; 2831 } 2832 hsh->target_value = sym_value; 2833 hsh->target_section = sym_sec; 2834 hsh->stub_type = stub_type; 2835 hsh->hh = hh; 2836 hsh->addend = irela->r_addend; 2837 stub_changed = TRUE; 2838 } 2839 2840 /* We're done with the internal relocs, free them. */ 2841 if (elf_section_data (section)->relocs == NULL) 2842 free (internal_relocs); 2843 } 2844 } 2845 2846 if (!stub_changed) 2847 break; 2848 2849 /* OK, we've added some stubs. Find out the new size of the 2850 stub sections. */ 2851 for (stub_sec = htab->stub_bfd->sections; 2852 stub_sec != NULL; 2853 stub_sec = stub_sec->next) 2854 stub_sec->size = 0; 2855 2856 bfd_hash_traverse (&htab->bstab, nios2_size_one_stub, htab); 2857 2858 /* Ask the linker to do its stuff. */ 2859 (*htab->layout_sections_again) (); 2860 stub_changed = FALSE; 2861 } 2862 2863 free (htab->all_local_syms); 2864 return TRUE; 2865 2866 error_ret_free_local: 2867 free (htab->all_local_syms); 2868 return FALSE; 2869} 2870 2871/* Build all the stubs associated with the current output file. The 2872 stubs are kept in a hash table attached to the main linker hash 2873 table. This function is called via nios2elf_finish in the linker. */ 2874bfd_boolean 2875nios2_elf32_build_stubs (struct bfd_link_info *info) 2876{ 2877 asection *stub_sec; 2878 struct bfd_hash_table *table; 2879 struct elf32_nios2_link_hash_table *htab; 2880 2881 htab = elf32_nios2_hash_table (info); 2882 2883 for (stub_sec = htab->stub_bfd->sections; 2884 stub_sec != NULL; 2885 stub_sec = stub_sec->next) 2886 /* The stub_bfd may contain non-stub sections if it is also the 2887 dynobj. Any such non-stub sections are created with the 2888 SEC_LINKER_CREATED flag set, while stub sections do not 2889 have that flag. Ignore any non-stub sections here. */ 2890 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0) 2891 { 2892 bfd_size_type size; 2893 2894 /* Allocate memory to hold the linker stubs. */ 2895 size = stub_sec->size; 2896 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size); 2897 if (stub_sec->contents == NULL && size != 0) 2898 return FALSE; 2899 stub_sec->size = 0; 2900 } 2901 2902 /* Build the stubs as directed by the stub hash table. */ 2903 table = &htab->bstab; 2904 bfd_hash_traverse (table, nios2_build_one_stub, info); 2905 2906 return TRUE; 2907} 2908 2909 2910#define is_nios2_elf(bfd) \ 2911 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ 2912 && elf_object_id (bfd) == NIOS2_ELF_DATA) 2913 2914/* Merge backend specific data from an object file to the output 2915 object file when linking. */ 2916 2917static bfd_boolean 2918nios2_elf32_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) 2919{ 2920 bfd *obfd = info->output_bfd; 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, info)) 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 /* xgettext:c-format */ 2965 (_("error: %B: Conflicting CPU architectures %d/%d"), 2966 ibfd, new_flags, old_flags); 2967 bfd_set_error (bfd_error_bad_value); 2968 return FALSE; 2969 } 2970 2971 /* Merge Tag_compatibility attributes and any common GNU ones. */ 2972 _bfd_elf_merge_object_attributes (ibfd, info); 2973 2974 return TRUE; 2975} 2976 2977 2978/* Implement bfd_elf32_bfd_reloc_type_lookup: 2979 Given a BFD reloc type, return a howto structure. */ 2980static reloc_howto_type * 2981nios2_elf32_bfd_reloc_type_lookup (bfd *abfd, 2982 bfd_reloc_code_real_type code) 2983{ 2984 int i; 2985 2986 for (i = 0; 2987 i < (int) (sizeof (nios2_reloc_map) / sizeof (struct elf_reloc_map)); 2988 ++i) 2989 if (nios2_reloc_map[i].bfd_val == code) 2990 return lookup_howto (nios2_reloc_map[i].elf_val, abfd); 2991 return NULL; 2992} 2993 2994/* Implement bfd_elf32_bfd_reloc_name_lookup: 2995 Given a reloc name, return a howto structure. */ 2996static reloc_howto_type * 2997nios2_elf32_bfd_reloc_name_lookup (bfd *abfd, 2998 const char *r_name) 2999{ 3000 int i; 3001 reloc_howto_type *howto_tbl; 3002 int howto_tbl_size; 3003 3004 if (BFD_IS_R2 (abfd)) 3005 { 3006 howto_tbl = elf_nios2_r2_howto_table_rel; 3007 howto_tbl_size = (int) (sizeof (elf_nios2_r2_howto_table_rel) 3008 / sizeof (elf_nios2_r2_howto_table_rel[0])); 3009 } 3010 else 3011 { 3012 howto_tbl = elf_nios2_r1_howto_table_rel; 3013 howto_tbl_size = (int) (sizeof (elf_nios2_r1_howto_table_rel) 3014 / sizeof (elf_nios2_r1_howto_table_rel[0])); 3015 } 3016 3017 for (i = 0; i < howto_tbl_size; i++) 3018 if (howto_tbl[i].name && strcasecmp (howto_tbl[i].name, r_name) == 0) 3019 return howto_tbl + i; 3020 return NULL; 3021} 3022 3023/* Implement elf_info_to_howto: 3024 Given a ELF32 relocation, fill in a arelent structure. */ 3025static void 3026nios2_elf32_info_to_howto (bfd *abfd, arelent *cache_ptr, 3027 Elf_Internal_Rela *dst) 3028{ 3029 unsigned int r_type; 3030 3031 r_type = ELF32_R_TYPE (dst->r_info); 3032 cache_ptr->howto = lookup_howto (r_type, abfd); 3033} 3034 3035/* Return the base VMA address which should be subtracted from real addresses 3036 when resolving @dtpoff relocation. 3037 This is PT_TLS segment p_vaddr. */ 3038static bfd_vma 3039dtpoff_base (struct bfd_link_info *info) 3040{ 3041 /* If tls_sec is NULL, we should have signalled an error already. */ 3042 if (elf_hash_table (info)->tls_sec == NULL) 3043 return 0; 3044 return elf_hash_table (info)->tls_sec->vma; 3045} 3046 3047/* Return the relocation value for @tpoff relocation 3048 if STT_TLS virtual address is ADDRESS. */ 3049static bfd_vma 3050tpoff (struct bfd_link_info *info, bfd_vma address) 3051{ 3052 struct elf_link_hash_table *htab = elf_hash_table (info); 3053 3054 /* If tls_sec is NULL, we should have signalled an error already. */ 3055 if (htab->tls_sec == NULL) 3056 return 0; 3057 return address - htab->tls_sec->vma; 3058} 3059 3060/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a 3061 dangerous relocation. */ 3062static bfd_boolean 3063nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info) 3064{ 3065 3066 bfd_boolean gp_found; 3067 struct bfd_hash_entry *h; 3068 struct bfd_link_hash_entry *lh; 3069 3070 /* If we've already figured out what GP will be, just return it. */ 3071 *pgp = _bfd_get_gp_value (output_bfd); 3072 if (*pgp) 3073 return TRUE; 3074 3075 h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE); 3076 lh = (struct bfd_link_hash_entry *) h; 3077lookup: 3078 if (lh) 3079 { 3080 switch (lh->type) 3081 { 3082 case bfd_link_hash_undefined: 3083 case bfd_link_hash_undefweak: 3084 case bfd_link_hash_common: 3085 gp_found = FALSE; 3086 break; 3087 case bfd_link_hash_defined: 3088 case bfd_link_hash_defweak: 3089 gp_found = TRUE; 3090 { 3091 asection *sym_sec = lh->u.def.section; 3092 bfd_vma sym_value = lh->u.def.value; 3093 3094 if (sym_sec->output_section) 3095 sym_value = (sym_value + sym_sec->output_offset 3096 + sym_sec->output_section->vma); 3097 *pgp = sym_value; 3098 } 3099 break; 3100 case bfd_link_hash_indirect: 3101 case bfd_link_hash_warning: 3102 lh = lh->u.i.link; 3103 /* @@FIXME ignoring warning for now */ 3104 goto lookup; 3105 case bfd_link_hash_new: 3106 default: 3107 abort (); 3108 } 3109 } 3110 else 3111 gp_found = FALSE; 3112 3113 if (!gp_found) 3114 { 3115 /* Only get the error once. */ 3116 *pgp = 4; 3117 _bfd_set_gp_value (output_bfd, *pgp); 3118 return FALSE; 3119 } 3120 3121 _bfd_set_gp_value (output_bfd, *pgp); 3122 3123 return TRUE; 3124} 3125 3126/* Retrieve the previously cached _gp pointer, returning bfd_reloc_dangerous 3127 if it's not available as we don't have a link_info pointer available here 3128 to look it up in the output symbol table. We don't need to adjust the 3129 symbol value for an external symbol if we are producing relocatable 3130 output. */ 3131static bfd_reloc_status_type 3132nios2_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable, 3133 char **error_message, bfd_vma *pgp) 3134{ 3135 if (bfd_is_und_section (symbol->section) && !relocatable) 3136 { 3137 *pgp = 0; 3138 return bfd_reloc_undefined; 3139 } 3140 3141 *pgp = _bfd_get_gp_value (output_bfd); 3142 if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)) 3143 { 3144 if (relocatable) 3145 { 3146 /* Make up a value. */ 3147 *pgp = symbol->section->output_section->vma + 0x4000; 3148 _bfd_set_gp_value (output_bfd, *pgp); 3149 } 3150 else 3151 { 3152 *error_message 3153 = (char *) _("global pointer relative relocation when _gp not defined"); 3154 return bfd_reloc_dangerous; 3155 } 3156 } 3157 3158 return bfd_reloc_ok; 3159} 3160 3161/* Do the relocations that require special handling. */ 3162static bfd_reloc_status_type 3163nios2_elf32_do_hi16_relocate (bfd *abfd, reloc_howto_type *howto, 3164 asection *input_section, 3165 bfd_byte *data, bfd_vma offset, 3166 bfd_vma symbol_value, bfd_vma addend) 3167{ 3168 symbol_value = symbol_value + addend; 3169 addend = 0; 3170 symbol_value = (symbol_value >> 16) & 0xffff; 3171 return _bfd_final_link_relocate (howto, abfd, input_section, 3172 data, offset, symbol_value, addend); 3173} 3174 3175static bfd_reloc_status_type 3176nios2_elf32_do_lo16_relocate (bfd *abfd, reloc_howto_type *howto, 3177 asection *input_section, 3178 bfd_byte *data, bfd_vma offset, 3179 bfd_vma symbol_value, bfd_vma addend) 3180{ 3181 symbol_value = symbol_value + addend; 3182 addend = 0; 3183 symbol_value = symbol_value & 0xffff; 3184 return _bfd_final_link_relocate (howto, abfd, input_section, 3185 data, offset, symbol_value, addend); 3186} 3187 3188static bfd_reloc_status_type 3189nios2_elf32_do_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto, 3190 asection *input_section, 3191 bfd_byte *data, bfd_vma offset, 3192 bfd_vma symbol_value, bfd_vma addend) 3193{ 3194 symbol_value = symbol_value + addend; 3195 addend = 0; 3196 symbol_value = hiadj(symbol_value); 3197 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset, 3198 symbol_value, addend); 3199} 3200 3201static bfd_reloc_status_type 3202nios2_elf32_do_pcrel_lo16_relocate (bfd *abfd, reloc_howto_type *howto, 3203 asection *input_section, 3204 bfd_byte *data, bfd_vma offset, 3205 bfd_vma symbol_value, bfd_vma addend) 3206{ 3207 symbol_value = symbol_value + addend; 3208 addend = 0; 3209 symbol_value = symbol_value & 0xffff; 3210 return _bfd_final_link_relocate (howto, abfd, input_section, 3211 data, offset, symbol_value, addend); 3212} 3213 3214static bfd_reloc_status_type 3215nios2_elf32_do_pcrel_hiadj16_relocate (bfd *abfd, reloc_howto_type *howto, 3216 asection *input_section, 3217 bfd_byte *data, bfd_vma offset, 3218 bfd_vma symbol_value, bfd_vma addend) 3219{ 3220 symbol_value = symbol_value + addend; 3221 symbol_value -= (input_section->output_section->vma 3222 + input_section->output_offset); 3223 symbol_value -= offset; 3224 addend = 0; 3225 symbol_value = hiadj(symbol_value); 3226 return _bfd_final_link_relocate (howto, abfd, input_section, data, offset, 3227 symbol_value, addend); 3228} 3229 3230static bfd_reloc_status_type 3231nios2_elf32_do_pcrel16_relocate (bfd *abfd, reloc_howto_type *howto, 3232 asection *input_section, 3233 bfd_byte *data, bfd_vma offset, 3234 bfd_vma symbol_value, bfd_vma addend) 3235{ 3236 /* NIOS2 pc relative relocations are relative to the next 32-bit instruction 3237 so we need to subtract 4 before doing a final_link_relocate. */ 3238 symbol_value = symbol_value + addend - 4; 3239 addend = 0; 3240 return _bfd_final_link_relocate (howto, abfd, input_section, 3241 data, offset, symbol_value, addend); 3242} 3243 3244static bfd_reloc_status_type 3245nios2_elf32_do_call26_relocate (bfd *abfd, reloc_howto_type *howto, 3246 asection *input_section, 3247 bfd_byte *data, bfd_vma offset, 3248 bfd_vma symbol_value, bfd_vma addend) 3249{ 3250 /* Check that the relocation is in the same page as the current address. */ 3251 if (CALL26_SEGMENT (symbol_value + addend) 3252 != CALL26_SEGMENT (input_section->output_section->vma 3253 + input_section->output_offset 3254 + offset)) 3255 return bfd_reloc_overflow; 3256 3257 /* Check that the target address is correctly aligned on a 4-byte 3258 boundary. */ 3259 if ((symbol_value + addend) & 0x3) 3260 return bfd_reloc_overflow; 3261 3262 return _bfd_final_link_relocate (howto, abfd, input_section, 3263 data, offset, symbol_value, addend); 3264} 3265 3266static bfd_reloc_status_type 3267nios2_elf32_do_gprel_relocate (bfd *abfd, reloc_howto_type *howto, 3268 asection *input_section, 3269 bfd_byte *data, bfd_vma offset, 3270 bfd_vma symbol_value, bfd_vma addend) 3271{ 3272 /* Because we need the output_bfd, the special handling is done 3273 in nios2_elf32_relocate_section or in nios2_elf32_gprel_relocate. */ 3274 return _bfd_final_link_relocate (howto, abfd, input_section, 3275 data, offset, symbol_value, addend); 3276} 3277 3278static bfd_reloc_status_type 3279nios2_elf32_do_ujmp_relocate (bfd *abfd, reloc_howto_type *howto, 3280 asection *input_section, 3281 bfd_byte *data, bfd_vma offset, 3282 bfd_vma symbol_value, bfd_vma addend) 3283{ 3284 bfd_vma symbol_lo16, symbol_hi16; 3285 bfd_reloc_status_type r; 3286 symbol_value = symbol_value + addend; 3287 addend = 0; 3288 symbol_hi16 = (symbol_value >> 16) & 0xffff; 3289 symbol_lo16 = symbol_value & 0xffff; 3290 3291 r = _bfd_final_link_relocate (howto, abfd, input_section, 3292 data, offset, symbol_hi16, addend); 3293 3294 if (r == bfd_reloc_ok) 3295 return _bfd_final_link_relocate (howto, abfd, input_section, 3296 data, offset + 4, symbol_lo16, addend); 3297 3298 return r; 3299} 3300 3301static bfd_reloc_status_type 3302nios2_elf32_do_cjmp_relocate (bfd *abfd, reloc_howto_type *howto, 3303 asection *input_section, 3304 bfd_byte *data, bfd_vma offset, 3305 bfd_vma symbol_value, bfd_vma addend) 3306{ 3307 bfd_vma symbol_lo16, symbol_hi16; 3308 bfd_reloc_status_type r; 3309 symbol_value = symbol_value + addend; 3310 addend = 0; 3311 symbol_hi16 = (symbol_value >> 16) & 0xffff; 3312 symbol_lo16 = symbol_value & 0xffff; 3313 3314 r = _bfd_final_link_relocate (howto, abfd, input_section, 3315 data, offset, symbol_hi16, addend); 3316 3317 if (r == bfd_reloc_ok) 3318 return _bfd_final_link_relocate (howto, abfd, input_section, 3319 data, offset + 4, symbol_lo16, addend); 3320 3321 return r; 3322} 3323 3324static bfd_reloc_status_type 3325nios2_elf32_do_callr_relocate (bfd *abfd, reloc_howto_type *howto, 3326 asection *input_section, 3327 bfd_byte *data, bfd_vma offset, 3328 bfd_vma symbol_value, bfd_vma addend) 3329{ 3330 bfd_vma symbol_lo16, symbol_hi16; 3331 bfd_reloc_status_type r; 3332 symbol_value = symbol_value + addend; 3333 addend = 0; 3334 symbol_hi16 = (symbol_value >> 16) & 0xffff; 3335 symbol_lo16 = symbol_value & 0xffff; 3336 3337 r = _bfd_final_link_relocate (howto, abfd, input_section, 3338 data, offset, symbol_hi16, addend); 3339 3340 if (r == bfd_reloc_ok) 3341 return _bfd_final_link_relocate (howto, abfd, input_section, 3342 data, offset + 4, symbol_lo16, addend); 3343 3344 return r; 3345} 3346 3347/* HOWTO handlers for relocations that require special handling. */ 3348 3349/* This is for relocations used only when relaxing to ensure 3350 changes in size of section don't screw up .align. */ 3351static bfd_reloc_status_type 3352nios2_elf32_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 3353 asymbol *symbol ATTRIBUTE_UNUSED, 3354 void *data ATTRIBUTE_UNUSED, asection *input_section, 3355 bfd *output_bfd, 3356 char **error_message ATTRIBUTE_UNUSED) 3357{ 3358 if (output_bfd != NULL) 3359 reloc_entry->address += input_section->output_offset; 3360 return bfd_reloc_ok; 3361} 3362 3363static bfd_reloc_status_type 3364nios2_elf32_hi16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3365 void *data, asection *input_section, 3366 bfd *output_bfd, 3367 char **error_message ATTRIBUTE_UNUSED) 3368{ 3369 /* This part is from bfd_elf_generic_reloc. */ 3370 if (output_bfd != NULL 3371 && (symbol->flags & BSF_SECTION_SYM) == 0 3372 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3373 { 3374 reloc_entry->address += input_section->output_offset; 3375 return bfd_reloc_ok; 3376 } 3377 3378 if (output_bfd != NULL) 3379 /* FIXME: See bfd_perform_relocation. Is this right? */ 3380 return bfd_reloc_continue; 3381 3382 return nios2_elf32_do_hi16_relocate (abfd, reloc_entry->howto, 3383 input_section, 3384 data, reloc_entry->address, 3385 (symbol->value 3386 + symbol->section->output_section->vma 3387 + symbol->section->output_offset), 3388 reloc_entry->addend); 3389} 3390 3391static bfd_reloc_status_type 3392nios2_elf32_lo16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3393 void *data, asection *input_section, 3394 bfd *output_bfd, 3395 char **error_message ATTRIBUTE_UNUSED) 3396{ 3397 /* This part is from bfd_elf_generic_reloc. */ 3398 if (output_bfd != NULL 3399 && (symbol->flags & BSF_SECTION_SYM) == 0 3400 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3401 { 3402 reloc_entry->address += input_section->output_offset; 3403 return bfd_reloc_ok; 3404 } 3405 3406 if (output_bfd != NULL) 3407 /* FIXME: See bfd_perform_relocation. Is this right? */ 3408 return bfd_reloc_continue; 3409 3410 return nios2_elf32_do_lo16_relocate (abfd, reloc_entry->howto, 3411 input_section, 3412 data, reloc_entry->address, 3413 (symbol->value 3414 + symbol->section->output_section->vma 3415 + symbol->section->output_offset), 3416 reloc_entry->addend); 3417} 3418 3419static bfd_reloc_status_type 3420nios2_elf32_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3421 void *data, asection *input_section, 3422 bfd *output_bfd, 3423 char **error_message ATTRIBUTE_UNUSED) 3424{ 3425 /* This part is from bfd_elf_generic_reloc. */ 3426 if (output_bfd != NULL 3427 && (symbol->flags & BSF_SECTION_SYM) == 0 3428 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3429 { 3430 reloc_entry->address += input_section->output_offset; 3431 return bfd_reloc_ok; 3432 } 3433 3434 if (output_bfd != NULL) 3435 /* FIXME: See bfd_perform_relocation. Is this right? */ 3436 return bfd_reloc_continue; 3437 3438 return nios2_elf32_do_hiadj16_relocate (abfd, reloc_entry->howto, 3439 input_section, 3440 data, reloc_entry->address, 3441 (symbol->value 3442 + symbol->section->output_section->vma 3443 + symbol->section->output_offset), 3444 reloc_entry->addend); 3445} 3446 3447static bfd_reloc_status_type 3448nios2_elf32_pcrel_lo16_relocate (bfd *abfd, arelent *reloc_entry, 3449 asymbol *symbol, void *data, 3450 asection *input_section, bfd *output_bfd, 3451 char **error_message ATTRIBUTE_UNUSED) 3452{ 3453 /* This part is from bfd_elf_generic_reloc. */ 3454 if (output_bfd != NULL 3455 && (symbol->flags & BSF_SECTION_SYM) == 0 3456 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3457 { 3458 reloc_entry->address += input_section->output_offset; 3459 return bfd_reloc_ok; 3460 } 3461 3462 if (output_bfd != NULL) 3463 /* FIXME: See bfd_perform_relocation. Is this right? */ 3464 return bfd_reloc_continue; 3465 3466 return nios2_elf32_do_pcrel_lo16_relocate ( 3467 abfd, reloc_entry->howto, input_section, data, reloc_entry->address, 3468 (symbol->value + symbol->section->output_section->vma 3469 + symbol->section->output_offset), 3470 reloc_entry->addend); 3471} 3472 3473static bfd_reloc_status_type 3474nios2_elf32_pcrel_hiadj16_relocate (bfd *abfd, arelent *reloc_entry, 3475 asymbol *symbol, void *data, 3476 asection *input_section, bfd *output_bfd, 3477 char **error_message ATTRIBUTE_UNUSED) 3478{ 3479 /* This part is from bfd_elf_generic_reloc. */ 3480 if (output_bfd != NULL 3481 && (symbol->flags & BSF_SECTION_SYM) == 0 3482 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3483 { 3484 reloc_entry->address += input_section->output_offset; 3485 return bfd_reloc_ok; 3486 } 3487 3488 if (output_bfd != NULL) 3489 /* FIXME: See bfd_perform_relocation. Is this right? */ 3490 return bfd_reloc_continue; 3491 3492 return nios2_elf32_do_pcrel_hiadj16_relocate ( 3493 abfd, reloc_entry->howto, input_section, data, reloc_entry->address, 3494 (symbol->value + symbol->section->output_section->vma 3495 + symbol->section->output_offset), 3496 reloc_entry->addend); 3497} 3498 3499static bfd_reloc_status_type 3500nios2_elf32_pcrel16_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3501 void *data, asection *input_section, 3502 bfd *output_bfd, 3503 char **error_message ATTRIBUTE_UNUSED) 3504{ 3505 /* This part is from bfd_elf_generic_reloc. */ 3506 if (output_bfd != NULL 3507 && (symbol->flags & BSF_SECTION_SYM) == 0 3508 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3509 { 3510 reloc_entry->address += input_section->output_offset; 3511 return bfd_reloc_ok; 3512 } 3513 3514 if (output_bfd != NULL) 3515 /* FIXME: See bfd_perform_relocation. Is this right? */ 3516 return bfd_reloc_continue; 3517 3518 return nios2_elf32_do_pcrel16_relocate (abfd, reloc_entry->howto, 3519 input_section, 3520 data, reloc_entry->address, 3521 (symbol->value 3522 + symbol->section->output_section->vma 3523 + symbol->section->output_offset), 3524 reloc_entry->addend); 3525} 3526 3527static bfd_reloc_status_type 3528nios2_elf32_call26_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3529 void *data, asection *input_section, 3530 bfd *output_bfd, 3531 char **error_message ATTRIBUTE_UNUSED) 3532{ 3533 /* This part is from bfd_elf_generic_reloc. */ 3534 if (output_bfd != NULL 3535 && (symbol->flags & BSF_SECTION_SYM) == 0 3536 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3537 { 3538 reloc_entry->address += input_section->output_offset; 3539 return bfd_reloc_ok; 3540 } 3541 3542 if (output_bfd != NULL) 3543 /* FIXME: See bfd_perform_relocation. Is this right? */ 3544 return bfd_reloc_continue; 3545 3546 return nios2_elf32_do_call26_relocate (abfd, reloc_entry->howto, 3547 input_section, 3548 data, reloc_entry->address, 3549 (symbol->value 3550 + symbol->section->output_section->vma 3551 + symbol->section->output_offset), 3552 reloc_entry->addend); 3553} 3554 3555static bfd_reloc_status_type 3556nios2_elf32_gprel_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3557 void *data, asection *input_section, 3558 bfd *output_bfd, char **msg) 3559{ 3560 bfd_vma relocation; 3561 bfd_vma gp; 3562 bfd_reloc_status_type r; 3563 3564 3565 /* This part is from bfd_elf_generic_reloc. */ 3566 if (output_bfd != NULL 3567 && (symbol->flags & BSF_SECTION_SYM) == 0 3568 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3569 { 3570 reloc_entry->address += input_section->output_offset; 3571 return bfd_reloc_ok; 3572 } 3573 3574 if (output_bfd != NULL) 3575 /* FIXME: See bfd_perform_relocation. Is this right? */ 3576 return bfd_reloc_continue; 3577 3578 relocation = (symbol->value 3579 + symbol->section->output_section->vma 3580 + symbol->section->output_offset); 3581 3582 /* This assumes we've already cached the _gp symbol. */ 3583 r = nios2_elf_final_gp (abfd, symbol, FALSE, msg, &gp); 3584 if (r == bfd_reloc_ok) 3585 { 3586 relocation = relocation + reloc_entry->addend - gp; 3587 reloc_entry->addend = 0; 3588 if ((signed) relocation < -32768 || (signed) relocation > 32767) 3589 { 3590 *msg = _("global pointer relative address out of range"); 3591 r = bfd_reloc_outofrange; 3592 } 3593 else 3594 r = nios2_elf32_do_gprel_relocate (abfd, reloc_entry->howto, 3595 input_section, 3596 data, reloc_entry->address, 3597 relocation, reloc_entry->addend); 3598 } 3599 3600 return r; 3601} 3602 3603static bfd_reloc_status_type 3604nios2_elf32_ujmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3605 void *data, asection *input_section, 3606 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 3607{ 3608 /* This part is from bfd_elf_generic_reloc. */ 3609 if (output_bfd != NULL 3610 && (symbol->flags & BSF_SECTION_SYM) == 0 3611 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3612 { 3613 reloc_entry->address += input_section->output_offset; 3614 return bfd_reloc_ok; 3615 } 3616 3617 if (output_bfd != NULL) 3618 /* FIXME: See bfd_perform_relocation. Is this right? */ 3619 return bfd_reloc_continue; 3620 3621 return nios2_elf32_do_ujmp_relocate (abfd, reloc_entry->howto, 3622 input_section, 3623 data, reloc_entry->address, 3624 (symbol->value 3625 + symbol->section->output_section->vma 3626 + symbol->section->output_offset), 3627 reloc_entry->addend); 3628} 3629 3630static bfd_reloc_status_type 3631nios2_elf32_cjmp_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3632 void *data, asection *input_section, 3633 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 3634{ 3635 /* This part is from bfd_elf_generic_reloc. */ 3636 if (output_bfd != NULL 3637 && (symbol->flags & BSF_SECTION_SYM) == 0 3638 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3639 { 3640 reloc_entry->address += input_section->output_offset; 3641 return bfd_reloc_ok; 3642 } 3643 3644 if (output_bfd != NULL) 3645 /* FIXME: See bfd_perform_relocation. Is this right? */ 3646 return bfd_reloc_continue; 3647 3648 return nios2_elf32_do_cjmp_relocate (abfd, reloc_entry->howto, 3649 input_section, 3650 data, reloc_entry->address, 3651 (symbol->value 3652 + symbol->section->output_section->vma 3653 + symbol->section->output_offset), 3654 reloc_entry->addend); 3655} 3656 3657static bfd_reloc_status_type 3658nios2_elf32_callr_relocate (bfd *abfd, arelent *reloc_entry, asymbol *symbol, 3659 void *data, asection *input_section, 3660 bfd *output_bfd, char **msg ATTRIBUTE_UNUSED) 3661{ 3662 /* This part is from bfd_elf_generic_reloc. */ 3663 if (output_bfd != NULL 3664 && (symbol->flags & BSF_SECTION_SYM) == 0 3665 && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 3666 { 3667 reloc_entry->address += input_section->output_offset; 3668 return bfd_reloc_ok; 3669 } 3670 3671 if (output_bfd != NULL) 3672 /* FIXME: See bfd_perform_relocation. Is this right? */ 3673 return bfd_reloc_continue; 3674 3675 return nios2_elf32_do_callr_relocate (abfd, reloc_entry->howto, 3676 input_section, 3677 data, reloc_entry->address, 3678 (symbol->value 3679 + symbol->section->output_section->vma 3680 + symbol->section->output_offset), 3681 reloc_entry->addend); 3682} 3683 3684 3685/* Implement elf_backend_relocate_section. */ 3686static bfd_boolean 3687nios2_elf32_relocate_section (bfd *output_bfd, 3688 struct bfd_link_info *info, 3689 bfd *input_bfd, 3690 asection *input_section, 3691 bfd_byte *contents, 3692 Elf_Internal_Rela *relocs, 3693 Elf_Internal_Sym *local_syms, 3694 asection **local_sections) 3695{ 3696 Elf_Internal_Shdr *symtab_hdr; 3697 struct elf_link_hash_entry **sym_hashes; 3698 Elf_Internal_Rela *rel; 3699 Elf_Internal_Rela *relend; 3700 struct elf32_nios2_link_hash_table *htab; 3701 asection *sgot; 3702 asection *splt; 3703 asection *sreloc = NULL; 3704 bfd_vma *local_got_offsets; 3705 bfd_vma got_base; 3706 3707 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 3708 sym_hashes = elf_sym_hashes (input_bfd); 3709 relend = relocs + input_section->reloc_count; 3710 3711 htab = elf32_nios2_hash_table (info); 3712 sgot = htab->root.sgot; 3713 splt = htab->root.splt; 3714 local_got_offsets = elf_local_got_offsets (input_bfd); 3715 3716 if (htab->h_gp_got == NULL) 3717 got_base = 0; 3718 else 3719 got_base = htab->h_gp_got->root.u.def.value; 3720 3721 for (rel = relocs; rel < relend; rel++) 3722 { 3723 reloc_howto_type *howto; 3724 unsigned long r_symndx; 3725 Elf_Internal_Sym *sym; 3726 asection *sec; 3727 struct elf_link_hash_entry *h; 3728 struct elf32_nios2_link_hash_entry *eh; 3729 bfd_vma relocation; 3730 bfd_vma gp; 3731 bfd_reloc_status_type r = bfd_reloc_ok; 3732 const char *name = NULL; 3733 int r_type; 3734 const char *format; 3735 char msgbuf[256]; 3736 const char* msg = (const char*) NULL; 3737 bfd_boolean unresolved_reloc; 3738 bfd_vma off; 3739 int use_plt; 3740 3741 r_type = ELF32_R_TYPE (rel->r_info); 3742 r_symndx = ELF32_R_SYM (rel->r_info); 3743 3744 howto = lookup_howto ((unsigned) ELF32_R_TYPE (rel->r_info), output_bfd); 3745 h = NULL; 3746 sym = NULL; 3747 sec = NULL; 3748 3749 if (r_symndx < symtab_hdr->sh_info) 3750 { 3751 sym = local_syms + r_symndx; 3752 sec = local_sections[r_symndx]; 3753 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 3754 } 3755 else 3756 { 3757 bfd_boolean warned, ignored; 3758 3759 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 3760 r_symndx, symtab_hdr, sym_hashes, 3761 h, sec, relocation, 3762 unresolved_reloc, warned, ignored); 3763 } 3764 3765 if (sec && discarded_section (sec)) 3766 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 3767 rel, 1, relend, howto, 0, contents); 3768 3769 /* Nothing more to do unless this is a final link. */ 3770 if (bfd_link_relocatable (info)) 3771 continue; 3772 3773 if (howto) 3774 { 3775 switch (howto->type) 3776 { 3777 case R_NIOS2_HI16: 3778 r = nios2_elf32_do_hi16_relocate (input_bfd, howto, 3779 input_section, 3780 contents, rel->r_offset, 3781 relocation, rel->r_addend); 3782 break; 3783 case R_NIOS2_LO16: 3784 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 3785 input_section, 3786 contents, rel->r_offset, 3787 relocation, rel->r_addend); 3788 break; 3789 case R_NIOS2_PCREL_LO: 3790 r = nios2_elf32_do_pcrel_lo16_relocate (input_bfd, howto, 3791 input_section, 3792 contents, 3793 rel->r_offset, 3794 relocation, 3795 rel->r_addend); 3796 break; 3797 case R_NIOS2_HIADJ16: 3798 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 3799 input_section, contents, 3800 rel->r_offset, relocation, 3801 rel->r_addend); 3802 break; 3803 case R_NIOS2_PCREL_HA: 3804 r = nios2_elf32_do_pcrel_hiadj16_relocate (input_bfd, howto, 3805 input_section, 3806 contents, 3807 rel->r_offset, 3808 relocation, 3809 rel->r_addend); 3810 break; 3811 case R_NIOS2_PCREL16: 3812 r = nios2_elf32_do_pcrel16_relocate (input_bfd, howto, 3813 input_section, contents, 3814 rel->r_offset, relocation, 3815 rel->r_addend); 3816 break; 3817 case R_NIOS2_GPREL: 3818 /* Turns an absolute address into a gp-relative address. */ 3819 if (!nios2_elf_assign_gp (output_bfd, &gp, info)) 3820 { 3821 bfd_vma reloc_address; 3822 3823 if (sec && sec->output_section) 3824 reloc_address = (sec->output_section->vma 3825 + sec->output_offset 3826 + rel->r_offset); 3827 else 3828 reloc_address = 0; 3829 3830 format = _("global pointer relative relocation at address " 3831 "0x%08x when _gp not defined\n"); 3832 sprintf (msgbuf, format, reloc_address); 3833 msg = msgbuf; 3834 r = bfd_reloc_dangerous; 3835 } 3836 else 3837 { 3838 bfd_vma symbol_address = rel->r_addend + relocation; 3839 relocation = symbol_address - gp; 3840 rel->r_addend = 0; 3841 if (((signed) relocation < -32768 3842 || (signed) relocation > 32767) 3843 && (!h 3844 || h->root.type == bfd_link_hash_defined 3845 || h->root.type == bfd_link_hash_defweak)) 3846 { 3847 if (h) 3848 name = h->root.root.string; 3849 /* xgettext:c-format */ 3850 format = _("Unable to reach %s (at 0x%08x) from the " 3851 "global pointer (at 0x%08x) because the " 3852 "offset (%d) is out of the allowed range, " 3853 "-32678 to 32767.\n" ); 3854 sprintf (msgbuf, format, name, symbol_address, gp, 3855 (signed)relocation); 3856 msg = msgbuf; 3857 r = bfd_reloc_outofrange; 3858 } 3859 else 3860 r = _bfd_final_link_relocate (howto, input_bfd, 3861 input_section, contents, 3862 rel->r_offset, relocation, 3863 rel->r_addend); 3864 } 3865 break; 3866 case R_NIOS2_UJMP: 3867 r = nios2_elf32_do_ujmp_relocate (input_bfd, howto, 3868 input_section, 3869 contents, rel->r_offset, 3870 relocation, rel->r_addend); 3871 break; 3872 case R_NIOS2_CJMP: 3873 r = nios2_elf32_do_cjmp_relocate (input_bfd, howto, 3874 input_section, 3875 contents, rel->r_offset, 3876 relocation, rel->r_addend); 3877 break; 3878 case R_NIOS2_CALLR: 3879 r = nios2_elf32_do_callr_relocate (input_bfd, howto, 3880 input_section, contents, 3881 rel->r_offset, relocation, 3882 rel->r_addend); 3883 break; 3884 case R_NIOS2_CALL26: 3885 case R_NIOS2_CALL26_NOAT: 3886 /* If we have a call to an undefined weak symbol, we just want 3887 to stuff a zero in the bits of the call instruction and 3888 bypass the normal call26 relocation handling, because it'll 3889 diagnose an overflow error if address 0 isn't in the same 3890 256MB segment as the call site. Presumably the call 3891 should be guarded by a null check anyway. */ 3892 if (h != NULL && h->root.type == bfd_link_hash_undefweak) 3893 { 3894 BFD_ASSERT (relocation == 0 && rel->r_addend == 0); 3895 r = _bfd_final_link_relocate (howto, input_bfd, 3896 input_section, contents, 3897 rel->r_offset, relocation, 3898 rel->r_addend); 3899 break; 3900 } 3901 /* Handle relocations which should use the PLT entry. 3902 NIOS2_BFD_RELOC_32 relocations will use the symbol's value, 3903 which may point to a PLT entry, but we don't need to handle 3904 that here. If we created a PLT entry, all branches in this 3905 object should go to it. */ 3906 if (h != NULL && splt != NULL && h->plt.offset != (bfd_vma) -1) 3907 { 3908 /* If we've created a .plt section, and assigned a PLT entry 3909 to this function, it should not be known to bind locally. 3910 If it were, we would have cleared the PLT entry. */ 3911 BFD_ASSERT (!SYMBOL_CALLS_LOCAL (info, h)); 3912 3913 relocation = (splt->output_section->vma 3914 + splt->output_offset 3915 + h->plt.offset); 3916 3917 unresolved_reloc = FALSE; 3918 } 3919 /* Detect R_NIOS2_CALL26 relocations that would overflow the 3920 256MB segment. Replace the target with a reference to a 3921 trampoline instead. 3922 Note that htab->stub_group is null if relaxation has been 3923 disabled by the --no-relax linker command-line option, so 3924 we can use that to skip this processing entirely. */ 3925 if (howto->type == R_NIOS2_CALL26 && htab->stub_group) 3926 { 3927 bfd_vma dest = relocation + rel->r_addend; 3928 enum elf32_nios2_stub_type stub_type; 3929 3930 eh = (struct elf32_nios2_link_hash_entry *)h; 3931 stub_type = nios2_type_of_stub (input_section, rel, eh, 3932 htab, dest, NULL); 3933 3934 if (stub_type != nios2_stub_none) 3935 { 3936 struct elf32_nios2_stub_hash_entry *hsh; 3937 3938 hsh = nios2_get_stub_entry (input_section, sec, 3939 eh, rel, htab, stub_type); 3940 if (hsh == NULL) 3941 { 3942 r = bfd_reloc_undefined; 3943 break; 3944 } 3945 3946 dest = (hsh->stub_offset 3947 + hsh->stub_sec->output_offset 3948 + hsh->stub_sec->output_section->vma); 3949 r = nios2_elf32_do_call26_relocate (input_bfd, howto, 3950 input_section, 3951 contents, 3952 rel->r_offset, 3953 dest, 0); 3954 break; 3955 } 3956 } 3957 3958 /* Normal case. */ 3959 r = nios2_elf32_do_call26_relocate (input_bfd, howto, 3960 input_section, contents, 3961 rel->r_offset, relocation, 3962 rel->r_addend); 3963 break; 3964 case R_NIOS2_ALIGN: 3965 r = bfd_reloc_ok; 3966 /* For symmetry this would be 3967 r = nios2_elf32_do_ignore_reloc (input_bfd, howto, 3968 input_section, contents, 3969 rel->r_offset, relocation, 3970 rel->r_addend); 3971 but do_ignore_reloc would do no more than return 3972 bfd_reloc_ok. */ 3973 break; 3974 3975 case R_NIOS2_GOT16: 3976 case R_NIOS2_CALL16: 3977 case R_NIOS2_GOT_LO: 3978 case R_NIOS2_GOT_HA: 3979 case R_NIOS2_CALL_LO: 3980 case R_NIOS2_CALL_HA: 3981 /* Relocation is to the entry for this symbol in the 3982 global offset table. */ 3983 if (sgot == NULL) 3984 { 3985 r = bfd_reloc_notsupported; 3986 break; 3987 } 3988 3989 use_plt = 0; 3990 3991 if (h != NULL) 3992 { 3993 bfd_boolean dyn; 3994 3995 eh = (struct elf32_nios2_link_hash_entry *)h; 3996 use_plt = (eh->got_types_used == CALL_USED 3997 && h->plt.offset != (bfd_vma) -1); 3998 3999 off = h->got.offset; 4000 BFD_ASSERT (off != (bfd_vma) -1); 4001 dyn = htab->root.dynamic_sections_created; 4002 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 4003 bfd_link_pic (info), 4004 h) 4005 || (bfd_link_pic (info) 4006 && SYMBOL_REFERENCES_LOCAL (info, h)) 4007 || (ELF_ST_VISIBILITY (h->other) 4008 && h->root.type == bfd_link_hash_undefweak)) 4009 { 4010 /* This is actually a static link, or it is a -Bsymbolic 4011 link and the symbol is defined locally. We must 4012 initialize this entry in the global offset table. 4013 Since the offset must always be a multiple of 4, we 4014 use the least significant bit to record whether we 4015 have initialized it already. 4016 4017 When doing a dynamic link, we create a .rela.got 4018 relocation entry to initialize the value. This is 4019 done in the finish_dynamic_symbol routine. */ 4020 if ((off & 1) != 0) 4021 off &= ~1; 4022 else 4023 { 4024 bfd_put_32 (output_bfd, relocation, 4025 sgot->contents + off); 4026 h->got.offset |= 1; 4027 } 4028 } 4029 else 4030 unresolved_reloc = FALSE; 4031 } 4032 else 4033 { 4034 BFD_ASSERT (local_got_offsets != NULL 4035 && local_got_offsets[r_symndx] != (bfd_vma) -1); 4036 4037 off = local_got_offsets[r_symndx]; 4038 4039 /* The offset must always be a multiple of 4. We use the 4040 least significant bit to record whether we have already 4041 generated the necessary reloc. */ 4042 if ((off & 1) != 0) 4043 off &= ~1; 4044 else 4045 { 4046 bfd_put_32 (output_bfd, relocation, 4047 sgot->contents + off); 4048 4049 if (bfd_link_pic (info)) 4050 { 4051 asection *srelgot; 4052 Elf_Internal_Rela outrel; 4053 bfd_byte *loc; 4054 4055 srelgot = htab->root.srelgot; 4056 BFD_ASSERT (srelgot != NULL); 4057 4058 outrel.r_addend = relocation; 4059 outrel.r_offset = (sgot->output_section->vma 4060 + sgot->output_offset 4061 + off); 4062 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 4063 loc = srelgot->contents; 4064 loc += (srelgot->reloc_count++ * 4065 sizeof (Elf32_External_Rela)); 4066 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4067 } 4068 4069 local_got_offsets[r_symndx] |= 1; 4070 } 4071 } 4072 4073 if (use_plt && bfd_link_pic (info)) 4074 { 4075 off = ((h->plt.offset - 24) / 12 + 3) * 4; 4076 relocation = (htab->root.sgotplt->output_offset + off 4077 - got_base); 4078 } 4079 else 4080 relocation = sgot->output_offset + off - got_base; 4081 4082 /* This relocation does not use the addend. */ 4083 rel->r_addend = 0; 4084 4085 switch (howto->type) 4086 { 4087 case R_NIOS2_GOT_LO: 4088 case R_NIOS2_CALL_LO: 4089 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 4090 input_section, contents, 4091 rel->r_offset, relocation, 4092 rel->r_addend); 4093 break; 4094 case R_NIOS2_GOT_HA: 4095 case R_NIOS2_CALL_HA: 4096 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 4097 input_section, contents, 4098 rel->r_offset, 4099 relocation, 4100 rel->r_addend); 4101 break; 4102 default: 4103 r = _bfd_final_link_relocate (howto, input_bfd, 4104 input_section, contents, 4105 rel->r_offset, relocation, 4106 rel->r_addend); 4107 break; 4108 } 4109 break; 4110 4111 case R_NIOS2_GOTOFF_LO: 4112 case R_NIOS2_GOTOFF_HA: 4113 case R_NIOS2_GOTOFF: 4114 /* Relocation is relative to the global offset table pointer. */ 4115 4116 BFD_ASSERT (sgot != NULL); 4117 if (sgot == NULL) 4118 { 4119 r = bfd_reloc_notsupported; 4120 break; 4121 } 4122 4123 /* Note that sgot->output_offset is not involved in this 4124 calculation. We always want the start of .got. */ 4125 relocation -= sgot->output_section->vma; 4126 4127 /* Now we adjust the relocation to be relative to the GOT pointer 4128 (the _gp_got symbol), which possibly contains the 0x8000 bias. */ 4129 relocation -= got_base; 4130 4131 switch (howto->type) 4132 { 4133 case R_NIOS2_GOTOFF_LO: 4134 r = nios2_elf32_do_lo16_relocate (input_bfd, howto, 4135 input_section, contents, 4136 rel->r_offset, relocation, 4137 rel->r_addend); 4138 break; 4139 case R_NIOS2_GOTOFF_HA: 4140 r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto, 4141 input_section, contents, 4142 rel->r_offset, 4143 relocation, 4144 rel->r_addend); 4145 break; 4146 default: 4147 r = _bfd_final_link_relocate (howto, input_bfd, 4148 input_section, contents, 4149 rel->r_offset, relocation, 4150 rel->r_addend); 4151 break; 4152 } 4153 break; 4154 4155 case R_NIOS2_TLS_LDO16: 4156 relocation -= dtpoff_base (info) + DTP_OFFSET; 4157 4158 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4159 contents, rel->r_offset, 4160 relocation, rel->r_addend); 4161 break; 4162 case R_NIOS2_TLS_LDM16: 4163 if (htab->root.sgot == NULL) 4164 abort (); 4165 4166 off = htab->tls_ldm_got.offset; 4167 4168 if ((off & 1) != 0) 4169 off &= ~1; 4170 else 4171 { 4172 /* If we don't know the module number, create a relocation 4173 for it. */ 4174 if (bfd_link_pic (info)) 4175 { 4176 Elf_Internal_Rela outrel; 4177 bfd_byte *loc; 4178 4179 if (htab->root.srelgot == NULL) 4180 abort (); 4181 4182 outrel.r_addend = 0; 4183 outrel.r_offset = (htab->root.sgot->output_section->vma 4184 + htab->root.sgot->output_offset 4185 + off); 4186 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_TLS_DTPMOD); 4187 4188 loc = htab->root.srelgot->contents; 4189 loc += (htab->root.srelgot->reloc_count++ 4190 * sizeof (Elf32_External_Rela)); 4191 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4192 } 4193 else 4194 bfd_put_32 (output_bfd, 1, 4195 htab->root.sgot->contents + off); 4196 4197 htab->tls_ldm_got.offset |= 1; 4198 } 4199 4200 relocation = htab->root.sgot->output_offset + off - got_base; 4201 4202 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4203 contents, rel->r_offset, 4204 relocation, rel->r_addend); 4205 4206 break; 4207 case R_NIOS2_TLS_GD16: 4208 case R_NIOS2_TLS_IE16: 4209 { 4210 int indx; 4211 char tls_type; 4212 4213 if (htab->root.sgot == NULL) 4214 abort (); 4215 4216 indx = 0; 4217 if (h != NULL) 4218 { 4219 bfd_boolean dyn; 4220 dyn = htab->root.dynamic_sections_created; 4221 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 4222 bfd_link_pic (info), 4223 h) 4224 && (!bfd_link_pic (info) 4225 || !SYMBOL_REFERENCES_LOCAL (info, h))) 4226 { 4227 unresolved_reloc = FALSE; 4228 indx = h->dynindx; 4229 } 4230 off = h->got.offset; 4231 tls_type = (((struct elf32_nios2_link_hash_entry *) h) 4232 ->tls_type); 4233 } 4234 else 4235 { 4236 if (local_got_offsets == NULL) 4237 abort (); 4238 off = local_got_offsets[r_symndx]; 4239 tls_type = (elf32_nios2_local_got_tls_type (input_bfd) 4240 [r_symndx]); 4241 } 4242 4243 if (tls_type == GOT_UNKNOWN) 4244 abort (); 4245 4246 if ((off & 1) != 0) 4247 off &= ~1; 4248 else 4249 { 4250 bfd_boolean need_relocs = FALSE; 4251 Elf_Internal_Rela outrel; 4252 bfd_byte *loc = NULL; 4253 int cur_off = off; 4254 4255 /* The GOT entries have not been initialized yet. Do it 4256 now, and emit any relocations. If both an IE GOT and a 4257 GD GOT are necessary, we emit the GD first. */ 4258 4259 if ((bfd_link_pic (info) || indx != 0) 4260 && (h == NULL 4261 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 4262 || h->root.type != bfd_link_hash_undefweak)) 4263 { 4264 need_relocs = TRUE; 4265 if (htab->root.srelgot == NULL) 4266 abort (); 4267 loc = htab->root.srelgot->contents; 4268 loc += (htab->root.srelgot->reloc_count * 4269 sizeof (Elf32_External_Rela)); 4270 } 4271 4272 if (tls_type & GOT_TLS_GD) 4273 { 4274 if (need_relocs) 4275 { 4276 outrel.r_addend = 0; 4277 outrel.r_offset = (htab->root.sgot->output_section->vma 4278 + htab->root.sgot->output_offset 4279 + cur_off); 4280 outrel.r_info = ELF32_R_INFO (indx, 4281 R_NIOS2_TLS_DTPMOD); 4282 4283 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 4284 loc); 4285 htab->root.srelgot->reloc_count++; 4286 loc += sizeof (Elf32_External_Rela); 4287 4288 if (indx == 0) 4289 bfd_put_32 (output_bfd, 4290 (relocation - dtpoff_base (info) - 4291 DTP_OFFSET), 4292 htab->root.sgot->contents + cur_off + 4); 4293 else 4294 { 4295 outrel.r_addend = 0; 4296 outrel.r_info = ELF32_R_INFO (indx, 4297 R_NIOS2_TLS_DTPREL); 4298 outrel.r_offset += 4; 4299 4300 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 4301 loc); 4302 htab->root.srelgot->reloc_count++; 4303 loc += sizeof (Elf32_External_Rela); 4304 } 4305 } 4306 else 4307 { 4308 /* If we are not emitting relocations for a 4309 general dynamic reference, then we must be in a 4310 static link or an executable link with the 4311 symbol binding locally. Mark it as belonging 4312 to module 1, the executable. */ 4313 bfd_put_32 (output_bfd, 1, 4314 htab->root.sgot->contents + cur_off); 4315 bfd_put_32 (output_bfd, (relocation - 4316 dtpoff_base (info) - 4317 DTP_OFFSET), 4318 htab->root.sgot->contents + cur_off + 4); 4319 } 4320 4321 cur_off += 8; 4322 } 4323 4324 if (tls_type & GOT_TLS_IE) 4325 { 4326 if (need_relocs) 4327 { 4328 if (indx == 0) 4329 outrel.r_addend = (relocation - 4330 dtpoff_base (info)); 4331 else 4332 outrel.r_addend = 0; 4333 outrel.r_offset = (htab->root.sgot->output_section->vma 4334 + htab->root.sgot->output_offset 4335 + cur_off); 4336 outrel.r_info = ELF32_R_INFO (indx, 4337 R_NIOS2_TLS_TPREL); 4338 4339 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 4340 loc); 4341 htab->root.srelgot->reloc_count++; 4342 loc += sizeof (Elf32_External_Rela); 4343 } 4344 else 4345 bfd_put_32 (output_bfd, (tpoff (info, relocation) 4346 - TP_OFFSET), 4347 htab->root.sgot->contents + cur_off); 4348 cur_off += 4; 4349 } 4350 4351 if (h != NULL) 4352 h->got.offset |= 1; 4353 else 4354 local_got_offsets[r_symndx] |= 1; 4355 } 4356 4357 if ((tls_type & GOT_TLS_GD) && r_type != R_NIOS2_TLS_GD16) 4358 off += 8; 4359 relocation = htab->root.sgot->output_offset + off - got_base; 4360 4361 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4362 contents, rel->r_offset, 4363 relocation, rel->r_addend); 4364 } 4365 4366 break; 4367 case R_NIOS2_TLS_LE16: 4368 if (bfd_link_dll (info)) 4369 { 4370 _bfd_error_handler 4371 /* xgettext:c-format */ 4372 (_("%B(%A+0x%lx): R_NIOS2_TLS_LE16 relocation not " 4373 "permitted in shared object"), 4374 input_bfd, input_section, 4375 (long) rel->r_offset, howto->name); 4376 return FALSE; 4377 } 4378 else 4379 relocation = tpoff (info, relocation) - TP_OFFSET; 4380 4381 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4382 contents, rel->r_offset, 4383 relocation, rel->r_addend); 4384 break; 4385 4386 case R_NIOS2_BFD_RELOC_32: 4387 if (bfd_link_pic (info) 4388 && (input_section->flags & SEC_ALLOC) != 0 4389 && (h == NULL 4390 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 4391 || h->root.type != bfd_link_hash_undefweak)) 4392 { 4393 Elf_Internal_Rela outrel; 4394 bfd_byte *loc; 4395 bfd_boolean skip, relocate; 4396 4397 /* When generating a shared object, these relocations 4398 are copied into the output file to be resolved at run 4399 time. */ 4400 4401 skip = FALSE; 4402 relocate = FALSE; 4403 4404 outrel.r_offset 4405 = _bfd_elf_section_offset (output_bfd, info, 4406 input_section, rel->r_offset); 4407 if (outrel.r_offset == (bfd_vma) -1) 4408 skip = TRUE; 4409 else if (outrel.r_offset == (bfd_vma) -2) 4410 skip = TRUE, relocate = TRUE; 4411 outrel.r_offset += (input_section->output_section->vma 4412 + input_section->output_offset); 4413 4414 if (skip) 4415 memset (&outrel, 0, sizeof outrel); 4416 else if (h != NULL 4417 && h->dynindx != -1 4418 && (!bfd_link_pic (info) 4419 || !SYMBOLIC_BIND (info, h) 4420 || !h->def_regular)) 4421 { 4422 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); 4423 outrel.r_addend = rel->r_addend; 4424 } 4425 else 4426 { 4427 /* This symbol is local, or marked to become local. */ 4428 outrel.r_addend = relocation + rel->r_addend; 4429 relocate = TRUE; 4430 outrel.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 4431 } 4432 4433 sreloc = elf_section_data (input_section)->sreloc; 4434 if (sreloc == NULL) 4435 abort (); 4436 4437 loc = sreloc->contents; 4438 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela); 4439 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4440 4441 /* This reloc will be computed at runtime, so there's no 4442 need to do anything now, except for R_NIOS2_BFD_RELOC_32 4443 relocations that have been turned into 4444 R_NIOS2_RELATIVE. */ 4445 if (!relocate) 4446 break; 4447 } 4448 4449 r = _bfd_final_link_relocate (howto, input_bfd, 4450 input_section, contents, 4451 rel->r_offset, relocation, 4452 rel->r_addend); 4453 break; 4454 4455 case R_NIOS2_TLS_DTPREL: 4456 relocation -= dtpoff_base (info); 4457 /* Fall through. */ 4458 4459 default: 4460 r = _bfd_final_link_relocate (howto, input_bfd, 4461 input_section, contents, 4462 rel->r_offset, relocation, 4463 rel->r_addend); 4464 break; 4465 } 4466 } 4467 else 4468 r = bfd_reloc_notsupported; 4469 4470 if (r != bfd_reloc_ok) 4471 { 4472 if (h != NULL) 4473 name = h->root.root.string; 4474 else 4475 { 4476 name = bfd_elf_string_from_elf_section (input_bfd, 4477 symtab_hdr->sh_link, 4478 sym->st_name); 4479 if (name == NULL || *name == '\0') 4480 name = bfd_section_name (input_bfd, sec); 4481 } 4482 4483 switch (r) 4484 { 4485 case bfd_reloc_overflow: 4486 (*info->callbacks->reloc_overflow) (info, NULL, name, 4487 howto->name, (bfd_vma) 0, 4488 input_bfd, input_section, 4489 rel->r_offset); 4490 break; 4491 4492 case bfd_reloc_undefined: 4493 (*info->callbacks->undefined_symbol) (info, name, input_bfd, 4494 input_section, 4495 rel->r_offset, TRUE); 4496 break; 4497 4498 case bfd_reloc_outofrange: 4499 if (msg == NULL) 4500 msg = _("relocation out of range"); 4501 break; 4502 4503 case bfd_reloc_notsupported: 4504 if (msg == NULL) 4505 msg = _("unsupported relocation"); 4506 break; 4507 4508 case bfd_reloc_dangerous: 4509 if (msg == NULL) 4510 msg = _("dangerous relocation"); 4511 break; 4512 4513 default: 4514 if (msg == NULL) 4515 msg = _("unknown error"); 4516 break; 4517 } 4518 4519 if (msg) 4520 { 4521 (*info->callbacks->warning) (info, msg, name, input_bfd, 4522 input_section, rel->r_offset); 4523 return FALSE; 4524 } 4525 } 4526 } 4527 return TRUE; 4528} 4529 4530/* Implement elf-backend_section_flags: 4531 Convert NIOS2 specific section flags to bfd internal section flags. */ 4532static bfd_boolean 4533nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr) 4534{ 4535 if (hdr->sh_flags & SHF_NIOS2_GPREL) 4536 *flags |= SEC_SMALL_DATA; 4537 4538 return TRUE; 4539} 4540 4541/* Implement elf_backend_fake_sections: 4542 Set the correct type for an NIOS2 ELF section. We do this by the 4543 section name, which is a hack, but ought to work. */ 4544static bfd_boolean 4545nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED, 4546 Elf_Internal_Shdr *hdr, asection *sec) 4547{ 4548 register const char *name = bfd_get_section_name (abfd, sec); 4549 4550 if ((sec->flags & SEC_SMALL_DATA) 4551 || strcmp (name, ".sdata") == 0 4552 || strcmp (name, ".sbss") == 0 4553 || strcmp (name, ".lit4") == 0 || strcmp (name, ".lit8") == 0) 4554 hdr->sh_flags |= SHF_NIOS2_GPREL; 4555 4556 return TRUE; 4557} 4558 4559/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up 4560 shortcuts to them in our hash table. */ 4561static bfd_boolean 4562create_got_section (bfd *dynobj, struct bfd_link_info *info) 4563{ 4564 struct elf32_nios2_link_hash_table *htab; 4565 struct elf_link_hash_entry *h; 4566 4567 htab = elf32_nios2_hash_table (info); 4568 4569 if (! _bfd_elf_create_got_section (dynobj, info)) 4570 return FALSE; 4571 4572 /* In order for the two loads in .PLTresolve to share the same %hiadj, 4573 _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */ 4574 if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4)) 4575 return FALSE; 4576 4577 /* The Nios II ABI specifies that GOT-relative relocations are relative 4578 to the linker-created symbol _gp_got, rather than using 4579 _GLOBAL_OFFSET_TABLE_ directly. In particular, the latter always 4580 points to the base of the GOT while _gp_got may include a bias. */ 4581 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.sgotplt, 4582 "_gp_got"); 4583 htab->h_gp_got = h; 4584 if (h == NULL) 4585 return FALSE; 4586 4587 return TRUE; 4588} 4589 4590/* Implement elf_backend_create_dynamic_sections: 4591 Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and 4592 .rela.bss sections in DYNOBJ, and set up shortcuts to them in our 4593 hash table. */ 4594static bfd_boolean 4595nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) 4596{ 4597 struct elf32_nios2_link_hash_table *htab; 4598 4599 htab = elf32_nios2_hash_table (info); 4600 if (!htab->root.sgot && !create_got_section (dynobj, info)) 4601 return FALSE; 4602 4603 if (!_bfd_elf_create_dynamic_sections (dynobj, info)) 4604 return FALSE; 4605 4606 /* In order for the two loads in a shared object .PLTresolve to share the 4607 same %hiadj, the start of the PLT (as well as the GOT) must be aligned 4608 to a 16-byte boundary. This is because the addresses for these loads 4609 include the -(.plt+4) PIC correction. */ 4610 return bfd_set_section_alignment (dynobj, htab->root.splt, 4); 4611} 4612 4613/* Implement elf_backend_copy_indirect_symbol: 4614 Copy the extra info we tack onto an elf_link_hash_entry. */ 4615static void 4616nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info, 4617 struct elf_link_hash_entry *dir, 4618 struct elf_link_hash_entry *ind) 4619{ 4620 struct elf32_nios2_link_hash_entry *edir, *eind; 4621 4622 edir = (struct elf32_nios2_link_hash_entry *) dir; 4623 eind = (struct elf32_nios2_link_hash_entry *) ind; 4624 4625 if (eind->dyn_relocs != NULL) 4626 { 4627 if (edir->dyn_relocs != NULL) 4628 { 4629 struct elf32_nios2_dyn_relocs **pp; 4630 struct elf32_nios2_dyn_relocs *p; 4631 4632 /* Add reloc counts against the indirect sym to the direct sym 4633 list. Merge any entries against the same section. */ 4634 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 4635 { 4636 struct elf32_nios2_dyn_relocs *q; 4637 4638 for (q = edir->dyn_relocs; q != NULL; q = q->next) 4639 if (q->sec == p->sec) 4640 { 4641 q->pc_count += p->pc_count; 4642 q->count += p->count; 4643 *pp = p->next; 4644 break; 4645 } 4646 if (q == NULL) 4647 pp = &p->next; 4648 } 4649 *pp = edir->dyn_relocs; 4650 } 4651 4652 edir->dyn_relocs = eind->dyn_relocs; 4653 eind->dyn_relocs = NULL; 4654 } 4655 4656 if (ind->root.type == bfd_link_hash_indirect 4657 && dir->got.refcount <= 0) 4658 { 4659 edir->tls_type = eind->tls_type; 4660 eind->tls_type = GOT_UNKNOWN; 4661 } 4662 4663 edir->got_types_used |= eind->got_types_used; 4664 4665 _bfd_elf_link_hash_copy_indirect (info, dir, ind); 4666} 4667 4668/* Set the right machine number for a NIOS2 ELF file. */ 4669 4670static bfd_boolean 4671nios2_elf32_object_p (bfd *abfd) 4672{ 4673 unsigned long mach; 4674 4675 mach = elf_elfheader (abfd)->e_flags; 4676 4677 switch (mach) 4678 { 4679 default: 4680 case EF_NIOS2_ARCH_R1: 4681 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1); 4682 break; 4683 case EF_NIOS2_ARCH_R2: 4684 bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2); 4685 break; 4686 } 4687 4688 return TRUE; 4689} 4690 4691/* Implement elf_backend_check_relocs: 4692 Look through the relocs for a section during the first phase. */ 4693static bfd_boolean 4694nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info, 4695 asection *sec, const Elf_Internal_Rela *relocs) 4696{ 4697 Elf_Internal_Shdr *symtab_hdr; 4698 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; 4699 const Elf_Internal_Rela *rel; 4700 const Elf_Internal_Rela *rel_end; 4701 struct elf32_nios2_link_hash_table *htab; 4702 asection *sreloc = NULL; 4703 bfd_signed_vma *local_got_refcounts; 4704 4705 if (bfd_link_relocatable (info)) 4706 return TRUE; 4707 4708 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 4709 sym_hashes = elf_sym_hashes (abfd); 4710 sym_hashes_end = (sym_hashes 4711 + symtab_hdr->sh_size / sizeof (Elf32_External_Sym)); 4712 if (!elf_bad_symtab (abfd)) 4713 sym_hashes_end -= symtab_hdr->sh_info; 4714 local_got_refcounts = elf_local_got_refcounts (abfd); 4715 4716 htab = elf32_nios2_hash_table (info); 4717 4718 rel_end = relocs + sec->reloc_count; 4719 for (rel = relocs; rel < rel_end; rel++) 4720 { 4721 unsigned int r_type; 4722 struct elf_link_hash_entry *h; 4723 unsigned long r_symndx; 4724 4725 r_symndx = ELF32_R_SYM (rel->r_info); 4726 if (r_symndx < symtab_hdr->sh_info) 4727 h = NULL; 4728 else 4729 { 4730 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 4731 while (h->root.type == bfd_link_hash_indirect 4732 || h->root.type == bfd_link_hash_warning) 4733 h = (struct elf_link_hash_entry *) h->root.u.i.link; 4734 4735 /* PR15323, ref flags aren't set for references in the same 4736 object. */ 4737 h->root.non_ir_ref = 1; 4738 } 4739 4740 r_type = ELF32_R_TYPE (rel->r_info); 4741 4742 switch (r_type) 4743 { 4744 case R_NIOS2_GOT16: 4745 case R_NIOS2_GOT_LO: 4746 case R_NIOS2_GOT_HA: 4747 case R_NIOS2_CALL16: 4748 case R_NIOS2_CALL_LO: 4749 case R_NIOS2_CALL_HA: 4750 case R_NIOS2_TLS_GD16: 4751 case R_NIOS2_TLS_IE16: 4752 /* This symbol requires a global offset table entry. */ 4753 { 4754 int tls_type, old_tls_type; 4755 4756 switch (r_type) 4757 { 4758 default: 4759 case R_NIOS2_GOT16: 4760 case R_NIOS2_GOT_LO: 4761 case R_NIOS2_GOT_HA: 4762 case R_NIOS2_CALL16: 4763 case R_NIOS2_CALL_LO: 4764 case R_NIOS2_CALL_HA: 4765 tls_type = GOT_NORMAL; 4766 break; 4767 case R_NIOS2_TLS_GD16: 4768 tls_type = GOT_TLS_GD; 4769 break; 4770 case R_NIOS2_TLS_IE16: 4771 tls_type = GOT_TLS_IE; 4772 break; 4773 } 4774 4775 if (h != NULL) 4776 { 4777 struct elf32_nios2_link_hash_entry *eh 4778 = (struct elf32_nios2_link_hash_entry *)h; 4779 h->got.refcount++; 4780 old_tls_type = elf32_nios2_hash_entry(h)->tls_type; 4781 if (r_type == R_NIOS2_CALL16 4782 || r_type == R_NIOS2_CALL_LO 4783 || r_type == R_NIOS2_CALL_HA) 4784 { 4785 /* Make sure a plt entry is created for this symbol if 4786 it turns out to be a function defined by a dynamic 4787 object. */ 4788 h->plt.refcount++; 4789 h->needs_plt = 1; 4790 h->type = STT_FUNC; 4791 eh->got_types_used |= CALL_USED; 4792 } 4793 else 4794 eh->got_types_used |= GOT_USED; 4795 } 4796 else 4797 { 4798 /* This is a global offset table entry for a local symbol. */ 4799 if (local_got_refcounts == NULL) 4800 { 4801 bfd_size_type size; 4802 4803 size = symtab_hdr->sh_info; 4804 size *= (sizeof (bfd_signed_vma) + sizeof (char)); 4805 local_got_refcounts 4806 = ((bfd_signed_vma *) bfd_zalloc (abfd, size)); 4807 if (local_got_refcounts == NULL) 4808 return FALSE; 4809 elf_local_got_refcounts (abfd) = local_got_refcounts; 4810 elf32_nios2_local_got_tls_type (abfd) 4811 = (char *) (local_got_refcounts + symtab_hdr->sh_info); 4812 } 4813 local_got_refcounts[r_symndx]++; 4814 old_tls_type = elf32_nios2_local_got_tls_type (abfd) [r_symndx]; 4815 } 4816 4817 /* We will already have issued an error message if there is a 4818 TLS / non-TLS mismatch, based on the symbol type. We don't 4819 support any linker relaxations. So just combine any TLS 4820 types needed. */ 4821 if (old_tls_type != GOT_UNKNOWN && old_tls_type != GOT_NORMAL 4822 && tls_type != GOT_NORMAL) 4823 tls_type |= old_tls_type; 4824 4825 if (old_tls_type != tls_type) 4826 { 4827 if (h != NULL) 4828 elf32_nios2_hash_entry (h)->tls_type = tls_type; 4829 else 4830 elf32_nios2_local_got_tls_type (abfd) [r_symndx] = tls_type; 4831 } 4832 } 4833 make_got: 4834 if (htab->root.sgot == NULL) 4835 { 4836 if (htab->root.dynobj == NULL) 4837 htab->root.dynobj = abfd; 4838 if (!create_got_section (htab->root.dynobj, info)) 4839 return FALSE; 4840 } 4841 break; 4842 4843 case R_NIOS2_TLS_LDM16: 4844 htab->tls_ldm_got.refcount++; 4845 goto make_got; 4846 4847 /* This relocation describes the C++ object vtable hierarchy. 4848 Reconstruct it for later use during GC. */ 4849 case R_NIOS2_GNU_VTINHERIT: 4850 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 4851 return FALSE; 4852 break; 4853 4854 /* This relocation describes which C++ vtable entries are actually 4855 used. Record for later use during GC. */ 4856 case R_NIOS2_GNU_VTENTRY: 4857 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 4858 return FALSE; 4859 break; 4860 4861 case R_NIOS2_BFD_RELOC_32: 4862 case R_NIOS2_CALL26: 4863 case R_NIOS2_CALL26_NOAT: 4864 case R_NIOS2_HIADJ16: 4865 case R_NIOS2_LO16: 4866 4867 if (h != NULL) 4868 { 4869 /* If this reloc is in a read-only section, we might 4870 need a copy reloc. We can't check reliably at this 4871 stage whether the section is read-only, as input 4872 sections have not yet been mapped to output sections. 4873 Tentatively set the flag for now, and correct in 4874 adjust_dynamic_symbol. */ 4875 if (!bfd_link_pic (info)) 4876 h->non_got_ref = 1; 4877 4878 /* Make sure a plt entry is created for this symbol if it 4879 turns out to be a function defined by a dynamic object. */ 4880 h->plt.refcount++; 4881 4882 if (r_type == R_NIOS2_CALL26 || r_type == R_NIOS2_CALL26_NOAT) 4883 h->needs_plt = 1; 4884 } 4885 4886 /* If we are creating a shared library, we need to copy the 4887 reloc into the shared library. */ 4888 if (bfd_link_pic (info) 4889 && (sec->flags & SEC_ALLOC) != 0 4890 && (r_type == R_NIOS2_BFD_RELOC_32 4891 || (h != NULL && ! h->needs_plt 4892 && (! SYMBOLIC_BIND (info, h) || ! h->def_regular)))) 4893 { 4894 struct elf32_nios2_dyn_relocs *p; 4895 struct elf32_nios2_dyn_relocs **head; 4896 4897 /* When creating a shared object, we must copy these 4898 reloc types into the output file. We create a reloc 4899 section in dynobj and make room for this reloc. */ 4900 if (sreloc == NULL) 4901 { 4902 if (htab->root.dynobj == NULL) 4903 htab->root.dynobj = abfd; 4904 4905 sreloc = _bfd_elf_make_dynamic_reloc_section 4906 (sec, htab->root.dynobj, 2, abfd, TRUE); 4907 if (sreloc == NULL) 4908 return FALSE; 4909 } 4910 4911 /* If this is a global symbol, we count the number of 4912 relocations we need for this symbol. */ 4913 if (h != NULL) 4914 head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs; 4915 else 4916 { 4917 /* Track dynamic relocs needed for local syms too. 4918 We really need local syms available to do this 4919 easily. Oh well. */ 4920 4921 asection *s; 4922 void *vpp; 4923 Elf_Internal_Sym *isym; 4924 4925 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 4926 abfd, r_symndx); 4927 if (isym == NULL) 4928 return FALSE; 4929 4930 s = bfd_section_from_elf_index (abfd, isym->st_shndx); 4931 if (s == NULL) 4932 s = sec; 4933 4934 vpp = &elf_section_data (s)->local_dynrel; 4935 head = (struct elf32_nios2_dyn_relocs **) vpp; 4936 } 4937 4938 p = *head; 4939 if (p == NULL || p->sec != sec) 4940 { 4941 bfd_size_type amt = sizeof *p; 4942 p = ((struct elf32_nios2_dyn_relocs *) 4943 bfd_alloc (htab->root.dynobj, amt)); 4944 if (p == NULL) 4945 return FALSE; 4946 p->next = *head; 4947 *head = p; 4948 p->sec = sec; 4949 p->count = 0; 4950 p->pc_count = 0; 4951 } 4952 4953 p->count += 1; 4954 4955 } 4956 break; 4957 } 4958 } 4959 4960 return TRUE; 4961} 4962 4963 4964/* Implement elf_backend_gc_mark_hook: 4965 Return the section that should be marked against GC for a given 4966 relocation. */ 4967static asection * 4968nios2_elf32_gc_mark_hook (asection *sec, 4969 struct bfd_link_info *info, 4970 Elf_Internal_Rela *rel, 4971 struct elf_link_hash_entry *h, 4972 Elf_Internal_Sym *sym) 4973{ 4974 if (h != NULL) 4975 switch (ELF32_R_TYPE (rel->r_info)) 4976 { 4977 case R_NIOS2_GNU_VTINHERIT: 4978 case R_NIOS2_GNU_VTENTRY: 4979 return NULL; 4980 } 4981 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); 4982} 4983 4984/* Implement elf_backend_gc_sweep_hook: 4985 Update the got entry reference counts for the section being removed. */ 4986static bfd_boolean 4987nios2_elf32_gc_sweep_hook (bfd *abfd, 4988 struct bfd_link_info *info, 4989 asection *sec, 4990 const Elf_Internal_Rela *relocs) 4991{ 4992 Elf_Internal_Shdr *symtab_hdr; 4993 struct elf_link_hash_entry **sym_hashes; 4994 bfd_signed_vma *local_got_refcounts; 4995 const Elf_Internal_Rela *rel, *relend; 4996 bfd *dynobj; 4997 4998 if (bfd_link_relocatable (info)) 4999 return TRUE; 5000 5001 elf_section_data (sec)->local_dynrel = NULL; 5002 5003 dynobj = elf_hash_table (info)->dynobj; 5004 if (dynobj == NULL) 5005 return TRUE; 5006 5007 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 5008 sym_hashes = elf_sym_hashes (abfd); 5009 local_got_refcounts = elf_local_got_refcounts (abfd); 5010 5011 relend = relocs + sec->reloc_count; 5012 for (rel = relocs; rel < relend; rel++) 5013 { 5014 unsigned long r_symndx; 5015 struct elf_link_hash_entry *h = NULL; 5016 int r_type; 5017 5018 r_symndx = ELF32_R_SYM (rel->r_info); 5019 if (r_symndx >= symtab_hdr->sh_info) 5020 { 5021 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 5022 while (h->root.type == bfd_link_hash_indirect 5023 || h->root.type == bfd_link_hash_warning) 5024 h = (struct elf_link_hash_entry *) h->root.u.i.link; 5025 } 5026 5027 r_type = ELF32_R_TYPE (rel->r_info); 5028 switch (r_type) 5029 { 5030 case R_NIOS2_GOT16: 5031 case R_NIOS2_GOT_LO: 5032 case R_NIOS2_GOT_HA: 5033 case R_NIOS2_CALL16: 5034 case R_NIOS2_CALL_LO: 5035 case R_NIOS2_CALL_HA: 5036 if (h != NULL) 5037 { 5038 if (h->got.refcount > 0) 5039 --h->got.refcount; 5040 } 5041 else if (local_got_refcounts != NULL) 5042 { 5043 if (local_got_refcounts[r_symndx] > 0) 5044 --local_got_refcounts[r_symndx]; 5045 } 5046 break; 5047 5048 case R_NIOS2_PCREL_LO: 5049 case R_NIOS2_PCREL_HA: 5050 case R_NIOS2_BFD_RELOC_32: 5051 case R_NIOS2_CALL26: 5052 case R_NIOS2_CALL26_NOAT: 5053 if (h != NULL) 5054 { 5055 struct elf32_nios2_link_hash_entry *eh; 5056 struct elf32_nios2_dyn_relocs **pp; 5057 struct elf32_nios2_dyn_relocs *p; 5058 5059 eh = (struct elf32_nios2_link_hash_entry *) h; 5060 5061 if (h->plt.refcount > 0) 5062 --h->plt.refcount; 5063 5064 if (r_type == R_NIOS2_PCREL_LO || r_type == R_NIOS2_PCREL_HA 5065 || r_type == R_NIOS2_BFD_RELOC_32) 5066 { 5067 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; 5068 pp = &p->next) 5069 if (p->sec == sec) 5070 { 5071 p->count -= 1; 5072 if (p->count == 0) 5073 *pp = p->next; 5074 break; 5075 } 5076 } 5077 } 5078 break; 5079 5080 default: 5081 break; 5082 } 5083 } 5084 5085 return TRUE; 5086} 5087 5088/* Implement elf_backend_finish_dynamic_symbols: 5089 Finish up dynamic symbol handling. We set the contents of various 5090 dynamic sections here. */ 5091static bfd_boolean 5092nios2_elf32_finish_dynamic_symbol (bfd *output_bfd, 5093 struct bfd_link_info *info, 5094 struct elf_link_hash_entry *h, 5095 Elf_Internal_Sym *sym) 5096{ 5097 struct elf32_nios2_link_hash_table *htab; 5098 struct elf32_nios2_link_hash_entry *eh 5099 = (struct elf32_nios2_link_hash_entry *)h; 5100 int use_plt; 5101 5102 htab = elf32_nios2_hash_table (info); 5103 5104 if (h->plt.offset != (bfd_vma) -1) 5105 { 5106 asection *splt; 5107 asection *sgotplt; 5108 asection *srela; 5109 bfd_vma plt_index; 5110 bfd_vma got_offset; 5111 Elf_Internal_Rela rela; 5112 bfd_byte *loc; 5113 bfd_vma got_address; 5114 5115 /* This symbol has an entry in the procedure linkage table. Set 5116 it up. */ 5117 BFD_ASSERT (h->dynindx != -1); 5118 splt = htab->root.splt; 5119 sgotplt = htab->root.sgotplt; 5120 srela = htab->root.srelplt; 5121 BFD_ASSERT (splt != NULL && sgotplt != NULL && srela != NULL); 5122 5123 /* Emit the PLT entry. */ 5124 if (bfd_link_pic (info)) 5125 { 5126 nios2_elf32_install_data (splt, nios2_so_plt_entry, h->plt.offset, 5127 3); 5128 plt_index = (h->plt.offset - 24) / 12; 5129 got_offset = (plt_index + 3) * 4; 5130 nios2_elf32_install_imm16 (splt, h->plt.offset, 5131 hiadj(plt_index * 4)); 5132 nios2_elf32_install_imm16 (splt, h->plt.offset + 4, 5133 (plt_index * 4) & 0xffff); 5134 nios2_elf32_install_imm16 (splt, h->plt.offset + 8, 5135 0xfff4 - h->plt.offset); 5136 got_address = (sgotplt->output_section->vma + sgotplt->output_offset 5137 + got_offset); 5138 5139 /* Fill in the entry in the global offset table. There are no 5140 res_n slots for a shared object PLT, instead the .got.plt entries 5141 point to the PLT entries. */ 5142 bfd_put_32 (output_bfd, 5143 splt->output_section->vma + splt->output_offset 5144 + h->plt.offset, sgotplt->contents + got_offset); 5145 } 5146 else 5147 { 5148 plt_index = (h->plt.offset - 28 - htab->res_n_size) / 12; 5149 got_offset = (plt_index + 3) * 4; 5150 5151 nios2_elf32_install_data (splt, nios2_plt_entry, h->plt.offset, 3); 5152 got_address = (sgotplt->output_section->vma + sgotplt->output_offset 5153 + got_offset); 5154 nios2_elf32_install_imm16 (splt, h->plt.offset, hiadj(got_address)); 5155 nios2_elf32_install_imm16 (splt, h->plt.offset + 4, 5156 got_address & 0xffff); 5157 5158 /* Fill in the entry in the global offset table. */ 5159 bfd_put_32 (output_bfd, 5160 splt->output_section->vma + splt->output_offset 5161 + plt_index * 4, sgotplt->contents + got_offset); 5162 } 5163 5164 /* Fill in the entry in the .rela.plt section. */ 5165 rela.r_offset = got_address; 5166 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_JUMP_SLOT); 5167 rela.r_addend = 0; 5168 loc = srela->contents + plt_index * sizeof (Elf32_External_Rela); 5169 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 5170 5171 if (!h->def_regular) 5172 { 5173 /* Mark the symbol as undefined, rather than as defined in 5174 the .plt section. Leave the value alone. */ 5175 sym->st_shndx = SHN_UNDEF; 5176 /* If the symbol is weak, we do need to clear the value. 5177 Otherwise, the PLT entry would provide a definition for 5178 the symbol even if the symbol wasn't defined anywhere, 5179 and so the symbol would never be NULL. */ 5180 if (!h->ref_regular_nonweak) 5181 sym->st_value = 0; 5182 } 5183 } 5184 5185 use_plt = (eh->got_types_used == CALL_USED 5186 && h->plt.offset != (bfd_vma) -1); 5187 5188 if (!use_plt && h->got.offset != (bfd_vma) -1 5189 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_GD) == 0 5190 && (elf32_nios2_hash_entry (h)->tls_type & GOT_TLS_IE) == 0) 5191 { 5192 asection *sgot; 5193 asection *srela; 5194 Elf_Internal_Rela rela; 5195 bfd_byte *loc; 5196 bfd_vma offset; 5197 5198 /* This symbol has an entry in the global offset table. Set it 5199 up. */ 5200 sgot = htab->root.sgot; 5201 srela = htab->root.srelgot; 5202 BFD_ASSERT (sgot != NULL && srela != NULL); 5203 5204 offset = (h->got.offset & ~(bfd_vma) 1); 5205 rela.r_offset = (sgot->output_section->vma 5206 + sgot->output_offset + offset); 5207 5208 /* If this is a -Bsymbolic link, and the symbol is defined 5209 locally, we just want to emit a RELATIVE reloc. Likewise if 5210 the symbol was forced to be local because of a version file. 5211 The entry in the global offset table will already have been 5212 initialized in the relocate_section function. */ 5213 5214 if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) 5215 { 5216 rela.r_info = ELF32_R_INFO (0, R_NIOS2_RELATIVE); 5217 rela.r_addend = bfd_get_signed_32 (output_bfd, 5218 (sgot->contents + offset)); 5219 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + offset); 5220 } 5221 else 5222 { 5223 bfd_put_32 (output_bfd, (bfd_vma) 0, 5224 sgot->contents + offset); 5225 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_GLOB_DAT); 5226 rela.r_addend = 0; 5227 } 5228 5229 loc = srela->contents; 5230 loc += srela->reloc_count++ * sizeof (Elf32_External_Rela); 5231 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 5232 } 5233 5234 if (use_plt && h->got.offset != (bfd_vma) -1) 5235 { 5236 bfd_vma offset = (h->got.offset & ~(bfd_vma) 1); 5237 asection *sgot = htab->root.sgot; 5238 asection *splt = htab->root.splt; 5239 bfd_put_32 (output_bfd, (splt->output_section->vma + splt->output_offset 5240 + h->plt.offset), 5241 sgot->contents + offset); 5242 } 5243 5244 if (h->needs_copy) 5245 { 5246 asection *s; 5247 Elf_Internal_Rela rela; 5248 bfd_byte *loc; 5249 5250 /* This symbol needs a copy reloc. Set it up. */ 5251 BFD_ASSERT (h->dynindx != -1 5252 && (h->root.type == bfd_link_hash_defined 5253 || h->root.type == bfd_link_hash_defweak)); 5254 5255 rela.r_offset = (h->root.u.def.value 5256 + h->root.u.def.section->output_section->vma 5257 + h->root.u.def.section->output_offset); 5258 rela.r_info = ELF32_R_INFO (h->dynindx, R_NIOS2_COPY); 5259 rela.r_addend = 0; 5260 if (h->root.u.def.section == htab->root.sdynrelro) 5261 s = htab->root.sreldynrelro; 5262 else 5263 s = htab->root.srelbss; 5264 BFD_ASSERT (s != NULL); 5265 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); 5266 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 5267 } 5268 5269 /* Mark _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and _gp_got as absolute. */ 5270 if (strcmp (h->root.root.string, "_DYNAMIC") == 0 5271 || h == htab->root.hgot 5272 || h == htab->h_gp_got) 5273 sym->st_shndx = SHN_ABS; 5274 5275 return TRUE; 5276} 5277 5278/* Implement elf_backend_finish_dynamic_sections. */ 5279static bfd_boolean 5280nios2_elf32_finish_dynamic_sections (bfd *output_bfd, 5281 struct bfd_link_info *info) 5282{ 5283 asection *sgotplt; 5284 asection *sdyn; 5285 struct elf32_nios2_link_hash_table *htab; 5286 5287 htab = elf32_nios2_hash_table (info); 5288 sgotplt = htab->root.sgotplt; 5289 sdyn = NULL; 5290 5291 if (htab->root.dynamic_sections_created) 5292 { 5293 asection *splt; 5294 Elf32_External_Dyn *dyncon, *dynconend; 5295 5296 splt = htab->root.splt; 5297 sdyn = bfd_get_linker_section (htab->root.dynobj, ".dynamic"); 5298 BFD_ASSERT (splt != NULL && sdyn != NULL && sgotplt != NULL); 5299 5300 dyncon = (Elf32_External_Dyn *) sdyn->contents; 5301 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); 5302 for (; dyncon < dynconend; dyncon++) 5303 { 5304 Elf_Internal_Dyn dyn; 5305 asection *s; 5306 5307 bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn); 5308 5309 switch (dyn.d_tag) 5310 { 5311 default: 5312 break; 5313 5314 case DT_PLTGOT: 5315 s = htab->root.sgotplt; 5316 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 5317 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5318 break; 5319 5320 case DT_JMPREL: 5321 s = htab->root.srelplt; 5322 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 5323 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5324 break; 5325 5326 case DT_PLTRELSZ: 5327 s = htab->root.srelplt; 5328 dyn.d_un.d_val = s->size; 5329 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5330 break; 5331 5332 case DT_NIOS2_GP: 5333 s = htab->root.sgotplt; 5334 dyn.d_un.d_ptr 5335 = s->output_section->vma + s->output_offset + 0x7ff0; 5336 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 5337 break; 5338 } 5339 } 5340 5341 /* Fill in the first entry in the procedure linkage table. */ 5342 if (splt->size > 0) 5343 { 5344 bfd_vma got_address = (sgotplt->output_section->vma 5345 + sgotplt->output_offset); 5346 if (bfd_link_pic (info)) 5347 { 5348 bfd_vma got_pcrel = got_address - (splt->output_section->vma 5349 + splt->output_offset); 5350 /* Both GOT and PLT must be aligned to a 16-byte boundary 5351 for the two loads to share the %hiadj part. The 4-byte 5352 offset for nextpc is accounted for in the %lo offsets 5353 on the loads. */ 5354 BFD_ASSERT ((got_pcrel & 0xf) == 0); 5355 nios2_elf32_install_data (splt, nios2_so_plt0_entry, 0, 6); 5356 nios2_elf32_install_imm16 (splt, 4, hiadj (got_pcrel)); 5357 nios2_elf32_install_imm16 (splt, 12, got_pcrel & 0xffff); 5358 nios2_elf32_install_imm16 (splt, 16, (got_pcrel + 4) & 0xffff); 5359 } 5360 else 5361 { 5362 /* Divide by 4 here, not 3 because we already corrected for the 5363 res_N branches. */ 5364 bfd_vma res_size = (splt->size - 28) / 4; 5365 bfd_vma res_start = (splt->output_section->vma 5366 + splt->output_offset); 5367 bfd_vma res_offset; 5368 5369 for (res_offset = 0; res_offset < res_size; res_offset += 4) 5370 bfd_put_32 (output_bfd, 5371 6 | ((res_size - (res_offset + 4)) << 6), 5372 splt->contents + res_offset); 5373 5374 /* The GOT must be aligned to a 16-byte boundary for the 5375 two loads to share the same %hiadj part. */ 5376 BFD_ASSERT ((got_address & 0xf) == 0); 5377 5378 nios2_elf32_install_data (splt, nios2_plt0_entry, res_size, 7); 5379 nios2_elf32_install_imm16 (splt, res_size, hiadj (res_start)); 5380 nios2_elf32_install_imm16 (splt, res_size + 4, 5381 res_start & 0xffff); 5382 nios2_elf32_install_imm16 (splt, res_size + 12, 5383 hiadj (got_address)); 5384 nios2_elf32_install_imm16 (splt, res_size + 16, 5385 (got_address + 4) & 0xffff); 5386 nios2_elf32_install_imm16 (splt, res_size + 20, 5387 (got_address + 8) & 0xffff); 5388 } 5389 } 5390 } 5391 5392 /* Fill in the first three entries in the global offset table. */ 5393 if (sgotplt != NULL && sgotplt->size > 0) 5394 { 5395 if (sdyn == NULL) 5396 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents); 5397 else 5398 bfd_put_32 (output_bfd, 5399 sdyn->output_section->vma + sdyn->output_offset, 5400 sgotplt->contents); 5401 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4); 5402 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8); 5403 5404 if (sgotplt->output_section != bfd_abs_section_ptr) 5405 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4; 5406 } 5407 5408 return TRUE; 5409} 5410 5411/* Implement elf_backend_adjust_dynamic_symbol: 5412 Adjust a symbol defined by a dynamic object and referenced by a 5413 regular object. The current definition is in some section of the 5414 dynamic object, but we're not including those sections. We have to 5415 change the definition to something the rest of the link can 5416 understand. */ 5417static bfd_boolean 5418nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info, 5419 struct elf_link_hash_entry *h) 5420{ 5421 struct elf32_nios2_link_hash_table *htab; 5422 bfd *dynobj; 5423 asection *s, *srel; 5424 unsigned align2; 5425 5426 htab = elf32_nios2_hash_table (info); 5427 dynobj = htab->root.dynobj; 5428 5429 /* Make sure we know what is going on here. */ 5430 BFD_ASSERT (dynobj != NULL 5431 && (h->needs_plt 5432 || h->u.weakdef != NULL 5433 || (h->def_dynamic 5434 && h->ref_regular 5435 && !h->def_regular))); 5436 5437 /* If this is a function, put it in the procedure linkage table. We 5438 will fill in the contents of the procedure linkage table later, 5439 when we know the address of the .got section. */ 5440 if (h->type == STT_FUNC || h->needs_plt) 5441 { 5442 if (h->plt.refcount <= 0 5443 || SYMBOL_CALLS_LOCAL (info, h) 5444 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 5445 && h->root.type == bfd_link_hash_undefweak)) 5446 { 5447 /* This case can occur if we saw a PLT reloc in an input 5448 file, but the symbol was never referred to by a dynamic 5449 object, or if all references were garbage collected. In 5450 such a case, we don't actually need to build a procedure 5451 linkage table, and we can just do a PCREL reloc instead. */ 5452 h->plt.offset = (bfd_vma) -1; 5453 h->needs_plt = 0; 5454 } 5455 5456 return TRUE; 5457 } 5458 5459 /* Reinitialize the plt offset now that it is not used as a reference 5460 count any more. */ 5461 h->plt.offset = (bfd_vma) -1; 5462 5463 /* If this is a weak symbol, and there is a real definition, the 5464 processor independent code will have arranged for us to see the 5465 real definition first, and we can just use the same value. */ 5466 if (h->u.weakdef != NULL) 5467 { 5468 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined 5469 || h->u.weakdef->root.type == bfd_link_hash_defweak); 5470 h->root.u.def.section = h->u.weakdef->root.u.def.section; 5471 h->root.u.def.value = h->u.weakdef->root.u.def.value; 5472 return TRUE; 5473 } 5474 5475 /* If there are no non-GOT references, we do not need a copy 5476 relocation. */ 5477 if (!h->non_got_ref) 5478 return TRUE; 5479 5480 /* This is a reference to a symbol defined by a dynamic object which 5481 is not a function. 5482 If we are creating a shared library, we must presume that the 5483 only references to the symbol are via the global offset table. 5484 For such cases we need not do anything here; the relocations will 5485 be handled correctly by relocate_section. */ 5486 if (bfd_link_pic (info)) 5487 return TRUE; 5488 5489 if (h->size == 0) 5490 { 5491 _bfd_error_handler (_("dynamic variable `%s' is zero size"), 5492 h->root.root.string); 5493 return TRUE; 5494 } 5495 5496 /* We must allocate the symbol in our .dynbss section, which will 5497 become part of the .bss section of the executable. There will be 5498 an entry for this symbol in the .dynsym section. The dynamic 5499 object will contain position independent code, so all references 5500 from the dynamic object to this symbol will go through the global 5501 offset table. The dynamic linker will use the .dynsym entry to 5502 determine the address it must put in the global offset table, so 5503 both the dynamic object and the regular object will refer to the 5504 same memory location for the variable. */ 5505 /* We must generate a R_NIOS2_COPY reloc to tell the dynamic linker to 5506 copy the initial value out of the dynamic object and into the 5507 runtime process image. We need to remember the offset into the 5508 .rela.bss section we are going to use. */ 5509 if ((h->root.u.def.section->flags & SEC_READONLY) != 0) 5510 { 5511 s = htab->root.sdynrelro; 5512 srel = htab->root.sreldynrelro; 5513 } 5514 else 5515 { 5516 s = htab->root.sdynbss; 5517 srel = htab->root.srelbss; 5518 } 5519 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) 5520 { 5521 srel->size += sizeof (Elf32_External_Rela); 5522 h->needs_copy = 1; 5523 } 5524 5525 align2 = bfd_log2 (h->size); 5526 if (align2 > h->root.u.def.section->alignment_power) 5527 align2 = h->root.u.def.section->alignment_power; 5528 5529 /* Align dynbss. */ 5530 s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2); 5531 if (align2 > bfd_get_section_alignment (dynobj, s) 5532 && !bfd_set_section_alignment (dynobj, s, align2)) 5533 return FALSE; 5534 5535 /* Define the symbol as being at this point in the section. */ 5536 h->root.u.def.section = s; 5537 h->root.u.def.value = s->size; 5538 5539 /* Increment the section size to make room for the symbol. */ 5540 s->size += h->size; 5541 5542 return TRUE; 5543} 5544 5545/* Worker function for nios2_elf32_size_dynamic_sections. */ 5546static bfd_boolean 5547adjust_dynrelocs (struct elf_link_hash_entry *h, PTR inf) 5548{ 5549 struct bfd_link_info *info; 5550 struct elf32_nios2_link_hash_table *htab; 5551 5552 if (h->root.type == bfd_link_hash_indirect) 5553 return TRUE; 5554 5555 if (h->root.type == bfd_link_hash_warning) 5556 /* When warning symbols are created, they **replace** the "real" 5557 entry in the hash table, thus we never get to see the real 5558 symbol in a hash traversal. So look at it now. */ 5559 h = (struct elf_link_hash_entry *) h->root.u.i.link; 5560 5561 info = (struct bfd_link_info *) inf; 5562 htab = elf32_nios2_hash_table (info); 5563 5564 if (h->plt.offset != (bfd_vma)-1) 5565 h->plt.offset += htab->res_n_size; 5566 if (htab->root.splt == h->root.u.def.section) 5567 h->root.u.def.value += htab->res_n_size; 5568 5569 return TRUE; 5570} 5571 5572/* Another worker function for nios2_elf32_size_dynamic_sections. 5573 Allocate space in .plt, .got and associated reloc sections for 5574 dynamic relocs. */ 5575static bfd_boolean 5576allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf) 5577{ 5578 struct bfd_link_info *info; 5579 struct elf32_nios2_link_hash_table *htab; 5580 struct elf32_nios2_link_hash_entry *eh; 5581 struct elf32_nios2_dyn_relocs *p; 5582 int use_plt; 5583 5584 if (h->root.type == bfd_link_hash_indirect) 5585 return TRUE; 5586 5587 if (h->root.type == bfd_link_hash_warning) 5588 /* When warning symbols are created, they **replace** the "real" 5589 entry in the hash table, thus we never get to see the real 5590 symbol in a hash traversal. So look at it now. */ 5591 h = (struct elf_link_hash_entry *) h->root.u.i.link; 5592 5593 info = (struct bfd_link_info *) inf; 5594 htab = elf32_nios2_hash_table (info); 5595 5596 if (htab->root.dynamic_sections_created 5597 && h->plt.refcount > 0) 5598 { 5599 /* Make sure this symbol is output as a dynamic symbol. 5600 Undefined weak syms won't yet be marked as dynamic. */ 5601 if (h->dynindx == -1 5602 && !h->forced_local 5603 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5604 return FALSE; 5605 5606 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) 5607 { 5608 asection *s = htab->root.splt; 5609 5610 /* Allocate room for the header. */ 5611 if (s->size == 0) 5612 { 5613 if (bfd_link_pic (info)) 5614 s->size = 24; 5615 else 5616 s->size = 28; 5617 } 5618 5619 h->plt.offset = s->size; 5620 5621 /* If this symbol is not defined in a regular file, and we are 5622 not generating a shared library, then set the symbol to this 5623 location in the .plt. This is required to make function 5624 pointers compare as equal between the normal executable and 5625 the shared library. */ 5626 if (! bfd_link_pic (info) 5627 && !h->def_regular) 5628 { 5629 h->root.u.def.section = s; 5630 h->root.u.def.value = h->plt.offset; 5631 } 5632 5633 /* Make room for this entry. */ 5634 s->size += 12; 5635 5636 /* We also need to make an entry in the .rela.plt section. */ 5637 htab->root.srelplt->size += sizeof (Elf32_External_Rela); 5638 5639 /* And the .got.plt section. */ 5640 htab->root.sgotplt->size += 4; 5641 } 5642 else 5643 { 5644 h->plt.offset = (bfd_vma) -1; 5645 h->needs_plt = 0; 5646 } 5647 } 5648 else 5649 { 5650 h->plt.offset = (bfd_vma) -1; 5651 h->needs_plt = 0; 5652 } 5653 5654 eh = (struct elf32_nios2_link_hash_entry *) h; 5655 use_plt = (eh->got_types_used == CALL_USED 5656 && h->plt.offset != (bfd_vma) -1); 5657 5658 if (h->got.refcount > 0) 5659 { 5660 asection *s; 5661 bfd_boolean dyn; 5662 int tls_type = eh->tls_type; 5663 int indx; 5664 5665 /* Make sure this symbol is output as a dynamic symbol. 5666 Undefined weak syms won't yet be marked as dynamic. */ 5667 if (h->dynindx == -1 5668 && !h->forced_local 5669 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5670 return FALSE; 5671 5672 s = htab->root.sgot; 5673 h->got.offset = s->size; 5674 5675 if (tls_type == GOT_UNKNOWN) 5676 abort (); 5677 5678 if (tls_type == GOT_NORMAL) 5679 /* Non-TLS symbols need one GOT slot. */ 5680 s->size += 4; 5681 else 5682 { 5683 if (tls_type & GOT_TLS_GD) 5684 /* R_NIOS2_TLS_GD16 needs 2 consecutive GOT slots. */ 5685 s->size += 8; 5686 if (tls_type & GOT_TLS_IE) 5687 /* R_NIOS2_TLS_IE16 needs one GOT slot. */ 5688 s->size += 4; 5689 } 5690 5691 dyn = htab->root.dynamic_sections_created; 5692 5693 indx = 0; 5694 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h) 5695 && (!bfd_link_pic (info) 5696 || !SYMBOL_REFERENCES_LOCAL (info, h))) 5697 indx = h->dynindx; 5698 5699 if (tls_type != GOT_NORMAL 5700 && (bfd_link_pic (info) || indx != 0) 5701 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 5702 || h->root.type != bfd_link_hash_undefweak)) 5703 { 5704 if (tls_type & GOT_TLS_IE) 5705 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5706 5707 if (tls_type & GOT_TLS_GD) 5708 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5709 5710 if ((tls_type & GOT_TLS_GD) && indx != 0) 5711 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5712 } 5713 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 5714 || h->root.type != bfd_link_hash_undefweak) 5715 && !use_plt 5716 && (bfd_link_pic (info) 5717 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) 5718 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5719 } 5720 else 5721 h->got.offset = (bfd_vma) -1; 5722 5723 if (eh->dyn_relocs == NULL) 5724 return TRUE; 5725 5726 /* In the shared -Bsymbolic case, discard space allocated for 5727 dynamic pc-relative relocs against symbols which turn out to be 5728 defined in regular objects. For the normal shared case, discard 5729 space for pc-relative relocs that have become local due to symbol 5730 visibility changes. */ 5731 5732 if (bfd_link_pic (info)) 5733 { 5734 if (h->def_regular 5735 && (h->forced_local || SYMBOLIC_BIND (info, h))) 5736 { 5737 struct elf32_nios2_dyn_relocs **pp; 5738 5739 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 5740 { 5741 p->count -= p->pc_count; 5742 p->pc_count = 0; 5743 if (p->count == 0) 5744 *pp = p->next; 5745 else 5746 pp = &p->next; 5747 } 5748 } 5749 5750 /* Also discard relocs on undefined weak syms with non-default 5751 visibility. */ 5752 if (eh->dyn_relocs != NULL 5753 && h->root.type == bfd_link_hash_undefweak) 5754 { 5755 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 5756 eh->dyn_relocs = NULL; 5757 5758 /* Make sure undefined weak symbols are output as a dynamic 5759 symbol in PIEs. */ 5760 else if (h->dynindx == -1 5761 && !h->forced_local 5762 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5763 return FALSE; 5764 } 5765 } 5766 else 5767 { 5768 /* For the non-shared case, discard space for relocs against 5769 symbols which turn out to need copy relocs or are not 5770 dynamic. */ 5771 5772 if (!h->non_got_ref 5773 && ((h->def_dynamic && !h->def_regular) 5774 || (htab->root.dynamic_sections_created 5775 && (h->root.type == bfd_link_hash_undefweak 5776 || h->root.type == bfd_link_hash_undefined)))) 5777 { 5778 /* Make sure this symbol is output as a dynamic symbol. 5779 Undefined weak syms won't yet be marked as dynamic. */ 5780 if (h->dynindx == -1 5781 && !h->forced_local 5782 && !bfd_elf_link_record_dynamic_symbol (info, h)) 5783 return FALSE; 5784 5785 /* If that succeeded, we know we'll be keeping all the 5786 relocs. */ 5787 if (h->dynindx != -1) 5788 goto keep; 5789 } 5790 5791 eh->dyn_relocs = NULL; 5792 5793 keep: ; 5794 } 5795 5796 /* Finally, allocate space. */ 5797 for (p = eh->dyn_relocs; p != NULL; p = p->next) 5798 { 5799 asection *sreloc = elf_section_data (p->sec)->sreloc; 5800 sreloc->size += p->count * sizeof (Elf32_External_Rela); 5801 } 5802 5803 return TRUE; 5804} 5805 5806/* Implement elf_backend_size_dynamic_sections: 5807 Set the sizes of the dynamic sections. */ 5808static bfd_boolean 5809nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 5810 struct bfd_link_info *info) 5811{ 5812 bfd *dynobj; 5813 asection *s; 5814 bfd_boolean relocs; 5815 bfd *ibfd; 5816 struct elf32_nios2_link_hash_table *htab; 5817 5818 htab = elf32_nios2_hash_table (info); 5819 dynobj = htab->root.dynobj; 5820 BFD_ASSERT (dynobj != NULL); 5821 5822 htab->res_n_size = 0; 5823 if (htab->root.dynamic_sections_created) 5824 { 5825 /* Set the contents of the .interp section to the interpreter. */ 5826 if (bfd_link_executable (info) && !info->nointerp) 5827 { 5828 s = bfd_get_linker_section (dynobj, ".interp"); 5829 BFD_ASSERT (s != NULL); 5830 s->size = sizeof ELF_DYNAMIC_INTERPRETER; 5831 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 5832 } 5833 } 5834 else 5835 { 5836 /* We may have created entries in the .rela.got section. 5837 However, if we are not creating the dynamic sections, we will 5838 not actually use these entries. Reset the size of .rela.got, 5839 which will cause it to get stripped from the output file 5840 below. */ 5841 s = htab->root.srelgot; 5842 if (s != NULL) 5843 s->size = 0; 5844 } 5845 5846 /* Set up .got offsets for local syms, and space for local dynamic 5847 relocs. */ 5848 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 5849 { 5850 bfd_signed_vma *local_got; 5851 bfd_signed_vma *end_local_got; 5852 char *local_tls_type; 5853 bfd_size_type locsymcount; 5854 Elf_Internal_Shdr *symtab_hdr; 5855 asection *srel; 5856 5857 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 5858 continue; 5859 5860 for (s = ibfd->sections; s != NULL; s = s->next) 5861 { 5862 struct elf32_nios2_dyn_relocs *p; 5863 5864 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) 5865 { 5866 if (!bfd_is_abs_section (p->sec) 5867 && bfd_is_abs_section (p->sec->output_section)) 5868 { 5869 /* Input section has been discarded, either because 5870 it is a copy of a linkonce section or due to 5871 linker script /DISCARD/, so we'll be discarding 5872 the relocs too. */ 5873 } 5874 else if (p->count != 0) 5875 { 5876 srel = elf_section_data (p->sec)->sreloc; 5877 srel->size += p->count * sizeof (Elf32_External_Rela); 5878 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 5879 info->flags |= DF_TEXTREL; 5880 } 5881 } 5882 } 5883 5884 local_got = elf_local_got_refcounts (ibfd); 5885 if (!local_got) 5886 continue; 5887 5888 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 5889 locsymcount = symtab_hdr->sh_info; 5890 end_local_got = local_got + locsymcount; 5891 local_tls_type = elf32_nios2_local_got_tls_type (ibfd); 5892 s = htab->root.sgot; 5893 srel = htab->root.srelgot; 5894 for (; local_got < end_local_got; ++local_got, ++local_tls_type) 5895 { 5896 if (*local_got > 0) 5897 { 5898 *local_got = s->size; 5899 if (*local_tls_type & GOT_TLS_GD) 5900 /* TLS_GD relocs need an 8-byte structure in the GOT. */ 5901 s->size += 8; 5902 if (*local_tls_type & GOT_TLS_IE) 5903 s->size += 4; 5904 if (*local_tls_type == GOT_NORMAL) 5905 s->size += 4; 5906 5907 if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD) 5908 srel->size += sizeof (Elf32_External_Rela); 5909 } 5910 else 5911 *local_got = (bfd_vma) -1; 5912 } 5913 } 5914 5915 if (htab->tls_ldm_got.refcount > 0) 5916 { 5917 /* Allocate two GOT entries and one dynamic relocation (if necessary) 5918 for R_NIOS2_TLS_LDM16 relocations. */ 5919 htab->tls_ldm_got.offset = htab->root.sgot->size; 5920 htab->root.sgot->size += 8; 5921 if (bfd_link_pic (info)) 5922 htab->root.srelgot->size += sizeof (Elf32_External_Rela); 5923 } 5924 else 5925 htab->tls_ldm_got.offset = -1; 5926 5927 /* Allocate global sym .plt and .got entries, and space for global 5928 sym dynamic relocs. */ 5929 elf_link_hash_traverse (& htab->root, allocate_dynrelocs, info); 5930 5931 if (htab->root.dynamic_sections_created) 5932 { 5933 /* If the .got section is more than 0x8000 bytes, we add 5934 0x8000 to the value of _gp_got, so that 16-bit relocations 5935 have a greater chance of working. */ 5936 if (htab->root.sgot->size >= 0x8000 5937 && htab->h_gp_got->root.u.def.value == 0) 5938 htab->h_gp_got->root.u.def.value = 0x8000; 5939 } 5940 5941 /* The check_relocs and adjust_dynamic_symbol entry points have 5942 determined the sizes of the various dynamic sections. Allocate 5943 memory for them. */ 5944 relocs = FALSE; 5945 for (s = dynobj->sections; s != NULL; s = s->next) 5946 { 5947 const char *name; 5948 5949 if ((s->flags & SEC_LINKER_CREATED) == 0) 5950 continue; 5951 5952 /* It's OK to base decisions on the section name, because none 5953 of the dynobj section names depend upon the input files. */ 5954 name = bfd_get_section_name (dynobj, s); 5955 5956 if (CONST_STRNEQ (name, ".rela")) 5957 { 5958 if (s->size != 0) 5959 { 5960 if (s != htab->root.srelplt) 5961 relocs = TRUE; 5962 5963 /* We use the reloc_count field as a counter if we need 5964 to copy relocs into the output file. */ 5965 s->reloc_count = 0; 5966 } 5967 } 5968 else if (s == htab->root.splt) 5969 { 5970 /* Correct for the number of res_N branches. */ 5971 if (s->size != 0 && !bfd_link_pic (info)) 5972 { 5973 htab->res_n_size = (s->size - 28) / 3; 5974 s->size += htab->res_n_size; 5975 } 5976 } 5977 else if (s != htab->sbss 5978 && s != htab->root.sgot 5979 && s != htab->root.sgotplt 5980 && s != htab->root.sdynbss 5981 && s != htab->root.sdynrelro) 5982 /* It's not one of our sections, so don't allocate space. */ 5983 continue; 5984 5985 if (s->size == 0) 5986 { 5987 s->flags |= SEC_EXCLUDE; 5988 continue; 5989 } 5990 5991 if ((s->flags & SEC_HAS_CONTENTS) == 0) 5992 continue; 5993 5994 /* Allocate memory for the section contents. */ 5995 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); 5996 if (s->contents == NULL) 5997 return FALSE; 5998 } 5999 6000 /* Adjust dynamic symbols that point to the plt to account for the 6001 now-known number of resN slots. */ 6002 if (htab->res_n_size) 6003 elf_link_hash_traverse (& htab->root, adjust_dynrelocs, info); 6004 6005 if (htab->root.dynamic_sections_created) 6006 { 6007 /* Add some entries to the .dynamic section. We fill in the 6008 values later, in elf_nios2_finish_dynamic_sections, but we 6009 must add the entries now so that we get the correct size for 6010 the .dynamic section. The DT_DEBUG entry is filled in by the 6011 dynamic linker and used by the debugger. */ 6012#define add_dynamic_entry(TAG, VAL) \ 6013 _bfd_elf_add_dynamic_entry (info, TAG, VAL) 6014 6015 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_DEBUG, 0)) 6016 return FALSE; 6017 6018 if (htab->root.sgotplt->size != 0 6019 && !add_dynamic_entry (DT_PLTGOT, 0)) 6020 return FALSE; 6021 6022 if (htab->root.splt->size != 0 6023 && (!add_dynamic_entry (DT_PLTRELSZ, 0) 6024 || !add_dynamic_entry (DT_PLTREL, DT_RELA) 6025 || !add_dynamic_entry (DT_JMPREL, 0))) 6026 return FALSE; 6027 6028 if (relocs 6029 && (!add_dynamic_entry (DT_RELA, 0) 6030 || !add_dynamic_entry (DT_RELASZ, 0) 6031 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))) 6032 return FALSE; 6033 6034 if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0)) 6035 return FALSE; 6036 6037 if ((info->flags & DF_TEXTREL) != 0 6038 && !add_dynamic_entry (DT_TEXTREL, 0)) 6039 return FALSE; 6040 } 6041#undef add_dynamic_entry 6042 6043 return TRUE; 6044} 6045 6046/* Free the derived linker hash table. */ 6047static void 6048nios2_elf32_link_hash_table_free (bfd *obfd) 6049{ 6050 struct elf32_nios2_link_hash_table *htab 6051 = (struct elf32_nios2_link_hash_table *) obfd->link.hash; 6052 6053 bfd_hash_table_free (&htab->bstab); 6054 _bfd_elf_link_hash_table_free (obfd); 6055} 6056 6057/* Implement bfd_elf32_bfd_link_hash_table_create. */ 6058static struct bfd_link_hash_table * 6059nios2_elf32_link_hash_table_create (bfd *abfd) 6060{ 6061 struct elf32_nios2_link_hash_table *ret; 6062 bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table); 6063 6064 ret = bfd_zmalloc (amt); 6065 if (ret == NULL) 6066 return NULL; 6067 6068 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 6069 link_hash_newfunc, 6070 sizeof (struct 6071 elf32_nios2_link_hash_entry), 6072 NIOS2_ELF_DATA)) 6073 { 6074 free (ret); 6075 return NULL; 6076 } 6077 6078 /* Init the stub hash table too. */ 6079 if (!bfd_hash_table_init (&ret->bstab, stub_hash_newfunc, 6080 sizeof (struct elf32_nios2_stub_hash_entry))) 6081 { 6082 _bfd_elf_link_hash_table_free (abfd); 6083 return NULL; 6084 } 6085 ret->root.root.hash_table_free = nios2_elf32_link_hash_table_free; 6086 6087 return &ret->root.root; 6088} 6089 6090/* Implement elf_backend_reloc_type_class. */ 6091static enum elf_reloc_type_class 6092nios2_elf32_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, 6093 const asection *rel_sec ATTRIBUTE_UNUSED, 6094 const Elf_Internal_Rela *rela) 6095{ 6096 switch ((int) ELF32_R_TYPE (rela->r_info)) 6097 { 6098 case R_NIOS2_RELATIVE: 6099 return reloc_class_relative; 6100 case R_NIOS2_JUMP_SLOT: 6101 return reloc_class_plt; 6102 case R_NIOS2_COPY: 6103 return reloc_class_copy; 6104 default: 6105 return reloc_class_normal; 6106 } 6107} 6108 6109/* Return 1 if target is one of ours. */ 6110static bfd_boolean 6111is_nios2_elf_target (const struct bfd_target *targ) 6112{ 6113 return (targ == &nios2_elf32_le_vec 6114 || targ == &nios2_elf32_be_vec); 6115} 6116 6117/* Implement elf_backend_add_symbol_hook. 6118 This hook is called by the linker when adding symbols from an object 6119 file. We use it to put .comm items in .sbss, and not .bss. */ 6120static bfd_boolean 6121nios2_elf_add_symbol_hook (bfd *abfd, 6122 struct bfd_link_info *info, 6123 Elf_Internal_Sym *sym, 6124 const char **namep ATTRIBUTE_UNUSED, 6125 flagword *flagsp ATTRIBUTE_UNUSED, 6126 asection **secp, 6127 bfd_vma *valp) 6128{ 6129 if (sym->st_shndx == SHN_COMMON 6130 && !bfd_link_relocatable (info) 6131 && sym->st_size <= elf_gp_size (abfd) 6132 && is_nios2_elf_target (info->output_bfd->xvec)) 6133 { 6134 /* Common symbols less than or equal to -G nn bytes are automatically 6135 put into .sbss. */ 6136 struct elf32_nios2_link_hash_table *htab; 6137 6138 htab = elf32_nios2_hash_table (info); 6139 if (htab->sbss == NULL) 6140 { 6141 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED; 6142 6143 if (htab->root.dynobj == NULL) 6144 htab->root.dynobj = abfd; 6145 6146 htab->sbss = bfd_make_section_anyway_with_flags (htab->root.dynobj, 6147 ".sbss", flags); 6148 if (htab->sbss == NULL) 6149 return FALSE; 6150 } 6151 6152 *secp = htab->sbss; 6153 *valp = sym->st_size; 6154 } 6155 6156 return TRUE; 6157} 6158 6159/* Implement elf_backend_can_make_relative_eh_frame: 6160 Decide whether to attempt to turn absptr or lsda encodings in 6161 shared libraries into pcrel within the given input section. */ 6162static bfd_boolean 6163nios2_elf32_can_make_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED, 6164 struct bfd_link_info *info 6165 ATTRIBUTE_UNUSED, 6166 asection *eh_frame_section 6167 ATTRIBUTE_UNUSED) 6168{ 6169 /* We can't use PC-relative encodings in the .eh_frame section. */ 6170 return FALSE; 6171} 6172 6173/* Implement elf_backend_special_sections. */ 6174const struct bfd_elf_special_section elf32_nios2_special_sections[] = 6175{ 6176 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, 6177 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL }, 6178 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, 6179 SHF_ALLOC + SHF_WRITE + SHF_NIOS2_GPREL }, 6180 { NULL, 0, 0, 0, 0 } 6181}; 6182 6183#define ELF_ARCH bfd_arch_nios2 6184#define ELF_TARGET_ID NIOS2_ELF_DATA 6185#define ELF_MACHINE_CODE EM_ALTERA_NIOS2 6186 6187/* The Nios II MMU uses a 4K page size. */ 6188 6189#define ELF_MAXPAGESIZE 0x1000 6190 6191#define bfd_elf32_bfd_link_hash_table_create \ 6192 nios2_elf32_link_hash_table_create 6193 6194#define bfd_elf32_bfd_merge_private_bfd_data \ 6195 nios2_elf32_merge_private_bfd_data 6196 6197/* Relocation table lookup macros. */ 6198 6199#define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup 6200#define bfd_elf32_bfd_reloc_name_lookup nios2_elf32_bfd_reloc_name_lookup 6201 6202/* JUMP_TABLE_LINK macros. */ 6203 6204/* elf_info_to_howto (using RELA relocations). */ 6205 6206#define elf_info_to_howto nios2_elf32_info_to_howto 6207 6208/* elf backend functions. */ 6209 6210#define elf_backend_can_gc_sections 1 6211#define elf_backend_can_refcount 1 6212#define elf_backend_plt_readonly 1 6213#define elf_backend_want_got_plt 1 6214#define elf_backend_want_dynrelro 1 6215#define elf_backend_rela_normal 1 6216#define elf_backend_dtrel_excludes_plt 1 6217 6218#define elf_backend_relocate_section nios2_elf32_relocate_section 6219#define elf_backend_section_flags nios2_elf32_section_flags 6220#define elf_backend_fake_sections nios2_elf32_fake_sections 6221#define elf_backend_check_relocs nios2_elf32_check_relocs 6222 6223#define elf_backend_gc_mark_hook nios2_elf32_gc_mark_hook 6224#define elf_backend_gc_sweep_hook nios2_elf32_gc_sweep_hook 6225#define elf_backend_create_dynamic_sections \ 6226 nios2_elf32_create_dynamic_sections 6227#define elf_backend_finish_dynamic_symbol nios2_elf32_finish_dynamic_symbol 6228#define elf_backend_finish_dynamic_sections \ 6229 nios2_elf32_finish_dynamic_sections 6230#define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol 6231#define elf_backend_reloc_type_class nios2_elf32_reloc_type_class 6232#define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections 6233#define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook 6234#define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol 6235#define elf_backend_object_p nios2_elf32_object_p 6236 6237#define elf_backend_grok_prstatus nios2_grok_prstatus 6238#define elf_backend_grok_psinfo nios2_grok_psinfo 6239 6240#undef elf_backend_can_make_relative_eh_frame 6241#define elf_backend_can_make_relative_eh_frame \ 6242 nios2_elf32_can_make_relative_eh_frame 6243 6244#define elf_backend_special_sections elf32_nios2_special_sections 6245 6246#define TARGET_LITTLE_SYM nios2_elf32_le_vec 6247#define TARGET_LITTLE_NAME "elf32-littlenios2" 6248#define TARGET_BIG_SYM nios2_elf32_be_vec 6249#define TARGET_BIG_NAME "elf32-bignios2" 6250 6251#define elf_backend_got_header_size 12 6252#define elf_backend_default_execstack 0 6253 6254#include "elf32-target.h" 6255