Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Side by Side Diff: bfd/elf-m10300.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « bfd/elf-m10200.c ('k') | bfd/elf-nacl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
None
OLDNEW
1 /* Matsushita 10300 specific support for 32-bit ELF 1 /* Matsushita 10300 specific support for 32-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 3 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 4
5 This file is part of BFD, the Binary File Descriptor library. 5 This file is part of BFD, the Binary File Descriptor library.
6 6
7 This program is free software; you can redistribute it and/or modify 7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or 9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version. 10 (at your option) any later version.
11 11
12 This program is distributed in the hope that it will be useful, 12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 instructions. */ 62 instructions. */
63 #define MN10300_CONVERT_CALL_TO_CALLS 0x1 63 #define MN10300_CONVERT_CALL_TO_CALLS 0x1
64 64
65 /* Used to mark functions which have had redundant parts of their 65 /* Used to mark functions which have had redundant parts of their
66 prologue deleted. */ 66 prologue deleted. */
67 #define MN10300_DELETED_PROLOGUE_BYTES 0x2 67 #define MN10300_DELETED_PROLOGUE_BYTES 0x2
68 unsigned char flags; 68 unsigned char flags;
69 69
70 /* Calculated value. */ 70 /* Calculated value. */
71 bfd_vma value; 71 bfd_vma value;
72
73 #define GOT_UNKNOWN 0
74 #define GOT_NORMAL 1
75 #define GOT_TLS_GD 2
76 #define GOT_TLS_LD 3
77 #define GOT_TLS_IE 4
78 /* Used to distinguish GOT entries for TLS types from normal GOT entries. */
79 unsigned char tls_type;
72 }; 80 };
73 81
74 /* We derive a hash table from the main elf linker hash table so 82 /* We derive a hash table from the main elf linker hash table so
75 we can store state variables and a secondary hash table without 83 we can store state variables and a secondary hash table without
76 resorting to global variables. */ 84 resorting to global variables. */
77 struct elf32_mn10300_link_hash_table 85 struct elf32_mn10300_link_hash_table
78 { 86 {
79 /* The main hash table. */ 87 /* The main hash table. */
80 struct elf_link_hash_table root; 88 struct elf_link_hash_table root;
81 89
82 /* A hash table for static functions. We could derive a new hash table 90 /* A hash table for static functions. We could derive a new hash table
83 instead of using the full elf32_mn10300_link_hash_table if we wanted 91 instead of using the full elf32_mn10300_link_hash_table if we wanted
84 to save some memory. */ 92 to save some memory. */
85 struct elf32_mn10300_link_hash_table *static_hash_table; 93 struct elf32_mn10300_link_hash_table *static_hash_table;
86 94
87 /* Random linker state flags. */ 95 /* Random linker state flags. */
88 #define MN10300_HASH_ENTRIES_INITIALIZED 0x1 96 #define MN10300_HASH_ENTRIES_INITIALIZED 0x1
89 char flags; 97 char flags;
98 struct
99 {
100 bfd_signed_vma refcount;
101 bfd_vma offset;
102 char got_allocated;
103 char rel_emitted;
104 } tls_ldm_got;
90 }; 105 };
91 106
107 #define elf_mn10300_hash_entry(ent) ((struct elf32_mn10300_link_hash_entry *)(en t))
108
109 struct elf_mn10300_obj_tdata
110 {
111 struct elf_obj_tdata root;
112
113 /* tls_type for each local got entry. */
114 char * local_got_tls_type;
115 };
116
117 #define elf_mn10300_tdata(abfd) \
118 ((struct elf_mn10300_obj_tdata *) (abfd)->tdata.any)
119
120 #define elf_mn10300_local_got_tls_type(abfd) \
121 (elf_mn10300_tdata (abfd)->local_got_tls_type)
122
92 #ifndef streq 123 #ifndef streq
93 #define streq(a, b) (strcmp ((a),(b)) == 0) 124 #define streq(a, b) (strcmp ((a),(b)) == 0)
94 #endif 125 #endif
95 126
96 /* For MN10300 linker hash table. */ 127 /* For MN10300 linker hash table. */
97 128
98 /* Get the MN10300 ELF linker hash table from a link_info structure. */ 129 /* Get the MN10300 ELF linker hash table from a link_info structure. */
99 130
100 #define elf32_mn10300_hash_table(p) \ 131 #define elf32_mn10300_hash_table(p) \
101 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ 132 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 FALSE, /* pc_relative */ 472 FALSE, /* pc_relative */
442 0, /* bitpos */ 473 0, /* bitpos */
443 complain_overflow_bitfield, /* complain_on_overflow */ 474 complain_overflow_bitfield, /* complain_on_overflow */
444 bfd_elf_generic_reloc, /* */ 475 bfd_elf_generic_reloc, /* */
445 "R_MN10300_RELATIVE", /* name */ 476 "R_MN10300_RELATIVE", /* name */
446 FALSE, /* partial_inplace */ 477 FALSE, /* partial_inplace */
447 0xffffffff, /* src_mask */ 478 0xffffffff, /* src_mask */
448 0xffffffff, /* dst_mask */ 479 0xffffffff, /* dst_mask */
449 FALSE), /* pcrel_offset */ 480 FALSE), /* pcrel_offset */
450 481
451 EMPTY_HOWTO (24), 482 HOWTO (R_MN10300_TLS_GD,» /* type */
452 EMPTY_HOWTO (25), 483 » 0,» » » /* rightshift */
453 EMPTY_HOWTO (26), 484 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
454 EMPTY_HOWTO (27), 485 » 32,» » » /* bitsize */
455 EMPTY_HOWTO (28), 486 » FALSE,»» » /* pc_relative */
456 EMPTY_HOWTO (29), 487 » 0,» » » /* bitpos */
457 EMPTY_HOWTO (30), 488 » complain_overflow_bitfield, /* complain_on_overflow */
458 EMPTY_HOWTO (31), 489 » bfd_elf_generic_reloc, /* */
459 EMPTY_HOWTO (32), 490 » "R_MN10300_TLS_GD",» /* name */
491 » FALSE,»» » /* partial_inplace */
492 » 0xffffffff,» » /* src_mask */
493 » 0xffffffff,» » /* dst_mask */
494 » FALSE),» » /* pcrel_offset */
495
496 HOWTO (R_MN10300_TLS_LD,» /* type */
497 » 0,» » » /* rightshift */
498 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
499 » 32,» » » /* bitsize */
500 » FALSE,»» » /* pc_relative */
501 » 0,» » » /* bitpos */
502 » complain_overflow_bitfield, /* complain_on_overflow */
503 » bfd_elf_generic_reloc, /* */
504 » "R_MN10300_TLS_LD",» /* name */
505 » FALSE,»» » /* partial_inplace */
506 » 0xffffffff,» » /* src_mask */
507 » 0xffffffff,» » /* dst_mask */
508 » FALSE),» » /* pcrel_offset */
509
510 HOWTO (R_MN10300_TLS_LDO,» /* type */
511 » 0,» » » /* rightshift */
512 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
513 » 32,» » » /* bitsize */
514 » FALSE,»» » /* pc_relative */
515 » 0,» » » /* bitpos */
516 » complain_overflow_bitfield, /* complain_on_overflow */
517 » bfd_elf_generic_reloc, /* */
518 » "R_MN10300_TLS_LDO",» /* name */
519 » FALSE,»» » /* partial_inplace */
520 » 0xffffffff,» » /* src_mask */
521 » 0xffffffff,» » /* dst_mask */
522 » FALSE),» » /* pcrel_offset */
523
524 HOWTO (R_MN10300_TLS_GOTIE,» /* type */
525 » 0,» » » /* rightshift */
526 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
527 » 32,» » » /* bitsize */
528 » FALSE,»» » /* pc_relative */
529 » 0,» » » /* bitpos */
530 » complain_overflow_bitfield, /* complain_on_overflow */
531 » bfd_elf_generic_reloc, /* */
532 » "R_MN10300_TLS_GOTIE",»/* name */
533 » FALSE,»» » /* partial_inplace */
534 » 0xffffffff,» » /* src_mask */
535 » 0xffffffff,» » /* dst_mask */
536 » FALSE),» » /* pcrel_offset */
537
538 HOWTO (R_MN10300_TLS_IE,» /* type */
539 » 0,» » » /* rightshift */
540 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
541 » 32,» » » /* bitsize */
542 » FALSE,»» » /* pc_relative */
543 » 0,» » » /* bitpos */
544 » complain_overflow_bitfield, /* complain_on_overflow */
545 » bfd_elf_generic_reloc, /* */
546 » "R_MN10300_TLS_IE",» /* name */
547 » FALSE,»» » /* partial_inplace */
548 » 0xffffffff,» » /* src_mask */
549 » 0xffffffff,» » /* dst_mask */
550 » FALSE),» » /* pcrel_offset */
551
552 HOWTO (R_MN10300_TLS_LE,» /* type */
553 » 0,» » » /* rightshift */
554 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
555 » 32,» » » /* bitsize */
556 » FALSE,»» » /* pc_relative */
557 » 0,» » » /* bitpos */
558 » complain_overflow_bitfield, /* complain_on_overflow */
559 » bfd_elf_generic_reloc, /* */
560 » "R_MN10300_TLS_LE",» /* name */
561 » FALSE,»» » /* partial_inplace */
562 » 0xffffffff,» » /* src_mask */
563 » 0xffffffff,» » /* dst_mask */
564 » FALSE),» » /* pcrel_offset */
565
566 HOWTO (R_MN10300_TLS_DTPMOD,» /* type */
567 » 0,» » » /* rightshift */
568 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
569 » 32,» » » /* bitsize */
570 » FALSE,»» » /* pc_relative */
571 » 0,» » » /* bitpos */
572 » complain_overflow_bitfield, /* complain_on_overflow */
573 » bfd_elf_generic_reloc, /* */
574 » "R_MN10300_TLS_DTPMOD",» /* name */
575 » FALSE,»» » /* partial_inplace */
576 » 0xffffffff,» » /* src_mask */
577 » 0xffffffff,» » /* dst_mask */
578 » FALSE),» » /* pcrel_offset */
579
580 HOWTO (R_MN10300_TLS_DTPOFF,» /* type */
581 » 0,» » » /* rightshift */
582 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
583 » 32,» » » /* bitsize */
584 » FALSE,»» » /* pc_relative */
585 » 0,» » » /* bitpos */
586 » complain_overflow_bitfield, /* complain_on_overflow */
587 » bfd_elf_generic_reloc, /* */
588 » "R_MN10300_TLS_DTPOFF",» /* name */
589 » FALSE,»» » /* partial_inplace */
590 » 0xffffffff,» » /* src_mask */
591 » 0xffffffff,» » /* dst_mask */
592 » FALSE),» » /* pcrel_offset */
593
594 HOWTO (R_MN10300_TLS_TPOFF,» /* type */
595 » 0,» » » /* rightshift */
596 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */
597 » 32,» » » /* bitsize */
598 » FALSE,»» » /* pc_relative */
599 » 0,» » » /* bitpos */
600 » complain_overflow_bitfield, /* complain_on_overflow */
601 » bfd_elf_generic_reloc, /* */
602 » "R_MN10300_TLS_TPOFF",»/* name */
603 » FALSE,»» » /* partial_inplace */
604 » 0xffffffff,» » /* src_mask */
605 » 0xffffffff,» » /* dst_mask */
606 » FALSE),» » /* pcrel_offset */
460 607
461 HOWTO (R_MN10300_SYM_DIFF, /* type */ 608 HOWTO (R_MN10300_SYM_DIFF, /* type */
462 0, /* rightshift */ 609 0, /* rightshift */
463 2, /* size (0 = byte, 1 = short, 2 = long) */ 610 2, /* size (0 = byte, 1 = short, 2 = long) */
464 32, /* bitsize */ 611 32, /* bitsize */
465 FALSE, /* pc_relative */ 612 FALSE, /* pc_relative */
466 0, /* bitpos */ 613 0, /* bitpos */
467 complain_overflow_dont,/* complain_on_overflow */ 614 complain_overflow_dont,/* complain_on_overflow */
468 NULL, /* special handler. */ 615 NULL, /* special handler. */
469 "R_MN10300_SYM_DIFF", /* name */ 616 "R_MN10300_SYM_DIFF", /* name */
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 { BFD_RELOC_16_GOTOFF, R_MN10300_GOTOFF16 }, 659 { BFD_RELOC_16_GOTOFF, R_MN10300_GOTOFF16 },
513 { BFD_RELOC_32_PLT_PCREL, R_MN10300_PLT32 }, 660 { BFD_RELOC_32_PLT_PCREL, R_MN10300_PLT32 },
514 { BFD_RELOC_16_PLT_PCREL, R_MN10300_PLT16 }, 661 { BFD_RELOC_16_PLT_PCREL, R_MN10300_PLT16 },
515 { BFD_RELOC_MN10300_GOT32, R_MN10300_GOT32 }, 662 { BFD_RELOC_MN10300_GOT32, R_MN10300_GOT32 },
516 { BFD_RELOC_MN10300_GOT24, R_MN10300_GOT24 }, 663 { BFD_RELOC_MN10300_GOT24, R_MN10300_GOT24 },
517 { BFD_RELOC_MN10300_GOT16, R_MN10300_GOT16 }, 664 { BFD_RELOC_MN10300_GOT16, R_MN10300_GOT16 },
518 { BFD_RELOC_MN10300_COPY, R_MN10300_COPY }, 665 { BFD_RELOC_MN10300_COPY, R_MN10300_COPY },
519 { BFD_RELOC_MN10300_GLOB_DAT, R_MN10300_GLOB_DAT }, 666 { BFD_RELOC_MN10300_GLOB_DAT, R_MN10300_GLOB_DAT },
520 { BFD_RELOC_MN10300_JMP_SLOT, R_MN10300_JMP_SLOT }, 667 { BFD_RELOC_MN10300_JMP_SLOT, R_MN10300_JMP_SLOT },
521 { BFD_RELOC_MN10300_RELATIVE, R_MN10300_RELATIVE }, 668 { BFD_RELOC_MN10300_RELATIVE, R_MN10300_RELATIVE },
669 { BFD_RELOC_MN10300_TLS_GD, R_MN10300_TLS_GD },
670 { BFD_RELOC_MN10300_TLS_LD, R_MN10300_TLS_LD },
671 { BFD_RELOC_MN10300_TLS_LDO, R_MN10300_TLS_LDO },
672 { BFD_RELOC_MN10300_TLS_GOTIE, R_MN10300_TLS_GOTIE },
673 { BFD_RELOC_MN10300_TLS_IE, R_MN10300_TLS_IE },
674 { BFD_RELOC_MN10300_TLS_LE, R_MN10300_TLS_LE },
675 { BFD_RELOC_MN10300_TLS_DTPMOD, R_MN10300_TLS_DTPMOD },
676 { BFD_RELOC_MN10300_TLS_DTPOFF, R_MN10300_TLS_DTPOFF },
677 { BFD_RELOC_MN10300_TLS_TPOFF, R_MN10300_TLS_TPOFF },
522 { BFD_RELOC_MN10300_SYM_DIFF, R_MN10300_SYM_DIFF }, 678 { BFD_RELOC_MN10300_SYM_DIFF, R_MN10300_SYM_DIFF },
523 { BFD_RELOC_MN10300_ALIGN, R_MN10300_ALIGN } 679 { BFD_RELOC_MN10300_ALIGN, R_MN10300_ALIGN }
524 }; 680 };
525 681
526 /* Create the GOT section. */ 682 /* Create the GOT section. */
527 683
528 static bfd_boolean 684 static bfd_boolean
529 _bfd_mn10300_elf_create_got_section (bfd * abfd, 685 _bfd_mn10300_elf_create_got_section (bfd * abfd,
530 struct bfd_link_info * info) 686 struct bfd_link_info * info)
531 { 687 {
532 flagword flags; 688 flagword flags;
533 flagword pltflags; 689 flagword pltflags;
534 asection * s; 690 asection * s;
535 struct elf_link_hash_entry * h; 691 struct elf_link_hash_entry * h;
536 const struct elf_backend_data * bed = get_elf_backend_data (abfd); 692 const struct elf_backend_data * bed = get_elf_backend_data (abfd);
693 struct elf_link_hash_table *htab;
537 int ptralign; 694 int ptralign;
538 695
539 /* This function may be called more than once. */ 696 /* This function may be called more than once. */
540 if (bfd_get_section_by_name (abfd, ".got") != NULL) 697 htab = elf_hash_table (info);
698 if (htab->sgot != NULL)
541 return TRUE; 699 return TRUE;
542 700
543 switch (bed->s->arch_size) 701 switch (bed->s->arch_size)
544 { 702 {
545 case 32: 703 case 32:
546 ptralign = 2; 704 ptralign = 2;
547 break; 705 break;
548 706
549 case 64: 707 case 64:
550 ptralign = 3; 708 ptralign = 3;
551 break; 709 break;
552 710
553 default: 711 default:
554 bfd_set_error (bfd_error_bad_value); 712 bfd_set_error (bfd_error_bad_value);
555 return FALSE; 713 return FALSE;
556 } 714 }
557 715
558 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY 716 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
559 | SEC_LINKER_CREATED); 717 | SEC_LINKER_CREATED);
560 718
561 pltflags = flags; 719 pltflags = flags;
562 pltflags |= SEC_CODE; 720 pltflags |= SEC_CODE;
563 if (bed->plt_not_loaded) 721 if (bed->plt_not_loaded)
564 pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS); 722 pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS);
565 if (bed->plt_readonly) 723 if (bed->plt_readonly)
566 pltflags |= SEC_READONLY; 724 pltflags |= SEC_READONLY;
567 725
568 s = bfd_make_section_with_flags (abfd, ".plt", pltflags); 726 s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags);
727 htab->splt = s;
569 if (s == NULL 728 if (s == NULL
570 || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) 729 || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
571 return FALSE; 730 return FALSE;
572 731
573 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the 732 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
574 .plt section. */ 733 .plt section. */
575 if (bed->want_plt_sym) 734 if (bed->want_plt_sym)
576 { 735 {
577 h = _bfd_elf_define_linkage_sym (abfd, info, s, 736 h = _bfd_elf_define_linkage_sym (abfd, info, s,
578 "_PROCEDURE_LINKAGE_TABLE_"); 737 "_PROCEDURE_LINKAGE_TABLE_");
579 elf_hash_table (info)->hplt = h; 738 htab->hplt = h;
580 if (h == NULL) 739 if (h == NULL)
581 return FALSE; 740 return FALSE;
582 } 741 }
583 742
584 s = bfd_make_section_with_flags (abfd, ".got", flags); 743 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
744 htab->sgot = s;
585 if (s == NULL 745 if (s == NULL
586 || ! bfd_set_section_alignment (abfd, s, ptralign)) 746 || ! bfd_set_section_alignment (abfd, s, ptralign))
587 return FALSE; 747 return FALSE;
588 748
589 if (bed->want_got_plt) 749 if (bed->want_got_plt)
590 { 750 {
591 s = bfd_make_section_with_flags (abfd, ".got.plt", flags); 751 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
752 htab->sgotplt = s;
592 if (s == NULL 753 if (s == NULL
593 || ! bfd_set_section_alignment (abfd, s, ptralign)) 754 || ! bfd_set_section_alignment (abfd, s, ptralign))
594 return FALSE; 755 return FALSE;
595 } 756 }
596 757
597 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got 758 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
598 (or .got.plt) section. We don't do this in the linker script 759 (or .got.plt) section. We don't do this in the linker script
599 because we don't want to define the symbol if we are not creating 760 because we don't want to define the symbol if we are not creating
600 a global offset table. */ 761 a global offset table. */
601 h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_"); 762 h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_");
602 elf_hash_table (info)->hgot = h; 763 htab->hgot = h;
603 if (h == NULL) 764 if (h == NULL)
604 return FALSE; 765 return FALSE;
605 766
606 /* The first bit of the global offset table is the header. */ 767 /* The first bit of the global offset table is the header. */
607 s->size += bed->got_header_size; 768 s->size += bed->got_header_size;
608 769
609 return TRUE; 770 return TRUE;
610 } 771 }
611 772
612 static reloc_howto_type * 773 static reloc_howto_type *
(...skipping 30 matching lines...) Expand all
643 arelent *cache_ptr, 804 arelent *cache_ptr,
644 Elf_Internal_Rela *dst) 805 Elf_Internal_Rela *dst)
645 { 806 {
646 unsigned int r_type; 807 unsigned int r_type;
647 808
648 r_type = ELF32_R_TYPE (dst->r_info); 809 r_type = ELF32_R_TYPE (dst->r_info);
649 BFD_ASSERT (r_type < (unsigned int) R_MN10300_MAX); 810 BFD_ASSERT (r_type < (unsigned int) R_MN10300_MAX);
650 cache_ptr->howto = elf_mn10300_howto_table + r_type; 811 cache_ptr->howto = elf_mn10300_howto_table + r_type;
651 } 812 }
652 813
814 static int
815 elf_mn10300_tls_transition (struct bfd_link_info * info,
816 int r_type,
817 struct elf_link_hash_entry * h,
818 asection * sec,
819 bfd_boolean counting)
820 {
821 bfd_boolean is_local;
822
823 if (r_type == R_MN10300_TLS_GD
824 && h != NULL
825 && elf_mn10300_hash_entry (h)->tls_type == GOT_TLS_IE)
826 return R_MN10300_TLS_GOTIE;
827
828 if (info->shared)
829 return r_type;
830
831 if (! (sec->flags & SEC_CODE))
832 return r_type;
833
834 if (! counting && h != NULL && ! elf_hash_table (info)->dynamic_sections_creat ed)
835 is_local = TRUE;
836 else
837 is_local = SYMBOL_CALLS_LOCAL (info, h);
838
839 /* For the main program, these are the transitions we do. */
840 switch (r_type)
841 {
842 case R_MN10300_TLS_GD: return is_local ? R_MN10300_TLS_LE : R_MN10300_TLS_GO TIE;
843 case R_MN10300_TLS_LD: return R_MN10300_NONE;
844 case R_MN10300_TLS_LDO: return R_MN10300_TLS_LE;
845 case R_MN10300_TLS_IE:
846 case R_MN10300_TLS_GOTIE: return is_local ? R_MN10300_TLS_LE : r_type;
847 }
848
849 return r_type;
850 }
851
852 /* Return the relocation value for @tpoff relocation
853 if STT_TLS virtual address is ADDRESS. */
854
855 static bfd_vma
856 dtpoff (struct bfd_link_info * info, bfd_vma address)
857 {
858 struct elf_link_hash_table *htab = elf_hash_table (info);
859
860 /* If tls_sec is NULL, we should have signalled an error already. */
861 if (htab->tls_sec == NULL)
862 return 0;
863 return address - htab->tls_sec->vma;
864 }
865
866 /* Return the relocation value for @tpoff relocation
867 if STT_TLS virtual address is ADDRESS. */
868
869 static bfd_vma
870 tpoff (struct bfd_link_info * info, bfd_vma address)
871 {
872 struct elf_link_hash_table *htab = elf_hash_table (info);
873
874 /* If tls_sec is NULL, we should have signalled an error already. */
875 if (htab->tls_sec == NULL)
876 return 0;
877 return address - (htab->tls_size + htab->tls_sec->vma);
878 }
879
880 /* Returns nonzero if there's a R_MN10300_PLT32 reloc that we now need
881 to skip, after this one. The actual value is the offset between
882 this reloc and the PLT reloc. */
883
884 static int
885 mn10300_do_tls_transition (bfd * input_bfd,
886 unsigned int r_type,
887 unsigned int tls_r_type,
888 bfd_byte * contents,
889 bfd_vma offset)
890 {
891 bfd_byte *op = contents + offset;
892 int gotreg = 0;
893
894 #define TLS_PAIR(r1,r2) ((r1) * R_MN10300_MAX + (r2))
895
896 /* This is common to all GD/LD transitions, so break it out. */
897 if (r_type == R_MN10300_TLS_GD
898 || r_type == R_MN10300_TLS_LD)
899 {
900 op -= 2;
901 /* mov imm,d0. */
902 BFD_ASSERT (bfd_get_8 (input_bfd, op) == 0xFC);
903 BFD_ASSERT (bfd_get_8 (input_bfd, op + 1) == 0xCC);
904 /* add aN,d0. */
905 BFD_ASSERT (bfd_get_8 (input_bfd, op + 6) == 0xF1);
906 gotreg = (bfd_get_8 (input_bfd, op + 7) & 0x0c) >> 2;
907 /* Call. */
908 BFD_ASSERT (bfd_get_8 (input_bfd, op + 8) == 0xDD);
909 }
910
911 switch (TLS_PAIR (r_type, tls_r_type))
912 {
913 case TLS_PAIR (R_MN10300_TLS_GD, R_MN10300_TLS_GOTIE):
914 {
915 /* Keep track of which register we put GOTptr in. */
916 /* mov (_x@indntpoff,a2),a0. */
917 memcpy (op, "\xFC\x20\x00\x00\x00\x00", 6);
918 op[1] |= gotreg;
919 /* add e2,a0. */
920 memcpy (op+6, "\xF9\x78\x28", 3);
921 /* or 0x00000000, d0 - six byte nop. */
922 memcpy (op+9, "\xFC\xE4\x00\x00\x00\x00", 6);
923 }
924 return 7;
925
926 case TLS_PAIR (R_MN10300_TLS_GD, R_MN10300_TLS_LE):
927 {
928 /* Register is *always* a0. */
929 /* mov _x@tpoff,a0. */
930 memcpy (op, "\xFC\xDC\x00\x00\x00\x00", 6);
931 /* add e2,a0. */
932 memcpy (op+6, "\xF9\x78\x28", 3);
933 /* or 0x00000000, d0 - six byte nop. */
934 memcpy (op+9, "\xFC\xE4\x00\x00\x00\x00", 6);
935 }
936 return 7;
937 case TLS_PAIR (R_MN10300_TLS_LD, R_MN10300_NONE):
938 {
939 /* Register is *always* a0. */
940 /* mov e2,a0. */
941 memcpy (op, "\xF5\x88", 2);
942 /* or 0x00000000, d0 - six byte nop. */
943 memcpy (op+2, "\xFC\xE4\x00\x00\x00\x00", 6);
944 /* or 0x00000000, e2 - seven byte nop. */
945 memcpy (op+8, "\xFE\x19\x22\x00\x00\x00\x00", 7);
946 }
947 return 7;
948
949 case TLS_PAIR (R_MN10300_TLS_LDO, R_MN10300_TLS_LE):
950 /* No changes needed, just the reloc change. */
951 return 0;
952
953 /* These are a little tricky, because we have to detect which
954 opcode is being used (they're different sizes, with the reloc
955 at different offsets within the opcode) and convert each
956 accordingly, copying the operands as needed. The conversions
957 we do are as follows (IE,GOTIE,LE):
958
959 1111 1100 1010 01Dn [-- abs32 --] MOV (x@indntpoff),Dn
960 1111 1100 0000 DnAm [-- abs32 --] MOV (x@gotntpoff,Am),Dn
961 1111 1100 1100 11Dn [-- abs32 --] MOV x@tpoff,Dn
962
963 1111 1100 1010 00An [-- abs32 --] MOV (x@indntpoff),An
964 1111 1100 0010 AnAm [-- abs32 --] MOV (x@gotntpoff,Am),An
965 1111 1100 1101 11An [-- abs32 --] MOV x@tpoff,An
966
967 1111 1110 0000 1110 Rnnn Xxxx [-- abs32 --] MOV (x@indntpoff),Rn
968 1111 1110 0000 1010 Rnnn Rmmm [-- abs32 --] MOV (x@indntpoff,Rm),Rn
969 1111 1110 0000 1000 Rnnn Xxxx [-- abs32 --] MOV x@tpoff,Rn
970
971 Since the GOT pointer is always $a2, we assume the last
972 normally won't happen, but let's be paranoid and plan for the
973 day that GCC optimizes it somewhow. */
974
975 case TLS_PAIR (R_MN10300_TLS_IE, R_MN10300_TLS_LE):
976 if (op[-2] == 0xFC)
977 {
978 op -= 2;
979 if ((op[1] & 0xFC) == 0xA4) /* Dn */
980 {
981 op[1] &= 0x03; /* Leaves Dn. */
982 op[1] |= 0xCC;
983 }
984 else /* An */
985 {
986 op[1] &= 0x03; /* Leaves An. */
987 op[1] |= 0xDC;
988 }
989 }
990 else if (op[-3] == 0xFE)
991 op[-2] = 0x08;
992 else
993 abort ();
994 break;
995
996 case TLS_PAIR (R_MN10300_TLS_GOTIE, R_MN10300_TLS_LE):
997 if (op[-2] == 0xFC)
998 {
999 op -= 2;
1000 if ((op[1] & 0xF0) == 0x00) /* Dn */
1001 {
1002 op[1] &= 0x0C; /* Leaves Dn. */
1003 op[1] >>= 2;
1004 op[1] |= 0xCC;
1005 }
1006 else /* An */
1007 {
1008 op[1] &= 0x0C; /* Leaves An. */
1009 op[1] >>= 2;
1010 op[1] |= 0xDC;
1011 }
1012 }
1013 else if (op[-3] == 0xFE)
1014 op[-2] = 0x08;
1015 else
1016 abort ();
1017 break;
1018
1019 default:
1020 (*_bfd_error_handler)
1021 (_("%s: Unsupported transition from %s to %s"),
1022 bfd_get_filename (input_bfd),
1023 elf_mn10300_howto_table[r_type].name,
1024 elf_mn10300_howto_table[tls_r_type].name);
1025 break;
1026 }
1027 #undef TLS_PAIR
1028 return 0;
1029 }
1030
653 /* Look through the relocs for a section during the first phase. 1031 /* Look through the relocs for a section during the first phase.
654 Since we don't do .gots or .plts, we just need to consider the 1032 Since we don't do .gots or .plts, we just need to consider the
655 virtual table relocs for gc. */ 1033 virtual table relocs for gc. */
656 1034
657 static bfd_boolean 1035 static bfd_boolean
658 mn10300_elf_check_relocs (bfd *abfd, 1036 mn10300_elf_check_relocs (bfd *abfd,
659 struct bfd_link_info *info, 1037 struct bfd_link_info *info,
660 asection *sec, 1038 asection *sec,
661 const Elf_Internal_Rela *relocs) 1039 const Elf_Internal_Rela *relocs)
662 { 1040 {
1041 struct elf32_mn10300_link_hash_table * htab = elf32_mn10300_hash_table (info);
663 bfd_boolean sym_diff_reloc_seen; 1042 bfd_boolean sym_diff_reloc_seen;
664 Elf_Internal_Shdr *symtab_hdr; 1043 Elf_Internal_Shdr *symtab_hdr;
665 Elf_Internal_Sym * isymbuf = NULL; 1044 Elf_Internal_Sym * isymbuf = NULL;
666 struct elf_link_hash_entry **sym_hashes; 1045 struct elf_link_hash_entry **sym_hashes;
667 const Elf_Internal_Rela *rel; 1046 const Elf_Internal_Rela *rel;
668 const Elf_Internal_Rela *rel_end; 1047 const Elf_Internal_Rela *rel_end;
669 bfd * dynobj; 1048 bfd * dynobj;
670 bfd_vma * local_got_offsets; 1049 bfd_vma * local_got_offsets;
671 asection * sgot; 1050 asection * sgot;
672 asection * srelgot; 1051 asection * srelgot;
(...skipping 14 matching lines...) Expand all
687 dynobj = elf_hash_table (info)->dynobj; 1066 dynobj = elf_hash_table (info)->dynobj;
688 local_got_offsets = elf_local_got_offsets (abfd); 1067 local_got_offsets = elf_local_got_offsets (abfd);
689 rel_end = relocs + sec->reloc_count; 1068 rel_end = relocs + sec->reloc_count;
690 sym_diff_reloc_seen = FALSE; 1069 sym_diff_reloc_seen = FALSE;
691 1070
692 for (rel = relocs; rel < rel_end; rel++) 1071 for (rel = relocs; rel < rel_end; rel++)
693 { 1072 {
694 struct elf_link_hash_entry *h; 1073 struct elf_link_hash_entry *h;
695 unsigned long r_symndx; 1074 unsigned long r_symndx;
696 unsigned int r_type; 1075 unsigned int r_type;
1076 int tls_type = GOT_NORMAL;
697 1077
698 r_symndx = ELF32_R_SYM (rel->r_info); 1078 r_symndx = ELF32_R_SYM (rel->r_info);
699 if (r_symndx < symtab_hdr->sh_info) 1079 if (r_symndx < symtab_hdr->sh_info)
700 h = NULL; 1080 h = NULL;
701 else 1081 else
702 { 1082 {
703 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 1083 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
704 while (h->root.type == bfd_link_hash_indirect 1084 while (h->root.type == bfd_link_hash_indirect
705 || h->root.type == bfd_link_hash_warning) 1085 || h->root.type == bfd_link_hash_warning)
706 h = (struct elf_link_hash_entry *) h->root.u.i.link; 1086 h = (struct elf_link_hash_entry *) h->root.u.i.link;
707 } 1087 }
708 1088
709 r_type = ELF32_R_TYPE (rel->r_info); 1089 r_type = ELF32_R_TYPE (rel->r_info);
1090 r_type = elf_mn10300_tls_transition (info, r_type, h, sec, TRUE);
710 1091
711 /* Some relocs require a global offset table. */ 1092 /* Some relocs require a global offset table. */
712 if (dynobj == NULL) 1093 if (dynobj == NULL)
713 { 1094 {
714 switch (r_type) 1095 switch (r_type)
715 { 1096 {
716 case R_MN10300_GOT32: 1097 case R_MN10300_GOT32:
717 case R_MN10300_GOT24: 1098 case R_MN10300_GOT24:
718 case R_MN10300_GOT16: 1099 case R_MN10300_GOT16:
719 case R_MN10300_GOTOFF32: 1100 case R_MN10300_GOTOFF32:
720 case R_MN10300_GOTOFF24: 1101 case R_MN10300_GOTOFF24:
721 case R_MN10300_GOTOFF16: 1102 case R_MN10300_GOTOFF16:
722 case R_MN10300_GOTPC32: 1103 case R_MN10300_GOTPC32:
723 case R_MN10300_GOTPC16: 1104 case R_MN10300_GOTPC16:
1105 case R_MN10300_TLS_GD:
1106 case R_MN10300_TLS_LD:
1107 case R_MN10300_TLS_GOTIE:
1108 case R_MN10300_TLS_IE:
724 elf_hash_table (info)->dynobj = dynobj = abfd; 1109 elf_hash_table (info)->dynobj = dynobj = abfd;
725 if (! _bfd_mn10300_elf_create_got_section (dynobj, info)) 1110 if (! _bfd_mn10300_elf_create_got_section (dynobj, info))
726 goto fail; 1111 goto fail;
727 break; 1112 break;
728 1113
729 default: 1114 default:
730 break; 1115 break;
731 } 1116 }
732 } 1117 }
733 1118
734 switch (r_type) 1119 switch (r_type)
735 { 1120 {
736 /* This relocation describes the C++ object vtable hierarchy. 1121 /* This relocation describes the C++ object vtable hierarchy.
737 Reconstruct it for later use during GC. */ 1122 Reconstruct it for later use during GC. */
738 case R_MN10300_GNU_VTINHERIT: 1123 case R_MN10300_GNU_VTINHERIT:
739 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 1124 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
740 goto fail; 1125 goto fail;
741 break; 1126 break;
742 1127
743 /* This relocation describes which C++ vtable entries are actually 1128 /* This relocation describes which C++ vtable entries are actually
744 used. Record for later use during GC. */ 1129 used. Record for later use during GC. */
745 case R_MN10300_GNU_VTENTRY: 1130 case R_MN10300_GNU_VTENTRY:
746 BFD_ASSERT (h != NULL); 1131 BFD_ASSERT (h != NULL);
747 if (h != NULL 1132 if (h != NULL
748 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 1133 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
749 goto fail; 1134 goto fail;
750 break; 1135 break;
751 1136
1137 case R_MN10300_TLS_LD:
1138 htab->tls_ldm_got.refcount ++;
1139 tls_type = GOT_TLS_LD;
1140
1141 if (htab->tls_ldm_got.got_allocated)
1142 break;
1143 goto create_got;
1144
1145 case R_MN10300_TLS_IE:
1146 case R_MN10300_TLS_GOTIE:
1147 if (info->shared)
1148 info->flags |= DF_STATIC_TLS;
1149 /* Fall through */
1150
1151 case R_MN10300_TLS_GD:
752 case R_MN10300_GOT32: 1152 case R_MN10300_GOT32:
753 case R_MN10300_GOT24: 1153 case R_MN10300_GOT24:
754 case R_MN10300_GOT16: 1154 case R_MN10300_GOT16:
1155 create_got:
755 /* This symbol requires a global offset table entry. */ 1156 /* This symbol requires a global offset table entry. */
756 1157
1158 switch (r_type)
1159 {
1160 case R_MN10300_TLS_IE:
1161 case R_MN10300_TLS_GOTIE: tls_type = GOT_TLS_IE; break;
1162 case R_MN10300_TLS_GD: tls_type = GOT_TLS_GD; break;
1163 default: tls_type = GOT_NORMAL; break;
1164 }
1165
757 if (sgot == NULL) 1166 if (sgot == NULL)
758 { 1167 {
759 » sgot = bfd_get_section_by_name (dynobj, ".got"); 1168 » sgot = htab->root.sgot;
760 BFD_ASSERT (sgot != NULL); 1169 BFD_ASSERT (sgot != NULL);
761 } 1170 }
762 1171
763 if (srelgot == NULL 1172 if (srelgot == NULL
764 && (h != NULL || info->shared)) 1173 && (h != NULL || info->shared))
765 { 1174 {
766 » srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); 1175 » srelgot = bfd_get_linker_section (dynobj, ".rela.got");
767 if (srelgot == NULL) 1176 if (srelgot == NULL)
768 { 1177 {
769 » » srelgot = bfd_make_section_with_flags (dynobj, 1178 » » flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
770 » » » » » » » ".rela.got", 1179 » » » » | SEC_IN_MEMORY | SEC_LINKER_CREATED
771 » » » » » » » (SEC_ALLOC 1180 » » » » | SEC_READONLY);
772 » » » » » » » | SEC_LOAD 1181 » » srelgot = bfd_make_section_anyway_with_flags (dynobj,
773 » » » » » » » | SEC_HAS_CONTENTS 1182 » » » » » » » » ".rela.got",
774 » » » » » » » | SEC_IN_MEMORY 1183 » » » » » » » » flags);
775 » » » » » » » | SEC_LINKER_CREATED
776 » » » » » » » | SEC_READONLY));
777 if (srelgot == NULL 1184 if (srelgot == NULL
778 || ! bfd_set_section_alignment (dynobj, srelgot, 2)) 1185 || ! bfd_set_section_alignment (dynobj, srelgot, 2))
779 goto fail; 1186 goto fail;
780 } 1187 }
781 } 1188 }
782 1189
783 » if (h != NULL) 1190 » if (r_type == R_MN10300_TLS_LD)
784 { 1191 {
1192 htab->tls_ldm_got.offset = sgot->size;
1193 htab->tls_ldm_got.got_allocated ++;
1194 }
1195 else if (h != NULL)
1196 {
1197 if (elf_mn10300_hash_entry (h)->tls_type != tls_type
1198 && elf_mn10300_hash_entry (h)->tls_type != GOT_UNKNOWN)
1199 {
1200 if (tls_type == GOT_TLS_IE
1201 && elf_mn10300_hash_entry (h)->tls_type == GOT_TLS_GD)
1202 /* No change - this is ok. */;
1203 else if (tls_type == GOT_TLS_GD
1204 && elf_mn10300_hash_entry (h)->tls_type == GOT_TLS_IE)
1205 /* Transition GD->IE. */
1206 tls_type = GOT_TLS_IE;
1207 else
1208 (*_bfd_error_handler)
1209 (_("%B: %s' accessed both as normal and thread local symbo l"),
1210 abfd, h ? h->root.root.string : "<local>");
1211 }
1212
1213 elf_mn10300_hash_entry (h)->tls_type = tls_type;
1214
785 if (h->got.offset != (bfd_vma) -1) 1215 if (h->got.offset != (bfd_vma) -1)
786 /* We have already allocated space in the .got. */ 1216 /* We have already allocated space in the .got. */
787 break; 1217 break;
788 1218
789 h->got.offset = sgot->size; 1219 h->got.offset = sgot->size;
790 1220
791 » /* Make sure this symbol is output as a dynamic symbol. */ 1221 » if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
792 » if (h->dynindx == -1) 1222 » » /* Make sure this symbol is output as a dynamic symbol. */
1223 » » && h->dynindx == -1)
793 { 1224 {
794 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1225 if (! bfd_elf_link_record_dynamic_symbol (info, h))
795 goto fail; 1226 goto fail;
796 } 1227 }
797 1228
798 srelgot->size += sizeof (Elf32_External_Rela); 1229 srelgot->size += sizeof (Elf32_External_Rela);
1230 if (r_type == R_MN10300_TLS_GD)
1231 srelgot->size += sizeof (Elf32_External_Rela);
799 } 1232 }
800 else 1233 else
801 { 1234 {
802 /* This is a global offset table entry for a local 1235 /* This is a global offset table entry for a local
803 symbol. */ 1236 symbol. */
804 if (local_got_offsets == NULL) 1237 if (local_got_offsets == NULL)
805 { 1238 {
806 size_t size; 1239 size_t size;
807 unsigned int i; 1240 unsigned int i;
808 1241
809 » » size = symtab_hdr->sh_info * sizeof (bfd_vma); 1242 » » size = symtab_hdr->sh_info * (sizeof (bfd_vma) + sizeof (char) );
810 local_got_offsets = bfd_alloc (abfd, size); 1243 local_got_offsets = bfd_alloc (abfd, size);
811 1244
812 if (local_got_offsets == NULL) 1245 if (local_got_offsets == NULL)
813 goto fail; 1246 goto fail;
814 1247
815 elf_local_got_offsets (abfd) = local_got_offsets; 1248 elf_local_got_offsets (abfd) = local_got_offsets;
1249 elf_mn10300_local_got_tls_type (abfd)
1250 = (char *) (local_got_offsets + symtab_hdr->sh_info);
816 1251
817 for (i = 0; i < symtab_hdr->sh_info; i++) 1252 for (i = 0; i < symtab_hdr->sh_info; i++)
818 local_got_offsets[i] = (bfd_vma) -1; 1253 local_got_offsets[i] = (bfd_vma) -1;
819 } 1254 }
820 1255
821 if (local_got_offsets[r_symndx] != (bfd_vma) -1) 1256 if (local_got_offsets[r_symndx] != (bfd_vma) -1)
822 /* We have already allocated space in the .got. */ 1257 /* We have already allocated space in the .got. */
823 break; 1258 break;
824 1259
825 local_got_offsets[r_symndx] = sgot->size; 1260 local_got_offsets[r_symndx] = sgot->size;
826 1261
827 if (info->shared) 1262 if (info->shared)
828 » » /* If we are generating a shared object, we need to 1263 » » {
829 » » output a R_MN10300_RELATIVE reloc so that the dynamic 1264 » » /* If we are generating a shared object, we need to
830 » » linker can adjust this GOT entry. */ 1265 » » output a R_MN10300_RELATIVE reloc so that the dynamic
831 » » srelgot->size += sizeof (Elf32_External_Rela); 1266 » » linker can adjust this GOT entry. */
1267 » » srelgot->size += sizeof (Elf32_External_Rela);
1268
1269 » » if (r_type == R_MN10300_TLS_GD)
1270 » » /* And a R_MN10300_TLS_DTPOFF reloc as well. */
1271 » » srelgot->size += sizeof (Elf32_External_Rela);
1272 » » }
1273
1274 » elf_mn10300_local_got_tls_type (abfd) [r_symndx] = tls_type;
832 } 1275 }
833 1276
834 sgot->size += 4; 1277 sgot->size += 4;
835 » break; 1278 » if (r_type == R_MN10300_TLS_GD
1279 » || r_type == R_MN10300_TLS_LD)
1280 » sgot->size += 4;
1281
1282 » goto need_shared_relocs;
836 1283
837 case R_MN10300_PLT32: 1284 case R_MN10300_PLT32:
838 case R_MN10300_PLT16: 1285 case R_MN10300_PLT16:
839 /* This symbol requires a procedure linkage table entry. We 1286 /* This symbol requires a procedure linkage table entry. We
840 actually build the entry in adjust_dynamic_symbol, 1287 actually build the entry in adjust_dynamic_symbol,
841 because this might be a case of linking PIC code which is 1288 because this might be a case of linking PIC code which is
842 never referenced by a dynamic object, in which case we 1289 never referenced by a dynamic object, in which case we
843 don't need to generate a procedure linkage table entry 1290 don't need to generate a procedure linkage table entry
844 after all. */ 1291 after all. */
845 1292
(...skipping 20 matching lines...) Expand all
866 break; 1313 break;
867 1314
868 case R_MN10300_SYM_DIFF: 1315 case R_MN10300_SYM_DIFF:
869 sym_diff_reloc_seen = TRUE; 1316 sym_diff_reloc_seen = TRUE;
870 break; 1317 break;
871 1318
872 case R_MN10300_32: 1319 case R_MN10300_32:
873 if (h != NULL) 1320 if (h != NULL)
874 h->non_got_ref = 1; 1321 h->non_got_ref = 1;
875 1322
1323 need_shared_relocs:
876 /* If we are creating a shared library, then we 1324 /* If we are creating a shared library, then we
877 need to copy the reloc into the shared library. */ 1325 need to copy the reloc into the shared library. */
878 if (info->shared 1326 if (info->shared
879 && (sec->flags & SEC_ALLOC) != 0 1327 && (sec->flags & SEC_ALLOC) != 0
880 /* Do not generate a dynamic reloc for a 1328 /* Do not generate a dynamic reloc for a
881 reloc associated with a SYM_DIFF operation. */ 1329 reloc associated with a SYM_DIFF operation. */
882 && ! sym_diff_reloc_seen) 1330 && ! sym_diff_reloc_seen)
883 { 1331 {
884 asection * sym_section = NULL; 1332 asection * sym_section = NULL;
885 1333
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 bfd_byte *contents, 1422 bfd_byte *contents,
975 bfd_vma offset, 1423 bfd_vma offset,
976 bfd_vma value, 1424 bfd_vma value,
977 bfd_vma addend, 1425 bfd_vma addend,
978 struct elf_link_hash_entry * h, 1426 struct elf_link_hash_entry * h,
979 unsigned long symndx, 1427 unsigned long symndx,
980 struct bfd_link_info *info, 1428 struct bfd_link_info *info,
981 asection *sym_sec ATTRIBUTE_UNUSED, 1429 asection *sym_sec ATTRIBUTE_UNUSED,
982 int is_local ATTRIBUTE_UNUSED) 1430 int is_local ATTRIBUTE_UNUSED)
983 { 1431 {
1432 struct elf32_mn10300_link_hash_table * htab = elf32_mn10300_hash_table (info);
984 static asection * sym_diff_section; 1433 static asection * sym_diff_section;
985 static bfd_vma sym_diff_value; 1434 static bfd_vma sym_diff_value;
986 bfd_boolean is_sym_diff_reloc; 1435 bfd_boolean is_sym_diff_reloc;
987 unsigned long r_type = howto->type; 1436 unsigned long r_type = howto->type;
988 bfd_byte * hit_data = contents + offset; 1437 bfd_byte * hit_data = contents + offset;
989 bfd * dynobj; 1438 bfd * dynobj;
990 asection * sgot; 1439 asection * sgot;
991 asection * splt; 1440 asection * splt;
992 asection * sreloc; 1441 asection * sreloc;
993 1442
(...skipping 11 matching lines...) Expand all
1005 case R_MN10300_PCREL16: 1454 case R_MN10300_PCREL16:
1006 case R_MN10300_PCREL32: 1455 case R_MN10300_PCREL32:
1007 case R_MN10300_GOTOFF32: 1456 case R_MN10300_GOTOFF32:
1008 case R_MN10300_GOTOFF24: 1457 case R_MN10300_GOTOFF24:
1009 case R_MN10300_GOTOFF16: 1458 case R_MN10300_GOTOFF16:
1010 if (info->shared 1459 if (info->shared
1011 && (input_section->flags & SEC_ALLOC) != 0 1460 && (input_section->flags & SEC_ALLOC) != 0
1012 && h != NULL 1461 && h != NULL
1013 && ! SYMBOL_REFERENCES_LOCAL (info, h)) 1462 && ! SYMBOL_REFERENCES_LOCAL (info, h))
1014 return bfd_reloc_dangerous; 1463 return bfd_reloc_dangerous;
1464 case R_MN10300_GOT32:
1465 /* Issue 2052223:
1466 Taking the address of a protected function in a shared library
1467 is illegal. Issue an error message here. */
1468 if (info->shared
1469 && (input_section->flags & SEC_ALLOC) != 0
1470 && h != NULL
1471 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED
1472 && (h->type == STT_FUNC || h->type == STT_GNU_IFUNC)
1473 && ! SYMBOL_REFERENCES_LOCAL (info, h))
1474 return bfd_reloc_dangerous;
1015 } 1475 }
1016 1476
1017 is_sym_diff_reloc = FALSE; 1477 is_sym_diff_reloc = FALSE;
1018 if (sym_diff_section != NULL) 1478 if (sym_diff_section != NULL)
1019 { 1479 {
1020 BFD_ASSERT (sym_diff_section == input_section); 1480 BFD_ASSERT (sym_diff_section == input_section);
1021 1481
1022 switch (r_type) 1482 switch (r_type)
1023 { 1483 {
1024 case R_MN10300_32: 1484 case R_MN10300_32:
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 value += addend; 1661 value += addend;
1202 1662
1203 bfd_put_32 (input_bfd, value, hit_data); 1663 bfd_put_32 (input_bfd, value, hit_data);
1204 return bfd_reloc_ok; 1664 return bfd_reloc_ok;
1205 1665
1206 case R_MN10300_GNU_VTINHERIT: 1666 case R_MN10300_GNU_VTINHERIT:
1207 case R_MN10300_GNU_VTENTRY: 1667 case R_MN10300_GNU_VTENTRY:
1208 return bfd_reloc_ok; 1668 return bfd_reloc_ok;
1209 1669
1210 case R_MN10300_GOTPC32: 1670 case R_MN10300_GOTPC32:
1671 if (dynobj == NULL)
1672 return bfd_reloc_dangerous;
1673
1211 /* Use global offset table as symbol value. */ 1674 /* Use global offset table as symbol value. */
1212 value = bfd_get_section_by_name (dynobj, 1675 value = htab->root.sgot->output_section->vma;
1213 » » » » ".got")->output_section->vma;
1214 value -= (input_section->output_section->vma 1676 value -= (input_section->output_section->vma
1215 + input_section->output_offset); 1677 + input_section->output_offset);
1216 value -= offset; 1678 value -= offset;
1217 value += addend; 1679 value += addend;
1218 1680
1219 bfd_put_32 (input_bfd, value, hit_data); 1681 bfd_put_32 (input_bfd, value, hit_data);
1220 return bfd_reloc_ok; 1682 return bfd_reloc_ok;
1221 1683
1222 case R_MN10300_GOTPC16: 1684 case R_MN10300_GOTPC16:
1685 if (dynobj == NULL)
1686 return bfd_reloc_dangerous;
1687
1223 /* Use global offset table as symbol value. */ 1688 /* Use global offset table as symbol value. */
1224 value = bfd_get_section_by_name (dynobj, 1689 value = htab->root.sgot->output_section->vma;
1225 » » » » ".got")->output_section->vma;
1226 value -= (input_section->output_section->vma 1690 value -= (input_section->output_section->vma
1227 + input_section->output_offset); 1691 + input_section->output_offset);
1228 value -= offset; 1692 value -= offset;
1229 value += addend; 1693 value += addend;
1230 1694
1231 if ((long) value > 0x7fff || (long) value < -0x8000) 1695 if ((long) value > 0x7fff || (long) value < -0x8000)
1232 return bfd_reloc_overflow; 1696 return bfd_reloc_overflow;
1233 1697
1234 bfd_put_16 (input_bfd, value, hit_data); 1698 bfd_put_16 (input_bfd, value, hit_data);
1235 return bfd_reloc_ok; 1699 return bfd_reloc_ok;
1236 1700
1237 case R_MN10300_GOTOFF32: 1701 case R_MN10300_GOTOFF32:
1238 value -= bfd_get_section_by_name (dynobj, 1702 if (dynobj == NULL)
1239 » » » » » ".got")->output_section->vma; 1703 » return bfd_reloc_dangerous;
1704
1705 value -= htab->root.sgot->output_section->vma;
1240 value += addend; 1706 value += addend;
1241 1707
1242 bfd_put_32 (input_bfd, value, hit_data); 1708 bfd_put_32 (input_bfd, value, hit_data);
1243 return bfd_reloc_ok; 1709 return bfd_reloc_ok;
1244 1710
1245 case R_MN10300_GOTOFF24: 1711 case R_MN10300_GOTOFF24:
1246 value -= bfd_get_section_by_name (dynobj, 1712 if (dynobj == NULL)
1247 » » » » » ".got")->output_section->vma; 1713 » return bfd_reloc_dangerous;
1714
1715 value -= htab->root.sgot->output_section->vma;
1248 value += addend; 1716 value += addend;
1249 1717
1250 if ((long) value > 0x7fffff || (long) value < -0x800000) 1718 if ((long) value > 0x7fffff || (long) value < -0x800000)
1251 return bfd_reloc_overflow; 1719 return bfd_reloc_overflow;
1252 1720
1253 bfd_put_8 (input_bfd, value, hit_data); 1721 bfd_put_8 (input_bfd, value, hit_data);
1254 bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1); 1722 bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
1255 bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2); 1723 bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
1256 return bfd_reloc_ok; 1724 return bfd_reloc_ok;
1257 1725
1258 case R_MN10300_GOTOFF16: 1726 case R_MN10300_GOTOFF16:
1259 value -= bfd_get_section_by_name (dynobj, 1727 if (dynobj == NULL)
1260 » » » » » ".got")->output_section->vma; 1728 » return bfd_reloc_dangerous;
1729
1730 value -= htab->root.sgot->output_section->vma;
1261 value += addend; 1731 value += addend;
1262 1732
1263 if ((long) value > 0x7fff || (long) value < -0x8000) 1733 if ((long) value > 0x7fff || (long) value < -0x8000)
1264 return bfd_reloc_overflow; 1734 return bfd_reloc_overflow;
1265 1735
1266 bfd_put_16 (input_bfd, value, hit_data); 1736 bfd_put_16 (input_bfd, value, hit_data);
1267 return bfd_reloc_ok; 1737 return bfd_reloc_ok;
1268 1738
1269 case R_MN10300_PLT32: 1739 case R_MN10300_PLT32:
1270 if (h != NULL 1740 if (h != NULL
1271 && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL 1741 && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
1272 && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN 1742 && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
1273 && h->plt.offset != (bfd_vma) -1) 1743 && h->plt.offset != (bfd_vma) -1)
1274 { 1744 {
1275 » splt = bfd_get_section_by_name (dynobj, ".plt"); 1745 » if (dynobj == NULL)
1746 » return bfd_reloc_dangerous;
1276 1747
1748 splt = htab->root.splt;
1277 value = (splt->output_section->vma 1749 value = (splt->output_section->vma
1278 + splt->output_offset 1750 + splt->output_offset
1279 + h->plt.offset) - value; 1751 + h->plt.offset) - value;
1280 } 1752 }
1281 1753
1282 value -= (input_section->output_section->vma 1754 value -= (input_section->output_section->vma
1283 + input_section->output_offset); 1755 + input_section->output_offset);
1284 value -= offset; 1756 value -= offset;
1285 value += addend; 1757 value += addend;
1286 1758
1287 bfd_put_32 (input_bfd, value, hit_data); 1759 bfd_put_32 (input_bfd, value, hit_data);
1288 return bfd_reloc_ok; 1760 return bfd_reloc_ok;
1289 1761
1290 case R_MN10300_PLT16: 1762 case R_MN10300_PLT16:
1291 if (h != NULL 1763 if (h != NULL
1292 && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL 1764 && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
1293 && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN 1765 && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
1294 && h->plt.offset != (bfd_vma) -1) 1766 && h->plt.offset != (bfd_vma) -1)
1295 { 1767 {
1296 » splt = bfd_get_section_by_name (dynobj, ".plt"); 1768 » if (dynobj == NULL)
1769 » return bfd_reloc_dangerous;
1297 1770
1771 splt = htab->root.splt;
1298 value = (splt->output_section->vma 1772 value = (splt->output_section->vma
1299 + splt->output_offset 1773 + splt->output_offset
1300 + h->plt.offset) - value; 1774 + h->plt.offset) - value;
1301 } 1775 }
1302 1776
1303 value -= (input_section->output_section->vma 1777 value -= (input_section->output_section->vma
1304 + input_section->output_offset); 1778 + input_section->output_offset);
1305 value -= offset; 1779 value -= offset;
1306 value += addend; 1780 value += addend;
1307 1781
1308 if ((long) value > 0x7fff || (long) value < -0x8000) 1782 if ((long) value > 0x7fff || (long) value < -0x8000)
1309 return bfd_reloc_overflow; 1783 return bfd_reloc_overflow;
1310 1784
1311 bfd_put_16 (input_bfd, value, hit_data); 1785 bfd_put_16 (input_bfd, value, hit_data);
1312 return bfd_reloc_ok; 1786 return bfd_reloc_ok;
1313 1787
1788 case R_MN10300_TLS_LDO:
1789 value = dtpoff (info, value);
1790 bfd_put_32 (input_bfd, value + addend, hit_data);
1791 return bfd_reloc_ok;
1792
1793 case R_MN10300_TLS_LE:
1794 value = tpoff (info, value);
1795 bfd_put_32 (input_bfd, value + addend, hit_data);
1796 return bfd_reloc_ok;
1797
1798 case R_MN10300_TLS_LD:
1799 if (dynobj == NULL)
1800 return bfd_reloc_dangerous;
1801
1802 sgot = htab->root.sgot;
1803 BFD_ASSERT (sgot != NULL);
1804 value = htab->tls_ldm_got.offset + sgot->output_offset;
1805 bfd_put_32 (input_bfd, value, hit_data);
1806
1807 if (!htab->tls_ldm_got.rel_emitted)
1808 {
1809 asection * srelgot = bfd_get_linker_section (dynobj, ".rela.got");
1810 Elf_Internal_Rela rel;
1811
1812 BFD_ASSERT (srelgot != NULL);
1813 htab->tls_ldm_got.rel_emitted ++;
1814 rel.r_offset = (sgot->output_section->vma
1815 + sgot->output_offset
1816 + htab->tls_ldm_got.offset);
1817 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + htab->tls_ldm_go t.offset);
1818 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + htab->tls_ldm_go t.offset+4);
1819 rel.r_info = ELF32_R_INFO (0, R_MN10300_TLS_DTPMOD);
1820 rel.r_addend = 0;
1821 bfd_elf32_swap_reloca_out (output_bfd, & rel,
1822 (bfd_byte *) ((Elf32_External_Rela *) srelg ot->contents
1823 + srelgot->reloc_count));
1824 ++ srelgot->reloc_count;
1825 }
1826
1827 return bfd_reloc_ok;
1828
1829 case R_MN10300_TLS_GOTIE:
1830 value = tpoff (info, value);
1831 /* Fall Through. */
1832
1833 case R_MN10300_TLS_GD:
1834 case R_MN10300_TLS_IE:
1314 case R_MN10300_GOT32: 1835 case R_MN10300_GOT32:
1315 case R_MN10300_GOT24: 1836 case R_MN10300_GOT24:
1316 case R_MN10300_GOT16: 1837 case R_MN10300_GOT16:
1317 { 1838 if (dynobj == NULL)
1318 » sgot = bfd_get_section_by_name (dynobj, ".got"); 1839 » return bfd_reloc_dangerous;
1319 1840
1320 » if (h != NULL) 1841 sgot = htab->root.sgot;
1321 » { 1842 if (r_type == R_MN10300_TLS_GD)
1322 » bfd_vma off; 1843 » value = dtpoff (info, value);
1323 1844
1324 » off = h->got.offset; 1845 if (h != NULL)
1325 » BFD_ASSERT (off != (bfd_vma) -1); 1846 » {
1847 » bfd_vma off;
1326 1848
1327 » if (! elf_hash_table (info)->dynamic_sections_created 1849 » off = h->got.offset;
1328 » » || SYMBOL_REFERENCES_LOCAL (info, h)) 1850 » /* Offsets in the GOT are allocated in check_relocs
1329 » » /* This is actually a static link, or it is a 1851 » which is not called for shared libraries... */
1330 » » -Bsymbolic link and the symbol is defined 1852 » if (off == (bfd_vma) -1)
1331 » » locally, or the symbol was forced to be local 1853 » off = 0;
1332 » » because of a version file. We must initialize
1333 » » this entry in the global offset table.
1334 1854
1335 » » When doing a dynamic link, we create a .rela.got 1855 » if (sgot->contents != NULL
1336 » » relocation entry to initialize the value. This 1856 » && (! elf_hash_table (info)->dynamic_sections_created
1337 » » is done in the finish_dynamic_symbol routine. */ 1857 » » || SYMBOL_REFERENCES_LOCAL (info, h)))
1338 » » bfd_put_32 (output_bfd, value, 1858 » /* This is actually a static link, or it is a
1339 » » » sgot->contents + off); 1859 » -Bsymbolic link and the symbol is defined
1860 » locally, or the symbol was forced to be local
1861 » because of a version file. We must initialize
1862 » this entry in the global offset table.
1340 1863
1341 » value = sgot->output_offset + off; 1864 » When doing a dynamic link, we create a .rela.got
1342 » } 1865 » relocation entry to initialize the value. This
1866 » is done in the finish_dynamic_symbol routine. */
1867 » bfd_put_32 (output_bfd, value,
1868 » » » sgot->contents + off);
1869
1870 » value = sgot->output_offset + off;
1871 » }
1872 else
1873 » {
1874 » bfd_vma off;
1875
1876 » off = elf_local_got_offsets (input_bfd)[symndx];
1877
1878 » if (off & 1)
1879 » bfd_put_32 (output_bfd, value, sgot->contents + (off & ~ 1));
1343 else 1880 else
1344 { 1881 {
1345 bfd_vma off;
1346
1347 off = elf_local_got_offsets (input_bfd)[symndx];
1348
1349 bfd_put_32 (output_bfd, value, sgot->contents + off); 1882 bfd_put_32 (output_bfd, value, sgot->contents + off);
1350 1883
1351 if (info->shared) 1884 if (info->shared)
1352 { 1885 {
1353 asection * srelgot; 1886 asection * srelgot;
1354 Elf_Internal_Rela outrel; 1887 Elf_Internal_Rela outrel;
1355 1888
1356 » » srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); 1889 » » srelgot = bfd_get_linker_section (dynobj, ".rela.got");
1357 BFD_ASSERT (srelgot != NULL); 1890 BFD_ASSERT (srelgot != NULL);
1358 1891
1359 outrel.r_offset = (sgot->output_section->vma 1892 outrel.r_offset = (sgot->output_section->vma
1360 + sgot->output_offset 1893 + sgot->output_offset
1361 + off); 1894 + off);
1362 » » outrel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE); 1895 » » switch (r_type)
1896 » » {
1897 » » case R_MN10300_TLS_GD:
1898 » » outrel.r_info = ELF32_R_INFO (0, R_MN10300_TLS_DTPOFF);
1899 » » outrel.r_offset = (sgot->output_section->vma
1900 » » » » » + sgot->output_offset
1901 » » » » » + off + 4);
1902 » » bfd_elf32_swap_reloca_out (output_bfd, & outrel,
1903 » » » » » » (bfd_byte *) (((Elf32_External_ Rela *)
1904 » » » » » » » » srelgot->content s)
1905 » » » » » » » + srelgot->reloc_ count));
1906 » » ++ srelgot->reloc_count;
1907 » » outrel.r_info = ELF32_R_INFO (0, R_MN10300_TLS_DTPMOD);
1908 » » break;
1909 » » case R_MN10300_TLS_GOTIE:
1910 » » case R_MN10300_TLS_IE:
1911 » » outrel.r_info = ELF32_R_INFO (0, R_MN10300_TLS_TPOFF);
1912 » » break;
1913 » » default:
1914 » » outrel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
1915 » » break;
1916 » » }
1917
1363 outrel.r_addend = value; 1918 outrel.r_addend = value;
1364 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 1919 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1365 (bfd_byte *) (((Elf32_External_Rela *) 1920 (bfd_byte *) (((Elf32_External_Rela *)
1366 srelgot->contents) 1921 srelgot->contents)
1367 + srelgot->reloc_coun t)); 1922 + srelgot->reloc_coun t));
1368 ++ srelgot->reloc_count; 1923 ++ srelgot->reloc_count;
1924 elf_local_got_offsets (input_bfd)[symndx] |= 1;
1369 } 1925 }
1370 1926
1371 » value = sgot->output_offset + off; 1927 » value = sgot->output_offset + (off & ~(bfd_vma) 1);
1372 } 1928 }
1373 } 1929 » }
1374 1930
1375 value += addend; 1931 value += addend;
1376 1932
1377 if (r_type == R_MN10300_GOT32) 1933 if (r_type == R_MN10300_TLS_IE)
1934 » {
1935 » value += sgot->output_section->vma;
1936 » bfd_put_32 (input_bfd, value, hit_data);
1937 » return bfd_reloc_ok;
1938 » }
1939 else if (r_type == R_MN10300_TLS_GOTIE
1940 » || r_type == R_MN10300_TLS_GD
1941 » || r_type == R_MN10300_TLS_LD)
1378 { 1942 {
1379 bfd_put_32 (input_bfd, value, hit_data); 1943 bfd_put_32 (input_bfd, value, hit_data);
1380 return bfd_reloc_ok; 1944 return bfd_reloc_ok;
1945 }
1946 else if (r_type == R_MN10300_GOT32)
1947 {
1948 bfd_put_32 (input_bfd, value, hit_data);
1949 return bfd_reloc_ok;
1381 } 1950 }
1382 else if (r_type == R_MN10300_GOT24) 1951 else if (r_type == R_MN10300_GOT24)
1383 { 1952 {
1384 if ((long) value > 0x7fffff || (long) value < -0x800000) 1953 if ((long) value > 0x7fffff || (long) value < -0x800000)
1385 return bfd_reloc_overflow; 1954 return bfd_reloc_overflow;
1386 1955
1387 bfd_put_8 (input_bfd, value & 0xff, hit_data); 1956 bfd_put_8 (input_bfd, value & 0xff, hit_data);
1388 bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1); 1957 bfd_put_8 (input_bfd, (value >> 8) & 0xff, hit_data + 1);
1389 bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2); 1958 bfd_put_8 (input_bfd, (value >> 16) & 0xff, hit_data + 2);
1390 return bfd_reloc_ok; 1959 return bfd_reloc_ok;
(...skipping 18 matching lines...) Expand all
1409 1978
1410 static bfd_boolean 1979 static bfd_boolean
1411 mn10300_elf_relocate_section (bfd *output_bfd, 1980 mn10300_elf_relocate_section (bfd *output_bfd,
1412 struct bfd_link_info *info, 1981 struct bfd_link_info *info,
1413 bfd *input_bfd, 1982 bfd *input_bfd,
1414 asection *input_section, 1983 asection *input_section,
1415 bfd_byte *contents, 1984 bfd_byte *contents,
1416 Elf_Internal_Rela *relocs, 1985 Elf_Internal_Rela *relocs,
1417 Elf_Internal_Sym *local_syms, 1986 Elf_Internal_Sym *local_syms,
1418 asection **local_sections) 1987 asection **local_sections)

error: old chunk mismatch

OLDNEW
« no previous file with comments | « bfd/elf-m10200.c ('k') | bfd/elf-nacl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698