Home | History | Annotate | Line # | Download | only in bfd
elf32-or1k.c revision 1.1.1.1
      1  1.1  christos /* Or1k-specific support for 32-bit ELF.
      2  1.1  christos    Copyright (C) 2001-2015 Free Software Foundation, Inc.
      3  1.1  christos    Contributed for OR32 by Johan Rydberg, jrydberg (at) opencores.org
      4  1.1  christos 
      5  1.1  christos    PIC parts added by Stefan Kristiansson, stefan.kristiansson (at) saunalahti.fi,
      6  1.1  christos    largely based on elf32-m32r.c and elf32-microblaze.c.
      7  1.1  christos 
      8  1.1  christos    This file is part of BFD, the Binary File Descriptor library.
      9  1.1  christos 
     10  1.1  christos    This program is free software; you can redistribute it and/or modify
     11  1.1  christos    it under the terms of the GNU General Public License as published by
     12  1.1  christos    the Free Software Foundation; either version 3 of the License, or
     13  1.1  christos    (at your option) any later version.
     14  1.1  christos 
     15  1.1  christos    This program is distributed in the hope that it will be useful,
     16  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  1.1  christos    GNU General Public License for more details.
     19  1.1  christos 
     20  1.1  christos    You should have received a copy of the GNU General Public License
     21  1.1  christos    along with this program; if not, see <http://www.gnu.org/licenses/>.  */
     22  1.1  christos 
     23  1.1  christos #include "sysdep.h"
     24  1.1  christos #include "bfd.h"
     25  1.1  christos #include "libbfd.h"
     26  1.1  christos #include "elf-bfd.h"
     27  1.1  christos #include "elf/or1k.h"
     28  1.1  christos #include "libiberty.h"
     29  1.1  christos 
     30  1.1  christos #define PLT_ENTRY_SIZE 20
     31  1.1  christos 
     32  1.1  christos #define PLT0_ENTRY_WORD0 0x19800000 /* l.movhi r12, 0 <- hi(.got+4) */
     33  1.1  christos #define PLT0_ENTRY_WORD1 0xa98c0000 /* l.ori r12, r12, 0 <- lo(.got+4) */
     34  1.1  christos #define PLT0_ENTRY_WORD2 0x85ec0004 /* l.lwz r15, 4(r12) <- *(.got+8)*/
     35  1.1  christos #define PLT0_ENTRY_WORD3 0x44007800 /* l.jr r15 */
     36  1.1  christos #define PLT0_ENTRY_WORD4 0x858c0000 /* l.lwz r12, 0(r12) */
     37  1.1  christos 
     38  1.1  christos #define PLT0_PIC_ENTRY_WORD0 0x85900004 /* l.lwz r12, 4(r16) */
     39  1.1  christos #define PLT0_PIC_ENTRY_WORD1 0x85f00008 /* l.lwz r15, 8(r16) */
     40  1.1  christos #define PLT0_PIC_ENTRY_WORD2 0x44007800 /* l.jr r15 */
     41  1.1  christos #define PLT0_PIC_ENTRY_WORD3 0x15000000 /* l.nop */
     42  1.1  christos #define PLT0_PIC_ENTRY_WORD4 0x15000000 /* l.nop */
     43  1.1  christos 
     44  1.1  christos #define PLT_ENTRY_WORD0 0x19800000 /* l.movhi r12, 0 <- hi(got idx addr) */
     45  1.1  christos #define PLT_ENTRY_WORD1 0xa98c0000 /* l.ori r12, r12, 0 <- lo(got idx addr) */
     46  1.1  christos #define PLT_ENTRY_WORD2 0x858c0000 /* l.lwz r12, 0(r12) */
     47  1.1  christos #define PLT_ENTRY_WORD3 0x44006000 /* l.jr r12 */
     48  1.1  christos #define PLT_ENTRY_WORD4 0xa9600000 /* l.ori r11, r0, 0 <- reloc offset */
     49  1.1  christos 
     50  1.1  christos #define PLT_PIC_ENTRY_WORD0 0x85900000 /* l.lwz r12, 0(r16) <- index in got */
     51  1.1  christos #define PLT_PIC_ENTRY_WORD1 0xa9600000 /* l.ori r11, r0, 0 <- reloc offset */
     52  1.1  christos #define PLT_PIC_ENTRY_WORD2 0x44006000 /* l.jr r12 */
     53  1.1  christos #define PLT_PIC_ENTRY_WORD3 0x15000000 /* l.nop */
     54  1.1  christos #define PLT_PIC_ENTRY_WORD4 0x15000000 /* l.nop */
     55  1.1  christos 
     56  1.1  christos #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
     57  1.1  christos 
     58  1.1  christos static reloc_howto_type or1k_elf_howto_table[] =
     59  1.1  christos {
     60  1.1  christos   /* This reloc does nothing.  */
     61  1.1  christos   HOWTO (R_OR1K_NONE,           /* type */
     62  1.1  christos          0,                     /* rightshift */
     63  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
     64  1.1  christos          32,                    /* bitsize */
     65  1.1  christos          FALSE,                 /* pc_relative */
     66  1.1  christos          0,                     /* bitpos */
     67  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
     68  1.1  christos          bfd_elf_generic_reloc, /* special_function */
     69  1.1  christos          "R_OR1K_NONE",         /* name */
     70  1.1  christos          FALSE,                 /* partial_inplace */
     71  1.1  christos          0,                     /* src_mask */
     72  1.1  christos          0,                     /* dst_mask */
     73  1.1  christos          FALSE),                /* pcrel_offset */
     74  1.1  christos 
     75  1.1  christos   HOWTO (R_OR1K_32,
     76  1.1  christos          0,                     /* rightshift */
     77  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
     78  1.1  christos          32,                    /* bitsize */
     79  1.1  christos          FALSE,                 /* pc_relative */
     80  1.1  christos          0,                     /* bitpos */
     81  1.1  christos          complain_overflow_unsigned, /* complain_on_overflow */
     82  1.1  christos          bfd_elf_generic_reloc, /* special_function */
     83  1.1  christos          "R_OR1K_32",           /* name */
     84  1.1  christos          FALSE,                 /* partial_inplace */
     85  1.1  christos          0,                     /* src_mask */
     86  1.1  christos          0xffffffff,            /* dst_mask */
     87  1.1  christos          FALSE),                /* pcrel_offset */
     88  1.1  christos 
     89  1.1  christos   HOWTO (R_OR1K_16,
     90  1.1  christos          0,                     /* rightshift */
     91  1.1  christos          1,                     /* size (0 = byte, 1 = short, 2 = long) */
     92  1.1  christos          16,                    /* bitsize */
     93  1.1  christos          FALSE,                 /* pc_relative */
     94  1.1  christos          0,                     /* bitpos */
     95  1.1  christos          complain_overflow_unsigned, /* complain_on_overflow */
     96  1.1  christos          bfd_elf_generic_reloc, /* special_function */
     97  1.1  christos          "R_OR1K_16",           /* name */
     98  1.1  christos          FALSE,                 /* partial_inplace */
     99  1.1  christos          0,                     /* src_mask */
    100  1.1  christos          0xffff,                /* dst_mask */
    101  1.1  christos          FALSE),                /* pcrel_offset */
    102  1.1  christos 
    103  1.1  christos   HOWTO (R_OR1K_8,
    104  1.1  christos          0,                     /* rightshift */
    105  1.1  christos          0,                     /* size (0 = byte, 1 = short, 2 = long) */
    106  1.1  christos          8,                     /* bitsize */
    107  1.1  christos          FALSE,                 /* pc_relative */
    108  1.1  christos          0,                     /* bitpos */
    109  1.1  christos          complain_overflow_unsigned, /* complain_on_overflow */
    110  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    111  1.1  christos          "R_OR1K_8",            /* name */
    112  1.1  christos          FALSE,                 /* partial_inplace */
    113  1.1  christos          0,                     /* src_mask */
    114  1.1  christos          0xff,                  /* dst_mask */
    115  1.1  christos          FALSE),                /* pcrel_offset */
    116  1.1  christos 
    117  1.1  christos   HOWTO (R_OR1K_LO_16_IN_INSN, /* type */
    118  1.1  christos          0,                     /* rightshift */
    119  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    120  1.1  christos          16,                    /* bitsize */
    121  1.1  christos          FALSE,                 /* pc_relative */
    122  1.1  christos          0,                     /* bitpos */
    123  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    124  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    125  1.1  christos          "R_OR1K_LO_16_IN_INSN", /* name */
    126  1.1  christos          FALSE,                 /* partial_inplace */
    127  1.1  christos          0,                     /* src_mask */
    128  1.1  christos          0x0000ffff,            /* dst_mask */
    129  1.1  christos          FALSE),                /* pcrel_offset */
    130  1.1  christos 
    131  1.1  christos   HOWTO (R_OR1K_HI_16_IN_INSN, /* type */
    132  1.1  christos          16,                    /* rightshift */
    133  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    134  1.1  christos          16,                    /* bitsize */
    135  1.1  christos          FALSE,                 /* pc_relative */
    136  1.1  christos          0,                     /* bitpos */
    137  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    138  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    139  1.1  christos          "R_OR1K_HI_16_IN_INSN", /* name */
    140  1.1  christos          FALSE,                 /* partial_inplace */
    141  1.1  christos          0,                     /* src_mask */
    142  1.1  christos          0x0000ffff,            /* dst_mask */
    143  1.1  christos          FALSE),                /* pcrel_offset */
    144  1.1  christos 
    145  1.1  christos   /* A PC relative 26 bit relocation, right shifted by 2.  */
    146  1.1  christos   HOWTO (R_OR1K_INSN_REL_26, /* type */
    147  1.1  christos          2,                     /* rightshift */
    148  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    149  1.1  christos          26,                    /* bitsize */
    150  1.1  christos          TRUE,                  /* pc_relative */
    151  1.1  christos          0,                     /* bitpos */
    152  1.1  christos          complain_overflow_signed, /* complain_on_overflow */
    153  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    154  1.1  christos          "R_OR1K_INSN_REL_26", /* name */
    155  1.1  christos          FALSE,                 /* partial_inplace */
    156  1.1  christos          0,                     /* src_mask */
    157  1.1  christos          0x03ffffff,            /* dst_mask */
    158  1.1  christos          TRUE),                 /* pcrel_offset */
    159  1.1  christos 
    160  1.1  christos   /* GNU extension to record C++ vtable hierarchy.  */
    161  1.1  christos   HOWTO (R_OR1K_GNU_VTINHERIT, /* type */
    162  1.1  christos          0,                     /* rightshift */
    163  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    164  1.1  christos          0,                     /* bitsize */
    165  1.1  christos          FALSE,                 /* pc_relative */
    166  1.1  christos          0,                     /* bitpos */
    167  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    168  1.1  christos          NULL,                  /* special_function */
    169  1.1  christos          "R_OR1K_GNU_VTINHERIT", /* name */
    170  1.1  christos          FALSE,                 /* partial_inplace */
    171  1.1  christos          0,                     /* src_mask */
    172  1.1  christos          0,                     /* dst_mask */
    173  1.1  christos          FALSE),                /* pcrel_offset */
    174  1.1  christos 
    175  1.1  christos   /* GNU extension to record C++ vtable member usage.  */
    176  1.1  christos   HOWTO (R_OR1K_GNU_VTENTRY, /* type */
    177  1.1  christos          0,                     /* rightshift */
    178  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    179  1.1  christos          0,                     /* bitsize */
    180  1.1  christos          FALSE,                 /* pc_relative */
    181  1.1  christos          0,                     /* bitpos */
    182  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    183  1.1  christos          _bfd_elf_rel_vtable_reloc_fn, /* special_function */
    184  1.1  christos          "R_OR1K_GNU_VTENTRY", /* name */
    185  1.1  christos          FALSE,                 /* partial_inplace */
    186  1.1  christos          0,                     /* src_mask */
    187  1.1  christos          0,                     /* dst_mask */
    188  1.1  christos          FALSE),                /* pcrel_offset */
    189  1.1  christos 
    190  1.1  christos   HOWTO (R_OR1K_32_PCREL,
    191  1.1  christos          0,                     /* rightshift */
    192  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    193  1.1  christos          32,                    /* bitsize */
    194  1.1  christos          TRUE,                  /* pc_relative */
    195  1.1  christos          0,                     /* bitpos */
    196  1.1  christos          complain_overflow_signed, /* complain_on_overflow */
    197  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    198  1.1  christos          "R_OR1K_32_PCREL",     /* name */
    199  1.1  christos          FALSE,                 /* partial_inplace */
    200  1.1  christos          0,                     /* src_mask */
    201  1.1  christos          0xffffffff,            /* dst_mask */
    202  1.1  christos          FALSE),                /* pcrel_offset */
    203  1.1  christos 
    204  1.1  christos   HOWTO (R_OR1K_16_PCREL,
    205  1.1  christos          0,                     /* rightshift */
    206  1.1  christos          1,                     /* size (0 = byte, 1 = short, 2 = long) */
    207  1.1  christos          16,                    /* bitsize */
    208  1.1  christos          TRUE,                  /* pc_relative */
    209  1.1  christos          0,                     /* bitpos */
    210  1.1  christos          complain_overflow_signed, /* complain_on_overflow */
    211  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    212  1.1  christos          "R_OR1K_16_PCREL",     /* name */
    213  1.1  christos          FALSE,                 /* partial_inplace */
    214  1.1  christos          0,                     /* src_mask */
    215  1.1  christos          0xffff,                /* dst_mask */
    216  1.1  christos          FALSE),                /* pcrel_offset */
    217  1.1  christos 
    218  1.1  christos   HOWTO (R_OR1K_8_PCREL,
    219  1.1  christos          0,                     /* rightshift */
    220  1.1  christos          0,                     /* size (0 = byte, 1 = short, 2 = long) */
    221  1.1  christos          8,                     /* bitsize */
    222  1.1  christos          TRUE,                  /* pc_relative */
    223  1.1  christos          0,                     /* bitpos */
    224  1.1  christos          complain_overflow_signed, /* complain_on_overflow */
    225  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    226  1.1  christos          "R_OR1K_8_PCREL",      /* name */
    227  1.1  christos          FALSE,                 /* partial_inplace */
    228  1.1  christos          0,                     /* src_mask */
    229  1.1  christos          0xff,                  /* dst_mask */
    230  1.1  christos          FALSE),                /* pcrel_offset */
    231  1.1  christos 
    232  1.1  christos    HOWTO (R_OR1K_GOTPC_HI16,    /* Type.  */
    233  1.1  christos          16,                    /* Rightshift.  */
    234  1.1  christos          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
    235  1.1  christos          16,                    /* Bitsize.  */
    236  1.1  christos          TRUE,                  /* PC_relative.  */
    237  1.1  christos          0,                     /* Bitpos.  */
    238  1.1  christos          complain_overflow_dont, /* Complain on overflow.  */
    239  1.1  christos          bfd_elf_generic_reloc, /* Special Function.  */
    240  1.1  christos          "R_OR1K_GOTPC_HI16",   /* Name.  */
    241  1.1  christos          FALSE,         /* Partial Inplace.  */
    242  1.1  christos          0,                     /* Source Mask.  */
    243  1.1  christos          0xffff,                /* Dest Mask.  */
    244  1.1  christos          TRUE),                 /* PC relative offset?  */
    245  1.1  christos 
    246  1.1  christos    HOWTO (R_OR1K_GOTPC_LO16,    /* Type.  */
    247  1.1  christos          0,                     /* Rightshift.  */
    248  1.1  christos          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
    249  1.1  christos          16,                    /* Bitsize.  */
    250  1.1  christos          TRUE,                  /* PC_relative.  */
    251  1.1  christos          0,                     /* Bitpos.  */
    252  1.1  christos          complain_overflow_dont, /* Complain on overflow.  */
    253  1.1  christos          bfd_elf_generic_reloc, /* Special Function.  */
    254  1.1  christos          "R_OR1K_GOTPC_LO16",   /* Name.  */
    255  1.1  christos          FALSE,         /* Partial Inplace.  */
    256  1.1  christos          0,                     /* Source Mask.  */
    257  1.1  christos          0xffff,                /* Dest Mask.  */
    258  1.1  christos          TRUE),                 /* PC relative offset?  */
    259  1.1  christos 
    260  1.1  christos   HOWTO (R_OR1K_GOT16,          /* type */
    261  1.1  christos          0,                     /* rightshift */
    262  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    263  1.1  christos          16,                    /* bitsize */
    264  1.1  christos          FALSE,                 /* pc_relative */
    265  1.1  christos          0,                     /* bitpos */
    266  1.1  christos          complain_overflow_signed, /* complain_on_overflow */
    267  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    268  1.1  christos          "R_OR1K_GOT16",        /* name */
    269  1.1  christos          FALSE,                 /* partial_inplace */
    270  1.1  christos          0,                     /* src_mask */
    271  1.1  christos          0xffff,                /* dst_mask */
    272  1.1  christos          FALSE),                /* pcrel_offset */
    273  1.1  christos 
    274  1.1  christos   /* A 26 bit PLT relocation.  Shifted by 2.  */
    275  1.1  christos   HOWTO (R_OR1K_PLT26,  /* Type.  */
    276  1.1  christos          2,                     /* Rightshift.  */
    277  1.1  christos          2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
    278  1.1  christos          26,                    /* Bitsize.  */
    279  1.1  christos          TRUE,                  /* PC_relative.  */
    280  1.1  christos          0,                     /* Bitpos.  */
    281  1.1  christos          complain_overflow_dont, /* Complain on overflow.  */
    282  1.1  christos          bfd_elf_generic_reloc,/* Special Function.  */
    283  1.1  christos          "R_OR1K_PLT26",        /* Name.  */
    284  1.1  christos          FALSE,         /* Partial Inplace.  */
    285  1.1  christos          0,                     /* Source Mask.  */
    286  1.1  christos          0x03ffffff,            /* Dest Mask.  */
    287  1.1  christos          TRUE),                 /* PC relative offset?  */
    288  1.1  christos 
    289  1.1  christos   HOWTO (R_OR1K_GOTOFF_HI16,    /* type */
    290  1.1  christos          16,                    /* rightshift */
    291  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    292  1.1  christos          16,                    /* bitsize */
    293  1.1  christos          FALSE,                 /* pc_relative */
    294  1.1  christos          0,                     /* bitpos */
    295  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    296  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    297  1.1  christos          "R_OR1K_GOTOFF_HI16",  /* name */
    298  1.1  christos          FALSE,                 /* partial_inplace */
    299  1.1  christos          0x0,                   /* src_mask */
    300  1.1  christos          0xffff,                /* dst_mask */
    301  1.1  christos          FALSE),                /* pcrel_offset */
    302  1.1  christos 
    303  1.1  christos   HOWTO (R_OR1K_GOTOFF_LO16,    /* type */
    304  1.1  christos          0,                     /* rightshift */
    305  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    306  1.1  christos          16,                    /* bitsize */
    307  1.1  christos          FALSE,                 /* pc_relative */
    308  1.1  christos          0,                     /* bitpos */
    309  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    310  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    311  1.1  christos          "R_OR1K_GOTOFF_LO16",  /* name */
    312  1.1  christos          FALSE,                 /* partial_inplace */
    313  1.1  christos          0x0,                   /* src_mask */
    314  1.1  christos          0xffff,                /* dst_mask */
    315  1.1  christos          FALSE),                /* pcrel_offset */
    316  1.1  christos 
    317  1.1  christos   HOWTO (R_OR1K_COPY,           /* type */
    318  1.1  christos          0,                     /* rightshift */
    319  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    320  1.1  christos          32,                    /* bitsize */
    321  1.1  christos          FALSE,                 /* pc_relative */
    322  1.1  christos          0,                     /* bitpos */
    323  1.1  christos          complain_overflow_bitfield, /* complain_on_overflow */
    324  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    325  1.1  christos          "R_OR1K_COPY",         /* name */
    326  1.1  christos          FALSE,                 /* partial_inplace */
    327  1.1  christos          0xffffffff,            /* src_mask */
    328  1.1  christos          0xffffffff,            /* dst_mask */
    329  1.1  christos          FALSE),                /* pcrel_offset */
    330  1.1  christos 
    331  1.1  christos   HOWTO (R_OR1K_GLOB_DAT,       /* type */
    332  1.1  christos          0,                     /* rightshift */
    333  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    334  1.1  christos          32,                    /* bitsize */
    335  1.1  christos          FALSE,                 /* pc_relative */
    336  1.1  christos          0,                     /* bitpos */
    337  1.1  christos          complain_overflow_bitfield, /* complain_on_overflow */
    338  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    339  1.1  christos          "R_OR1K_GLOB_DAT",     /* name */
    340  1.1  christos          FALSE,                 /* partial_inplace */
    341  1.1  christos          0xffffffff,            /* src_mask */
    342  1.1  christos          0xffffffff,            /* dst_mask */
    343  1.1  christos          FALSE),                /* pcrel_offset */
    344  1.1  christos 
    345  1.1  christos   HOWTO (R_OR1K_JMP_SLOT,       /* type */
    346  1.1  christos          0,                     /* rightshift */
    347  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    348  1.1  christos          32,                    /* bitsize */
    349  1.1  christos          FALSE,                 /* pc_relative */
    350  1.1  christos          0,                     /* bitpos */
    351  1.1  christos          complain_overflow_bitfield, /* complain_on_overflow */
    352  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    353  1.1  christos          "R_OR1K_JMP_SLOT",     /* name */
    354  1.1  christos          FALSE,                 /* partial_inplace */
    355  1.1  christos          0xffffffff,            /* src_mask */
    356  1.1  christos          0xffffffff,            /* dst_mask */
    357  1.1  christos          FALSE),                /* pcrel_offset */
    358  1.1  christos 
    359  1.1  christos   HOWTO (R_OR1K_RELATIVE,       /* type */
    360  1.1  christos          0,                     /* rightshift */
    361  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    362  1.1  christos          32,                    /* bitsize */
    363  1.1  christos          FALSE,                 /* pc_relative */
    364  1.1  christos          0,                     /* bitpos */
    365  1.1  christos          complain_overflow_bitfield, /* complain_on_overflow */
    366  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    367  1.1  christos          "R_OR1K_RELATIVE",     /* name */
    368  1.1  christos          FALSE,                 /* partial_inplace */
    369  1.1  christos          0xffffffff,            /* src_mask */
    370  1.1  christos          0xffffffff,            /* dst_mask */
    371  1.1  christos          FALSE),                /* pcrel_offset */
    372  1.1  christos 
    373  1.1  christos   HOWTO (R_OR1K_TLS_GD_HI16,    /* type */
    374  1.1  christos          16,                    /* rightshift */
    375  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    376  1.1  christos          16,                    /* bitsize */
    377  1.1  christos          FALSE,                 /* pc_relative */
    378  1.1  christos          0,                     /* bitpos */
    379  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    380  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    381  1.1  christos          "R_OR1K_TLS_GD_HI16",  /* name */
    382  1.1  christos          FALSE,                 /* partial_inplace */
    383  1.1  christos          0x0,                   /* src_mask */
    384  1.1  christos          0xffff,                /* dst_mask */
    385  1.1  christos          FALSE),                /* pcrel_offset */
    386  1.1  christos 
    387  1.1  christos   HOWTO (R_OR1K_TLS_GD_LO16,    /* type */
    388  1.1  christos          0,                     /* rightshift */
    389  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    390  1.1  christos          16,                    /* bitsize */
    391  1.1  christos          FALSE,                 /* pc_relative */
    392  1.1  christos          0,                     /* bitpos */
    393  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    394  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    395  1.1  christos          "R_OR1K_TLS_GD_LO16",  /* name */
    396  1.1  christos          FALSE,                 /* partial_inplace */
    397  1.1  christos          0x0,                   /* src_mask */
    398  1.1  christos          0xffff,                /* dst_mask */
    399  1.1  christos          FALSE),                /* pcrel_offset */
    400  1.1  christos 
    401  1.1  christos   HOWTO (R_OR1K_TLS_LDM_HI16,   /* type */
    402  1.1  christos          16,                    /* rightshift */
    403  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    404  1.1  christos          16,                    /* bitsize */
    405  1.1  christos          FALSE,                 /* pc_relative */
    406  1.1  christos          0,                     /* bitpos */
    407  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    408  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    409  1.1  christos          "R_OR1K_TLS_LDM_HI16", /* name */
    410  1.1  christos          FALSE,                 /* partial_inplace */
    411  1.1  christos          0x0,                   /* src_mask */
    412  1.1  christos          0xffff,                /* dst_mask */
    413  1.1  christos          FALSE),                /* pcrel_offset */
    414  1.1  christos 
    415  1.1  christos   HOWTO (R_OR1K_TLS_LDM_LO16,   /* type */
    416  1.1  christos          0,                     /* rightshift */
    417  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    418  1.1  christos          16,                    /* bitsize */
    419  1.1  christos          FALSE,                 /* pc_relative */
    420  1.1  christos          0,                     /* bitpos */
    421  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    422  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    423  1.1  christos          "R_OR1K_TLS_LDM_LO16", /* name */
    424  1.1  christos          FALSE,                 /* partial_inplace */
    425  1.1  christos          0x0,                   /* src_mask */
    426  1.1  christos          0xffff,                /* dst_mask */
    427  1.1  christos          FALSE),                /* pcrel_offset */
    428  1.1  christos 
    429  1.1  christos   HOWTO (R_OR1K_TLS_LDO_HI16,   /* type */
    430  1.1  christos          16,                    /* rightshift */
    431  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    432  1.1  christos          16,                    /* bitsize */
    433  1.1  christos          FALSE,                 /* pc_relative */
    434  1.1  christos          0,                     /* bitpos */
    435  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    436  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    437  1.1  christos          "R_OR1K_TLS_LDO_HI16", /* name */
    438  1.1  christos          FALSE,                 /* partial_inplace */
    439  1.1  christos          0x0,                   /* src_mask */
    440  1.1  christos          0xffff,                /* dst_mask */
    441  1.1  christos          FALSE),                /* pcrel_offset */
    442  1.1  christos 
    443  1.1  christos   HOWTO (R_OR1K_TLS_LDO_LO16,   /* type */
    444  1.1  christos          0,                     /* rightshift */
    445  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    446  1.1  christos          16,                    /* bitsize */
    447  1.1  christos          FALSE,                 /* pc_relative */
    448  1.1  christos          0,                     /* bitpos */
    449  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    450  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    451  1.1  christos          "R_OR1K_TLS_LDO_LO16", /* name */
    452  1.1  christos          FALSE,                 /* partial_inplace */
    453  1.1  christos          0x0,                   /* src_mask */
    454  1.1  christos          0xffff,                /* dst_mask */
    455  1.1  christos          FALSE),                /* pcrel_offset */
    456  1.1  christos 
    457  1.1  christos   HOWTO (R_OR1K_TLS_IE_HI16,    /* type */
    458  1.1  christos          16,                    /* rightshift */
    459  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    460  1.1  christos          16,                    /* bitsize */
    461  1.1  christos          FALSE,                 /* pc_relative */
    462  1.1  christos          0,                     /* bitpos */
    463  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    464  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    465  1.1  christos          "R_OR1K_TLS_IE_HI16",  /* name */
    466  1.1  christos          FALSE,                 /* partial_inplace */
    467  1.1  christos          0x0,                   /* src_mask */
    468  1.1  christos          0xffff,                /* dst_mask */
    469  1.1  christos          FALSE),                /* pcrel_offset */
    470  1.1  christos 
    471  1.1  christos   HOWTO (R_OR1K_TLS_IE_LO16,    /* type */
    472  1.1  christos          0,                     /* rightshift */
    473  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    474  1.1  christos          16,                    /* bitsize */
    475  1.1  christos          FALSE,                 /* pc_relative */
    476  1.1  christos          0,                     /* bitpos */
    477  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    478  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    479  1.1  christos          "R_OR1K_TLS_IE_LO16",  /* name */
    480  1.1  christos          FALSE,                 /* partial_inplace */
    481  1.1  christos          0x0,                   /* src_mask */
    482  1.1  christos          0xffff,                /* dst_mask */
    483  1.1  christos          FALSE),                /* pcrel_offset */
    484  1.1  christos 
    485  1.1  christos   HOWTO (R_OR1K_TLS_LE_HI16,    /* type */
    486  1.1  christos          16,                    /* rightshift */
    487  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    488  1.1  christos          16,                    /* bitsize */
    489  1.1  christos          FALSE,                 /* pc_relative */
    490  1.1  christos          0,                     /* bitpos */
    491  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    492  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    493  1.1  christos          "R_OR1K_TLS_LE_HI16",  /* name */
    494  1.1  christos          FALSE,                 /* partial_inplace */
    495  1.1  christos          0x0,                   /* src_mask */
    496  1.1  christos          0xffff,                /* dst_mask */
    497  1.1  christos          FALSE),                /* pcrel_offset */
    498  1.1  christos 
    499  1.1  christos   HOWTO (R_OR1K_TLS_LE_LO16,    /* type */
    500  1.1  christos          0,                     /* rightshift */
    501  1.1  christos          2,                     /* size (0 = byte, 1 = short, 2 = long) */
    502  1.1  christos          16,                    /* bitsize */
    503  1.1  christos          FALSE,                 /* pc_relative */
    504  1.1  christos          0,                     /* bitpos */
    505  1.1  christos          complain_overflow_dont, /* complain_on_overflow */
    506  1.1  christos          bfd_elf_generic_reloc, /* special_function */
    507  1.1  christos          "R_OR1K_TLS_LE_LO16",  /* name */
    508  1.1  christos          FALSE,                 /* partial_inplace */
    509  1.1  christos          0x0,                   /* src_mask */
    510  1.1  christos          0xffff,                /* dst_mask */
    511  1.1  christos          FALSE),                /* pcrel_offset */
    512  1.1  christos 
    513  1.1  christos };
    514  1.1  christos 
    515  1.1  christos /* Map BFD reloc types to Or1k ELF reloc types.  */
    516  1.1  christos 
    517  1.1  christos struct or1k_reloc_map
    518  1.1  christos {
    519  1.1  christos   bfd_reloc_code_real_type bfd_reloc_val;
    520  1.1  christos   unsigned int or1k_reloc_val;
    521  1.1  christos };
    522  1.1  christos 
    523  1.1  christos static const struct or1k_reloc_map or1k_reloc_map[] =
    524  1.1  christos {
    525  1.1  christos   { BFD_RELOC_NONE,             R_OR1K_NONE },
    526  1.1  christos   { BFD_RELOC_32,               R_OR1K_32 },
    527  1.1  christos   { BFD_RELOC_16,               R_OR1K_16 },
    528  1.1  christos   { BFD_RELOC_8,                R_OR1K_8 },
    529  1.1  christos   { BFD_RELOC_LO16,             R_OR1K_LO_16_IN_INSN },
    530  1.1  christos   { BFD_RELOC_HI16,             R_OR1K_HI_16_IN_INSN },
    531  1.1  christos   { BFD_RELOC_OR1K_REL_26,      R_OR1K_INSN_REL_26 },
    532  1.1  christos   { BFD_RELOC_VTABLE_ENTRY,     R_OR1K_GNU_VTENTRY },
    533  1.1  christos   { BFD_RELOC_VTABLE_INHERIT,   R_OR1K_GNU_VTINHERIT },
    534  1.1  christos   { BFD_RELOC_32_PCREL,         R_OR1K_32_PCREL },
    535  1.1  christos   { BFD_RELOC_16_PCREL,         R_OR1K_16_PCREL },
    536  1.1  christos   { BFD_RELOC_8_PCREL,          R_OR1K_8_PCREL },
    537  1.1  christos   { BFD_RELOC_OR1K_GOTPC_HI16,  R_OR1K_GOTPC_HI16 },
    538  1.1  christos   { BFD_RELOC_OR1K_GOTPC_LO16,  R_OR1K_GOTPC_LO16 },
    539  1.1  christos   { BFD_RELOC_OR1K_GOT16,       R_OR1K_GOT16 },
    540  1.1  christos   { BFD_RELOC_OR1K_PLT26,       R_OR1K_PLT26 },
    541  1.1  christos   { BFD_RELOC_OR1K_GOTOFF_HI16, R_OR1K_GOTOFF_HI16 },
    542  1.1  christos   { BFD_RELOC_OR1K_GOTOFF_LO16, R_OR1K_GOTOFF_LO16 },
    543  1.1  christos   { BFD_RELOC_OR1K_GLOB_DAT,    R_OR1K_GLOB_DAT },
    544  1.1  christos   { BFD_RELOC_OR1K_COPY,        R_OR1K_COPY },
    545  1.1  christos   { BFD_RELOC_OR1K_JMP_SLOT,    R_OR1K_JMP_SLOT },
    546  1.1  christos   { BFD_RELOC_OR1K_RELATIVE,    R_OR1K_RELATIVE },
    547  1.1  christos   { BFD_RELOC_OR1K_TLS_GD_HI16, R_OR1K_TLS_GD_HI16 },
    548  1.1  christos   { BFD_RELOC_OR1K_TLS_GD_LO16, R_OR1K_TLS_GD_LO16 },
    549  1.1  christos   { BFD_RELOC_OR1K_TLS_LDM_HI16,        R_OR1K_TLS_LDM_HI16 },
    550  1.1  christos   { BFD_RELOC_OR1K_TLS_LDM_LO16,        R_OR1K_TLS_LDM_LO16 },
    551  1.1  christos   { BFD_RELOC_OR1K_TLS_LDO_HI16,        R_OR1K_TLS_LDO_HI16 },
    552  1.1  christos   { BFD_RELOC_OR1K_TLS_LDO_LO16,        R_OR1K_TLS_LDO_LO16 },
    553  1.1  christos   { BFD_RELOC_OR1K_TLS_IE_HI16, R_OR1K_TLS_IE_HI16 },
    554  1.1  christos   { BFD_RELOC_OR1K_TLS_IE_LO16, R_OR1K_TLS_IE_LO16 },
    555  1.1  christos   { BFD_RELOC_OR1K_TLS_LE_HI16, R_OR1K_TLS_LE_HI16 },
    556  1.1  christos   { BFD_RELOC_OR1K_TLS_LE_LO16, R_OR1K_TLS_LE_LO16 },
    557  1.1  christos };
    558  1.1  christos 
    559  1.1  christos /* The linker needs to keep track of the number of relocs that it
    560  1.1  christos    decides to copy as dynamic relocs in check_relocs for each symbol.
    561  1.1  christos    This is so that it can later discard them if they are found to be
    562  1.1  christos    unnecessary.  We store the information in a field extending the
    563  1.1  christos    regular ELF linker hash table.  */
    564  1.1  christos 
    565  1.1  christos struct elf_or1k_dyn_relocs
    566  1.1  christos {
    567  1.1  christos   struct elf_or1k_dyn_relocs *next;
    568  1.1  christos 
    569  1.1  christos   /* The input section of the reloc.  */
    570  1.1  christos   asection *sec;
    571  1.1  christos 
    572  1.1  christos   /* Total number of relocs copied for the input section.  */
    573  1.1  christos   bfd_size_type count;
    574  1.1  christos 
    575  1.1  christos   /* Number of pc-relative relocs copied for the input section.  */
    576  1.1  christos   bfd_size_type pc_count;
    577  1.1  christos };
    578  1.1  christos 
    579  1.1  christos #define TLS_UNKNOWN    0
    580  1.1  christos #define TLS_NONE       1
    581  1.1  christos #define TLS_GD         2
    582  1.1  christos #define TLS_LD         3
    583  1.1  christos #define TLS_IE         4
    584  1.1  christos #define TLS_LE         5
    585  1.1  christos 
    586  1.1  christos /* ELF linker hash entry.  */
    587  1.1  christos struct elf_or1k_link_hash_entry
    588  1.1  christos {
    589  1.1  christos   struct elf_link_hash_entry root;
    590  1.1  christos 
    591  1.1  christos   /* Track dynamic relocs copied for this symbol.  */
    592  1.1  christos   struct elf_or1k_dyn_relocs *dyn_relocs;
    593  1.1  christos 
    594  1.1  christos   /* Track type of TLS access.  */
    595  1.1  christos   unsigned char tls_type;
    596  1.1  christos };
    597  1.1  christos 
    598  1.1  christos /* ELF object data.  */
    599  1.1  christos struct elf_or1k_obj_tdata
    600  1.1  christos {
    601  1.1  christos   struct elf_obj_tdata root;
    602  1.1  christos 
    603  1.1  christos   /* tls_type for each local got entry.  */
    604  1.1  christos   unsigned char *local_tls_type;
    605  1.1  christos };
    606  1.1  christos 
    607  1.1  christos #define elf_or1k_tdata(abfd) \
    608  1.1  christos   ((struct elf_or1k_obj_tdata *) (abfd)->tdata.any)
    609  1.1  christos 
    610  1.1  christos #define elf_or1k_local_tls_type(abfd) \
    611  1.1  christos   (elf_or1k_tdata (abfd)->local_tls_type)
    612  1.1  christos 
    613  1.1  christos /* ELF linker hash table.  */
    614  1.1  christos struct elf_or1k_link_hash_table
    615  1.1  christos {
    616  1.1  christos   struct elf_link_hash_table root;
    617  1.1  christos 
    618  1.1  christos   /* Short-cuts to get to dynamic linker sections.  */
    619  1.1  christos   asection *sgot;
    620  1.1  christos   asection *sgotplt;
    621  1.1  christos   asection *srelgot;
    622  1.1  christos   asection *splt;
    623  1.1  christos   asection *srelplt;
    624  1.1  christos   asection *sdynbss;
    625  1.1  christos   asection *srelbss;
    626  1.1  christos 
    627  1.1  christos   /* Small local sym to section mapping cache.  */
    628  1.1  christos   struct sym_cache sym_sec;
    629  1.1  christos };
    630  1.1  christos 
    631  1.1  christos /* Get the ELF linker hash table from a link_info structure.  */
    632  1.1  christos #define or1k_elf_hash_table(p) \
    633  1.1  christos   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
    634  1.1  christos    == OR1K_ELF_DATA ? ((struct elf_or1k_link_hash_table *) ((p)->hash)) : NULL)
    635  1.1  christos 
    636  1.1  christos static bfd_boolean
    637  1.1  christos elf_or1k_mkobject (bfd *abfd)
    638  1.1  christos {
    639  1.1  christos   return bfd_elf_allocate_object (abfd, sizeof (struct elf_or1k_obj_tdata),
    640  1.1  christos                                   OR1K_ELF_DATA);
    641  1.1  christos }
    642  1.1  christos 
    643  1.1  christos /* Create an entry in an or1k ELF linker hash table.  */
    644  1.1  christos 
    645  1.1  christos static struct bfd_hash_entry *
    646  1.1  christos or1k_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
    647  1.1  christos                             struct bfd_hash_table *table,
    648  1.1  christos                             const char *string)
    649  1.1  christos {
    650  1.1  christos   struct elf_or1k_link_hash_entry *ret =
    651  1.1  christos     (struct elf_or1k_link_hash_entry *) entry;
    652  1.1  christos 
    653  1.1  christos   /* Allocate the structure if it has not already been allocated by a
    654  1.1  christos      subclass.  */
    655  1.1  christos   if (ret == NULL)
    656  1.1  christos     ret = bfd_hash_allocate (table,
    657  1.1  christos                              sizeof (struct elf_or1k_link_hash_entry));
    658  1.1  christos   if (ret == NULL)
    659  1.1  christos     return NULL;
    660  1.1  christos 
    661  1.1  christos   /* Call the allocation method of the superclass.  */
    662  1.1  christos   ret = ((struct elf_or1k_link_hash_entry *)
    663  1.1  christos          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
    664  1.1  christos                                      table, string));
    665  1.1  christos   if (ret != NULL)
    666  1.1  christos     {
    667  1.1  christos       struct elf_or1k_link_hash_entry *eh;
    668  1.1  christos 
    669  1.1  christos       eh = (struct elf_or1k_link_hash_entry *) ret;
    670  1.1  christos       eh->dyn_relocs = NULL;
    671  1.1  christos       eh->tls_type = TLS_UNKNOWN;
    672  1.1  christos     }
    673  1.1  christos 
    674  1.1  christos   return (struct bfd_hash_entry *) ret;
    675  1.1  christos }
    676  1.1  christos 
    677  1.1  christos /* Create an or1k ELF linker hash table.  */
    678  1.1  christos 
    679  1.1  christos static struct bfd_link_hash_table *
    680  1.1  christos or1k_elf_link_hash_table_create (bfd *abfd)
    681  1.1  christos {
    682  1.1  christos   struct elf_or1k_link_hash_table *ret;
    683  1.1  christos   bfd_size_type amt = sizeof (struct elf_or1k_link_hash_table);
    684  1.1  christos 
    685  1.1  christos   ret = bfd_zmalloc (amt);
    686  1.1  christos   if (ret == NULL)
    687  1.1  christos     return NULL;
    688  1.1  christos 
    689  1.1  christos   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
    690  1.1  christos                                       or1k_elf_link_hash_newfunc,
    691  1.1  christos                                       sizeof (struct elf_or1k_link_hash_entry),
    692  1.1  christos                                       OR1K_ELF_DATA))
    693  1.1  christos     {
    694  1.1  christos       free (ret);
    695  1.1  christos       return NULL;
    696  1.1  christos     }
    697  1.1  christos 
    698  1.1  christos   return &ret->root.root;
    699  1.1  christos }
    700  1.1  christos 
    701  1.1  christos static reloc_howto_type *
    702  1.1  christos or1k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
    703  1.1  christos 			bfd_reloc_code_real_type code)
    704  1.1  christos {
    705  1.1  christos   unsigned int i;
    706  1.1  christos 
    707  1.1  christos   for (i = ARRAY_SIZE (or1k_reloc_map); --i;)
    708  1.1  christos     if (or1k_reloc_map[i].bfd_reloc_val == code)
    709  1.1  christos       return & or1k_elf_howto_table[or1k_reloc_map[i].or1k_reloc_val];
    710  1.1  christos 
    711  1.1  christos   return NULL;
    712  1.1  christos }
    713  1.1  christos 
    714  1.1  christos static reloc_howto_type *
    715  1.1  christos or1k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    716  1.1  christos 			const char *r_name)
    717  1.1  christos {
    718  1.1  christos   unsigned int i;
    719  1.1  christos 
    720  1.1  christos   for (i = 0;
    721  1.1  christos        i < (sizeof (or1k_elf_howto_table)
    722  1.1  christos             / sizeof (or1k_elf_howto_table[0]));
    723  1.1  christos        i++)
    724  1.1  christos     if (or1k_elf_howto_table[i].name != NULL
    725  1.1  christos         && strcasecmp (or1k_elf_howto_table[i].name, r_name) == 0)
    726  1.1  christos       return &or1k_elf_howto_table[i];
    727  1.1  christos 
    728  1.1  christos   return NULL;
    729  1.1  christos }
    730  1.1  christos 
    731  1.1  christos /* Set the howto pointer for an Or1k ELF reloc.  */
    732  1.1  christos 
    733  1.1  christos static void
    734  1.1  christos or1k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
    735  1.1  christos 			 arelent * cache_ptr,
    736  1.1  christos 			 Elf_Internal_Rela * dst)
    737  1.1  christos {
    738  1.1  christos   unsigned int r_type;
    739  1.1  christos 
    740  1.1  christos   r_type = ELF32_R_TYPE (dst->r_info);
    741  1.1  christos   if (r_type >= (unsigned int) R_OR1K_max)
    742  1.1  christos     {
    743  1.1  christos       _bfd_error_handler (_("%A: invalid OR1K reloc number: %d"), abfd, r_type);
    744  1.1  christos       r_type = 0;
    745  1.1  christos     }
    746  1.1  christos   cache_ptr->howto = & or1k_elf_howto_table[r_type];
    747  1.1  christos }
    748  1.1  christos 
    749  1.1  christos 
    750  1.1  christos /* Return the relocation value for @tpoff relocations..  */
    751  1.1  christos static bfd_vma
    752  1.1  christos tpoff (struct bfd_link_info *info, bfd_vma address)
    753  1.1  christos {
    754  1.1  christos   /* If tls_sec is NULL, we should have signalled an error already.  */
    755  1.1  christos   if (elf_hash_table (info)->tls_sec == NULL)
    756  1.1  christos     return 0;
    757  1.1  christos 
    758  1.1  christos   /* The thread pointer on or1k stores the address after the TCB where
    759  1.1  christos      the data is, just compute the difference. No need to compensate
    760  1.1  christos      for the size of TCB.  */
    761  1.1  christos   return (address - elf_hash_table (info)->tls_sec->vma);
    762  1.1  christos }
    763  1.1  christos 
    764  1.1  christos /* Relocate an Or1k ELF section.
    765  1.1  christos 
    766  1.1  christos    The RELOCATE_SECTION function is called by the new ELF backend linker
    767  1.1  christos    to handle the relocations for a section.
    768  1.1  christos 
    769  1.1  christos    The relocs are always passed as Rela structures; if the section
    770  1.1  christos    actually uses Rel structures, the r_addend field will always be
    771  1.1  christos    zero.
    772  1.1  christos 
    773  1.1  christos    This function is responsible for adjusting the section contents as
    774  1.1  christos    necessary, and (if using Rela relocs and generating a relocatable
    775  1.1  christos    output file) adjusting the reloc addend as necessary.
    776  1.1  christos 
    777  1.1  christos    This function does not have to worry about setting the reloc
    778  1.1  christos    address or the reloc symbol index.
    779  1.1  christos 
    780  1.1  christos    LOCAL_SYMS is a pointer to the swapped in local symbols.
    781  1.1  christos 
    782  1.1  christos    LOCAL_SECTIONS is an array giving the section in the input file
    783  1.1  christos    corresponding to the st_shndx field of each local symbol.
    784  1.1  christos 
    785  1.1  christos    The global hash table entry for the global symbols can be found
    786  1.1  christos    via elf_sym_hashes (input_bfd).
    787  1.1  christos 
    788  1.1  christos    When generating relocatable output, this function must handle
    789  1.1  christos    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
    790  1.1  christos    going to be the section symbol corresponding to the output
    791  1.1  christos    section, which means that the addend must be adjusted
    792  1.1  christos    accordingly.  */
    793  1.1  christos 
    794  1.1  christos static bfd_boolean
    795  1.1  christos or1k_elf_relocate_section (bfd *output_bfd,
    796  1.1  christos 			   struct bfd_link_info *info,
    797  1.1  christos 			   bfd *input_bfd,
    798  1.1  christos 			   asection *input_section,
    799  1.1  christos 			   bfd_byte *contents,
    800  1.1  christos 			   Elf_Internal_Rela *relocs,
    801  1.1  christos 			   Elf_Internal_Sym *local_syms,
    802  1.1  christos 			   asection **local_sections)
    803  1.1  christos {
    804  1.1  christos   Elf_Internal_Shdr *symtab_hdr;
    805  1.1  christos   struct elf_link_hash_entry **sym_hashes;
    806  1.1  christos   Elf_Internal_Rela *rel;
    807  1.1  christos   Elf_Internal_Rela *relend;
    808  1.1  christos   struct elf_or1k_link_hash_table *htab = or1k_elf_hash_table (info);
    809  1.1  christos   bfd *dynobj;
    810  1.1  christos   asection *sreloc;
    811  1.1  christos   bfd_vma *local_got_offsets;
    812  1.1  christos   asection *sgot;
    813  1.1  christos 
    814  1.1  christos   if (htab == NULL)
    815  1.1  christos     return FALSE;
    816  1.1  christos 
    817  1.1  christos   dynobj = htab->root.dynobj;
    818  1.1  christos   local_got_offsets = elf_local_got_offsets (input_bfd);
    819  1.1  christos 
    820  1.1  christos   sreloc = elf_section_data (input_section)->sreloc;
    821  1.1  christos 
    822  1.1  christos   sgot = htab->sgot;
    823  1.1  christos 
    824  1.1  christos   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
    825  1.1  christos   sym_hashes = elf_sym_hashes (input_bfd);
    826  1.1  christos   relend = relocs + input_section->reloc_count;
    827  1.1  christos 
    828  1.1  christos   for (rel = relocs; rel < relend; rel++)
    829  1.1  christos     {
    830  1.1  christos       reloc_howto_type *howto;
    831  1.1  christos       unsigned long r_symndx;
    832  1.1  christos       Elf_Internal_Sym *sym;
    833  1.1  christos       asection *sec;
    834  1.1  christos       struct elf_link_hash_entry *h;
    835  1.1  christos       bfd_vma relocation;
    836  1.1  christos       bfd_reloc_status_type r;
    837  1.1  christos       const char *name = NULL;
    838  1.1  christos       int r_type;
    839  1.1  christos 
    840  1.1  christos       r_type = ELF32_R_TYPE (rel->r_info);
    841  1.1  christos       r_symndx = ELF32_R_SYM (rel->r_info);
    842  1.1  christos 
    843  1.1  christos       if (r_type == R_OR1K_GNU_VTINHERIT
    844  1.1  christos           || r_type == R_OR1K_GNU_VTENTRY)
    845  1.1  christos         continue;
    846  1.1  christos 
    847  1.1  christos       if (r_type < 0 || r_type >= (int) R_OR1K_max)
    848  1.1  christos         {
    849  1.1  christos           bfd_set_error (bfd_error_bad_value);
    850  1.1  christos           return FALSE;
    851  1.1  christos         }
    852  1.1  christos 
    853  1.1  christos       howto = or1k_elf_howto_table + ELF32_R_TYPE (rel->r_info);
    854  1.1  christos       h = NULL;
    855  1.1  christos       sym = NULL;
    856  1.1  christos       sec = NULL;
    857  1.1  christos 
    858  1.1  christos       if (r_symndx < symtab_hdr->sh_info)
    859  1.1  christos         {
    860  1.1  christos           sym = local_syms + r_symndx;
    861  1.1  christos           sec = local_sections[r_symndx];
    862  1.1  christos           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
    863  1.1  christos 
    864  1.1  christos           name = bfd_elf_string_from_elf_section
    865  1.1  christos             (input_bfd, symtab_hdr->sh_link, sym->st_name);
    866  1.1  christos           name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
    867  1.1  christos         }
    868  1.1  christos       else
    869  1.1  christos         {
    870  1.1  christos           bfd_boolean unresolved_reloc, warned, ignored;
    871  1.1  christos 
    872  1.1  christos           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
    873  1.1  christos                                    r_symndx, symtab_hdr, sym_hashes,
    874  1.1  christos                                    h, sec, relocation,
    875  1.1  christos                                    unresolved_reloc, warned, ignored);
    876  1.1  christos         }
    877  1.1  christos 
    878  1.1  christos       if (sec != NULL && discarded_section (sec))
    879  1.1  christos         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
    880  1.1  christos                                          rel, 1, relend, howto, 0, contents);
    881  1.1  christos 
    882  1.1  christos       if (info->relocatable)
    883  1.1  christos         continue;
    884  1.1  christos 
    885  1.1  christos       switch (howto->type)
    886  1.1  christos         {
    887  1.1  christos         case R_OR1K_PLT26:
    888  1.1  christos           {
    889  1.1  christos             if (htab->splt != NULL && h != NULL
    890  1.1  christos                 && h->plt.offset != (bfd_vma) -1)
    891  1.1  christos               {
    892  1.1  christos                 relocation = (htab->splt->output_section->vma
    893  1.1  christos                               + htab->splt->output_offset
    894  1.1  christos                               + h->plt.offset);
    895  1.1  christos               }
    896  1.1  christos             break;
    897  1.1  christos           }
    898  1.1  christos 
    899  1.1  christos         case R_OR1K_GOT16:
    900  1.1  christos           /* Relocation is to the entry for this symbol in the global
    901  1.1  christos              offset table.  */
    902  1.1  christos           BFD_ASSERT (sgot != NULL);
    903  1.1  christos           if (h != NULL)
    904  1.1  christos             {
    905  1.1  christos               bfd_boolean dyn;
    906  1.1  christos               bfd_vma off;
    907  1.1  christos 
    908  1.1  christos               off = h->got.offset;
    909  1.1  christos               BFD_ASSERT (off != (bfd_vma) -1);
    910  1.1  christos 
    911  1.1  christos               dyn = htab->root.dynamic_sections_created;
    912  1.1  christos               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
    913  1.1  christos                   || (info->shared
    914  1.1  christos                       && SYMBOL_REFERENCES_LOCAL (info, h)))
    915  1.1  christos                 {
    916  1.1  christos                   /* This is actually a static link, or it is a
    917  1.1  christos                      -Bsymbolic link and the symbol is defined
    918  1.1  christos                      locally, or the symbol was forced to be local
    919  1.1  christos                      because of a version file.  We must initialize
    920  1.1  christos                      this entry in the global offset table.  Since the
    921  1.1  christos                      offset must always be a multiple of 4, we use the
    922  1.1  christos                      least significant bit to record whether we have
    923  1.1  christos                      initialized it already.
    924  1.1  christos 
    925  1.1  christos                      When doing a dynamic link, we create a .rela.got
    926  1.1  christos                      relocation entry to initialize the value.  This
    927  1.1  christos                      is done in the finish_dynamic_symbol routine.  */
    928  1.1  christos                   if ((off & 1) != 0)
    929  1.1  christos                     off &= ~1;
    930  1.1  christos                   else
    931  1.1  christos                     {
    932  1.1  christos                       /* Write entry in GOT.  */
    933  1.1  christos                       bfd_put_32 (output_bfd, relocation,
    934  1.1  christos                                   sgot->contents + off);
    935  1.1  christos                       /* Mark GOT entry as having been written.  */
    936  1.1  christos                       h->got.offset |= 1;
    937  1.1  christos                     }
    938  1.1  christos                 }
    939  1.1  christos 
    940  1.1  christos               relocation = sgot->output_offset + off;
    941  1.1  christos             }
    942  1.1  christos           else
    943  1.1  christos             {
    944  1.1  christos               bfd_vma off;
    945  1.1  christos               bfd_byte *loc;
    946  1.1  christos 
    947  1.1  christos               BFD_ASSERT (local_got_offsets != NULL
    948  1.1  christos                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
    949  1.1  christos 
    950  1.1  christos               /* Get offset into GOT table.  */
    951  1.1  christos               off = local_got_offsets[r_symndx];
    952  1.1  christos 
    953  1.1  christos               /* The offset must always be a multiple of 4.  We use
    954  1.1  christos                  the least significant bit to record whether we have
    955  1.1  christos                  already processed this entry.  */
    956  1.1  christos               if ((off & 1) != 0)
    957  1.1  christos                 off &= ~1;
    958  1.1  christos               else
    959  1.1  christos                 {
    960  1.1  christos                   /* Write entry in GOT.  */
    961  1.1  christos                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
    962  1.1  christos                   if (info->shared)
    963  1.1  christos                     {
    964  1.1  christos                       asection *srelgot;
    965  1.1  christos                       Elf_Internal_Rela outrel;
    966  1.1  christos 
    967  1.1  christos                       /* We need to generate a R_OR1K_RELATIVE reloc
    968  1.1  christos                          for the dynamic linker.  */
    969  1.1  christos                       srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
    970  1.1  christos                       BFD_ASSERT (srelgot != NULL);
    971  1.1  christos 
    972  1.1  christos                       outrel.r_offset = (sgot->output_section->vma
    973  1.1  christos                                          + sgot->output_offset
    974  1.1  christos                                          + off);
    975  1.1  christos                       outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
    976  1.1  christos                       outrel.r_addend = relocation;
    977  1.1  christos                       loc = srelgot->contents;
    978  1.1  christos                       loc += srelgot->reloc_count * sizeof (Elf32_External_Rela);
    979  1.1  christos                       bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
    980  1.1  christos                       ++srelgot->reloc_count;
    981  1.1  christos                     }
    982  1.1  christos 
    983  1.1  christos                   local_got_offsets[r_symndx] |= 1;
    984  1.1  christos                 }
    985  1.1  christos               relocation = sgot->output_offset + off;
    986  1.1  christos             }
    987  1.1  christos 
    988  1.1  christos           /* Addend should be zero.  */
    989  1.1  christos           if (rel->r_addend != 0)
    990  1.1  christos             (*_bfd_error_handler)
    991  1.1  christos               (_("internal error: addend should be zero for R_OR1K_GOT16"));
    992  1.1  christos 
    993  1.1  christos           break;
    994  1.1  christos 
    995  1.1  christos         case R_OR1K_GOTOFF_LO16:
    996  1.1  christos         case R_OR1K_GOTOFF_HI16:
    997  1.1  christos           /* Relocation is offset from GOT.  */
    998  1.1  christos           BFD_ASSERT (sgot != NULL);
    999  1.1  christos           relocation -= sgot->output_section->vma;
   1000  1.1  christos           break;
   1001  1.1  christos 
   1002  1.1  christos         case R_OR1K_INSN_REL_26:
   1003  1.1  christos         case R_OR1K_HI_16_IN_INSN:
   1004  1.1  christos         case R_OR1K_LO_16_IN_INSN:
   1005  1.1  christos         case R_OR1K_32:
   1006  1.1  christos           /* R_OR1K_16? */
   1007  1.1  christos           {
   1008  1.1  christos             /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols
   1009  1.1  christos                from removed linkonce sections, or sections discarded by
   1010  1.1  christos                a linker script.  */
   1011  1.1  christos             if (r_symndx == STN_UNDEF
   1012  1.1  christos                 || (input_section->flags & SEC_ALLOC) == 0)
   1013  1.1  christos               break;
   1014  1.1  christos 
   1015  1.1  christos             if ((info->shared
   1016  1.1  christos                  && (h == NULL
   1017  1.1  christos                      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   1018  1.1  christos                      || h->root.type != bfd_link_hash_undefweak)
   1019  1.1  christos 		 && (howto->type != R_OR1K_INSN_REL_26
   1020  1.1  christos 		     || !SYMBOL_CALLS_LOCAL (info, h)))
   1021  1.1  christos                 || (!info->shared
   1022  1.1  christos                     && h != NULL
   1023  1.1  christos                     && h->dynindx != -1
   1024  1.1  christos                     && !h->non_got_ref
   1025  1.1  christos                     && ((h->def_dynamic
   1026  1.1  christos                          && !h->def_regular)
   1027  1.1  christos                         || h->root.type == bfd_link_hash_undefweak
   1028  1.1  christos                         || h->root.type == bfd_link_hash_undefined)))
   1029  1.1  christos               {
   1030  1.1  christos                 Elf_Internal_Rela outrel;
   1031  1.1  christos                 bfd_byte *loc;
   1032  1.1  christos                 bfd_boolean skip;
   1033  1.1  christos 
   1034  1.1  christos                 /* When generating a shared object, these relocations
   1035  1.1  christos                    are copied into the output file to be resolved at run
   1036  1.1  christos                    time.  */
   1037  1.1  christos 
   1038  1.1  christos                 BFD_ASSERT (sreloc != NULL);
   1039  1.1  christos 
   1040  1.1  christos                 skip = FALSE;
   1041  1.1  christos 
   1042  1.1  christos                 outrel.r_offset =
   1043  1.1  christos                   _bfd_elf_section_offset (output_bfd, info, input_section,
   1044  1.1  christos                                            rel->r_offset);
   1045  1.1  christos                 if (outrel.r_offset == (bfd_vma) -1)
   1046  1.1  christos                   skip = TRUE;
   1047  1.1  christos                 else if (outrel.r_offset == (bfd_vma) -2)
   1048  1.1  christos                   skip = TRUE;
   1049  1.1  christos                 outrel.r_offset += (input_section->output_section->vma
   1050  1.1  christos                                     + input_section->output_offset);
   1051  1.1  christos 
   1052  1.1  christos                 if (skip)
   1053  1.1  christos                   memset (&outrel, 0, sizeof outrel);
   1054  1.1  christos                 /* h->dynindx may be -1 if the symbol was marked to
   1055  1.1  christos                    become local.  */
   1056  1.1  christos                 else if (h != NULL
   1057  1.1  christos                          && ((! info->symbolic && h->dynindx != -1)
   1058  1.1  christos                              || !h->def_regular))
   1059  1.1  christos                   {
   1060  1.1  christos                     BFD_ASSERT (h->dynindx != -1);
   1061  1.1  christos                     outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
   1062  1.1  christos                     outrel.r_addend = rel->r_addend;
   1063  1.1  christos                   }
   1064  1.1  christos                 else
   1065  1.1  christos                   {
   1066  1.1  christos                     if (r_type == R_OR1K_32)
   1067  1.1  christos                       {
   1068  1.1  christos                         outrel.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
   1069  1.1  christos                         outrel.r_addend = relocation + rel->r_addend;
   1070  1.1  christos                       }
   1071  1.1  christos                     else
   1072  1.1  christos                       {
   1073  1.1  christos                         BFD_FAIL ();
   1074  1.1  christos                         (*_bfd_error_handler)
   1075  1.1  christos                           (_("%B: probably compiled without -fPIC?"),
   1076  1.1  christos                            input_bfd);
   1077  1.1  christos                         bfd_set_error (bfd_error_bad_value);
   1078  1.1  christos                         return FALSE;
   1079  1.1  christos                       }
   1080  1.1  christos                   }
   1081  1.1  christos 
   1082  1.1  christos                 loc = sreloc->contents;
   1083  1.1  christos                 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
   1084  1.1  christos                 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
   1085  1.1  christos                 break;
   1086  1.1  christos               }
   1087  1.1  christos             break;
   1088  1.1  christos           }
   1089  1.1  christos 
   1090  1.1  christos         case R_OR1K_TLS_LDM_HI16:
   1091  1.1  christos         case R_OR1K_TLS_LDM_LO16:
   1092  1.1  christos         case R_OR1K_TLS_LDO_HI16:
   1093  1.1  christos         case R_OR1K_TLS_LDO_LO16:
   1094  1.1  christos           /* TODO: implement support for local dynamic.  */
   1095  1.1  christos           BFD_FAIL ();
   1096  1.1  christos           (*_bfd_error_handler)
   1097  1.1  christos             (_("%B: support for local dynamic not implemented"),
   1098  1.1  christos              input_bfd);
   1099  1.1  christos           bfd_set_error (bfd_error_bad_value);
   1100  1.1  christos           return FALSE;
   1101  1.1  christos 
   1102  1.1  christos 
   1103  1.1  christos         case R_OR1K_TLS_GD_HI16:
   1104  1.1  christos         case R_OR1K_TLS_GD_LO16:
   1105  1.1  christos         case R_OR1K_TLS_IE_HI16:
   1106  1.1  christos         case R_OR1K_TLS_IE_LO16:
   1107  1.1  christos           {
   1108  1.1  christos             bfd_vma gotoff;
   1109  1.1  christos             Elf_Internal_Rela rela;
   1110  1.1  christos             bfd_byte *loc;
   1111  1.1  christos             int dynamic;
   1112  1.1  christos 
   1113  1.1  christos             sreloc = bfd_get_section_by_name (dynobj, ".rela.got");
   1114  1.1  christos 
   1115  1.1  christos             /* Mark as TLS related GOT entry by setting
   1116  1.1  christos                bit 2 as well as bit 1.  */
   1117  1.1  christos             if (h != NULL)
   1118  1.1  christos               {
   1119  1.1  christos                 gotoff = h->got.offset;
   1120  1.1  christos                 h->got.offset |= 3;
   1121  1.1  christos               }
   1122  1.1  christos             else
   1123  1.1  christos               {
   1124  1.1  christos                 gotoff = local_got_offsets[r_symndx];
   1125  1.1  christos                 local_got_offsets[r_symndx] |= 3;
   1126  1.1  christos               }
   1127  1.1  christos 
   1128  1.1  christos             /* Only process the relocation once.  */
   1129  1.1  christos             if (gotoff & 1)
   1130  1.1  christos               {
   1131  1.1  christos                 relocation = sgot->output_offset + (gotoff  & ~3);
   1132  1.1  christos                 break;
   1133  1.1  christos               }
   1134  1.1  christos 
   1135  1.1  christos             BFD_ASSERT (elf_hash_table (info)->hgot == NULL
   1136  1.1  christos 			|| elf_hash_table (info)->hgot->root.u.def.value == 0);
   1137  1.1  christos 
   1138  1.1  christos             /* Dynamic entries will require relocations. if we do not need
   1139  1.1  christos                them we will just use the default R_OR1K_NONE and
   1140  1.1  christos                not set anything.  */
   1141  1.1  christos             dynamic = info->shared
   1142  1.1  christos 	      || (sec && (sec->flags & SEC_ALLOC) != 0
   1143  1.1  christos 		  && h != NULL
   1144  1.1  christos 		  && (h->root.type == bfd_link_hash_defweak || !h->def_regular));
   1145  1.1  christos 
   1146  1.1  christos             /* Shared GD.  */
   1147  1.1  christos             if (dynamic && (howto->type == R_OR1K_TLS_GD_HI16
   1148  1.1  christos 			    || howto->type == R_OR1K_TLS_GD_LO16))
   1149  1.1  christos               {
   1150  1.1  christos                 int i;
   1151  1.1  christos 
   1152  1.1  christos                 /* Add DTPMOD and DTPOFF GOT and rela entries.  */
   1153  1.1  christos                 for (i = 0; i < 2; ++i)
   1154  1.1  christos                   {
   1155  1.1  christos                     rela.r_offset = sgot->output_section->vma +
   1156  1.1  christos                       sgot->output_offset + gotoff + i*4;
   1157  1.1  christos                     if (h != NULL && h->dynindx != -1)
   1158  1.1  christos                       {
   1159  1.1  christos                         rela.r_info = ELF32_R_INFO (h->dynindx,
   1160  1.1  christos                             (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
   1161  1.1  christos                         rela.r_addend = 0;
   1162  1.1  christos                       }
   1163  1.1  christos                     else
   1164  1.1  christos                       {
   1165  1.1  christos                         rela.r_info = ELF32_R_INFO (0,
   1166  1.1  christos                             (i == 0 ? R_OR1K_TLS_DTPMOD : R_OR1K_TLS_DTPOFF));
   1167  1.1  christos                         rela.r_addend = tpoff (info, relocation);
   1168  1.1  christos                       }
   1169  1.1  christos 
   1170  1.1  christos                     loc = sreloc->contents;
   1171  1.1  christos                     loc += sreloc->reloc_count++ *
   1172  1.1  christos                       sizeof (Elf32_External_Rela);
   1173  1.1  christos 
   1174  1.1  christos                     bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   1175  1.1  christos                     bfd_put_32 (output_bfd, 0, sgot->contents + gotoff + i*4);
   1176  1.1  christos                   }
   1177  1.1  christos               }
   1178  1.1  christos             /* Static GD.  */
   1179  1.1  christos             else if (howto->type == R_OR1K_TLS_GD_HI16
   1180  1.1  christos                      || howto->type == R_OR1K_TLS_GD_LO16)
   1181  1.1  christos               {
   1182  1.1  christos                 bfd_put_32 (output_bfd, 1, sgot->contents + gotoff);
   1183  1.1  christos                 bfd_put_32 (output_bfd, tpoff (info, relocation),
   1184  1.1  christos                     sgot->contents + gotoff + 4);
   1185  1.1  christos               }
   1186  1.1  christos             /* Shared IE.  */
   1187  1.1  christos             else if (dynamic)
   1188  1.1  christos               {
   1189  1.1  christos                 /* Add TPOFF GOT and rela entries.  */
   1190  1.1  christos                 rela.r_offset = sgot->output_section->vma +
   1191  1.1  christos                   sgot->output_offset + gotoff;
   1192  1.1  christos                 if (h != NULL && h->dynindx != -1)
   1193  1.1  christos                   {
   1194  1.1  christos                     rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_TLS_TPOFF);
   1195  1.1  christos                     rela.r_addend = 0;
   1196  1.1  christos                   }
   1197  1.1  christos                 else
   1198  1.1  christos                   {
   1199  1.1  christos                     rela.r_info = ELF32_R_INFO (0, R_OR1K_TLS_TPOFF);
   1200  1.1  christos                     rela.r_addend = tpoff (info, relocation);
   1201  1.1  christos                   }
   1202  1.1  christos 
   1203  1.1  christos                 loc = sreloc->contents;
   1204  1.1  christos                 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
   1205  1.1  christos 
   1206  1.1  christos                 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   1207  1.1  christos                 bfd_put_32 (output_bfd, 0, sgot->contents + gotoff);
   1208  1.1  christos               }
   1209  1.1  christos             /* Static IE.  */
   1210  1.1  christos             else
   1211  1.1  christos               {
   1212  1.1  christos                 bfd_put_32 (output_bfd, tpoff (info, relocation),
   1213  1.1  christos 			    sgot->contents + gotoff);
   1214  1.1  christos               }
   1215  1.1  christos             relocation = sgot->output_offset + gotoff;
   1216  1.1  christos             break;
   1217  1.1  christos           }
   1218  1.1  christos         case R_OR1K_TLS_LE_HI16:
   1219  1.1  christos         case R_OR1K_TLS_LE_LO16:
   1220  1.1  christos 
   1221  1.1  christos           /* Relocation is offset from TP.  */
   1222  1.1  christos           relocation = tpoff (info, relocation);
   1223  1.1  christos           break;
   1224  1.1  christos 
   1225  1.1  christos         case R_OR1K_TLS_DTPMOD:
   1226  1.1  christos         case R_OR1K_TLS_DTPOFF:
   1227  1.1  christos         case R_OR1K_TLS_TPOFF:
   1228  1.1  christos           /* These are resolved dynamically on load and shouldn't
   1229  1.1  christos              be used as linker input.  */
   1230  1.1  christos           BFD_FAIL ();
   1231  1.1  christos           (*_bfd_error_handler)
   1232  1.1  christos             (_("%B: will not resolve runtime TLS relocation"),
   1233  1.1  christos              input_bfd);
   1234  1.1  christos           bfd_set_error (bfd_error_bad_value);
   1235  1.1  christos           return FALSE;
   1236  1.1  christos 
   1237  1.1  christos         default:
   1238  1.1  christos           break;
   1239  1.1  christos         }
   1240  1.1  christos       r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
   1241  1.1  christos                                     rel->r_offset, relocation, rel->r_addend);
   1242  1.1  christos 
   1243  1.1  christos       if (r != bfd_reloc_ok)
   1244  1.1  christos         {
   1245  1.1  christos           const char *msg = NULL;
   1246  1.1  christos 
   1247  1.1  christos           switch (r)
   1248  1.1  christos             {
   1249  1.1  christos             case bfd_reloc_overflow:
   1250  1.1  christos               r = info->callbacks->reloc_overflow
   1251  1.1  christos                 (info, (h ? &h->root : NULL), name, howto->name,
   1252  1.1  christos                  (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   1253  1.1  christos               break;
   1254  1.1  christos 
   1255  1.1  christos             case bfd_reloc_undefined:
   1256  1.1  christos               r = info->callbacks->undefined_symbol
   1257  1.1  christos                 (info, name, input_bfd, input_section, rel->r_offset, TRUE);
   1258  1.1  christos               break;
   1259  1.1  christos 
   1260  1.1  christos             case bfd_reloc_outofrange:
   1261  1.1  christos               msg = _("internal error: out of range error");
   1262  1.1  christos               break;
   1263  1.1  christos 
   1264  1.1  christos             case bfd_reloc_notsupported:
   1265  1.1  christos               msg = _("internal error: unsupported relocation error");
   1266  1.1  christos               break;
   1267  1.1  christos 
   1268  1.1  christos             case bfd_reloc_dangerous:
   1269  1.1  christos               msg = _("internal error: dangerous relocation");
   1270  1.1  christos               break;
   1271  1.1  christos 
   1272  1.1  christos             default:
   1273  1.1  christos               msg = _("internal error: unknown error");
   1274  1.1  christos               break;
   1275  1.1  christos             }
   1276  1.1  christos 
   1277  1.1  christos           if (msg)
   1278  1.1  christos             r = info->callbacks->warning
   1279  1.1  christos               (info, msg, name, input_bfd, input_section, rel->r_offset);
   1280  1.1  christos 
   1281  1.1  christos           if (!r)
   1282  1.1  christos             return FALSE;
   1283  1.1  christos         }
   1284  1.1  christos     }
   1285  1.1  christos 
   1286  1.1  christos   return TRUE;
   1287  1.1  christos }
   1288  1.1  christos 
   1289  1.1  christos /* Return the section that should be marked against GC for a given
   1290  1.1  christos    relocation.  */
   1291  1.1  christos 
   1292  1.1  christos static asection *
   1293  1.1  christos or1k_elf_gc_mark_hook (asection *sec,
   1294  1.1  christos 		       struct bfd_link_info *info,
   1295  1.1  christos 		       Elf_Internal_Rela *rel,
   1296  1.1  christos 		       struct elf_link_hash_entry *h,
   1297  1.1  christos 		       Elf_Internal_Sym *sym)
   1298  1.1  christos {
   1299  1.1  christos   if (h != NULL)
   1300  1.1  christos     switch (ELF32_R_TYPE (rel->r_info))
   1301  1.1  christos       {
   1302  1.1  christos       case R_OR1K_GNU_VTINHERIT:
   1303  1.1  christos       case R_OR1K_GNU_VTENTRY:
   1304  1.1  christos         return NULL;
   1305  1.1  christos       }
   1306  1.1  christos 
   1307  1.1  christos   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   1308  1.1  christos }
   1309  1.1  christos 
   1310  1.1  christos static bfd_boolean
   1311  1.1  christos or1k_elf_gc_sweep_hook (bfd *abfd,
   1312  1.1  christos                         struct bfd_link_info *info ATTRIBUTE_UNUSED,
   1313  1.1  christos                         asection *sec,
   1314  1.1  christos                         const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
   1315  1.1  christos {
   1316  1.1  christos   /* Update the got entry reference counts for the section being removed.  */
   1317  1.1  christos   Elf_Internal_Shdr *symtab_hdr;
   1318  1.1  christos   struct elf_link_hash_entry **sym_hashes;
   1319  1.1  christos   bfd_signed_vma *local_got_refcounts;
   1320  1.1  christos   const Elf_Internal_Rela *rel, *relend;
   1321  1.1  christos 
   1322  1.1  christos   elf_section_data (sec)->local_dynrel = NULL;
   1323  1.1  christos 
   1324  1.1  christos   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1325  1.1  christos   sym_hashes = elf_sym_hashes (abfd);
   1326  1.1  christos   local_got_refcounts = elf_local_got_refcounts (abfd);
   1327  1.1  christos 
   1328  1.1  christos   relend = relocs + sec->reloc_count;
   1329  1.1  christos   for (rel = relocs; rel < relend; rel++)
   1330  1.1  christos     {
   1331  1.1  christos       unsigned long r_symndx;
   1332  1.1  christos       struct elf_link_hash_entry *h = NULL;
   1333  1.1  christos 
   1334  1.1  christos       r_symndx = ELF32_R_SYM (rel->r_info);
   1335  1.1  christos       if (r_symndx >= symtab_hdr->sh_info)
   1336  1.1  christos         {
   1337  1.1  christos           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1338  1.1  christos           while (h->root.type == bfd_link_hash_indirect
   1339  1.1  christos                  || h->root.type == bfd_link_hash_warning)
   1340  1.1  christos             h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1341  1.1  christos         }
   1342  1.1  christos 
   1343  1.1  christos       switch (ELF32_R_TYPE (rel->r_info))
   1344  1.1  christos         {
   1345  1.1  christos         case R_OR1K_GOT16:
   1346  1.1  christos           if (h != NULL)
   1347  1.1  christos             {
   1348  1.1  christos               if (h->got.refcount > 0)
   1349  1.1  christos                 h->got.refcount--;
   1350  1.1  christos             }
   1351  1.1  christos           else
   1352  1.1  christos             {
   1353  1.1  christos               if (local_got_refcounts && local_got_refcounts[r_symndx] > 0)
   1354  1.1  christos                 local_got_refcounts[r_symndx]--;
   1355  1.1  christos             }
   1356  1.1  christos           break;
   1357  1.1  christos 
   1358  1.1  christos         default:
   1359  1.1  christos           break;
   1360  1.1  christos         }
   1361  1.1  christos     }
   1362  1.1  christos   return TRUE;
   1363  1.1  christos }
   1364  1.1  christos 
   1365  1.1  christos /* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up
   1366  1.1  christos    shortcuts to them in our hash table.  */
   1367  1.1  christos 
   1368  1.1  christos static bfd_boolean
   1369  1.1  christos create_got_section (bfd *dynobj, struct bfd_link_info *info)
   1370  1.1  christos {
   1371  1.1  christos   struct elf_or1k_link_hash_table *htab;
   1372  1.1  christos   asection *s;
   1373  1.1  christos 
   1374  1.1  christos   /* This function may be called more than once.  */
   1375  1.1  christos   s = bfd_get_section_by_name (dynobj, ".got");
   1376  1.1  christos   if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
   1377  1.1  christos     return TRUE;
   1378  1.1  christos 
   1379  1.1  christos   htab = or1k_elf_hash_table (info);
   1380  1.1  christos   if (htab == NULL)
   1381  1.1  christos     return FALSE;
   1382  1.1  christos 
   1383  1.1  christos   if (! _bfd_elf_create_got_section (dynobj, info))
   1384  1.1  christos     return FALSE;
   1385  1.1  christos 
   1386  1.1  christos   htab->sgot = bfd_get_section_by_name (dynobj, ".got");
   1387  1.1  christos   htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
   1388  1.1  christos   htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
   1389  1.1  christos 
   1390  1.1  christos   if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
   1391  1.1  christos     abort ();
   1392  1.1  christos 
   1393  1.1  christos   if (! bfd_set_section_flags (dynobj, htab->srelgot, SEC_ALLOC
   1394  1.1  christos                                | SEC_LOAD
   1395  1.1  christos                                | SEC_HAS_CONTENTS
   1396  1.1  christos                                | SEC_IN_MEMORY
   1397  1.1  christos                                | SEC_LINKER_CREATED
   1398  1.1  christos                                | SEC_READONLY)
   1399  1.1  christos       || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
   1400  1.1  christos     return FALSE;
   1401  1.1  christos 
   1402  1.1  christos   return TRUE;
   1403  1.1  christos }
   1404  1.1  christos 
   1405  1.1  christos /* Look through the relocs for a section during the first phase.  */
   1406  1.1  christos 
   1407  1.1  christos static bfd_boolean
   1408  1.1  christos or1k_elf_check_relocs (bfd *abfd,
   1409  1.1  christos 		       struct bfd_link_info *info,
   1410  1.1  christos 		       asection *sec,
   1411  1.1  christos 		       const Elf_Internal_Rela *relocs)
   1412  1.1  christos {
   1413  1.1  christos   Elf_Internal_Shdr *symtab_hdr;
   1414  1.1  christos   struct elf_link_hash_entry **sym_hashes;
   1415  1.1  christos   const Elf_Internal_Rela *rel;
   1416  1.1  christos 
   1417  1.1  christos   const Elf_Internal_Rela *rel_end;
   1418  1.1  christos   struct elf_or1k_link_hash_table *htab;
   1419  1.1  christos   bfd *dynobj;
   1420  1.1  christos   asection *sreloc = NULL;
   1421  1.1  christos 
   1422  1.1  christos   if (info->relocatable)
   1423  1.1  christos     return TRUE;
   1424  1.1  christos 
   1425  1.1  christos   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1426  1.1  christos   sym_hashes = elf_sym_hashes (abfd);
   1427  1.1  christos 
   1428  1.1  christos   htab = or1k_elf_hash_table (info);
   1429  1.1  christos   if (htab == NULL)
   1430  1.1  christos     return FALSE;
   1431  1.1  christos 
   1432  1.1  christos   dynobj = htab->root.dynobj;
   1433  1.1  christos 
   1434  1.1  christos   rel_end = relocs + sec->reloc_count;
   1435  1.1  christos   for (rel = relocs; rel < rel_end; rel++)
   1436  1.1  christos     {
   1437  1.1  christos       struct elf_link_hash_entry *h;
   1438  1.1  christos       unsigned long r_symndx;
   1439  1.1  christos       unsigned char tls_type;
   1440  1.1  christos 
   1441  1.1  christos       r_symndx = ELF32_R_SYM (rel->r_info);
   1442  1.1  christos       if (r_symndx < symtab_hdr->sh_info)
   1443  1.1  christos         h = NULL;
   1444  1.1  christos       else
   1445  1.1  christos         {
   1446  1.1  christos           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1447  1.1  christos           while (h->root.type == bfd_link_hash_indirect
   1448  1.1  christos                  || h->root.type == bfd_link_hash_warning)
   1449  1.1  christos             h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1450  1.1  christos 
   1451  1.1  christos           /* PR15323, ref flags aren't set for references in the same
   1452  1.1  christos              object.  */
   1453  1.1  christos           h->root.non_ir_ref = 1;
   1454  1.1  christos         }
   1455  1.1  christos 
   1456  1.1  christos       switch (ELF32_R_TYPE (rel->r_info))
   1457  1.1  christos         {
   1458  1.1  christos         case R_OR1K_TLS_GD_HI16:
   1459  1.1  christos         case R_OR1K_TLS_GD_LO16:
   1460  1.1  christos           tls_type = TLS_GD;
   1461  1.1  christos           break;
   1462  1.1  christos         case R_OR1K_TLS_LDM_HI16:
   1463  1.1  christos         case R_OR1K_TLS_LDM_LO16:
   1464  1.1  christos         case R_OR1K_TLS_LDO_HI16:
   1465  1.1  christos         case R_OR1K_TLS_LDO_LO16:
   1466  1.1  christos           tls_type = TLS_LD;
   1467  1.1  christos           break;
   1468  1.1  christos         case R_OR1K_TLS_IE_HI16:
   1469  1.1  christos         case R_OR1K_TLS_IE_LO16:
   1470  1.1  christos           tls_type = TLS_IE;
   1471  1.1  christos           break;
   1472  1.1  christos         case R_OR1K_TLS_LE_HI16:
   1473  1.1  christos         case R_OR1K_TLS_LE_LO16:
   1474  1.1  christos           tls_type = TLS_LE;
   1475  1.1  christos           break;
   1476  1.1  christos         default:
   1477  1.1  christos           tls_type = TLS_NONE;
   1478  1.1  christos         }
   1479  1.1  christos 
   1480  1.1  christos       /* Record TLS type.  */
   1481  1.1  christos       if (h != NULL)
   1482  1.1  christos           ((struct elf_or1k_link_hash_entry *) h)->tls_type = tls_type;
   1483  1.1  christos       else
   1484  1.1  christos         {
   1485  1.1  christos           unsigned char *local_tls_type;
   1486  1.1  christos 
   1487  1.1  christos           /* This is a TLS type record for a local symbol.  */
   1488  1.1  christos           local_tls_type = (unsigned char *) elf_or1k_local_tls_type (abfd);
   1489  1.1  christos           if (local_tls_type == NULL)
   1490  1.1  christos             {
   1491  1.1  christos               bfd_size_type size;
   1492  1.1  christos 
   1493  1.1  christos               size = symtab_hdr->sh_info;
   1494  1.1  christos               local_tls_type = bfd_zalloc (abfd, size);
   1495  1.1  christos               if (local_tls_type == NULL)
   1496  1.1  christos                 return FALSE;
   1497  1.1  christos               elf_or1k_local_tls_type (abfd) = local_tls_type;
   1498  1.1  christos             }
   1499  1.1  christos           local_tls_type[r_symndx] = tls_type;
   1500  1.1  christos         }
   1501  1.1  christos 
   1502  1.1  christos       switch (ELF32_R_TYPE (rel->r_info))
   1503  1.1  christos         {
   1504  1.1  christos           /* This relocation describes the C++ object vtable hierarchy.
   1505  1.1  christos              Reconstruct it for later use during GC.  */
   1506  1.1  christos         case R_OR1K_GNU_VTINHERIT:
   1507  1.1  christos           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   1508  1.1  christos             return FALSE;
   1509  1.1  christos           break;
   1510  1.1  christos 
   1511  1.1  christos           /* This relocation describes which C++ vtable entries are actually
   1512  1.1  christos              used.  Record for later use during GC.  */
   1513  1.1  christos         case R_OR1K_GNU_VTENTRY:
   1514  1.1  christos           BFD_ASSERT (h != NULL);
   1515  1.1  christos           if (h != NULL
   1516  1.1  christos               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   1517  1.1  christos             return FALSE;
   1518  1.1  christos           break;
   1519  1.1  christos 
   1520  1.1  christos           /* This relocation requires .plt entry.  */
   1521  1.1  christos         case R_OR1K_PLT26:
   1522  1.1  christos           if (h != NULL)
   1523  1.1  christos             {
   1524  1.1  christos               h->needs_plt = 1;
   1525  1.1  christos               h->plt.refcount += 1;
   1526  1.1  christos             }
   1527  1.1  christos           break;
   1528  1.1  christos 
   1529  1.1  christos         case R_OR1K_GOT16:
   1530  1.1  christos         case R_OR1K_GOTOFF_HI16:
   1531  1.1  christos         case R_OR1K_GOTOFF_LO16:
   1532  1.1  christos         case R_OR1K_TLS_GD_HI16:
   1533  1.1  christos         case R_OR1K_TLS_GD_LO16:
   1534  1.1  christos         case R_OR1K_TLS_IE_HI16:
   1535  1.1  christos         case R_OR1K_TLS_IE_LO16:
   1536  1.1  christos           if (htab->sgot == NULL)
   1537  1.1  christos             {
   1538  1.1  christos               if (dynobj == NULL)
   1539  1.1  christos                 htab->root.dynobj = dynobj = abfd;
   1540  1.1  christos               if (! create_got_section (dynobj, info))
   1541  1.1  christos                 return FALSE;
   1542  1.1  christos             }
   1543  1.1  christos 
   1544  1.1  christos           if (ELF32_R_TYPE (rel->r_info) != R_OR1K_GOTOFF_HI16 &&
   1545  1.1  christos               ELF32_R_TYPE (rel->r_info) != R_OR1K_GOTOFF_LO16)
   1546  1.1  christos             {
   1547  1.1  christos               if (h != NULL)
   1548  1.1  christos                 h->got.refcount += 1;
   1549  1.1  christos               else
   1550  1.1  christos                 {
   1551  1.1  christos                   bfd_signed_vma *local_got_refcounts;
   1552  1.1  christos 
   1553  1.1  christos                   /* This is a global offset table entry for a local symbol.  */
   1554  1.1  christos                   local_got_refcounts = elf_local_got_refcounts (abfd);
   1555  1.1  christos                   if (local_got_refcounts == NULL)
   1556  1.1  christos                     {
   1557  1.1  christos                       bfd_size_type size;
   1558  1.1  christos 
   1559  1.1  christos                       size = symtab_hdr->sh_info;
   1560  1.1  christos                       size *= sizeof (bfd_signed_vma);
   1561  1.1  christos                       local_got_refcounts = bfd_zalloc (abfd, size);
   1562  1.1  christos                       if (local_got_refcounts == NULL)
   1563  1.1  christos                         return FALSE;
   1564  1.1  christos                       elf_local_got_refcounts (abfd) = local_got_refcounts;
   1565  1.1  christos                     }
   1566  1.1  christos                   local_got_refcounts[r_symndx] += 1;
   1567  1.1  christos                 }
   1568  1.1  christos             }
   1569  1.1  christos           break;
   1570  1.1  christos 
   1571  1.1  christos         case R_OR1K_INSN_REL_26:
   1572  1.1  christos         case R_OR1K_HI_16_IN_INSN:
   1573  1.1  christos         case R_OR1K_LO_16_IN_INSN:
   1574  1.1  christos         case R_OR1K_32:
   1575  1.1  christos           /* R_OR1K_16? */
   1576  1.1  christos           {
   1577  1.1  christos             if (h != NULL && !info->shared)
   1578  1.1  christos               {
   1579  1.1  christos                 /* We may need a copy reloc.  */
   1580  1.1  christos                 h->non_got_ref = 1;
   1581  1.1  christos 
   1582  1.1  christos                 /* We may also need a .plt entry.  */
   1583  1.1  christos                 h->plt.refcount += 1;
   1584  1.1  christos                 if (ELF32_R_TYPE (rel->r_info) != R_OR1K_INSN_REL_26)
   1585  1.1  christos                   h->pointer_equality_needed = 1;
   1586  1.1  christos               }
   1587  1.1  christos 
   1588  1.1  christos             /* If we are creating a shared library, and this is a reloc
   1589  1.1  christos                against a global symbol, or a non PC relative reloc
   1590  1.1  christos                against a local symbol, then we need to copy the reloc
   1591  1.1  christos                into the shared library.  However, if we are linking with
   1592  1.1  christos                -Bsymbolic, we do not need to copy a reloc against a
   1593  1.1  christos                global symbol which is defined in an object we are
   1594  1.1  christos                including in the link (i.e., DEF_REGULAR is set).  At
   1595  1.1  christos                this point we have not seen all the input files, so it is
   1596  1.1  christos                possible that DEF_REGULAR is not set now but will be set
   1597  1.1  christos                later (it is never cleared).  In case of a weak definition,
   1598  1.1  christos                DEF_REGULAR may be cleared later by a strong definition in
   1599  1.1  christos                a shared library.  We account for that possibility below by
   1600  1.1  christos                storing information in the relocs_copied field of the hash
   1601  1.1  christos                table entry.  A similar situation occurs when creating
   1602  1.1  christos                shared libraries and symbol visibility changes render the
   1603  1.1  christos                symbol local.
   1604  1.1  christos 
   1605  1.1  christos                If on the other hand, we are creating an executable, we
   1606  1.1  christos                may need to keep relocations for symbols satisfied by a
   1607  1.1  christos                dynamic library if we manage to avoid copy relocs for the
   1608  1.1  christos                symbol.  */
   1609  1.1  christos 
   1610  1.1  christos             if ((info->shared
   1611  1.1  christos                  && (sec->flags & SEC_ALLOC) != 0
   1612  1.1  christos                  && (ELF32_R_TYPE (rel->r_info) != R_OR1K_INSN_REL_26
   1613  1.1  christos                      || (h != NULL
   1614  1.1  christos                          && (!SYMBOLIC_BIND (info, h)
   1615  1.1  christos                              || h->root.type == bfd_link_hash_defweak
   1616  1.1  christos                              || !h->def_regular))))
   1617  1.1  christos                 || (!info->shared
   1618  1.1  christos                     && (sec->flags & SEC_ALLOC) != 0
   1619  1.1  christos                     && h != NULL
   1620  1.1  christos                     && (h->root.type == bfd_link_hash_defweak
   1621  1.1  christos                         || !h->def_regular)))
   1622  1.1  christos               {
   1623  1.1  christos                 struct elf_or1k_dyn_relocs *p;
   1624  1.1  christos                 struct elf_or1k_dyn_relocs **head;
   1625  1.1  christos 
   1626  1.1  christos                 /* When creating a shared object, we must copy these
   1627  1.1  christos                    relocs into the output file.  We create a reloc
   1628  1.1  christos                    section in dynobj and make room for the reloc.  */
   1629  1.1  christos                 if (sreloc == NULL)
   1630  1.1  christos                   {
   1631  1.1  christos                     const char *name;
   1632  1.1  christos                     unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
   1633  1.1  christos                     unsigned int shnam = _bfd_elf_single_rel_hdr (sec)->sh_name;
   1634  1.1  christos 
   1635  1.1  christos                     name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
   1636  1.1  christos                     if (name == NULL)
   1637  1.1  christos                       return FALSE;
   1638  1.1  christos 
   1639  1.1  christos                     if (strncmp (name, ".rela", 5) != 0
   1640  1.1  christos                         || strcmp (bfd_get_section_name (abfd, sec),
   1641  1.1  christos                                    name + 5) != 0)
   1642  1.1  christos                       {
   1643  1.1  christos                         (*_bfd_error_handler)
   1644  1.1  christos                           (_("%B: bad relocation section name `%s\'"),
   1645  1.1  christos                            abfd, name);
   1646  1.1  christos                       }
   1647  1.1  christos 
   1648  1.1  christos                     if (htab->root.dynobj == NULL)
   1649  1.1  christos                       htab->root.dynobj = abfd;
   1650  1.1  christos                     dynobj = htab->root.dynobj;
   1651  1.1  christos 
   1652  1.1  christos                     sreloc = bfd_get_section_by_name (dynobj, name);
   1653  1.1  christos                     if (sreloc == NULL)
   1654  1.1  christos                       {
   1655  1.1  christos                         sreloc = _bfd_elf_make_dynamic_reloc_section
   1656  1.1  christos                           (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
   1657  1.1  christos 
   1658  1.1  christos                         if (sreloc == NULL)
   1659  1.1  christos                           return FALSE;
   1660  1.1  christos                       }
   1661  1.1  christos                     elf_section_data (sec)->sreloc = sreloc;
   1662  1.1  christos                   }
   1663  1.1  christos 
   1664  1.1  christos                 /* If this is a global symbol, we count the number of
   1665  1.1  christos                    relocations we need for this symbol.  */
   1666  1.1  christos                 if (h != NULL)
   1667  1.1  christos                   head = &((struct elf_or1k_link_hash_entry *) h)->dyn_relocs;
   1668  1.1  christos                 else
   1669  1.1  christos                   {
   1670  1.1  christos                     /* Track dynamic relocs needed for local syms too.
   1671  1.1  christos                        We really need local syms available to do this
   1672  1.1  christos                        easily.  Oh well.  */
   1673  1.1  christos 
   1674  1.1  christos                     asection *s;
   1675  1.1  christos                     Elf_Internal_Sym *isym;
   1676  1.1  christos                     void *vpp;
   1677  1.1  christos 
   1678  1.1  christos                     isym = bfd_sym_from_r_symndx (&htab->sym_sec,
   1679  1.1  christos                                                   abfd, r_symndx);
   1680  1.1  christos                     if (isym == NULL)
   1681  1.1  christos                       return FALSE;
   1682  1.1  christos 
   1683  1.1  christos                     s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   1684  1.1  christos                     if (s == NULL)
   1685  1.1  christos                       return FALSE;
   1686  1.1  christos 
   1687  1.1  christos                     vpp = &elf_section_data (s)->local_dynrel;
   1688  1.1  christos                     head = (struct elf_or1k_dyn_relocs **) vpp;
   1689  1.1  christos                   }
   1690  1.1  christos 
   1691  1.1  christos                 p = *head;
   1692  1.1  christos                 if (p == NULL || p->sec != sec)
   1693  1.1  christos                   {
   1694  1.1  christos                     bfd_size_type amt = sizeof *p;
   1695  1.1  christos                     p = ((struct elf_or1k_dyn_relocs *)
   1696  1.1  christos                          bfd_alloc (htab->root.dynobj, amt));
   1697  1.1  christos                     if (p == NULL)
   1698  1.1  christos                       return FALSE;
   1699  1.1  christos                     p->next = *head;
   1700  1.1  christos                     *head = p;
   1701  1.1  christos                     p->sec = sec;
   1702  1.1  christos                     p->count = 0;
   1703  1.1  christos                     p->pc_count = 0;
   1704  1.1  christos                   }
   1705  1.1  christos 
   1706  1.1  christos                 p->count += 1;
   1707  1.1  christos                 if (ELF32_R_TYPE (rel->r_info) == R_OR1K_INSN_REL_26)
   1708  1.1  christos                   p->pc_count += 1;
   1709  1.1  christos               }
   1710  1.1  christos           }
   1711  1.1  christos           break;
   1712  1.1  christos         }
   1713  1.1  christos     }
   1714  1.1  christos 
   1715  1.1  christos   return TRUE;
   1716  1.1  christos }
   1717  1.1  christos 
   1718  1.1  christos /* Finish up the dynamic sections.  */
   1719  1.1  christos 
   1720  1.1  christos static bfd_boolean
   1721  1.1  christos or1k_elf_finish_dynamic_sections (bfd *output_bfd,
   1722  1.1  christos                                   struct bfd_link_info *info)
   1723  1.1  christos {
   1724  1.1  christos   bfd *dynobj;
   1725  1.1  christos   asection *sdyn, *sgot;
   1726  1.1  christos   struct elf_or1k_link_hash_table *htab;
   1727  1.1  christos 
   1728  1.1  christos   htab = or1k_elf_hash_table (info);
   1729  1.1  christos   if (htab == NULL)
   1730  1.1  christos     return FALSE;
   1731  1.1  christos 
   1732  1.1  christos   dynobj = htab->root.dynobj;
   1733  1.1  christos 
   1734  1.1  christos   sgot = htab->sgotplt;
   1735  1.1  christos   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
   1736  1.1  christos 
   1737  1.1  christos   if (htab->root.dynamic_sections_created)
   1738  1.1  christos     {
   1739  1.1  christos       asection *splt;
   1740  1.1  christos       Elf32_External_Dyn *dyncon, *dynconend;
   1741  1.1  christos 
   1742  1.1  christos       BFD_ASSERT (sgot != NULL && sdyn != NULL);
   1743  1.1  christos 
   1744  1.1  christos       dyncon = (Elf32_External_Dyn *) sdyn->contents;
   1745  1.1  christos       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
   1746  1.1  christos 
   1747  1.1  christos       for (; dyncon < dynconend; dyncon++)
   1748  1.1  christos         {
   1749  1.1  christos           Elf_Internal_Dyn dyn;
   1750  1.1  christos           asection *s;
   1751  1.1  christos 
   1752  1.1  christos           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
   1753  1.1  christos 
   1754  1.1  christos           switch (dyn.d_tag)
   1755  1.1  christos             {
   1756  1.1  christos             default:
   1757  1.1  christos               continue;
   1758  1.1  christos 
   1759  1.1  christos             case DT_PLTGOT:
   1760  1.1  christos               s = htab->sgot->output_section;
   1761  1.1  christos               BFD_ASSERT (s != NULL);
   1762  1.1  christos               dyn.d_un.d_ptr = s->vma;
   1763  1.1  christos               break;
   1764  1.1  christos 
   1765  1.1  christos             case DT_JMPREL:
   1766  1.1  christos               s = htab->srelplt->output_section;
   1767  1.1  christos               BFD_ASSERT (s != NULL);
   1768  1.1  christos               dyn.d_un.d_ptr = s->vma;
   1769  1.1  christos               break;
   1770  1.1  christos 
   1771  1.1  christos             case DT_PLTRELSZ:
   1772  1.1  christos               s = htab->srelplt->output_section;
   1773  1.1  christos               BFD_ASSERT (s != NULL);
   1774  1.1  christos               dyn.d_un.d_val = s->size;
   1775  1.1  christos               break;
   1776  1.1  christos 
   1777  1.1  christos             case DT_RELASZ:
   1778  1.1  christos               /* My reading of the SVR4 ABI indicates that the
   1779  1.1  christos                  procedure linkage table relocs (DT_JMPREL) should be
   1780  1.1  christos                  included in the overall relocs (DT_RELA).  This is
   1781  1.1  christos                  what Solaris does.  However, UnixWare can not handle
   1782  1.1  christos                  that case.  Therefore, we override the DT_RELASZ entry
   1783  1.1  christos                  here to make it not include the JMPREL relocs.  Since
   1784  1.1  christos                  the linker script arranges for .rela.plt to follow all
   1785  1.1  christos                  other relocation sections, we don't have to worry
   1786  1.1  christos                  about changing the DT_RELA entry.  */
   1787  1.1  christos               if (htab->srelplt != NULL)
   1788  1.1  christos                 {
   1789  1.1  christos                   /* FIXME: this calculation sometimes produces
   1790  1.1  christos                      wrong result, the problem is that the dyn.d_un.d_val
   1791  1.1  christos                      is not always correct, needs investigation why
   1792  1.1  christos                      that happens. In the meantime, reading the
   1793  1.1  christos                      ".rela.dyn" section by name seems to yield
   1794  1.1  christos                      correct result.
   1795  1.1  christos 
   1796  1.1  christos                   s = htab->srelplt->output_section;
   1797  1.1  christos                   dyn.d_un.d_val -= s->size;
   1798  1.1  christos                   */
   1799  1.1  christos 
   1800  1.1  christos                   s = bfd_get_section_by_name (output_bfd, ".rela.dyn");
   1801  1.1  christos                   dyn.d_un.d_val = s ? s->size : 0;
   1802  1.1  christos                 }
   1803  1.1  christos               break;
   1804  1.1  christos             }
   1805  1.1  christos           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
   1806  1.1  christos         }
   1807  1.1  christos 
   1808  1.1  christos 
   1809  1.1  christos       /* Fill in the first entry in the procedure linkage table.  */
   1810  1.1  christos       splt = htab->splt;
   1811  1.1  christos       if (splt && splt->size > 0)
   1812  1.1  christos         {
   1813  1.1  christos           if (info->shared)
   1814  1.1  christos             {
   1815  1.1  christos               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD0,
   1816  1.1  christos                           splt->contents);
   1817  1.1  christos               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD1,
   1818  1.1  christos                           splt->contents + 4);
   1819  1.1  christos               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD2,
   1820  1.1  christos                           splt->contents + 8);
   1821  1.1  christos               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD3,
   1822  1.1  christos                           splt->contents + 12);
   1823  1.1  christos               bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD4,
   1824  1.1  christos                           splt->contents + 16);
   1825  1.1  christos             }
   1826  1.1  christos           else
   1827  1.1  christos             {
   1828  1.1  christos               unsigned long addr;
   1829  1.1  christos               /* addr = .got + 4 */
   1830  1.1  christos               addr = sgot->output_section->vma + sgot->output_offset + 4;
   1831  1.1  christos               bfd_put_32 (output_bfd,
   1832  1.1  christos                           PLT0_ENTRY_WORD0 | ((addr >> 16) & 0xffff),
   1833  1.1  christos                           splt->contents);
   1834  1.1  christos               bfd_put_32 (output_bfd,
   1835  1.1  christos                           PLT0_ENTRY_WORD1 | (addr & 0xffff),
   1836  1.1  christos                           splt->contents + 4);
   1837  1.1  christos               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD2, splt->contents + 8);
   1838  1.1  christos               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD3, splt->contents + 12);
   1839  1.1  christos               bfd_put_32 (output_bfd, PLT0_ENTRY_WORD4, splt->contents + 16);
   1840  1.1  christos             }
   1841  1.1  christos 
   1842  1.1  christos           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
   1843  1.1  christos         }
   1844  1.1  christos     }
   1845  1.1  christos 
   1846  1.1  christos   /* Set the first entry in the global offset table to the address of
   1847  1.1  christos      the dynamic section.  */
   1848  1.1  christos   if (sgot && sgot->size > 0)
   1849  1.1  christos     {
   1850  1.1  christos       if (sdyn == NULL)
   1851  1.1  christos         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
   1852  1.1  christos       else
   1853  1.1  christos         bfd_put_32 (output_bfd,
   1854  1.1  christos                     sdyn->output_section->vma + sdyn->output_offset,
   1855  1.1  christos                     sgot->contents);
   1856  1.1  christos       elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
   1857  1.1  christos     }
   1858  1.1  christos 
   1859  1.1  christos   if (htab->sgot && htab->sgot->size > 0)
   1860  1.1  christos     elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
   1861  1.1  christos 
   1862  1.1  christos   return TRUE;
   1863  1.1  christos }
   1864  1.1  christos 
   1865  1.1  christos /* Finish up dynamic symbol handling.  We set the contents of various
   1866  1.1  christos    dynamic sections here.  */
   1867  1.1  christos 
   1868  1.1  christos static bfd_boolean
   1869  1.1  christos or1k_elf_finish_dynamic_symbol (bfd *output_bfd,
   1870  1.1  christos                                 struct bfd_link_info *info,
   1871  1.1  christos                                 struct elf_link_hash_entry *h,
   1872  1.1  christos                                 Elf_Internal_Sym *sym)
   1873  1.1  christos {
   1874  1.1  christos   struct elf_or1k_link_hash_table *htab;
   1875  1.1  christos   bfd_byte *loc;
   1876  1.1  christos 
   1877  1.1  christos   htab = or1k_elf_hash_table (info);
   1878  1.1  christos   if (htab == NULL)
   1879  1.1  christos     return FALSE;
   1880  1.1  christos 
   1881  1.1  christos   if (h->plt.offset != (bfd_vma) -1)
   1882  1.1  christos     {
   1883  1.1  christos       asection *splt;
   1884  1.1  christos       asection *sgot;
   1885  1.1  christos       asection *srela;
   1886  1.1  christos 
   1887  1.1  christos       bfd_vma plt_index;
   1888  1.1  christos       bfd_vma got_offset;
   1889  1.1  christos       bfd_vma got_addr;
   1890  1.1  christos       Elf_Internal_Rela rela;
   1891  1.1  christos 
   1892  1.1  christos       /* This symbol has an entry in the procedure linkage table.  Set
   1893  1.1  christos          it up.  */
   1894  1.1  christos       BFD_ASSERT (h->dynindx != -1);
   1895  1.1  christos 
   1896  1.1  christos       splt = htab->splt;
   1897  1.1  christos       sgot = htab->sgotplt;
   1898  1.1  christos       srela = htab->srelplt;
   1899  1.1  christos       BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
   1900  1.1  christos 
   1901  1.1  christos       /* Get the index in the procedure linkage table which
   1902  1.1  christos          corresponds to this symbol.  This is the index of this symbol
   1903  1.1  christos          in all the symbols for which we are making plt entries.  The
   1904  1.1  christos          first entry in the procedure linkage table is reserved.  */
   1905  1.1  christos       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
   1906  1.1  christos 
   1907  1.1  christos       /* Get the offset into the .got table of the entry that
   1908  1.1  christos         corresponds to this function.  Each .got entry is 4 bytes.
   1909  1.1  christos         The first three are reserved.  */
   1910  1.1  christos       got_offset = (plt_index + 3) * 4;
   1911  1.1  christos       got_addr = got_offset;
   1912  1.1  christos 
   1913  1.1  christos       /* Fill in the entry in the procedure linkage table.  */
   1914  1.1  christos       if (! info->shared)
   1915  1.1  christos         {
   1916  1.1  christos           got_addr += htab->sgotplt->output_section->vma
   1917  1.1  christos             + htab->sgotplt->output_offset;
   1918  1.1  christos           bfd_put_32 (output_bfd, PLT_ENTRY_WORD0 | ((got_addr >> 16) & 0xffff),
   1919  1.1  christos                       splt->contents + h->plt.offset);
   1920  1.1  christos           bfd_put_32 (output_bfd, PLT_ENTRY_WORD1 | (got_addr & 0xffff),
   1921  1.1  christos                       splt->contents + h->plt.offset + 4);
   1922  1.1  christos           bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD2,
   1923  1.1  christos                       splt->contents + h->plt.offset + 8);
   1924  1.1  christos           bfd_put_32 (output_bfd, (bfd_vma) PLT_ENTRY_WORD3,
   1925  1.1  christos                       splt->contents + h->plt.offset + 12);
   1926  1.1  christos           bfd_put_32 (output_bfd, PLT_ENTRY_WORD4
   1927  1.1  christos                       | plt_index * sizeof (Elf32_External_Rela),
   1928  1.1  christos                       splt->contents + h->plt.offset + 16);
   1929  1.1  christos         }
   1930  1.1  christos       else
   1931  1.1  christos         {
   1932  1.1  christos           bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD0 | (got_addr & 0xffff),
   1933  1.1  christos                       splt->contents + h->plt.offset);
   1934  1.1  christos           bfd_put_32 (output_bfd, PLT_PIC_ENTRY_WORD1
   1935  1.1  christos                       | plt_index * sizeof (Elf32_External_Rela),
   1936  1.1  christos                       splt->contents + h->plt.offset + 4);
   1937  1.1  christos           bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD2,
   1938  1.1  christos                       splt->contents + h->plt.offset + 8);
   1939  1.1  christos           bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD3,
   1940  1.1  christos                       splt->contents + h->plt.offset + 12);
   1941  1.1  christos           bfd_put_32 (output_bfd, (bfd_vma) PLT_PIC_ENTRY_WORD4,
   1942  1.1  christos                       splt->contents + h->plt.offset + 16);
   1943  1.1  christos         }
   1944  1.1  christos 
   1945  1.1  christos       /* Fill in the entry in the global offset table.  */
   1946  1.1  christos       bfd_put_32 (output_bfd,
   1947  1.1  christos                   (splt->output_section->vma
   1948  1.1  christos                    + splt->output_offset), /* Same offset.  */
   1949  1.1  christos                   sgot->contents + got_offset);
   1950  1.1  christos 
   1951  1.1  christos       /* Fill in the entry in the .rela.plt section.  */
   1952  1.1  christos       rela.r_offset = (sgot->output_section->vma
   1953  1.1  christos                        + sgot->output_offset
   1954  1.1  christos                        + got_offset);
   1955  1.1  christos       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_JMP_SLOT);
   1956  1.1  christos       rela.r_addend = 0;
   1957  1.1  christos       loc = srela->contents;
   1958  1.1  christos       loc += plt_index * sizeof (Elf32_External_Rela);
   1959  1.1  christos       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   1960  1.1  christos 
   1961  1.1  christos       if (!h->def_regular)
   1962  1.1  christos         {
   1963  1.1  christos           /* Mark the symbol as undefined, rather than as defined in
   1964  1.1  christos              the .plt section.  Leave the value alone.  */
   1965  1.1  christos           sym->st_shndx = SHN_UNDEF;
   1966  1.1  christos         }
   1967  1.1  christos 
   1968  1.1  christos     }
   1969  1.1  christos 
   1970  1.1  christos   if (h->got.offset != (bfd_vma) -1
   1971  1.1  christos       && (h->got.offset & 2) == 0) /* Homemade TLS check.  */
   1972  1.1  christos     {
   1973  1.1  christos       asection *sgot;
   1974  1.1  christos       asection *srela;
   1975  1.1  christos       Elf_Internal_Rela rela;
   1976  1.1  christos 
   1977  1.1  christos       /* This symbol has an entry in the global offset table.  Set it
   1978  1.1  christos          up.  */
   1979  1.1  christos       sgot = htab->sgot;
   1980  1.1  christos       srela = htab->srelgot;
   1981  1.1  christos       BFD_ASSERT (sgot != NULL && srela != NULL);
   1982  1.1  christos 
   1983  1.1  christos       rela.r_offset = (sgot->output_section->vma
   1984  1.1  christos                        + sgot->output_offset
   1985  1.1  christos                        + (h->got.offset &~ 1));
   1986  1.1  christos 
   1987  1.1  christos       /* If this is a -Bsymbolic link, and the symbol is defined
   1988  1.1  christos          locally, we just want to emit a RELATIVE reloc.  Likewise if
   1989  1.1  christos          the symbol was forced to be local because of a version file.
   1990  1.1  christos          The entry in the global offset table will already have been
   1991  1.1  christos          initialized in the relocate_section function.  */
   1992  1.1  christos       if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h))
   1993  1.1  christos         {
   1994  1.1  christos           rela.r_info = ELF32_R_INFO (0, R_OR1K_RELATIVE);
   1995  1.1  christos           rela.r_addend = (h->root.u.def.value
   1996  1.1  christos                            + h->root.u.def.section->output_section->vma
   1997  1.1  christos                            + h->root.u.def.section->output_offset);
   1998  1.1  christos         }
   1999  1.1  christos       else
   2000  1.1  christos         {
   2001  1.1  christos           BFD_ASSERT ((h->got.offset & 1) == 0);
   2002  1.1  christos           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
   2003  1.1  christos           rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_GLOB_DAT);
   2004  1.1  christos           rela.r_addend = 0;
   2005  1.1  christos         }
   2006  1.1  christos 
   2007  1.1  christos       loc = srela->contents;
   2008  1.1  christos       loc += srela->reloc_count * sizeof (Elf32_External_Rela);
   2009  1.1  christos       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   2010  1.1  christos       ++srela->reloc_count;
   2011  1.1  christos     }
   2012  1.1  christos 
   2013  1.1  christos   if (h->needs_copy)
   2014  1.1  christos     {
   2015  1.1  christos       asection *s;
   2016  1.1  christos       Elf_Internal_Rela rela;
   2017  1.1  christos 
   2018  1.1  christos       /* This symbols needs a copy reloc.  Set it up.  */
   2019  1.1  christos       BFD_ASSERT (h->dynindx != -1
   2020  1.1  christos                   && (h->root.type == bfd_link_hash_defined
   2021  1.1  christos                       || h->root.type == bfd_link_hash_defweak));
   2022  1.1  christos 
   2023  1.1  christos       s = bfd_get_section_by_name (h->root.u.def.section->owner,
   2024  1.1  christos                                    ".rela.bss");
   2025  1.1  christos       BFD_ASSERT (s != NULL);
   2026  1.1  christos 
   2027  1.1  christos       rela.r_offset = (h->root.u.def.value
   2028  1.1  christos                        + h->root.u.def.section->output_section->vma
   2029  1.1  christos                        + h->root.u.def.section->output_offset);
   2030  1.1  christos       rela.r_info = ELF32_R_INFO (h->dynindx, R_OR1K_COPY);
   2031  1.1  christos       rela.r_addend = 0;
   2032  1.1  christos       loc = s->contents;
   2033  1.1  christos       loc += s->reloc_count * sizeof (Elf32_External_Rela);
   2034  1.1  christos       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
   2035  1.1  christos       ++s->reloc_count;
   2036  1.1  christos     }
   2037  1.1  christos 
   2038  1.1  christos   /* Mark some specially defined symbols as absolute.  */
   2039  1.1  christos   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
   2040  1.1  christos       || h == htab->root.hgot)
   2041  1.1  christos     sym->st_shndx = SHN_ABS;
   2042  1.1  christos 
   2043  1.1  christos   return TRUE;
   2044  1.1  christos }
   2045  1.1  christos 
   2046  1.1  christos static enum elf_reloc_type_class
   2047  1.1  christos or1k_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2048  1.1  christos                            const asection *rel_sec ATTRIBUTE_UNUSED,
   2049  1.1  christos                            const Elf_Internal_Rela *rela)
   2050  1.1  christos {
   2051  1.1  christos   switch ((int) ELF32_R_TYPE (rela->r_info))
   2052  1.1  christos     {
   2053  1.1  christos     case R_OR1K_RELATIVE:  return reloc_class_relative;
   2054  1.1  christos     case R_OR1K_JMP_SLOT:  return reloc_class_plt;
   2055  1.1  christos     case R_OR1K_COPY:      return reloc_class_copy;
   2056  1.1  christos     default:               return reloc_class_normal;
   2057  1.1  christos     }
   2058  1.1  christos }
   2059  1.1  christos 
   2060  1.1  christos /* Adjust a symbol defined by a dynamic object and referenced by a
   2061  1.1  christos    regular object.  The current definition is in some section of the
   2062  1.1  christos    dynamic object, but we're not including those sections.  We have to
   2063  1.1  christos    change the definition to something the rest of the link can
   2064  1.1  christos    understand.  */
   2065  1.1  christos 
   2066  1.1  christos static bfd_boolean
   2067  1.1  christos or1k_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   2068  1.1  christos                                 struct elf_link_hash_entry *h)
   2069  1.1  christos {
   2070  1.1  christos   struct elf_or1k_link_hash_table *htab;
   2071  1.1  christos   struct elf_or1k_link_hash_entry *eh;
   2072  1.1  christos   struct elf_or1k_dyn_relocs *p;
   2073  1.1  christos   bfd *dynobj;
   2074  1.1  christos   asection *s;
   2075  1.1  christos 
   2076  1.1  christos   dynobj = elf_hash_table (info)->dynobj;
   2077  1.1  christos 
   2078  1.1  christos   /* Make sure we know what is going on here.  */
   2079  1.1  christos   BFD_ASSERT (dynobj != NULL
   2080  1.1  christos               && (h->needs_plt
   2081  1.1  christos                   || h->u.weakdef != NULL
   2082  1.1  christos                   || (h->def_dynamic
   2083  1.1  christos                       && h->ref_regular
   2084  1.1  christos                       && !h->def_regular)));
   2085  1.1  christos 
   2086  1.1  christos   /* If this is a function, put it in the procedure linkage table.  We
   2087  1.1  christos      will fill in the contents of the procedure linkage table later,
   2088  1.1  christos      when we know the address of the .got section.  */
   2089  1.1  christos   if (h->type == STT_FUNC
   2090  1.1  christos       || h->needs_plt)
   2091  1.1  christos     {
   2092  1.1  christos       if (! info->shared
   2093  1.1  christos           && !h->def_dynamic
   2094  1.1  christos           && !h->ref_dynamic
   2095  1.1  christos           && h->root.type != bfd_link_hash_undefweak
   2096  1.1  christos           && h->root.type != bfd_link_hash_undefined)
   2097  1.1  christos         {
   2098  1.1  christos           /* This case can occur if we saw a PLT reloc in an input
   2099  1.1  christos              file, but the symbol was never referred to by a dynamic
   2100  1.1  christos              object.  In such a case, we don't actually need to build
   2101  1.1  christos              a procedure linkage table, and we can just do a PCREL
   2102  1.1  christos              reloc instead.  */
   2103  1.1  christos           h->plt.offset = (bfd_vma) -1;
   2104  1.1  christos           h->needs_plt = 0;
   2105  1.1  christos         }
   2106  1.1  christos 
   2107  1.1  christos       return TRUE;
   2108  1.1  christos     }
   2109  1.1  christos   else
   2110  1.1  christos     h->plt.offset = (bfd_vma) -1;
   2111  1.1  christos 
   2112  1.1  christos   /* If this is a weak symbol, and there is a real definition, the
   2113  1.1  christos      processor independent code will have arranged for us to see the
   2114  1.1  christos      real definition first, and we can just use the same value.  */
   2115  1.1  christos   if (h->u.weakdef != NULL)
   2116  1.1  christos     {
   2117  1.1  christos       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
   2118  1.1  christos                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
   2119  1.1  christos       h->root.u.def.section = h->u.weakdef->root.u.def.section;
   2120  1.1  christos       h->root.u.def.value = h->u.weakdef->root.u.def.value;
   2121  1.1  christos       return TRUE;
   2122  1.1  christos     }
   2123  1.1  christos 
   2124  1.1  christos   /* This is a reference to a symbol defined by a dynamic object which
   2125  1.1  christos      is not a function.  */
   2126  1.1  christos 
   2127  1.1  christos   /* If we are creating a shared library, we must presume that the
   2128  1.1  christos      only references to the symbol are via the global offset table.
   2129  1.1  christos      For such cases we need not do anything here; the relocations will
   2130  1.1  christos      be handled correctly by relocate_section.  */
   2131  1.1  christos   if (info->shared)
   2132  1.1  christos     return TRUE;
   2133  1.1  christos 
   2134  1.1  christos   /* If there are no references to this symbol that do not use the
   2135  1.1  christos      GOT, we don't need to generate a copy reloc.  */
   2136  1.1  christos   if (!h->non_got_ref)
   2137  1.1  christos     return TRUE;
   2138  1.1  christos 
   2139  1.1  christos   /* If -z nocopyreloc was given, we won't generate them either.  */
   2140  1.1  christos   if (info->nocopyreloc)
   2141  1.1  christos     {
   2142  1.1  christos       h->non_got_ref = 0;
   2143  1.1  christos       return TRUE;
   2144  1.1  christos     }
   2145  1.1  christos 
   2146  1.1  christos   eh = (struct elf_or1k_link_hash_entry *) h;
   2147  1.1  christos   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2148  1.1  christos     {
   2149  1.1  christos       s = p->sec->output_section;
   2150  1.1  christos       if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0)
   2151  1.1  christos         break;
   2152  1.1  christos     }
   2153  1.1  christos 
   2154  1.1  christos   /* If we didn't find any dynamic relocs in sections which needs the
   2155  1.1  christos      copy reloc, then we'll be keeping the dynamic relocs and avoiding
   2156  1.1  christos      the copy reloc.  */
   2157  1.1  christos   if (p == NULL)
   2158  1.1  christos     {
   2159  1.1  christos       h->non_got_ref = 0;
   2160  1.1  christos       return TRUE;
   2161  1.1  christos     }
   2162  1.1  christos 
   2163  1.1  christos   /* We must allocate the symbol in our .dynbss section, which will
   2164  1.1  christos      become part of the .bss section of the executable.  There will be
   2165  1.1  christos      an entry for this symbol in the .dynsym section.  The dynamic
   2166  1.1  christos      object will contain position independent code, so all references
   2167  1.1  christos      from the dynamic object to this symbol will go through the global
   2168  1.1  christos      offset table.  The dynamic linker will use the .dynsym entry to
   2169  1.1  christos      determine the address it must put in the global offset table, so
   2170  1.1  christos      both the dynamic object and the regular object will refer to the
   2171  1.1  christos      same memory location for the variable.  */
   2172  1.1  christos 
   2173  1.1  christos   htab = or1k_elf_hash_table (info);
   2174  1.1  christos   if (htab == NULL)
   2175  1.1  christos     return FALSE;
   2176  1.1  christos 
   2177  1.1  christos   s = htab->sdynbss;
   2178  1.1  christos   BFD_ASSERT (s != NULL);
   2179  1.1  christos 
   2180  1.1  christos   /* We must generate a R_OR1K_COPY reloc to tell the dynamic linker
   2181  1.1  christos      to copy the initial value out of the dynamic object and into the
   2182  1.1  christos      runtime process image.  We need to remember the offset into the
   2183  1.1  christos      .rela.bss section we are going to use.  */
   2184  1.1  christos   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   2185  1.1  christos     {
   2186  1.1  christos       asection *srel;
   2187  1.1  christos 
   2188  1.1  christos       srel = htab->srelbss;
   2189  1.1  christos       BFD_ASSERT (srel != NULL);
   2190  1.1  christos       srel->size += sizeof (Elf32_External_Rela);
   2191  1.1  christos       h->needs_copy = 1;
   2192  1.1  christos     }
   2193  1.1  christos 
   2194  1.1  christos   return _bfd_elf_adjust_dynamic_copy (info, h, s);
   2195  1.1  christos }
   2196  1.1  christos 
   2197  1.1  christos /* Allocate space in .plt, .got and associated reloc sections for
   2198  1.1  christos    dynamic relocs.  */
   2199  1.1  christos 
   2200  1.1  christos static bfd_boolean
   2201  1.1  christos allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   2202  1.1  christos {
   2203  1.1  christos   struct bfd_link_info *info;
   2204  1.1  christos   struct elf_or1k_link_hash_table *htab;
   2205  1.1  christos   struct elf_or1k_link_hash_entry *eh;
   2206  1.1  christos   struct elf_or1k_dyn_relocs *p;
   2207  1.1  christos 
   2208  1.1  christos   if (h->root.type == bfd_link_hash_indirect)
   2209  1.1  christos     return TRUE;
   2210  1.1  christos 
   2211  1.1  christos   info = (struct bfd_link_info *) inf;
   2212  1.1  christos   htab = or1k_elf_hash_table (info);
   2213  1.1  christos   if (htab == NULL)
   2214  1.1  christos     return FALSE;
   2215  1.1  christos 
   2216  1.1  christos   eh = (struct elf_or1k_link_hash_entry *) h;
   2217  1.1  christos 
   2218  1.1  christos   if (htab->root.dynamic_sections_created
   2219  1.1  christos       && h->plt.refcount > 0)
   2220  1.1  christos     {
   2221  1.1  christos       /* Make sure this symbol is output as a dynamic symbol.
   2222  1.1  christos          Undefined weak syms won't yet be marked as dynamic.  */
   2223  1.1  christos       if (h->dynindx == -1
   2224  1.1  christos           && !h->forced_local)
   2225  1.1  christos         {
   2226  1.1  christos           if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2227  1.1  christos             return FALSE;
   2228  1.1  christos         }
   2229  1.1  christos 
   2230  1.1  christos       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
   2231  1.1  christos         {
   2232  1.1  christos           asection *s = htab->splt;
   2233  1.1  christos 
   2234  1.1  christos           /* If this is the first .plt entry, make room for the special
   2235  1.1  christos              first entry.  */
   2236  1.1  christos           if (s->size == 0)
   2237  1.1  christos             s->size = PLT_ENTRY_SIZE;
   2238  1.1  christos 
   2239  1.1  christos           h->plt.offset = s->size;
   2240  1.1  christos 
   2241  1.1  christos           /* If this symbol is not defined in a regular file, and we are
   2242  1.1  christos              not generating a shared library, then set the symbol to this
   2243  1.1  christos              location in the .plt.  This is required to make function
   2244  1.1  christos              pointers compare as equal between the normal executable and
   2245  1.1  christos              the shared library.  */
   2246  1.1  christos           if (! info->shared
   2247  1.1  christos               && !h->def_regular)
   2248  1.1  christos             {
   2249  1.1  christos               h->root.u.def.section = s;
   2250  1.1  christos               h->root.u.def.value = h->plt.offset;
   2251  1.1  christos             }
   2252  1.1  christos 
   2253  1.1  christos           /* Make room for this entry.  */
   2254  1.1  christos           s->size += PLT_ENTRY_SIZE;
   2255  1.1  christos 
   2256  1.1  christos           /* We also need to make an entry in the .got.plt section, which
   2257  1.1  christos              will be placed in the .got section by the linker script.  */
   2258  1.1  christos           htab->sgotplt->size += 4;
   2259  1.1  christos 
   2260  1.1  christos           /* We also need to make an entry in the .rel.plt section.  */
   2261  1.1  christos           htab->srelplt->size += sizeof (Elf32_External_Rela);
   2262  1.1  christos         }
   2263  1.1  christos       else
   2264  1.1  christos         {
   2265  1.1  christos           h->plt.offset = (bfd_vma) -1;
   2266  1.1  christos           h->needs_plt = 0;
   2267  1.1  christos         }
   2268  1.1  christos     }
   2269  1.1  christos   else
   2270  1.1  christos     {
   2271  1.1  christos       h->plt.offset = (bfd_vma) -1;
   2272  1.1  christos       h->needs_plt = 0;
   2273  1.1  christos     }
   2274  1.1  christos 
   2275  1.1  christos   if (h->got.refcount > 0)
   2276  1.1  christos     {
   2277  1.1  christos       asection *s;
   2278  1.1  christos       bfd_boolean dyn;
   2279  1.1  christos       unsigned char tls_type;
   2280  1.1  christos 
   2281  1.1  christos       /* Make sure this symbol is output as a dynamic symbol.
   2282  1.1  christos          Undefined weak syms won't yet be marked as dynamic.  */
   2283  1.1  christos       if (h->dynindx == -1
   2284  1.1  christos           && !h->forced_local)
   2285  1.1  christos         {
   2286  1.1  christos           if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2287  1.1  christos             return FALSE;
   2288  1.1  christos         }
   2289  1.1  christos 
   2290  1.1  christos       s = htab->sgot;
   2291  1.1  christos 
   2292  1.1  christos       h->got.offset = s->size;
   2293  1.1  christos 
   2294  1.1  christos       tls_type = ((struct elf_or1k_link_hash_entry *) h)->tls_type;
   2295  1.1  christos 
   2296  1.1  christos       /* TLS GD requires two GOT and two relocs.  */
   2297  1.1  christos       if (tls_type == TLS_GD)
   2298  1.1  christos         s->size += 8;
   2299  1.1  christos       else
   2300  1.1  christos         s->size += 4;
   2301  1.1  christos       dyn = htab->root.dynamic_sections_created;
   2302  1.1  christos       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
   2303  1.1  christos         {
   2304  1.1  christos           if (tls_type == TLS_GD)
   2305  1.1  christos             htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
   2306  1.1  christos           else
   2307  1.1  christos             htab->srelgot->size += sizeof (Elf32_External_Rela);
   2308  1.1  christos         }
   2309  1.1  christos     }
   2310  1.1  christos   else
   2311  1.1  christos     h->got.offset = (bfd_vma) -1;
   2312  1.1  christos 
   2313  1.1  christos   if (eh->dyn_relocs == NULL)
   2314  1.1  christos     return TRUE;
   2315  1.1  christos 
   2316  1.1  christos   /* In the shared -Bsymbolic case, discard space allocated for
   2317  1.1  christos      dynamic pc-relative relocs against symbols which turn out to be
   2318  1.1  christos      defined in regular objects.  For the normal shared case, discard
   2319  1.1  christos      space for pc-relative relocs that have become local due to symbol
   2320  1.1  christos      visibility changes.  */
   2321  1.1  christos 
   2322  1.1  christos   if (info->shared)
   2323  1.1  christos     {
   2324  1.1  christos       if (SYMBOL_CALLS_LOCAL (info, h))
   2325  1.1  christos         {
   2326  1.1  christos           struct elf_or1k_dyn_relocs **pp;
   2327  1.1  christos 
   2328  1.1  christos           for (pp = &eh->dyn_relocs; (p = *pp) != NULL;)
   2329  1.1  christos             {
   2330  1.1  christos               p->count -= p->pc_count;
   2331  1.1  christos               p->pc_count = 0;
   2332  1.1  christos               if (p->count == 0)
   2333  1.1  christos                 *pp = p->next;
   2334  1.1  christos               else
   2335  1.1  christos                 pp = &p->next;
   2336  1.1  christos             }
   2337  1.1  christos         }
   2338  1.1  christos 
   2339  1.1  christos       /* Also discard relocs on undefined weak syms with non-default
   2340  1.1  christos          visibility.  */
   2341  1.1  christos       if (eh->dyn_relocs != NULL
   2342  1.1  christos           && h->root.type == bfd_link_hash_undefweak)
   2343  1.1  christos         {
   2344  1.1  christos           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   2345  1.1  christos             eh->dyn_relocs = NULL;
   2346  1.1  christos 
   2347  1.1  christos           /* Make sure undefined weak symbols are output as a dynamic
   2348  1.1  christos              symbol in PIEs.  */
   2349  1.1  christos           else if (h->dynindx == -1
   2350  1.1  christos                    && !h->forced_local)
   2351  1.1  christos             {
   2352  1.1  christos               if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2353  1.1  christos                 return FALSE;
   2354  1.1  christos             }
   2355  1.1  christos         }
   2356  1.1  christos     }
   2357  1.1  christos   else
   2358  1.1  christos     {
   2359  1.1  christos       /* For the non-shared case, discard space for relocs against
   2360  1.1  christos          symbols which turn out to need copy relocs or are not
   2361  1.1  christos          dynamic.  */
   2362  1.1  christos 
   2363  1.1  christos       if (!h->non_got_ref
   2364  1.1  christos           && ((h->def_dynamic
   2365  1.1  christos                && !h->def_regular)
   2366  1.1  christos               || (htab->root.dynamic_sections_created
   2367  1.1  christos                   && (h->root.type == bfd_link_hash_undefweak
   2368  1.1  christos                       || h->root.type == bfd_link_hash_undefined))))
   2369  1.1  christos         {
   2370  1.1  christos           /* Make sure this symbol is output as a dynamic symbol.
   2371  1.1  christos              Undefined weak syms won't yet be marked as dynamic.  */
   2372  1.1  christos           if (h->dynindx == -1
   2373  1.1  christos               && !h->forced_local)
   2374  1.1  christos             {
   2375  1.1  christos               if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2376  1.1  christos                 return FALSE;
   2377  1.1  christos             }
   2378  1.1  christos 
   2379  1.1  christos           /* If that succeeded, we know we'll be keeping all the
   2380  1.1  christos              relocs.  */
   2381  1.1  christos           if (h->dynindx != -1)
   2382  1.1  christos             goto keep;
   2383  1.1  christos         }
   2384  1.1  christos 
   2385  1.1  christos       eh->dyn_relocs = NULL;
   2386  1.1  christos 
   2387  1.1  christos     keep: ;
   2388  1.1  christos     }
   2389  1.1  christos 
   2390  1.1  christos   /* Finally, allocate space.  */
   2391  1.1  christos   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2392  1.1  christos     {
   2393  1.1  christos       asection *sreloc = elf_section_data (p->sec)->sreloc;
   2394  1.1  christos       sreloc->size += p->count * sizeof (Elf32_External_Rela);
   2395  1.1  christos     }
   2396  1.1  christos 
   2397  1.1  christos   return TRUE;
   2398  1.1  christos }
   2399  1.1  christos 
   2400  1.1  christos /* Find any dynamic relocs that apply to read-only sections.  */
   2401  1.1  christos 
   2402  1.1  christos static bfd_boolean
   2403  1.1  christos readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf)
   2404  1.1  christos {
   2405  1.1  christos   struct elf_or1k_link_hash_entry *eh;
   2406  1.1  christos   struct elf_or1k_dyn_relocs *p;
   2407  1.1  christos 
   2408  1.1  christos   eh = (struct elf_or1k_link_hash_entry *) h;
   2409  1.1  christos   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2410  1.1  christos     {
   2411  1.1  christos       asection *s = p->sec->output_section;
   2412  1.1  christos 
   2413  1.1  christos       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   2414  1.1  christos         {
   2415  1.1  christos           struct bfd_link_info *info = (struct bfd_link_info *) inf;
   2416  1.1  christos 
   2417  1.1  christos           info->flags |= DF_TEXTREL;
   2418  1.1  christos 
   2419  1.1  christos           /* Not an error, just cut short the traversal.  */
   2420  1.1  christos           return FALSE;
   2421  1.1  christos         }
   2422  1.1  christos     }
   2423  1.1  christos   return TRUE;
   2424  1.1  christos }
   2425  1.1  christos 
   2426  1.1  christos /* Set the sizes of the dynamic sections.  */
   2427  1.1  christos 
   2428  1.1  christos static bfd_boolean
   2429  1.1  christos or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   2430  1.1  christos                                 struct bfd_link_info *info)
   2431  1.1  christos {
   2432  1.1  christos   struct elf_or1k_link_hash_table *htab;
   2433  1.1  christos   bfd *dynobj;
   2434  1.1  christos   asection *s;
   2435  1.1  christos   bfd_boolean relocs;
   2436  1.1  christos   bfd *ibfd;
   2437  1.1  christos 
   2438  1.1  christos   htab = or1k_elf_hash_table (info);
   2439  1.1  christos   if (htab == NULL)
   2440  1.1  christos     return FALSE;
   2441  1.1  christos 
   2442  1.1  christos   dynobj = htab->root.dynobj;
   2443  1.1  christos   BFD_ASSERT (dynobj != NULL);
   2444  1.1  christos 
   2445  1.1  christos   if (htab->root.dynamic_sections_created)
   2446  1.1  christos     {
   2447  1.1  christos       /* Set the contents of the .interp section to the interpreter.  */
   2448  1.1  christos       if (info->executable)
   2449  1.1  christos         {
   2450  1.1  christos           s = bfd_get_section_by_name (dynobj, ".interp");
   2451  1.1  christos           BFD_ASSERT (s != NULL);
   2452  1.1  christos           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
   2453  1.1  christos           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
   2454  1.1  christos         }
   2455  1.1  christos     }
   2456  1.1  christos 
   2457  1.1  christos   /* Set up .got offsets for local syms, and space for local dynamic
   2458  1.1  christos      relocs.  */
   2459  1.1  christos   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   2460  1.1  christos     {
   2461  1.1  christos       bfd_signed_vma *local_got;
   2462  1.1  christos       bfd_signed_vma *end_local_got;
   2463  1.1  christos       bfd_size_type locsymcount;
   2464  1.1  christos       Elf_Internal_Shdr *symtab_hdr;
   2465  1.1  christos       unsigned char *local_tls_type;
   2466  1.1  christos       asection *srel;
   2467  1.1  christos 
   2468  1.1  christos       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
   2469  1.1  christos         continue;
   2470  1.1  christos 
   2471  1.1  christos       for (s = ibfd->sections; s != NULL; s = s->next)
   2472  1.1  christos         {
   2473  1.1  christos           struct elf_or1k_dyn_relocs *p;
   2474  1.1  christos 
   2475  1.1  christos           for (p = ((struct elf_or1k_dyn_relocs *)
   2476  1.1  christos                     elf_section_data (s)->local_dynrel);
   2477  1.1  christos                p != NULL;
   2478  1.1  christos                p = p->next)
   2479  1.1  christos             {
   2480  1.1  christos               if (! bfd_is_abs_section (p->sec)
   2481  1.1  christos                   && bfd_is_abs_section (p->sec->output_section))
   2482  1.1  christos                 {
   2483  1.1  christos                   /* Input section has been discarded, either because
   2484  1.1  christos                      it is a copy of a linkonce section or due to
   2485  1.1  christos                      linker script /DISCARD/, so we'll be discarding
   2486  1.1  christos                      the relocs too.  */
   2487  1.1  christos                 }
   2488  1.1  christos               else if (p->count != 0)
   2489  1.1  christos                 {
   2490  1.1  christos                   srel = elf_section_data (p->sec)->sreloc;
   2491  1.1  christos                   srel->size += p->count * sizeof (Elf32_External_Rela);
   2492  1.1  christos                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   2493  1.1  christos                     info->flags |= DF_TEXTREL;
   2494  1.1  christos                 }
   2495  1.1  christos             }
   2496  1.1  christos         }
   2497  1.1  christos 
   2498  1.1  christos       local_got = elf_local_got_refcounts (ibfd);
   2499  1.1  christos       if (!local_got)
   2500  1.1  christos         continue;
   2501  1.1  christos 
   2502  1.1  christos       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
   2503  1.1  christos       locsymcount = symtab_hdr->sh_info;
   2504  1.1  christos       end_local_got = local_got + locsymcount;
   2505  1.1  christos       s = htab->sgot;
   2506  1.1  christos       srel = htab->srelgot;
   2507  1.1  christos       local_tls_type = (unsigned char *) elf_or1k_local_tls_type (ibfd);
   2508  1.1  christos       for (; local_got < end_local_got; ++local_got)
   2509  1.1  christos         {
   2510  1.1  christos           if (*local_got > 0)
   2511  1.1  christos             {
   2512  1.1  christos               *local_got = s->size;
   2513  1.1  christos 
   2514  1.1  christos               /* TLS GD requires two GOT and two relocs.  */
   2515  1.1  christos               if (local_tls_type != NULL && *local_tls_type == TLS_GD)
   2516  1.1  christos                 s->size += 8;
   2517  1.1  christos               else
   2518  1.1  christos                 s->size += 4;
   2519  1.1  christos               if (info->shared)
   2520  1.1  christos                 {
   2521  1.1  christos                   if (local_tls_type != NULL && *local_tls_type == TLS_GD)
   2522  1.1  christos                     srel->size += 2 * sizeof (Elf32_External_Rela);
   2523  1.1  christos                   else
   2524  1.1  christos                     srel->size += sizeof (Elf32_External_Rela);
   2525  1.1  christos                 }
   2526  1.1  christos             }
   2527  1.1  christos           else
   2528  1.1  christos 
   2529  1.1  christos             *local_got = (bfd_vma) -1;
   2530  1.1  christos 
   2531  1.1  christos           if (local_tls_type)
   2532  1.1  christos             ++local_tls_type;
   2533  1.1  christos         }
   2534  1.1  christos     }
   2535  1.1  christos 
   2536  1.1  christos   /* Allocate global sym .plt and .got entries, and space for global
   2537  1.1  christos      sym dynamic relocs.  */
   2538  1.1  christos   elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
   2539  1.1  christos 
   2540  1.1  christos   /* We now have determined the sizes of the various dynamic sections.
   2541  1.1  christos      Allocate memory for them.  */
   2542  1.1  christos   relocs = FALSE;
   2543  1.1  christos   for (s = dynobj->sections; s != NULL; s = s->next)
   2544  1.1  christos     {
   2545  1.1  christos       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2546  1.1  christos         continue;
   2547  1.1  christos 
   2548  1.1  christos       if (s == htab->splt
   2549  1.1  christos           || s == htab->sgot
   2550  1.1  christos           || s == htab->sgotplt
   2551  1.1  christos           || s == htab->sdynbss)
   2552  1.1  christos         {
   2553  1.1  christos           /* Strip this section if we don't need it; see the
   2554  1.1  christos              comment below.  */
   2555  1.1  christos         }
   2556  1.1  christos       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
   2557  1.1  christos         {
   2558  1.1  christos           if (s->size != 0 && s != htab->srelplt)
   2559  1.1  christos             relocs = TRUE;
   2560  1.1  christos 
   2561  1.1  christos           /* We use the reloc_count field as a counter if we need
   2562  1.1  christos              to copy relocs into the output file.  */
   2563  1.1  christos           s->reloc_count = 0;
   2564  1.1  christos         }
   2565  1.1  christos       else
   2566  1.1  christos         /* It's not one of our sections, so don't allocate space.  */
   2567  1.1  christos         continue;
   2568  1.1  christos 
   2569  1.1  christos       if (s->size == 0)
   2570  1.1  christos         {
   2571  1.1  christos           /* If we don't need this section, strip it from the
   2572  1.1  christos              output file.  This is mostly to handle .rela.bss and
   2573  1.1  christos              .rela.plt.  We must create both sections in
   2574  1.1  christos              create_dynamic_sections, because they must be created
   2575  1.1  christos              before the linker maps input sections to output
   2576  1.1  christos              sections.  The linker does that before
   2577  1.1  christos              adjust_dynamic_symbol is called, and it is that
   2578  1.1  christos              function which decides whether anything needs to go
   2579  1.1  christos              into these sections.  */
   2580  1.1  christos           s->flags |= SEC_EXCLUDE;
   2581  1.1  christos           continue;
   2582  1.1  christos         }
   2583  1.1  christos 
   2584  1.1  christos       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2585  1.1  christos         continue;
   2586  1.1  christos 
   2587  1.1  christos       /* Allocate memory for the section contents.  We use bfd_zalloc
   2588  1.1  christos          here in case unused entries are not reclaimed before the
   2589  1.1  christos          section's contents are written out.  This should not happen,
   2590  1.1  christos          but this way if it does, we get a R_OR1K_NONE reloc instead
   2591  1.1  christos          of garbage.  */
   2592  1.1  christos       s->contents = bfd_zalloc (dynobj, s->size);
   2593  1.1  christos 
   2594  1.1  christos       if (s->contents == NULL)
   2595  1.1  christos         return FALSE;
   2596  1.1  christos     }
   2597  1.1  christos 
   2598  1.1  christos   if (htab->root.dynamic_sections_created)
   2599  1.1  christos     {
   2600  1.1  christos       /* Add some entries to the .dynamic section.  We fill in the
   2601  1.1  christos          values later, in or1k_elf_finish_dynamic_sections, but we
   2602  1.1  christos          must add the entries now so that we get the correct size for
   2603  1.1  christos          the .dynamic section.  The DT_DEBUG entry is filled in by the
   2604  1.1  christos          dynamic linker and used by the debugger.  */
   2605  1.1  christos #define add_dynamic_entry(TAG, VAL) \
   2606  1.1  christos   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   2607  1.1  christos 
   2608  1.1  christos      if (info->executable)
   2609  1.1  christos        {
   2610  1.1  christos          if (! add_dynamic_entry (DT_DEBUG, 0))
   2611  1.1  christos            return FALSE;
   2612  1.1  christos        }
   2613  1.1  christos 
   2614  1.1  christos      if (htab->splt->size != 0)
   2615  1.1  christos        {
   2616  1.1  christos          if (! add_dynamic_entry (DT_PLTGOT, 0)
   2617  1.1  christos              || ! add_dynamic_entry (DT_PLTRELSZ, 0)
   2618  1.1  christos              || ! add_dynamic_entry (DT_PLTREL, DT_RELA)
   2619  1.1  christos              || ! add_dynamic_entry (DT_JMPREL, 0))
   2620  1.1  christos            return FALSE;
   2621  1.1  christos         }
   2622  1.1  christos 
   2623  1.1  christos      if (relocs)
   2624  1.1  christos        {
   2625  1.1  christos          if (! add_dynamic_entry (DT_RELA, 0)
   2626  1.1  christos              || ! add_dynamic_entry (DT_RELASZ, 0)
   2627  1.1  christos              || ! add_dynamic_entry (DT_RELAENT,
   2628  1.1  christos                                      sizeof (Elf32_External_Rela)))
   2629  1.1  christos            return FALSE;
   2630  1.1  christos 
   2631  1.1  christos          /* If any dynamic relocs apply to a read-only section,
   2632  1.1  christos             then we need a DT_TEXTREL entry.  */
   2633  1.1  christos          if ((info->flags & DF_TEXTREL) == 0)
   2634  1.1  christos            elf_link_hash_traverse (&htab->root, readonly_dynrelocs,
   2635  1.1  christos                                    info);
   2636  1.1  christos 
   2637  1.1  christos          if ((info->flags & DF_TEXTREL) != 0)
   2638  1.1  christos            {
   2639  1.1  christos              if (! add_dynamic_entry (DT_TEXTREL, 0))
   2640  1.1  christos                return FALSE;
   2641  1.1  christos            }
   2642  1.1  christos        }
   2643  1.1  christos     }
   2644  1.1  christos 
   2645  1.1  christos #undef add_dynamic_entry
   2646  1.1  christos   return TRUE;
   2647  1.1  christos }
   2648  1.1  christos 
   2649  1.1  christos /* Create dynamic sections when linking against a dynamic object.  */
   2650  1.1  christos 
   2651  1.1  christos static bfd_boolean
   2652  1.1  christos or1k_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
   2653  1.1  christos {
   2654  1.1  christos   struct elf_or1k_link_hash_table *htab;
   2655  1.1  christos 
   2656  1.1  christos   htab = or1k_elf_hash_table (info);
   2657  1.1  christos   if (htab == NULL)
   2658  1.1  christos     return FALSE;
   2659  1.1  christos 
   2660  1.1  christos   if (!htab->sgot && !create_got_section (dynobj, info))
   2661  1.1  christos     return FALSE;
   2662  1.1  christos 
   2663  1.1  christos   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
   2664  1.1  christos     return FALSE;
   2665  1.1  christos 
   2666  1.1  christos   htab->splt = bfd_get_section_by_name (dynobj, ".plt");
   2667  1.1  christos   htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
   2668  1.1  christos   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
   2669  1.1  christos   if (!info->shared)
   2670  1.1  christos     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
   2671  1.1  christos 
   2672  1.1  christos   if (!htab->splt || !htab->srelplt || !htab->sdynbss
   2673  1.1  christos       || (!info->shared && !htab->srelbss))
   2674  1.1  christos     abort ();
   2675  1.1  christos 
   2676  1.1  christos   return TRUE;
   2677  1.1  christos }
   2678  1.1  christos 
   2679  1.1  christos /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   2680  1.1  christos 
   2681  1.1  christos static void
   2682  1.1  christos or1k_elf_copy_indirect_symbol (struct bfd_link_info *info,
   2683  1.1  christos                                struct elf_link_hash_entry *dir,
   2684  1.1  christos                                struct elf_link_hash_entry *ind)
   2685  1.1  christos {
   2686  1.1  christos   struct elf_or1k_link_hash_entry * edir;
   2687  1.1  christos   struct elf_or1k_link_hash_entry * eind;
   2688  1.1  christos 
   2689  1.1  christos   edir = (struct elf_or1k_link_hash_entry *) dir;
   2690  1.1  christos   eind = (struct elf_or1k_link_hash_entry *) ind;
   2691  1.1  christos 
   2692  1.1  christos   if (eind->dyn_relocs != NULL)
   2693  1.1  christos     {
   2694  1.1  christos       if (edir->dyn_relocs != NULL)
   2695  1.1  christos         {
   2696  1.1  christos           struct elf_or1k_dyn_relocs **pp;
   2697  1.1  christos           struct elf_or1k_dyn_relocs *p;
   2698  1.1  christos 
   2699  1.1  christos           /* Add reloc counts against the indirect sym to the direct sym
   2700  1.1  christos              list.  Merge any entries against the same section.  */
   2701  1.1  christos           for (pp = &eind->dyn_relocs; (p = *pp) != NULL;)
   2702  1.1  christos             {
   2703  1.1  christos               struct elf_or1k_dyn_relocs *q;
   2704  1.1  christos 
   2705  1.1  christos               for (q = edir->dyn_relocs; q != NULL; q = q->next)
   2706  1.1  christos                 if (q->sec == p->sec)
   2707  1.1  christos                   {
   2708  1.1  christos                     q->pc_count += p->pc_count;
   2709  1.1  christos                     q->count += p->count;
   2710  1.1  christos                     *pp = p->next;
   2711  1.1  christos                     break;
   2712  1.1  christos                   }
   2713  1.1  christos               if (q == NULL)
   2714  1.1  christos                 pp = &p->next;
   2715  1.1  christos             }
   2716  1.1  christos           *pp = edir->dyn_relocs;
   2717  1.1  christos         }
   2718  1.1  christos 
   2719  1.1  christos       edir->dyn_relocs = eind->dyn_relocs;
   2720  1.1  christos       eind->dyn_relocs = NULL;
   2721  1.1  christos     }
   2722  1.1  christos 
   2723  1.1  christos   if (ind->root.type == bfd_link_hash_indirect)
   2724  1.1  christos     {
   2725  1.1  christos       if (dir->got.refcount <= 0)
   2726  1.1  christos         {
   2727  1.1  christos           edir->tls_type = eind->tls_type;
   2728  1.1  christos           eind->tls_type = TLS_UNKNOWN;
   2729  1.1  christos         }
   2730  1.1  christos     }
   2731  1.1  christos 
   2732  1.1  christos   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
   2733  1.1  christos }
   2734  1.1  christos 
   2735  1.1  christos /* Set the right machine number.  */
   2736  1.1  christos 
   2737  1.1  christos static bfd_boolean
   2738  1.1  christos or1k_elf_object_p (bfd *abfd)
   2739  1.1  christos {
   2740  1.1  christos   unsigned long mach = bfd_mach_or1k;
   2741  1.1  christos 
   2742  1.1  christos   if (elf_elfheader (abfd)->e_flags & EF_OR1K_NODELAY)
   2743  1.1  christos     mach = bfd_mach_or1knd;
   2744  1.1  christos 
   2745  1.1  christos   return bfd_default_set_arch_mach (abfd, bfd_arch_or1k, mach);
   2746  1.1  christos }
   2747  1.1  christos 
   2748  1.1  christos /* Store the machine number in the flags field.  */
   2749  1.1  christos 
   2750  1.1  christos static void
   2751  1.1  christos or1k_elf_final_write_processing (bfd *abfd,
   2752  1.1  christos 				 bfd_boolean linker ATTRIBUTE_UNUSED)
   2753  1.1  christos {
   2754  1.1  christos   switch (bfd_get_mach (abfd))
   2755  1.1  christos     {
   2756  1.1  christos     default:
   2757  1.1  christos     case bfd_mach_or1k:
   2758  1.1  christos       break;
   2759  1.1  christos     case bfd_mach_or1knd:
   2760  1.1  christos       elf_elfheader (abfd)->e_flags |= EF_OR1K_NODELAY;
   2761  1.1  christos       break;
   2762  1.1  christos     }
   2763  1.1  christos }
   2764  1.1  christos 
   2765  1.1  christos static bfd_boolean
   2766  1.1  christos or1k_elf_set_private_flags (bfd *abfd, flagword flags)
   2767  1.1  christos {
   2768  1.1  christos   BFD_ASSERT (!elf_flags_init (abfd)
   2769  1.1  christos               || elf_elfheader (abfd)->e_flags == flags);
   2770  1.1  christos 
   2771  1.1  christos   elf_elfheader (abfd)->e_flags = flags;
   2772  1.1  christos   elf_flags_init (abfd) = TRUE;
   2773  1.1  christos   return TRUE;
   2774  1.1  christos }
   2775  1.1  christos 
   2776  1.1  christos /* Make sure all input files are consistent with respect to
   2777  1.1  christos    EF_OR1K_NODELAY flag setting.  */
   2778  1.1  christos 
   2779  1.1  christos static bfd_boolean
   2780  1.1  christos elf32_or1k_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   2781  1.1  christos {
   2782  1.1  christos   flagword out_flags;
   2783  1.1  christos   flagword in_flags;
   2784  1.1  christos 
   2785  1.1  christos   in_flags  = elf_elfheader (ibfd)->e_flags;
   2786  1.1  christos   out_flags = elf_elfheader (obfd)->e_flags;
   2787  1.1  christos 
   2788  1.1  christos   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   2789  1.1  christos       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   2790  1.1  christos     return TRUE;
   2791  1.1  christos 
   2792  1.1  christos   if (!elf_flags_init (obfd))
   2793  1.1  christos     {
   2794  1.1  christos       elf_flags_init (obfd) = TRUE;
   2795  1.1  christos       elf_elfheader (obfd)->e_flags = in_flags;
   2796  1.1  christos 
   2797  1.1  christos       return TRUE;
   2798  1.1  christos     }
   2799  1.1  christos 
   2800  1.1  christos   if (in_flags == out_flags)
   2801  1.1  christos     return TRUE;
   2802  1.1  christos 
   2803  1.1  christos   if ((in_flags & EF_OR1K_NODELAY) != (out_flags & EF_OR1K_NODELAY))
   2804  1.1  christos     {
   2805  1.1  christos       (*_bfd_error_handler)
   2806  1.1  christos 	(_("%B: EF_OR1K_NODELAY flag mismatch with previous modules"), ibfd);
   2807  1.1  christos 
   2808  1.1  christos       bfd_set_error (bfd_error_bad_value);
   2809  1.1  christos       return FALSE;
   2810  1.1  christos     }
   2811  1.1  christos 
   2812  1.1  christos   return TRUE;
   2813  1.1  christos 
   2814  1.1  christos }
   2815  1.1  christos 
   2816  1.1  christos #define ELF_ARCH                        bfd_arch_or1k
   2817  1.1  christos #define ELF_MACHINE_CODE                EM_OR1K
   2818  1.1  christos #define ELF_TARGET_ID                   OR1K_ELF_DATA
   2819  1.1  christos #define ELF_MAXPAGESIZE                 0x2000
   2820  1.1  christos 
   2821  1.1  christos #define TARGET_BIG_SYM                  or1k_elf32_vec
   2822  1.1  christos #define TARGET_BIG_NAME                 "elf32-or1k"
   2823  1.1  christos 
   2824  1.1  christos #define elf_info_to_howto_rel           NULL
   2825  1.1  christos #define elf_info_to_howto               or1k_info_to_howto_rela
   2826  1.1  christos #define elf_backend_relocate_section    or1k_elf_relocate_section
   2827  1.1  christos #define elf_backend_gc_mark_hook        or1k_elf_gc_mark_hook
   2828  1.1  christos #define elf_backend_gc_sweep_hook       or1k_elf_gc_sweep_hook
   2829  1.1  christos #define elf_backend_check_relocs        or1k_elf_check_relocs
   2830  1.1  christos #define elf_backend_reloc_type_class    or1k_elf_reloc_type_class
   2831  1.1  christos #define elf_backend_can_gc_sections     1
   2832  1.1  christos #define elf_backend_rela_normal         1
   2833  1.1  christos 
   2834  1.1  christos #define bfd_elf32_mkobject                   elf_or1k_mkobject
   2835  1.1  christos 
   2836  1.1  christos #define bfd_elf32_bfd_merge_private_bfd_data elf32_or1k_merge_private_bfd_data
   2837  1.1  christos #define bfd_elf32_bfd_set_private_flags or1k_elf_set_private_flags
   2838  1.1  christos #define bfd_elf32_bfd_reloc_type_lookup or1k_reloc_type_lookup
   2839  1.1  christos #define bfd_elf32_bfd_reloc_name_lookup or1k_reloc_name_lookup
   2840  1.1  christos 
   2841  1.1  christos #define elf_backend_object_p                or1k_elf_object_p
   2842  1.1  christos #define elf_backend_final_write_processing  or1k_elf_final_write_processing
   2843  1.1  christos #define elf_backend_can_refcount                1
   2844  1.1  christos 
   2845  1.1  christos #define elf_backend_plt_readonly                1
   2846  1.1  christos #define elf_backend_want_got_plt                1
   2847  1.1  christos #define elf_backend_want_plt_sym                0
   2848  1.1  christos #define elf_backend_got_header_size             12
   2849  1.1  christos #define bfd_elf32_bfd_link_hash_table_create    or1k_elf_link_hash_table_create
   2850  1.1  christos #define elf_backend_copy_indirect_symbol        or1k_elf_copy_indirect_symbol
   2851  1.1  christos #define elf_backend_create_dynamic_sections     or1k_elf_create_dynamic_sections
   2852  1.1  christos #define elf_backend_finish_dynamic_sections     or1k_elf_finish_dynamic_sections
   2853  1.1  christos #define elf_backend_size_dynamic_sections       or1k_elf_size_dynamic_sections
   2854  1.1  christos #define elf_backend_adjust_dynamic_symbol       or1k_elf_adjust_dynamic_symbol
   2855  1.1  christos #define elf_backend_finish_dynamic_symbol       or1k_elf_finish_dynamic_symbol
   2856  1.1  christos 
   2857  1.1  christos #include "elf32-target.h"
   2858