Ignore:
Timestamp:
Aug 16, 2003, 6:59:22 PM (22 years ago)
Author:
bird
Message:

binutils v2.14 - offical sources.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GNU/src/binutils/bfd/elf32-i386.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r608 r609  
    11/* Intel 80386/80486-specific support for 32-bit ELF
    2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
     2   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
    33   Free Software Foundation, Inc.
    44
    5 This file is part of BFD, the Binary File Descriptor library.
    6 
    7 This program is free software; you can redistribute it and/or modify
    8 it under the terms of the GNU General Public License as published by
    9 the Free Software Foundation; either version 2 of the License, or
    10 (at your option) any later version.
    11 
    12 This program is distributed in the hope that it will be useful,
    13 but WITHOUT ANY WARRANTY; without even the implied warranty of
    14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15 GNU General Public License for more details.
    16 
    17 You should have received a copy of the GNU General Public License
    18 along with this program; if not, write to the Free Software
    19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     5   This file is part of BFD, the Binary File Descriptor library.
     6
     7   This program is free software; you can redistribute it and/or modify
     8   it under the terms of the GNU General Public License as published by
     9   the Free Software Foundation; either version 2 of the License, or
     10   (at your option) any later version.
     11
     12   This program is distributed in the hope that it will be useful,
     13   but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   GNU General Public License for more details.
     16
     17   You should have received a copy of the GNU General Public License
     18   along with this program; if not, write to the Free Software
     19   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
    2020
    2121#include "bfd.h"
     
    2727static reloc_howto_type *elf_i386_reloc_type_lookup
    2828  PARAMS ((bfd *, bfd_reloc_code_real_type));
    29 static void elf_i386_info_to_howto
    30   PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
    3129static void elf_i386_info_to_howto_rel
    32   PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
    33 static boolean elf_i386_is_local_label_name PARAMS ((bfd *, const char *));
    34 static struct bfd_hash_entry *elf_i386_link_hash_newfunc
     30  PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
     31static bfd_boolean elf_i386_is_local_label_name
     32  PARAMS ((bfd *, const char *));
     33static bfd_boolean elf_i386_grok_prstatus
     34  PARAMS ((bfd *abfd, Elf_Internal_Note *note));
     35static bfd_boolean elf_i386_grok_psinfo
     36  PARAMS ((bfd *abfd, Elf_Internal_Note *note));
     37static struct bfd_hash_entry *link_hash_newfunc
    3538  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
    3639static struct bfd_link_hash_table *elf_i386_link_hash_table_create
    3740  PARAMS ((bfd *));
    38 static boolean elf_i386_check_relocs
     41static bfd_boolean create_got_section
     42  PARAMS ((bfd *, struct bfd_link_info *));
     43static bfd_boolean elf_i386_create_dynamic_sections
     44  PARAMS ((bfd *, struct bfd_link_info *));
     45static void elf_i386_copy_indirect_symbol
     46  PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *,
     47           struct elf_link_hash_entry *));
     48static int elf_i386_tls_transition
     49  PARAMS ((struct bfd_link_info *, int, int));
     50
     51static bfd_boolean elf_i386_mkobject
     52  PARAMS ((bfd *));
     53static bfd_boolean elf_i386_object_p
     54  PARAMS ((bfd *));
     55static bfd_boolean elf_i386_check_relocs
    3956  PARAMS ((bfd *, struct bfd_link_info *, asection *,
    4057           const Elf_Internal_Rela *));
    41 static boolean elf_i386_adjust_dynamic_symbol
     58static asection *elf_i386_gc_mark_hook
     59  PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
     60           struct elf_link_hash_entry *, Elf_Internal_Sym *));
     61static bfd_boolean elf_i386_gc_sweep_hook
     62  PARAMS ((bfd *, struct bfd_link_info *, asection *,
     63           const Elf_Internal_Rela *));
     64static bfd_boolean elf_i386_adjust_dynamic_symbol
    4265  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
    43 static boolean elf_i386_size_dynamic_sections
     66static bfd_boolean allocate_dynrelocs
     67  PARAMS ((struct elf_link_hash_entry *, PTR));
     68static bfd_boolean readonly_dynrelocs
     69  PARAMS ((struct elf_link_hash_entry *, PTR));
     70static bfd_boolean elf_i386_fake_sections
     71  PARAMS ((bfd *, Elf_Internal_Shdr *, asection *));
     72static bfd_boolean elf_i386_size_dynamic_sections
    4473  PARAMS ((bfd *, struct bfd_link_info *));
    45 static boolean elf_i386_relocate_section
     74static bfd_vma dtpoff_base
     75  PARAMS ((struct bfd_link_info *));
     76static bfd_vma tpoff
     77  PARAMS ((struct bfd_link_info *, bfd_vma));
     78static bfd_boolean elf_i386_relocate_section
    4679  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
    4780           Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
    48 static boolean elf_i386_finish_dynamic_symbol
     81static bfd_boolean elf_i386_finish_dynamic_symbol
    4982  PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
    5083           Elf_Internal_Sym *));
    51 static boolean elf_i386_finish_dynamic_sections
     84static enum elf_reloc_type_class elf_i386_reloc_type_class
     85  PARAMS ((const Elf_Internal_Rela *));
     86static bfd_boolean elf_i386_finish_dynamic_sections
    5287  PARAMS ((bfd *, struct bfd_link_info *));
    5388
    54 #define USE_REL 1               /* 386 uses REL relocations instead of RELA */
     89#define USE_REL 1               /* 386 uses REL relocations instead of RELA. */
    5590
    5691#include "elf/i386.h"
     
    5893static reloc_howto_type elf_howto_table[]=
    5994{
    60   HOWTO(R_386_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
     95  HOWTO(R_386_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
    6196        bfd_elf_generic_reloc, "R_386_NONE",
    62         true, 0x00000000, 0x00000000, false),
    63   HOWTO(R_386_32, 0, 2, 32, false, 0, complain_overflow_bitfield,
     97        TRUE, 0x00000000, 0x00000000, FALSE),
     98  HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    6499        bfd_elf_generic_reloc, "R_386_32",
    65         true, 0xffffffff, 0xffffffff, false),
    66   HOWTO(R_386_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield,
     100        TRUE, 0xffffffff, 0xffffffff, FALSE),
     101  HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
    67102        bfd_elf_generic_reloc, "R_386_PC32",
    68         true, 0xffffffff, 0xffffffff, true),
    69   HOWTO(R_386_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield,
     103        TRUE, 0xffffffff, 0xffffffff, TRUE),
     104  HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    70105        bfd_elf_generic_reloc, "R_386_GOT32",
    71         true, 0xffffffff, 0xffffffff, false),
    72   HOWTO(R_386_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield,
     106        TRUE, 0xffffffff, 0xffffffff, FALSE),
     107  HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
    73108        bfd_elf_generic_reloc, "R_386_PLT32",
    74         true, 0xffffffff, 0xffffffff, true),
    75   HOWTO(R_386_COPY, 0, 2, 32, false, 0, complain_overflow_bitfield,
     109        TRUE, 0xffffffff, 0xffffffff, TRUE),
     110  HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    76111        bfd_elf_generic_reloc, "R_386_COPY",
    77         true, 0xffffffff, 0xffffffff, false),
    78   HOWTO(R_386_GLOB_DAT, 0, 2, 32, false, 0, complain_overflow_bitfield,
     112        TRUE, 0xffffffff, 0xffffffff, FALSE),
     113  HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    79114        bfd_elf_generic_reloc, "R_386_GLOB_DAT",
    80         true, 0xffffffff, 0xffffffff, false),
    81   HOWTO(R_386_JUMP_SLOT, 0, 2, 32, false, 0, complain_overflow_bitfield,
     115        TRUE, 0xffffffff, 0xffffffff, FALSE),
     116  HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    82117        bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
    83         true, 0xffffffff, 0xffffffff, false),
    84   HOWTO(R_386_RELATIVE, 0, 2, 32, false, 0, complain_overflow_bitfield,
     118        TRUE, 0xffffffff, 0xffffffff, FALSE),
     119  HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    85120        bfd_elf_generic_reloc, "R_386_RELATIVE",
    86         true, 0xffffffff, 0xffffffff, false),
    87   HOWTO(R_386_GOTOFF, 0, 2, 32, false, 0, complain_overflow_bitfield,
     121        TRUE, 0xffffffff, 0xffffffff, FALSE),
     122  HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
    88123        bfd_elf_generic_reloc, "R_386_GOTOFF",
    89         true, 0xffffffff, 0xffffffff, false),
    90   HOWTO(R_386_GOTPC, 0, 2, 32, true, 0, complain_overflow_bitfield,
     124        TRUE, 0xffffffff, 0xffffffff, FALSE),
     125  HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
    91126        bfd_elf_generic_reloc, "R_386_GOTPC",
    92         true, 0xffffffff, 0xffffffff, true),
     127        TRUE, 0xffffffff, 0xffffffff, TRUE),
    93128
    94129  /* We have a gap in the reloc numbers here.
     
    97132     R_386_16 thru R_386_PC8 to form an index into this table.  */
    98133#define R_386_standard ((unsigned int) R_386_GOTPC + 1)
    99 #define R_386_ext_offset ((unsigned int) R_386_16 - R_386_standard)
    100 
    101   /* The remaining relocs are a GNU extension.  */
    102   HOWTO(R_386_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
     134#define R_386_ext_offset ((unsigned int) R_386_TLS_TPOFF - R_386_standard)
     135
     136  /* These relocs are a GNU extension.  */
     137  HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     138        bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
     139        TRUE, 0xffffffff, 0xffffffff, FALSE),
     140  HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     141        bfd_elf_generic_reloc, "R_386_TLS_IE",
     142        TRUE, 0xffffffff, 0xffffffff, FALSE),
     143  HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     144        bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
     145        TRUE, 0xffffffff, 0xffffffff, FALSE),
     146  HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     147        bfd_elf_generic_reloc, "R_386_TLS_LE",
     148        TRUE, 0xffffffff, 0xffffffff, FALSE),
     149  HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     150        bfd_elf_generic_reloc, "R_386_TLS_GD",
     151        TRUE, 0xffffffff, 0xffffffff, FALSE),
     152  HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     153        bfd_elf_generic_reloc, "R_386_TLS_LDM",
     154        TRUE, 0xffffffff, 0xffffffff, FALSE),
     155  HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
    103156        bfd_elf_generic_reloc, "R_386_16",
    104         true, 0xffff, 0xffff, false),
    105   HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield,
     157        TRUE, 0xffff, 0xffff, FALSE),
     158  HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield,
    106159        bfd_elf_generic_reloc, "R_386_PC16",
    107         true, 0xffff, 0xffff, true),
    108   HOWTO(R_386_8, 0, 0, 8, false, 0, complain_overflow_bitfield,
     160        TRUE, 0xffff, 0xffff, TRUE),
     161  HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
    109162        bfd_elf_generic_reloc, "R_386_8",
    110         true, 0xff, 0xff, false),
    111   HOWTO(R_386_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
     163        TRUE, 0xff, 0xff, FALSE),
     164  HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
    112165        bfd_elf_generic_reloc, "R_386_PC8",
    113         true, 0xff, 0xff, true),
     166        TRUE, 0xff, 0xff, TRUE),
     167
     168#define R_386_ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset)
     169#define R_386_tls_offset ((unsigned int) R_386_TLS_LDO_32 - R_386_ext)
     170  /* These are common with Solaris TLS implementation.  */
     171  HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     172        bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
     173        TRUE, 0xffffffff, 0xffffffff, FALSE),
     174  HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     175        bfd_elf_generic_reloc, "R_386_TLS_IE_32",
     176        TRUE, 0xffffffff, 0xffffffff, FALSE),
     177  HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     178        bfd_elf_generic_reloc, "R_386_TLS_LE_32",
     179        TRUE, 0xffffffff, 0xffffffff, FALSE),
     180  HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     181        bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
     182        TRUE, 0xffffffff, 0xffffffff, FALSE),
     183  HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     184        bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
     185        TRUE, 0xffffffff, 0xffffffff, FALSE),
     186  HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
     187        bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
     188        TRUE, 0xffffffff, 0xffffffff, FALSE),
    114189
    115190  /* Another gap.  */
    116 #define R_386_ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset)
    117 #define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_ext)
     191#define R_386_tls ((unsigned int) R_386_TLS_TPOFF32 + 1 - R_386_tls_offset)
     192#define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_tls)
    118193
    119194/* GNU extension to record C++ vtable hierarchy.  */
     
    122197         2,                     /* size (0 = byte, 1 = short, 2 = long) */
    123198         0,                     /* bitsize */
    124          false,                 /* pc_relative */
     199         FALSE,                 /* pc_relative */
    125200         0,                     /* bitpos */
    126201         complain_overflow_dont, /* complain_on_overflow */
    127202         NULL,                  /* special_function */
    128203         "R_386_GNU_VTINHERIT", /* name */
    129          false,                 /* partial_inplace */
     204         FALSE,                 /* partial_inplace */
    130205         0,                     /* src_mask */
    131206         0,                     /* dst_mask */
    132          false),
     207         FALSE),                /* pcrel_offset */
    133208
    134209/* GNU extension to record C++ vtable member usage.  */
     
    137212         2,                     /* size (0 = byte, 1 = short, 2 = long) */
    138213         0,                     /* bitsize */
    139          false,                 /* pc_relative */
     214         FALSE,                 /* pc_relative */
    140215         0,                     /* bitpos */
    141216         complain_overflow_dont, /* complain_on_overflow */
    142217         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
    143218         "R_386_GNU_VTENTRY",   /* name */
    144          false,                 /* partial_inplace */
     219         FALSE,                 /* partial_inplace */
    145220         0,                     /* src_mask */
    146221         0,                     /* dst_mask */
    147          false)
     222         FALSE)                 /* pcrel_offset */
    148223
    149224#define R_386_vt ((unsigned int) R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
     
    212287      return &elf_howto_table[(unsigned int) R_386_GOTPC ];
    213288
    214       /* The remaining relocs are a GNU extension.  */
     289      /* These relocs are a GNU extension.  */
     290    case BFD_RELOC_386_TLS_TPOFF:
     291      TRACE ("BFD_RELOC_386_TLS_TPOFF");
     292      return &elf_howto_table[(unsigned int) R_386_TLS_TPOFF - R_386_ext_offset];
     293
     294    case BFD_RELOC_386_TLS_IE:
     295      TRACE ("BFD_RELOC_386_TLS_IE");
     296      return &elf_howto_table[(unsigned int) R_386_TLS_IE - R_386_ext_offset];
     297
     298    case BFD_RELOC_386_TLS_GOTIE:
     299      TRACE ("BFD_RELOC_386_TLS_GOTIE");
     300      return &elf_howto_table[(unsigned int) R_386_TLS_GOTIE - R_386_ext_offset];
     301
     302    case BFD_RELOC_386_TLS_LE:
     303      TRACE ("BFD_RELOC_386_TLS_LE");
     304      return &elf_howto_table[(unsigned int) R_386_TLS_LE - R_386_ext_offset];
     305
     306    case BFD_RELOC_386_TLS_GD:
     307      TRACE ("BFD_RELOC_386_TLS_GD");
     308      return &elf_howto_table[(unsigned int) R_386_TLS_GD - R_386_ext_offset];
     309
     310    case BFD_RELOC_386_TLS_LDM:
     311      TRACE ("BFD_RELOC_386_TLS_LDM");
     312      return &elf_howto_table[(unsigned int) R_386_TLS_LDM - R_386_ext_offset];
     313
    215314    case BFD_RELOC_16:
    216315      TRACE ("BFD_RELOC_16");
     
    228327      TRACE ("BFD_RELOC_8_PCREL");
    229328      return &elf_howto_table[(unsigned int) R_386_PC8 - R_386_ext_offset];
     329
     330    /* Common with Sun TLS implementation.  */
     331    case BFD_RELOC_386_TLS_LDO_32:
     332      TRACE ("BFD_RELOC_386_TLS_LDO_32");
     333      return &elf_howto_table[(unsigned int) R_386_TLS_LDO_32 - R_386_tls_offset];
     334
     335    case BFD_RELOC_386_TLS_IE_32:
     336      TRACE ("BFD_RELOC_386_TLS_IE_32");
     337      return &elf_howto_table[(unsigned int) R_386_TLS_IE_32 - R_386_tls_offset];
     338
     339    case BFD_RELOC_386_TLS_LE_32:
     340      TRACE ("BFD_RELOC_386_TLS_LE_32");
     341      return &elf_howto_table[(unsigned int) R_386_TLS_LE_32 - R_386_tls_offset];
     342
     343    case BFD_RELOC_386_TLS_DTPMOD32:
     344      TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
     345      return &elf_howto_table[(unsigned int) R_386_TLS_DTPMOD32 - R_386_tls_offset];
     346
     347    case BFD_RELOC_386_TLS_DTPOFF32:
     348      TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
     349      return &elf_howto_table[(unsigned int) R_386_TLS_DTPOFF32 - R_386_tls_offset];
     350
     351    case BFD_RELOC_386_TLS_TPOFF32:
     352      TRACE ("BFD_RELOC_386_TLS_TPOFF32");
     353      return &elf_howto_table[(unsigned int) R_386_TLS_TPOFF32 - R_386_tls_offset];
    230354
    231355    case BFD_RELOC_VTABLE_INHERIT:
     
    248372
    249373static void
    250 elf_i386_info_to_howto (abfd, cache_ptr, dst)
    251      bfd                *abfd ATTRIBUTE_UNUSED;
    252      arelent            *cache_ptr ATTRIBUTE_UNUSED;
    253      Elf32_Internal_Rela *dst ATTRIBUTE_UNUSED;
    254 {
    255   abort ();
    256 }
    257 
    258 static void
    259374elf_i386_info_to_howto_rel (abfd, cache_ptr, dst)
    260375     bfd *abfd ATTRIBUTE_UNUSED;
    261376     arelent *cache_ptr;
    262      Elf32_Internal_Rel *dst;
     377     Elf_Internal_Rela *dst;
    263378{
    264379  unsigned int r_type = ELF32_R_TYPE (dst->r_info);
     
    268383      && ((indx = r_type - R_386_ext_offset) - R_386_standard
    269384          >= R_386_ext - R_386_standard)
    270       && ((indx = r_type - R_386_vt_offset) - R_386_ext
    271           >= R_386_vt - R_386_ext))
     385      && ((indx = r_type - R_386_tls_offset) - R_386_ext
     386          >= R_386_tls - R_386_ext)
     387      && ((indx = r_type - R_386_vt_offset) - R_386_tls
     388          >= R_386_vt - R_386_tls))
    272389    {
    273390      (*_bfd_error_handler) (_("%s: invalid relocation type %d"),
    274                              bfd_get_filename (abfd), (int) r_type);
     391                             bfd_archive_filename (abfd), (int) r_type);
    275392      indx = (unsigned int) R_386_NONE;
    276393    }
     
    284401   _bfd_elf_is_local_label_name.  */
    285402
    286 static boolean
     403static bfd_boolean
    287404elf_i386_is_local_label_name (abfd, name)
    288405     bfd *abfd;
     
    290407{
    291408  if (name[0] == '.' && name[1] == 'X')
    292     return true;
     409    return TRUE;
    293410
    294411  return _bfd_elf_is_local_label_name (abfd, name);
     
    296413
    297414
    298 /* Functions for the i386 ELF linker.  */
     415/* Support for core dump NOTE sections.  */
     416static bfd_boolean
     417elf_i386_grok_prstatus (abfd, note)
     418     bfd *abfd;
     419     Elf_Internal_Note *note;
     420{
     421  int offset;
     422  size_t raw_size;
     423
     424  switch (note->descsz)
     425    {
     426      default:
     427        return FALSE;
     428
     429      case 144:         /* Linux/i386 */
     430        /* pr_cursig */
     431        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
     432
     433        /* pr_pid */
     434        elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
     435
     436        /* pr_reg */
     437        offset = 72;
     438        raw_size = 68;
     439
     440        break;
     441    }
     442
     443  /* Make a ".reg/999" section.  */
     444  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
     445                                          raw_size, note->descpos + offset);
     446}
     447
     448static bfd_boolean
     449elf_i386_grok_psinfo (abfd, note)
     450     bfd *abfd;
     451     Elf_Internal_Note *note;
     452{
     453  switch (note->descsz)
     454    {
     455      default:
     456        return FALSE;
     457
     458      case 124:         /* Linux/i386 elf_prpsinfo */
     459        elf_tdata (abfd)->core_program
     460         = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
     461        elf_tdata (abfd)->core_command
     462         = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
     463    }
     464
     465  /* Note that for some reason, a spurious space is tacked
     466     onto the end of the args in some (at least one anyway)
     467     implementations, so strip it off if it exists.  */
     468
     469  {
     470    char *command = elf_tdata (abfd)->core_command;
     471    int n = strlen (command);
     472
     473    if (0 < n && command[n - 1] == ' ')
     474      command[n - 1] = '\0';
     475  }
     476
     477  return TRUE;
     478}
     479
     480
     481/* Functions for the i386 ELF linker.
     482
     483   In order to gain some understanding of code in this file without
     484   knowing all the intricate details of the linker, note the
     485   following:
     486
     487   Functions named elf_i386_* are called by external routines, other
     488   functions are only called locally.  elf_i386_* functions appear
     489   in this file more or less in the order in which they are called
     490   from external routines.  eg. elf_i386_check_relocs is called
     491   early in the link process, elf_i386_finish_dynamic_sections is
     492   one of the last functions.  */
     493
    299494
    300495/* The name of the dynamic interpreter.  This is put in the .interp
     
    302497
    303498#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
     499
     500/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
     501   copying dynamic variables from a shared lib into an app's dynbss
     502   section, and instead use a dynamic relocation to point into the
     503   shared lib.  */
     504#define ELIMINATE_COPY_RELOCS 1
    304505
    305506/* The size in bytes of an entry in the procedure linkage table.  */
     
    354555
    355556/* The i386 linker needs to keep track of the number of relocs that it
    356    decides to copy in check_relocs for each symbol.  This is so that
    357    it can discard PC relative relocs if it doesn't need them when
    358    linking with -Bsymbolic.  We store the information in a field
    359    extending the regular ELF linker hash table.  */
    360 
    361 /* This structure keeps track of the number of PC relative relocs we
    362    have copied for a given symbol.  */
    363 
    364 struct elf_i386_pcrel_relocs_copied
    365 {
    366   /* Next section.  */
    367   struct elf_i386_pcrel_relocs_copied *next;
    368   /* A section in dynobj.  */
    369   asection *section;
    370   /* Number of relocs copied in this section.  */
     557   decides to copy as dynamic relocs in check_relocs for each symbol.
     558   This is so that it can later discard them if they are found to be
     559   unnecessary.  We store the information in a field extending the
     560   regular ELF linker hash table.  */
     561
     562struct elf_i386_dyn_relocs
     563{
     564  struct elf_i386_dyn_relocs *next;
     565
     566  /* The input section of the reloc.  */
     567  asection *sec;
     568
     569  /* Total number of relocs copied for the input section.  */
    371570  bfd_size_type count;
     571
     572  /* Number of pc-relative relocs copied for the input section.  */
     573  bfd_size_type pc_count;
    372574};
    373575
     
    376578struct elf_i386_link_hash_entry
    377579{
    378   struct elf_link_hash_entry root;
    379 
    380   /* Number of PC relative relocs copied for this symbol.  */
    381   struct elf_i386_pcrel_relocs_copied *pcrel_relocs_copied;
     580  struct elf_link_hash_entry elf;
     581
     582  /* Track dynamic relocs copied for this symbol.  */
     583  struct elf_i386_dyn_relocs *dyn_relocs;
     584
     585#define GOT_UNKNOWN     0
     586#define GOT_NORMAL      1
     587#define GOT_TLS_GD      2
     588#define GOT_TLS_IE      4
     589#define GOT_TLS_IE_POS  5
     590#define GOT_TLS_IE_NEG  6
     591#define GOT_TLS_IE_BOTH 7
     592  unsigned char tls_type;
    382593};
    383594
     595#define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent))
     596
     597struct elf_i386_obj_tdata
     598{
     599  struct elf_obj_tdata root;
     600
     601  /* tls_type for each local got entry.  */
     602  char *local_got_tls_type;
     603};
     604
     605#define elf_i386_tdata(abfd) \
     606  ((struct elf_i386_obj_tdata *) (abfd)->tdata.any)
     607
     608#define elf_i386_local_got_tls_type(abfd) \
     609  (elf_i386_tdata (abfd)->local_got_tls_type)
     610
     611static bfd_boolean
     612elf_i386_mkobject (abfd)
     613     bfd *abfd;
     614{
     615  bfd_size_type amt = sizeof (struct elf_i386_obj_tdata);
     616  abfd->tdata.any = bfd_zalloc (abfd, amt);
     617  if (abfd->tdata.any == NULL)
     618    return FALSE;
     619  return TRUE;
     620}
     621
     622static bfd_boolean
     623elf_i386_object_p (abfd)
     624  bfd *abfd;
     625{
     626  /* Allocate our special target data.  */
     627  struct elf_i386_obj_tdata *new_tdata;
     628  bfd_size_type amt = sizeof (struct elf_i386_obj_tdata);
     629  new_tdata = bfd_zalloc (abfd, amt);
     630  if (new_tdata == NULL)
     631    return FALSE;
     632  new_tdata->root = *abfd->tdata.elf_obj_data;
     633  abfd->tdata.any = new_tdata;
     634  return TRUE;
     635}
     636
    384637/* i386 ELF linker hash table.  */
    385638
    386639struct elf_i386_link_hash_table
    387640{
    388   struct elf_link_hash_table root;
     641  struct elf_link_hash_table elf;
     642
     643  /* Short-cuts to get to dynamic linker sections.  */
     644  asection *sgot;
     645  asection *sgotplt;
     646  asection *srelgot;
     647  asection *splt;
     648  asection *srelplt;
     649  asection *sdynbss;
     650  asection *srelbss;
     651
     652  union {
     653    bfd_signed_vma refcount;
     654    bfd_vma offset;
     655  } tls_ldm_got;
     656
     657  /* Small local sym to section mapping cache.  */
     658  struct sym_sec_cache sym_sec;
    389659};
    390 
    391 /* Declare this now that the above structures are defined.  */
    392 
    393 static boolean elf_i386_discard_copies
    394   PARAMS ((struct elf_i386_link_hash_entry *, PTR));
    395 
    396 /* Traverse an i386 ELF linker hash table.  */
    397 
    398 #define elf_i386_link_hash_traverse(table, func, info)                  \
    399   (elf_link_hash_traverse                                               \
    400    (&(table)->root,                                                     \
    401     (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
    402     (info)))
    403660
    404661/* Get the i386 ELF linker hash table from a link_info structure.  */
     
    410667
    411668static struct bfd_hash_entry *
    412 elf_i386_link_hash_newfunc (entry, table, string)
     669link_hash_newfunc (entry, table, string)
    413670     struct bfd_hash_entry *entry;
    414671     struct bfd_hash_table *table;
    415672     const char *string;
    416673{
    417   struct elf_i386_link_hash_entry *ret =
    418     (struct elf_i386_link_hash_entry *) entry;
    419 
    420674  /* Allocate the structure if it has not already been allocated by a
    421675     subclass.  */
    422   if (ret == (struct elf_i386_link_hash_entry *) NULL)
    423     ret = ((struct elf_i386_link_hash_entry *)
    424            bfd_hash_allocate (table,
    425                               sizeof (struct elf_i386_link_hash_entry)));
    426   if (ret == (struct elf_i386_link_hash_entry *) NULL)
    427     return (struct bfd_hash_entry *) ret;
     676  if (entry == NULL)
     677    {
     678      entry = bfd_hash_allocate (table,
     679                                 sizeof (struct elf_i386_link_hash_entry));
     680      if (entry == NULL)
     681        return entry;
     682    }
    428683
    429684  /* Call the allocation method of the superclass.  */
    430   ret = ((struct elf_i386_link_hash_entry *)
    431          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
    432                                      table, string));
    433   if (ret != (struct elf_i386_link_hash_entry *) NULL)
    434     {
    435       ret->pcrel_relocs_copied = NULL;
    436     }
    437 
    438   return (struct bfd_hash_entry *) ret;
     685  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
     686  if (entry != NULL)
     687    {
     688      struct elf_i386_link_hash_entry *eh;
     689
     690      eh = (struct elf_i386_link_hash_entry *) entry;
     691      eh->dyn_relocs = NULL;
     692      eh->tls_type = GOT_UNKNOWN;
     693    }
     694
     695  return entry;
    439696}
    440697
     
    446703{
    447704  struct elf_i386_link_hash_table *ret;
    448 
    449   ret = ((struct elf_i386_link_hash_table *)
    450          bfd_alloc (abfd, sizeof (struct elf_i386_link_hash_table)));
    451   if (ret == (struct elf_i386_link_hash_table *) NULL)
     705  bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
     706
     707  ret = (struct elf_i386_link_hash_table *) bfd_malloc (amt);
     708  if (ret == NULL)
    452709    return NULL;
    453710
    454   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
    455                                        elf_i386_link_hash_newfunc))
    456     {
    457       bfd_release (abfd, ret);
     711  if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
     712    {
     713      free (ret);
    458714      return NULL;
    459715    }
    460716
    461   return &ret->root.root;
     717  ret->sgot = NULL;
     718  ret->sgotplt = NULL;
     719  ret->srelgot = NULL;
     720  ret->splt = NULL;
     721  ret->srelplt = NULL;
     722  ret->sdynbss = NULL;
     723  ret->srelbss = NULL;
     724  ret->tls_ldm_got.refcount = 0;
     725  ret->sym_sec.abfd = NULL;
     726
     727  return &ret->elf.root;
    462728}
    463729
     730/* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
     731   shortcuts to them in our hash table.  */
     732
     733static bfd_boolean
     734create_got_section (dynobj, info)
     735     bfd *dynobj;
     736     struct bfd_link_info *info;
     737{
     738  struct elf_i386_link_hash_table *htab;
     739
     740  if (! _bfd_elf_create_got_section (dynobj, info))
     741    return FALSE;
     742
     743  htab = elf_i386_hash_table (info);
     744  htab->sgot = bfd_get_section_by_name (dynobj, ".got");
     745  htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
     746  if (!htab->sgot || !htab->sgotplt)
     747    abort ();
     748
     749  htab->srelgot = bfd_make_section (dynobj, ".rel.got");
     750  if (htab->srelgot == NULL
     751      || ! bfd_set_section_flags (dynobj, htab->srelgot,
     752                                  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
     753                                   | SEC_IN_MEMORY | SEC_LINKER_CREATED
     754                                   | SEC_READONLY))
     755      || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
     756    return FALSE;
     757  return TRUE;
     758}
     759
     760/* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
     761   .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
     762   hash table.  */
     763
     764static bfd_boolean
     765elf_i386_create_dynamic_sections (dynobj, info)
     766     bfd *dynobj;
     767     struct bfd_link_info *info;
     768{
     769  struct elf_i386_link_hash_table *htab;
     770
     771  htab = elf_i386_hash_table (info);
     772  if (!htab->sgot && !create_got_section (dynobj, info))
     773    return FALSE;
     774
     775  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
     776    return FALSE;
     777
     778  htab->splt = bfd_get_section_by_name (dynobj, ".plt");
     779  htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
     780  htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
     781  if (!info->shared)
     782    htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
     783
     784  if (!htab->splt || !htab->srelplt || !htab->sdynbss
     785      || (!info->shared && !htab->srelbss))
     786    abort ();
     787
     788  return TRUE;
     789}
     790
     791/* Copy the extra info we tack onto an elf_link_hash_entry.  */
     792
     793static void
     794elf_i386_copy_indirect_symbol (bed, dir, ind)
     795     struct elf_backend_data *bed;
     796     struct elf_link_hash_entry *dir, *ind;
     797{
     798  struct elf_i386_link_hash_entry *edir, *eind;
     799
     800  edir = (struct elf_i386_link_hash_entry *) dir;
     801  eind = (struct elf_i386_link_hash_entry *) ind;
     802
     803  if (eind->dyn_relocs != NULL)
     804    {
     805      if (edir->dyn_relocs != NULL)
     806        {
     807          struct elf_i386_dyn_relocs **pp;
     808          struct elf_i386_dyn_relocs *p;
     809
     810          if (ind->root.type == bfd_link_hash_indirect)
     811            abort ();
     812
     813          /* Add reloc counts against the weak sym to the strong sym
     814             list.  Merge any entries against the same section.  */
     815          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
     816            {
     817              struct elf_i386_dyn_relocs *q;
     818
     819              for (q = edir->dyn_relocs; q != NULL; q = q->next)
     820                if (q->sec == p->sec)
     821                  {
     822                    q->pc_count += p->pc_count;
     823                    q->count += p->count;
     824                    *pp = p->next;
     825                    break;
     826                  }
     827              if (q == NULL)
     828                pp = &p->next;
     829            }
     830          *pp = edir->dyn_relocs;
     831        }
     832
     833      edir->dyn_relocs = eind->dyn_relocs;
     834      eind->dyn_relocs = NULL;
     835    }
     836
     837  if (ind->root.type == bfd_link_hash_indirect
     838      && dir->got.refcount <= 0)
     839    {
     840      edir->tls_type = eind->tls_type;
     841      eind->tls_type = GOT_UNKNOWN;
     842    }
     843
     844  if (ELIMINATE_COPY_RELOCS
     845      && ind->root.type != bfd_link_hash_indirect
     846      && (dir->elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0)
     847    /* If called to transfer flags for a weakdef during processing
     848       of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
     849       We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
     850    dir->elf_link_hash_flags |=
     851      (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
     852                                   | ELF_LINK_HASH_REF_REGULAR
     853                                   | ELF_LINK_HASH_REF_REGULAR_NONWEAK));
     854  else
     855    _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
     856}
     857
     858static int
     859elf_i386_tls_transition (info, r_type, is_local)
     860     struct bfd_link_info *info;
     861     int r_type;
     862     int is_local;
     863{
     864  if (info->shared)
     865    return r_type;
     866
     867  switch (r_type)
     868    {
     869    case R_386_TLS_GD:
     870    case R_386_TLS_IE_32:
     871      if (is_local)
     872        return R_386_TLS_LE_32;
     873      return R_386_TLS_IE_32;
     874    case R_386_TLS_IE:
     875    case R_386_TLS_GOTIE:
     876      if (is_local)
     877        return R_386_TLS_LE_32;
     878      return r_type;
     879    case R_386_TLS_LDM:
     880      return R_386_TLS_LE_32;
     881    }
     882
     883  return r_type;
     884}
     885
    464886/* Look through the relocs for a section during the first phase, and
    465    allocate space in the global offset table or procedure linkage
    466    table.  */
    467 
    468 static boolean
     887   calculate needed space in the global offset table, procedure linkage
     888   table, and dynamic reloc sections.  */
     889
     890static bfd_boolean
    469891elf_i386_check_relocs (abfd, info, sec, relocs)
    470892     bfd *abfd;
     
    473895     const Elf_Internal_Rela *relocs;
    474896{
    475   bfd *dynobj;
     897  struct elf_i386_link_hash_table *htab;
    476898  Elf_Internal_Shdr *symtab_hdr;
    477899  struct elf_link_hash_entry **sym_hashes;
    478   bfd_signed_vma *local_got_refcounts;
    479900  const Elf_Internal_Rela *rel;
    480901  const Elf_Internal_Rela *rel_end;
    481   asection *sgot;
    482   asection *srelgot;
    483902  asection *sreloc;
    484903
    485904  if (info->relocateable)
    486     return true;
    487 
    488   dynobj = elf_hash_table (info)->dynobj;
     905    return TRUE;
     906
     907  htab = elf_i386_hash_table (info);
    489908  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
    490909  sym_hashes = elf_sym_hashes (abfd);
    491   local_got_refcounts = elf_local_got_refcounts (abfd);
    492 
    493   sgot = NULL;
    494   srelgot = NULL;
     910
    495911  sreloc = NULL;
    496912
     
    498914  for (rel = relocs; rel < rel_end; rel++)
    499915    {
     916      unsigned int r_type;
    500917      unsigned long r_symndx;
    501918      struct elf_link_hash_entry *h;
    502919
    503920      r_symndx = ELF32_R_SYM (rel->r_info);
     921      r_type = ELF32_R_TYPE (rel->r_info);
    504922
    505923      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
    506924        {
    507           if (abfd->my_archive)
    508             (*_bfd_error_handler) (_("%s(%s): bad symbol index: %d"),
    509                                    bfd_get_filename (abfd->my_archive),
    510                                    bfd_get_filename (abfd),
    511                                    r_symndx);
    512           else
    513             (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
    514                                    bfd_get_filename (abfd),
    515                                    r_symndx);
    516           return false;
     925          (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
     926                                 bfd_archive_filename (abfd),
     927                                 r_symndx);
     928          return FALSE;
    517929        }
    518930
     
    522934        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
    523935
    524       /* Some relocs require a global offset table.  */
    525       if (dynobj == NULL)
    526         {
    527           switch (ELF32_R_TYPE (rel->r_info))
    528             {
    529             case R_386_GOT32:
    530             case R_386_GOTOFF:
    531             case R_386_GOTPC:
    532               elf_hash_table (info)->dynobj = dynobj = abfd;
    533               if (! _bfd_elf_create_got_section (dynobj, info))
    534                 return false;
    535               break;
    536 
    537             default:
    538               break;
    539             }
    540         }
    541 
    542       switch (ELF32_R_TYPE (rel->r_info))
    543         {
    544         case R_386_GOT32:
    545           /* This symbol requires a global offset table entry.  */
    546 
    547           if (sgot == NULL)
    548             {
    549               sgot = bfd_get_section_by_name (dynobj, ".got");
    550               BFD_ASSERT (sgot != NULL);
    551             }
    552 
    553           if (srelgot == NULL
    554               && (h != NULL || info->shared))
    555             {
    556               srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
    557               if (srelgot == NULL)
    558                 {
    559                   srelgot = bfd_make_section (dynobj, ".rel.got");
    560                   if (srelgot == NULL
    561                       || ! bfd_set_section_flags (dynobj, srelgot,
    562                                                   (SEC_ALLOC
    563                                                    | SEC_LOAD
    564                                                    | SEC_HAS_CONTENTS
    565                                                    | SEC_IN_MEMORY
    566                                                    | SEC_LINKER_CREATED
    567                                                    | SEC_READONLY))
    568                       || ! bfd_set_section_alignment (dynobj, srelgot, 2))
    569                     return false;
    570                 }
    571             }
    572 
    573           if (h != NULL)
    574             {
    575               if (h->got.refcount == -1)
    576                 {
    577                   h->got.refcount = 1;
    578 
    579                   /* Make sure this symbol is output as a dynamic symbol.  */
    580                   if (h->dynindx == -1)
    581                     {
    582                       if (! bfd_elf32_link_record_dynamic_symbol (info, h))
    583                         return false;
    584                     }
    585 
    586                   sgot->_raw_size += 4;
    587                   srelgot->_raw_size += sizeof (Elf32_External_Rel);
    588                 }
    589               else
    590                 h->got.refcount += 1;
    591             }
    592           else
    593             {
    594               /* This is a global offset table entry for a local symbol.  */
    595               if (local_got_refcounts == NULL)
    596                 {
    597                   size_t size;
    598 
    599                   size = symtab_hdr->sh_info * sizeof (bfd_signed_vma);
    600                   local_got_refcounts = ((bfd_signed_vma *)
    601                                          bfd_alloc (abfd, size));
    602                   if (local_got_refcounts == NULL)
    603                     return false;
    604                   elf_local_got_refcounts (abfd) = local_got_refcounts;
    605                   memset (local_got_refcounts, -1, size);
    606                 }
    607               if (local_got_refcounts[r_symndx] == -1)
    608                 {
    609                   local_got_refcounts[r_symndx] = 1;
    610 
    611                   sgot->_raw_size += 4;
    612                   if (info->shared)
    613                     {
    614                       /* If we are generating a shared object, we need to
    615                          output a R_386_RELATIVE reloc so that the dynamic
    616                          linker can adjust this GOT entry.  */
    617                       srelgot->_raw_size += sizeof (Elf32_External_Rel);
    618                     }
    619                 }
    620               else
    621                 local_got_refcounts[r_symndx] += 1;
    622             }
    623           break;
     936      r_type = elf_i386_tls_transition (info, r_type, h == NULL);
     937
     938      switch (r_type)
     939        {
     940        case R_386_TLS_LDM:
     941          htab->tls_ldm_got.refcount += 1;
     942          goto create_got;
    624943
    625944        case R_386_PLT32:
    626945          /* This symbol requires a procedure linkage table entry.  We
    627              actually build the entry in adjust_dynamic_symbol,
    628              because this might be a case of linking PIC code which is
    629              never referenced by a dynamic object, in which case we
    630              don't need to generate a procedure linkage table entry
    631              after all.  */
     946             actually build the entry in adjust_dynamic_symbol,
     947             because this might be a case of linking PIC code which is
     948             never referenced by a dynamic object, in which case we
     949             don't need to generate a procedure linkage table entry
     950             after all.  */
    632951
    633952          /* If this is a local symbol, we resolve it directly without
    634              creating a procedure linkage table entry.  */
     953             creating a procedure linkage table entry.  */
    635954          if (h == NULL)
    636955            continue;
    637956
    638           if (h->plt.refcount == -1)
    639             {
    640               h->plt.refcount = 1;
    641               h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
    642             }
    643           else
    644             h->plt.refcount += 1;
     957          h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
     958          h->plt.refcount += 1;
    645959          break;
     960
     961        case R_386_TLS_IE_32:
     962        case R_386_TLS_IE:
     963        case R_386_TLS_GOTIE:
     964          if (info->shared)
     965            info->flags |= DF_STATIC_TLS;
     966          /* Fall through */
     967
     968        case R_386_GOT32:
     969        case R_386_TLS_GD:
     970          /* This symbol requires a global offset table entry.  */
     971          {
     972            int tls_type, old_tls_type;
     973
     974            switch (r_type)
     975              {
     976              default:
     977              case R_386_GOT32: tls_type = GOT_NORMAL; break;
     978              case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
     979              case R_386_TLS_IE_32:
     980                if (ELF32_R_TYPE (rel->r_info) == r_type)
     981                  tls_type = GOT_TLS_IE_NEG;
     982                else
     983                  /* If this is a GD->IE transition, we may use either of
     984                     R_386_TLS_TPOFF and R_386_TLS_TPOFF32.  */
     985                  tls_type = GOT_TLS_IE;
     986                break;
     987              case R_386_TLS_IE:
     988              case R_386_TLS_GOTIE:
     989                tls_type = GOT_TLS_IE_POS; break;
     990              }
     991
     992            if (h != NULL)
     993              {
     994                h->got.refcount += 1;
     995                old_tls_type = elf_i386_hash_entry(h)->tls_type;
     996              }
     997            else
     998              {
     999                bfd_signed_vma *local_got_refcounts;
     1000
     1001                /* This is a global offset table entry for a local symbol.  */
     1002                local_got_refcounts = elf_local_got_refcounts (abfd);
     1003                if (local_got_refcounts == NULL)
     1004                  {
     1005                    bfd_size_type size;
     1006
     1007                    size = symtab_hdr->sh_info;
     1008                    size *= (sizeof (bfd_signed_vma) + sizeof(char));
     1009                    local_got_refcounts = ((bfd_signed_vma *)
     1010                                           bfd_zalloc (abfd, size));
     1011                    if (local_got_refcounts == NULL)
     1012                      return FALSE;
     1013                    elf_local_got_refcounts (abfd) = local_got_refcounts;
     1014                    elf_i386_local_got_tls_type (abfd)
     1015                      = (char *) (local_got_refcounts + symtab_hdr->sh_info);
     1016                  }
     1017                local_got_refcounts[r_symndx] += 1;
     1018                old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
     1019              }
     1020
     1021            if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
     1022              tls_type |= old_tls_type;
     1023            /* If a TLS symbol is accessed using IE at least once,
     1024               there is no point to use dynamic model for it.  */
     1025            else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
     1026                     && (old_tls_type != GOT_TLS_GD
     1027                         || (tls_type & GOT_TLS_IE) == 0))
     1028              {
     1029                if ((old_tls_type & GOT_TLS_IE) && tls_type == GOT_TLS_GD)
     1030                  tls_type = old_tls_type;
     1031                else
     1032                  {
     1033                    (*_bfd_error_handler)
     1034                      (_("%s: `%s' accessed both as normal and thread local symbol"),
     1035                       bfd_archive_filename (abfd),
     1036                       h ? h->root.root.string : "<local>");
     1037                    return FALSE;
     1038                  }
     1039              }
     1040
     1041            if (old_tls_type != tls_type)
     1042              {
     1043                if (h != NULL)
     1044                  elf_i386_hash_entry (h)->tls_type = tls_type;
     1045                else
     1046                  elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
     1047              }
     1048          }
     1049          /* Fall through */
     1050
     1051        case R_386_GOTOFF:
     1052        case R_386_GOTPC:
     1053        create_got:
     1054          if (htab->sgot == NULL)
     1055            {
     1056              if (htab->elf.dynobj == NULL)
     1057                htab->elf.dynobj = abfd;
     1058              if (!create_got_section (htab->elf.dynobj, info))
     1059                return FALSE;
     1060            }
     1061          if (r_type != R_386_TLS_IE)
     1062            break;
     1063          /* Fall through */
     1064
     1065        case R_386_TLS_LE_32:
     1066        case R_386_TLS_LE:
     1067          if (!info->shared)
     1068            break;
     1069          info->flags |= DF_STATIC_TLS;
     1070          /* Fall through */
    6461071
    6471072        case R_386_32:
    6481073        case R_386_PC32:
    649           if (h != NULL)
    650             h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
     1074          if (h != NULL && !info->shared)
     1075            {
     1076              /* If this reloc is in a read-only section, we might
     1077                 need a copy reloc.  We can't check reliably at this
     1078                 stage whether the section is read-only, as input
     1079                 sections have not yet been mapped to output sections.
     1080                 Tentatively set the flag for now, and correct in
     1081                 adjust_dynamic_symbol.  */
     1082              h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
     1083
     1084              /* We may need a .plt entry if the function this reloc
     1085                 refers to is in a shared lib.  */
     1086              h->plt.refcount += 1;
     1087            }
    6511088
    6521089          /* If we are creating a shared library, and this is a reloc
     
    6611098             later (it is never cleared).  In case of a weak definition,
    6621099             DEF_REGULAR may be cleared later by a strong definition in
    663              a shared library. We account for that possibility below by
     1100             a shared library.  We account for that possibility below by
    6641101             storing information in the relocs_copied field of the hash
    6651102             table entry.  A similar situation occurs when creating
    6661103             shared libraries and symbol visibility changes render the
    667              symbol local.  */
    668           if (info->shared
    669               && (sec->flags & SEC_ALLOC) != 0
    670               && (ELF32_R_TYPE (rel->r_info) != R_386_PC32
    671                   || (h != NULL
    672                       && (! info->symbolic
    673                           || h->root.type == bfd_link_hash_defweak
    674                           || (h->elf_link_hash_flags
    675                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
    676             {
    677               /* When creating a shared object, we must copy these
    678                  reloc types into the output file.  We create a reloc
    679                  section in dynobj and make room for this reloc.  */
     1104             symbol local.
     1105
     1106             If on the other hand, we are creating an executable, we
     1107             may need to keep relocations for symbols satisfied by a
     1108             dynamic library if we manage to avoid copy relocs for the
     1109             symbol.  */
     1110          if ((info->shared
     1111               && (sec->flags & SEC_ALLOC) != 0
     1112               && (r_type != R_386_PC32
     1113                   || (h != NULL
     1114                       && (! info->symbolic
     1115                           || h->root.type == bfd_link_hash_defweak
     1116                           || (h->elf_link_hash_flags
     1117                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
     1118              || (ELIMINATE_COPY_RELOCS
     1119                  && !info->shared
     1120                  && (sec->flags & SEC_ALLOC) != 0
     1121                  && h != NULL
     1122                  && (h->root.type == bfd_link_hash_defweak
     1123                      || (h->elf_link_hash_flags
     1124                          & ELF_LINK_HASH_DEF_REGULAR) == 0)))
     1125            {
     1126              struct elf_i386_dyn_relocs *p;
     1127              struct elf_i386_dyn_relocs **head;
     1128
     1129              /* We must copy these reloc types into the output file.
     1130                 Create a reloc section in dynobj and make room for
     1131                 this reloc.  */
    6801132              if (sreloc == NULL)
    6811133                {
    6821134                  const char *name;
    683 
    684                   name = (bfd_elf_string_from_elf_section
    685                           (abfd,
    686                            elf_elfheader (abfd)->e_shstrndx,
    687                            elf_section_data (sec)->rel_hdr.sh_name));
     1135                  bfd *dynobj;
     1136                  unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
     1137                  unsigned int shnam = elf_section_data (sec)->rel_hdr.sh_name;
     1138
     1139                  name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
    6881140                  if (name == NULL)
    689                     return false;
     1141                    return FALSE;
    6901142
    6911143                  if (strncmp (name, ".rel", 4) != 0
     
    6931145                                 name + 4) != 0)
    6941146                    {
    695                       if (abfd->my_archive)
    696                         (*_bfd_error_handler) (_("%s(%s): bad relocation section name `%s\'"),
    697                                                bfd_get_filename (abfd->my_archive),
    698                                                bfd_get_filename (abfd),
    699                                                name);
    700                       else
    701                         (*_bfd_error_handler) (_("%s: bad relocation section name `%s\'"),
    702                                                bfd_get_filename (abfd),
    703                                                name);
     1147                      (*_bfd_error_handler)
     1148                        (_("%s: bad relocation section name `%s\'"),
     1149                         bfd_archive_filename (abfd), name);
    7041150                    }
    7051151
     1152                  if (htab->elf.dynobj == NULL)
     1153                    htab->elf.dynobj = abfd;
     1154
     1155                  dynobj = htab->elf.dynobj;
    7061156                  sreloc = bfd_get_section_by_name (dynobj, name);
    7071157                  if (sreloc == NULL)
     
    7171167                          || ! bfd_set_section_flags (dynobj, sreloc, flags)
    7181168                          || ! bfd_set_section_alignment (dynobj, sreloc, 2))
    719                         return false;
     1169                        return FALSE;
    7201170                    }
     1171                  elf_section_data (sec)->sreloc = sreloc;
    7211172                }
    7221173
    723               sreloc->_raw_size += sizeof (Elf32_External_Rel);
    724 
    725               /* If this is a global symbol, we count the number of PC
    726                  relative relocations we have entered for this symbol,
    727                  so that we can discard them later as necessary.  Note
    728                  that this function is only called if we are using an
    729                  elf_i386 linker hash table, which means that h is
    730                  really a pointer to an elf_i386_link_hash_entry.  */
    731               if (h != NULL
    732                   && ELF32_R_TYPE (rel->r_info) == R_386_PC32)
     1174              /* If this is a global symbol, we count the number of
     1175                 relocations we need for this symbol.  */
     1176              if (h != NULL)
    7331177                {
    734                   struct elf_i386_link_hash_entry *eh;
    735                   struct elf_i386_pcrel_relocs_copied *p;
    736 
    737                   eh = (struct elf_i386_link_hash_entry *) h;
    738 
    739                   for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
    740                     if (p->section == sreloc)
    741                       break;
    742 
     1178                  head = &((struct elf_i386_link_hash_entry *) h)->dyn_relocs;
     1179                }
     1180              else
     1181                {
     1182                  /* Track dynamic relocs needed for local syms too.
     1183                     We really need local syms available to do this
     1184                     easily.  Oh well.  */
     1185
     1186                  asection *s;
     1187                  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
     1188                                                 sec, r_symndx);
     1189                  if (s == NULL)
     1190                    return FALSE;
     1191
     1192                  head = ((struct elf_i386_dyn_relocs **)
     1193                          &elf_section_data (s)->local_dynrel);
     1194                }
     1195
     1196              p = *head;
     1197              if (p == NULL || p->sec != sec)
     1198                {
     1199                  bfd_size_type amt = sizeof *p;
     1200                  p = ((struct elf_i386_dyn_relocs *)
     1201                       bfd_alloc (htab->elf.dynobj, amt));
    7431202                  if (p == NULL)
    744                     {
    745                       p = ((struct elf_i386_pcrel_relocs_copied *)
    746                            bfd_alloc (dynobj, sizeof *p));
    747                       if (p == NULL)
    748                         return false;
    749                       p->next = eh->pcrel_relocs_copied;
    750                       eh->pcrel_relocs_copied = p;
    751                       p->section = sreloc;
    752                       p->count = 0;
    753                     }
    754 
    755                   ++p->count;
     1203                    return FALSE;
     1204                  p->next = *head;
     1205                  *head = p;
     1206                  p->sec = sec;
     1207                  p->count = 0;
     1208                  p->pc_count = 0;
    7561209                }
    757             }
    758 
     1210
     1211              p->count += 1;
     1212              if (r_type == R_386_PC32)
     1213                p->pc_count += 1;
     1214            }
    7591215          break;
    7601216
     
    7631219        case R_386_GNU_VTINHERIT:
    7641220          if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
    765             return false;
     1221            return FALSE;
    7661222          break;
    7671223
     
    7701226        case R_386_GNU_VTENTRY:
    7711227          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
    772             return false;
     1228            return FALSE;
    7731229          break;
    7741230
     
    7781234    }
    7791235
    780   return true;
     1236  return TRUE;
    7811237}
    7821238
     
    7851241
    7861242static asection *
    787 elf_i386_gc_mark_hook (abfd, info, rel, h, sym)
    788      bfd *abfd;
     1243elf_i386_gc_mark_hook (sec, info, rel, h, sym)
     1244     asection *sec;
    7891245     struct bfd_link_info *info ATTRIBUTE_UNUSED;
    7901246     Elf_Internal_Rela *rel;
     
    8161272    }
    8171273  else
    818     {
    819       if (!(elf_bad_symtab (abfd)
    820             && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
    821           && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
    822                 && sym->st_shndx != SHN_COMMON))
    823         {
    824           return bfd_section_from_elf_index (abfd, sym->st_shndx);
    825         }
    826     }
     1274    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
    8271275
    8281276  return NULL;
     
    8311279/* Update the got entry reference counts for the section being removed.  */
    8321280
    833 static boolean
     1281static bfd_boolean
    8341282elf_i386_gc_sweep_hook (abfd, info, sec, relocs)
    8351283     bfd *abfd;
     
    8421290  bfd_signed_vma *local_got_refcounts;
    8431291  const Elf_Internal_Rela *rel, *relend;
    844   unsigned long r_symndx;
    845   struct elf_link_hash_entry *h;
    846   bfd *dynobj;
    847   asection *sgot;
    848   asection *srelgot;
     1292
     1293  elf_section_data (sec)->local_dynrel = NULL;
    8491294
    8501295  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
     
    8521297  local_got_refcounts = elf_local_got_refcounts (abfd);
    8531298
    854   dynobj = elf_hash_table (info)->dynobj;
    855   if (dynobj == NULL)
    856     return true;
    857 
    858   sgot = bfd_get_section_by_name (dynobj, ".got");
    859   srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
    860 
    8611299  relend = relocs + sec->reloc_count;
    8621300  for (rel = relocs; rel < relend; rel++)
    863     switch (ELF32_R_TYPE (rel->r_info))
    864       {
    865       case R_386_GOT32:
    866       case R_386_GOTOFF:
    867       case R_386_GOTPC:
    868         r_symndx = ELF32_R_SYM (rel->r_info);
    869         if (r_symndx >= symtab_hdr->sh_info)
    870           {
    871             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
    872             if (h->got.refcount > 0)
     1301    {
     1302      unsigned long r_symndx;
     1303      unsigned int r_type;
     1304      struct elf_link_hash_entry *h = NULL;
     1305
     1306      r_symndx = ELF32_R_SYM (rel->r_info);
     1307      if (r_symndx >= symtab_hdr->sh_info)
     1308        {
     1309          struct elf_i386_link_hash_entry *eh;
     1310          struct elf_i386_dyn_relocs **pp;
     1311          struct elf_i386_dyn_relocs *p;
     1312
     1313          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
     1314          eh = (struct elf_i386_link_hash_entry *) h;
     1315
     1316          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
     1317            if (p->sec == sec)
    8731318              {
     1319                /* Everything must go for SEC.  */
     1320                *pp = p->next;
     1321                break;
     1322              }
     1323        }
     1324
     1325      r_type = ELF32_R_TYPE (rel->r_info);
     1326      r_type = elf_i386_tls_transition (info, r_type, h != NULL);
     1327      switch (r_type)
     1328        {
     1329        case R_386_TLS_LDM:
     1330          if (elf_i386_hash_table (info)->tls_ldm_got.refcount > 0)
     1331            elf_i386_hash_table (info)->tls_ldm_got.refcount -= 1;
     1332          break;
     1333
     1334        case R_386_TLS_GD:
     1335        case R_386_TLS_IE_32:
     1336        case R_386_TLS_IE:
     1337        case R_386_TLS_GOTIE:
     1338        case R_386_GOT32:
     1339          if (h != NULL)
     1340            {
     1341              if (h->got.refcount > 0)
    8741342                h->got.refcount -= 1;
    875                 if (h->got.refcount == 0)
    876                   {
    877                     sgot->_raw_size -= 4;
    878                     srelgot->_raw_size -= sizeof (Elf32_External_Rel);
    879                   }
    880               }
    881           }
    882         else if (local_got_refcounts != NULL)
    883           {
    884             if (local_got_refcounts[r_symndx] > 0)
    885               {
     1343            }
     1344          else if (local_got_refcounts != NULL)
     1345            {
     1346              if (local_got_refcounts[r_symndx] > 0)
    8861347                local_got_refcounts[r_symndx] -= 1;
    887                 if (local_got_refcounts[r_symndx] == 0)
    888                   {
    889                     sgot->_raw_size -= 4;
    890                     if (info->shared)
    891                       srelgot->_raw_size -= sizeof (Elf32_External_Rel);
    892                   }
    893               }
    894           }
    895         break;
    896 
    897       case R_386_PLT32:
    898         r_symndx = ELF32_R_SYM (rel->r_info);
    899         if (r_symndx >= symtab_hdr->sh_info)
    900           {
    901             h = sym_hashes[r_symndx - symtab_hdr->sh_info];
    902             if (h->plt.refcount > 0)
    903               h->plt.refcount -= 1;
    904           }
    905         break;
    906 
    907       default:
    908         break;
    909       }
    910 
    911   return true;
     1348            }
     1349          break;
     1350
     1351        case R_386_32:
     1352        case R_386_PC32:
     1353          if (info->shared)
     1354            break;
     1355          /* Fall through */
     1356
     1357        case R_386_PLT32:
     1358          if (h != NULL)
     1359            {
     1360              if (h->plt.refcount > 0)
     1361                h->plt.refcount -= 1;
     1362            }
     1363          break;
     1364
     1365        default:
     1366          break;
     1367        }
     1368    }
     1369
     1370  return TRUE;
    9121371}
    9131372
     
    9181377   understand.  */
    9191378
    920 static boolean
     1379static bfd_boolean
    9211380elf_i386_adjust_dynamic_symbol (info, h)
    9221381     struct bfd_link_info *info;
    9231382     struct elf_link_hash_entry *h;
    9241383{
    925   bfd *dynobj;
     1384  struct elf_i386_link_hash_table *htab;
    9261385  asection *s;
    9271386  unsigned int power_of_two;
    928 
    929   dynobj = elf_hash_table (info)->dynobj;
    930 
    931   /* Make sure we know what is going on here.  */
    932   BFD_ASSERT (dynobj != NULL
    933               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
    934                   || h->weakdef != NULL
    935                   || ((h->elf_link_hash_flags
    936                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
    937                       && (h->elf_link_hash_flags
    938                           & ELF_LINK_HASH_REF_REGULAR) != 0
    939                       && (h->elf_link_hash_flags
    940                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
    9411387
    9421388  /* If this is a function, put it in the procedure linkage table.  We
     
    9461392      || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
    9471393    {
    948       if ((! info->shared
    949            && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
    950            && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0)
    951           || (info->shared && h->plt.refcount <= 0))
     1394      if (h->plt.refcount <= 0
     1395          || (! info->shared
     1396              && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
     1397              && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
     1398              && h->root.type != bfd_link_hash_undefweak
     1399              && h->root.type != bfd_link_hash_undefined))
    9521400        {
    9531401          /* This case can occur if we saw a PLT32 reloc in an input
     
    9581406          h->plt.offset = (bfd_vma) -1;
    9591407          h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
    960           return true;
    961         }
    962 
    963       /* Make sure this symbol is output as a dynamic symbol.  */
    964       if (h->dynindx == -1)
    965         {
    966           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
    967             return false;
    968         }
    969 
    970       s = bfd_get_section_by_name (dynobj, ".plt");
    971       BFD_ASSERT (s != NULL);
    972 
    973       /* If this is the first .plt entry, make room for the special
    974          first entry.  */
    975       if (s->_raw_size == 0)
    976         s->_raw_size += PLT_ENTRY_SIZE;
    977 
    978       /* If this symbol is not defined in a regular file, and we are
    979          not generating a shared library, then set the symbol to this
    980          location in the .plt.  This is required to make function
    981          pointers compare as equal between the normal executable and
    982          the shared library.  */
    983       if (! info->shared
    984           && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
    985         {
    986           h->root.u.def.section = s;
    987           h->root.u.def.value = s->_raw_size;
    988         }
    989 
    990       h->plt.offset = s->_raw_size;
    991 
    992       /* Make room for this entry.  */
    993       s->_raw_size += PLT_ENTRY_SIZE;
    994 
    995       /* We also need to make an entry in the .got.plt section, which
    996          will be placed in the .got section by the linker script.  */
    997       s = bfd_get_section_by_name (dynobj, ".got.plt");
    998       BFD_ASSERT (s != NULL);
    999       s->_raw_size += 4;
    1000 
    1001       /* We also need to make an entry in the .rel.plt section.  */
    1002       s = bfd_get_section_by_name (dynobj, ".rel.plt");
    1003       BFD_ASSERT (s != NULL);
    1004       s->_raw_size += sizeof (Elf32_External_Rel);
    1005 
    1006       return true;
    1007     }
     1408        }
     1409
     1410      return TRUE;
     1411    }
     1412  else
     1413    /* It's possible that we incorrectly decided a .plt reloc was
     1414       needed for an R_386_PC32 reloc to a non-function sym in
     1415       check_relocs.  We can't decide accurately between function and
     1416       non-function syms in check-relocs;  Objects loaded later in
     1417       the link may change h->type.  So fix it now.  */
     1418    h->plt.offset = (bfd_vma) -1;
    10081419
    10091420  /* If this is a weak symbol, and there is a real definition, the
     
    10161427      h->root.u.def.section = h->weakdef->root.u.def.section;
    10171428      h->root.u.def.value = h->weakdef->root.u.def.value;
    1018       return true;
     1429      if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
     1430        h->elf_link_hash_flags
     1431          = ((h->elf_link_hash_flags & ~ELF_LINK_NON_GOT_REF)
     1432             | (h->weakdef->elf_link_hash_flags & ELF_LINK_NON_GOT_REF));
     1433      return TRUE;
    10191434    }
    10201435
     
    10271442     be handled correctly by relocate_section.  */
    10281443  if (info->shared)
    1029     return true;
     1444    return TRUE;
    10301445
    10311446  /* If there are no references to this symbol that do not use the
    10321447     GOT, we don't need to generate a copy reloc.  */
    10331448  if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
    1034     return true;
     1449    return TRUE;
     1450
     1451  /* If -z nocopyreloc was given, we won't generate them either.  */
     1452  if (info->nocopyreloc)
     1453    {
     1454      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
     1455      return TRUE;
     1456    }
     1457
     1458  if (ELIMINATE_COPY_RELOCS)
     1459    {
     1460      struct elf_i386_link_hash_entry * eh;
     1461      struct elf_i386_dyn_relocs *p;
     1462
     1463      eh = (struct elf_i386_link_hash_entry *) h;
     1464      for (p = eh->dyn_relocs; p != NULL; p = p->next)
     1465        {
     1466          s = p->sec->output_section;
     1467          if (s != NULL && (s->flags & SEC_READONLY) != 0)
     1468            break;
     1469        }
     1470
     1471      /* If we didn't find any dynamic relocs in read-only sections, then
     1472         we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
     1473      if (p == NULL)
     1474        {
     1475          h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
     1476          return TRUE;
     1477        }
     1478    }
    10351479
    10361480  /* We must allocate the symbol in our .dynbss section, which will
     
    10441488     same memory location for the variable.  */
    10451489
    1046   s = bfd_get_section_by_name (dynobj, ".dynbss");
    1047   BFD_ASSERT (s != NULL);
     1490  htab = elf_i386_hash_table (info);
    10481491
    10491492  /* We must generate a R_386_COPY reloc to tell the dynamic linker to
    10501493     copy the initial value out of the dynamic object and into the
    1051      runtime process image.  We need to remember the offset into the
    1052      .rel.bss section we are going to use.  */
     1494     runtime process image.  */
    10531495  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
    10541496    {
    1055       asection *srel;
    1056 
    1057       srel = bfd_get_section_by_name (dynobj, ".rel.bss");
    1058       BFD_ASSERT (srel != NULL);
    1059       srel->_raw_size += sizeof (Elf32_External_Rel);
     1497      htab->srelbss->_raw_size += sizeof (Elf32_External_Rel);
    10601498      h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
    10611499    }
     
    10681506
    10691507  /* Apply the required alignment.  */
    1070   s->_raw_size = BFD_ALIGN (s->_raw_size,
    1071                             (bfd_size_type) (1 << power_of_two));
    1072   if (power_of_two > bfd_get_section_alignment (dynobj, s))
    1073     {
    1074       if (! bfd_set_section_alignment (dynobj, s, power_of_two))
    1075         return false;
     1508  s = htab->sdynbss;
     1509  s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
     1510  if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
     1511    {
     1512      if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
     1513        return FALSE;
    10761514    }
    10771515
     
    10831521  s->_raw_size += h->size;
    10841522
    1085   return true;
     1523  return TRUE;
    10861524}
    10871525
     1526/* This is the condition under which elf_i386_finish_dynamic_symbol
     1527   will be called from elflink.h.  If elflink.h doesn't call our
     1528   finish_dynamic_symbol routine, we'll need to do something about
     1529   initializing any .plt and .got entries in elf_i386_relocate_section.  */
     1530#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \
     1531  ((DYN)                                                                \
     1532   && ((SHARED)                                                         \
     1533       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)      \
     1534   && ((H)->dynindx != -1                                               \
     1535       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
     1536
     1537/* Allocate space in .plt, .got and associated reloc sections for
     1538   dynamic relocs.  */
     1539
     1540static bfd_boolean
     1541allocate_dynrelocs (h, inf)
     1542     struct elf_link_hash_entry *h;
     1543     PTR inf;
     1544{
     1545  struct bfd_link_info *info;
     1546  struct elf_i386_link_hash_table *htab;
     1547  struct elf_i386_link_hash_entry *eh;
     1548  struct elf_i386_dyn_relocs *p;
     1549
     1550  if (h->root.type == bfd_link_hash_indirect)
     1551    return TRUE;
     1552
     1553  if (h->root.type == bfd_link_hash_warning)
     1554    /* When warning symbols are created, they **replace** the "real"
     1555       entry in the hash table, thus we never get to see the real
     1556       symbol in a hash traversal.  So look at it now.  */
     1557    h = (struct elf_link_hash_entry *) h->root.u.i.link;
     1558
     1559  info = (struct bfd_link_info *) inf;
     1560  htab = elf_i386_hash_table (info);
     1561
     1562  if (htab->elf.dynamic_sections_created
     1563      && h->plt.refcount > 0)
     1564    {
     1565      /* Make sure this symbol is output as a dynamic symbol.
     1566         Undefined weak syms won't yet be marked as dynamic.  */
     1567      if (h->dynindx == -1
     1568          && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
     1569        {
     1570          if (! bfd_elf32_link_record_dynamic_symbol (info, h))
     1571            return FALSE;
     1572        }
     1573
     1574      if (info->shared
     1575          || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
     1576        {
     1577          asection *s = htab->splt;
     1578
     1579          /* If this is the first .plt entry, make room for the special
     1580             first entry.  */
     1581          if (s->_raw_size == 0)
     1582            s->_raw_size += PLT_ENTRY_SIZE;
     1583
     1584          h->plt.offset = s->_raw_size;
     1585
     1586          /* If this symbol is not defined in a regular file, and we are
     1587             not generating a shared library, then set the symbol to this
     1588             location in the .plt.  This is required to make function
     1589             pointers compare as equal between the normal executable and
     1590             the shared library.  */
     1591          if (! info->shared
     1592              && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
     1593            {
     1594              h->root.u.def.section = s;
     1595              h->root.u.def.value = h->plt.offset;
     1596            }
     1597
     1598          /* Make room for this entry.  */
     1599          s->_raw_size += PLT_ENTRY_SIZE;
     1600
     1601          /* We also need to make an entry in the .got.plt section, which
     1602             will be placed in the .got section by the linker script.  */
     1603          htab->sgotplt->_raw_size += 4;
     1604
     1605          /* We also need to make an entry in the .rel.plt section.  */
     1606          htab->srelplt->_raw_size += sizeof (Elf32_External_Rel);
     1607        }
     1608      else
     1609        {
     1610          h->plt.offset = (bfd_vma) -1;
     1611          h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
     1612        }
     1613    }
     1614  else
     1615    {
     1616      h->plt.offset = (bfd_vma) -1;
     1617      h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
     1618    }
     1619
     1620  /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
     1621     make it a R_386_TLS_LE_32 requiring no TLS entry.  */
     1622  if (h->got.refcount > 0
     1623      && !info->shared
     1624      && h->dynindx == -1
     1625      && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
     1626    h->got.offset = (bfd_vma) -1;
     1627  else if (h->got.refcount > 0)
     1628    {
     1629      asection *s;
     1630      bfd_boolean dyn;
     1631      int tls_type = elf_i386_hash_entry(h)->tls_type;
     1632
     1633      /* Make sure this symbol is output as a dynamic symbol.
     1634         Undefined weak syms won't yet be marked as dynamic.  */
     1635      if (h->dynindx == -1
     1636          && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
     1637        {
     1638          if (! bfd_elf32_link_record_dynamic_symbol (info, h))
     1639            return FALSE;
     1640        }
     1641
     1642      s = htab->sgot;
     1643      h->got.offset = s->_raw_size;
     1644      s->_raw_size += 4;
     1645      /* R_386_TLS_GD needs 2 consecutive GOT slots.  */
     1646      if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE_BOTH)
     1647        s->_raw_size += 4;
     1648      dyn = htab->elf.dynamic_sections_created;
     1649      /* R_386_TLS_IE_32 needs one dynamic relocation,
     1650         R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
     1651         (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
     1652         need two), R_386_TLS_GD needs one if local symbol and two if
     1653         global.  */
     1654      if (tls_type == GOT_TLS_IE_BOTH)
     1655        htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rel);
     1656      else if ((tls_type == GOT_TLS_GD && h->dynindx == -1)
     1657               || (tls_type & GOT_TLS_IE))
     1658        htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
     1659      else if (tls_type == GOT_TLS_GD)
     1660        htab->srelgot->_raw_size += 2 * sizeof (Elf32_External_Rel);
     1661      else if (info->shared
     1662               || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
     1663        htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
     1664    }
     1665  else
     1666    h->got.offset = (bfd_vma) -1;
     1667
     1668  eh = (struct elf_i386_link_hash_entry *) h;
     1669  if (eh->dyn_relocs == NULL)
     1670    return TRUE;
     1671
     1672  /* In the shared -Bsymbolic case, discard space allocated for
     1673     dynamic pc-relative relocs against symbols which turn out to be
     1674     defined in regular objects.  For the normal shared case, discard
     1675     space for pc-relative relocs that have become local due to symbol
     1676     visibility changes.  */
     1677
     1678  if (info->shared)
     1679    {
     1680      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
     1681          && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
     1682              || info->symbolic))
     1683        {
     1684          struct elf_i386_dyn_relocs **pp;
     1685
     1686          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
     1687            {
     1688              p->count -= p->pc_count;
     1689              p->pc_count = 0;
     1690              if (p->count == 0)
     1691                *pp = p->next;
     1692              else
     1693                pp = &p->next;
     1694            }
     1695        }
     1696    }
     1697  else if (ELIMINATE_COPY_RELOCS)
     1698    {
     1699      /* For the non-shared case, discard space for relocs against
     1700         symbols which turn out to need copy relocs or are not
     1701         dynamic.  */
     1702
     1703      if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
     1704          && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
     1705               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
     1706              || (htab->elf.dynamic_sections_created
     1707                  && (h->root.type == bfd_link_hash_undefweak
     1708                      || h->root.type == bfd_link_hash_undefined))))
     1709        {
     1710          /* Make sure this symbol is output as a dynamic symbol.
     1711             Undefined weak syms won't yet be marked as dynamic.  */
     1712          if (h->dynindx == -1
     1713              && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
     1714            {
     1715              if (! bfd_elf32_link_record_dynamic_symbol (info, h))
     1716                return FALSE;
     1717            }
     1718
     1719          /* If that succeeded, we know we'll be keeping all the
     1720             relocs.  */
     1721          if (h->dynindx != -1)
     1722            goto keep;
     1723        }
     1724
     1725      eh->dyn_relocs = NULL;
     1726
     1727    keep: ;
     1728    }
     1729
     1730  /* Finally, allocate space.  */
     1731  for (p = eh->dyn_relocs; p != NULL; p = p->next)
     1732    {
     1733      asection *sreloc = elf_section_data (p->sec)->sreloc;
     1734      sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel);
     1735    }
     1736
     1737  return TRUE;
     1738}
     1739
     1740/* Find any dynamic relocs that apply to read-only sections.  */
     1741
     1742static bfd_boolean
     1743readonly_dynrelocs (h, inf)
     1744     struct elf_link_hash_entry *h;
     1745     PTR inf;
     1746{
     1747  struct elf_i386_link_hash_entry *eh;
     1748  struct elf_i386_dyn_relocs *p;
     1749
     1750  if (h->root.type == bfd_link_hash_warning)
     1751    h = (struct elf_link_hash_entry *) h->root.u.i.link;
     1752
     1753  eh = (struct elf_i386_link_hash_entry *) h;
     1754  for (p = eh->dyn_relocs; p != NULL; p = p->next)
     1755    {
     1756      asection *s = p->sec->output_section;
     1757
     1758      if (s != NULL && (s->flags & SEC_READONLY) != 0)
     1759        {
     1760          struct bfd_link_info *info = (struct bfd_link_info *) inf;
     1761
     1762          info->flags |= DF_TEXTREL;
     1763
     1764          /* Not an error, just cut short the traversal.  */
     1765          return FALSE;
     1766        }
     1767    }
     1768  return TRUE;
     1769}
     1770
    10881771/* Set the sizes of the dynamic sections.  */
    10891772
    1090 static boolean
     1773static bfd_boolean
    10911774elf_i386_size_dynamic_sections (output_bfd, info)
    1092      bfd *output_bfd;
     1775     bfd *output_bfd ATTRIBUTE_UNUSED;
    10931776     struct bfd_link_info *info;
    10941777{
     1778  struct elf_i386_link_hash_table *htab;
    10951779  bfd *dynobj;
    10961780  asection *s;
    1097   boolean plt;
    1098   boolean relocs;
    1099   boolean reltext;
    1100 
    1101   dynobj = elf_hash_table (info)->dynobj;
    1102   BFD_ASSERT (dynobj != NULL);
    1103 
    1104   if (elf_hash_table (info)->dynamic_sections_created)
     1781  bfd_boolean relocs;
     1782  bfd *ibfd;
     1783
     1784  htab = elf_i386_hash_table (info);
     1785  dynobj = htab->elf.dynobj;
     1786  if (dynobj == NULL)
     1787    abort ();
     1788
     1789  if (htab->elf.dynamic_sections_created)
    11051790    {
    11061791      /* Set the contents of the .interp section to the interpreter.  */
     
    11081793        {
    11091794          s = bfd_get_section_by_name (dynobj, ".interp");
    1110           BFD_ASSERT (s != NULL);
     1795          if (s == NULL)
     1796            abort ();
    11111797          s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
    11121798          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
    11131799        }
    11141800    }
     1801
     1802  /* Set up .got offsets for local syms, and space for local dynamic
     1803     relocs.  */
     1804  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
     1805    {
     1806      bfd_signed_vma *local_got;
     1807      bfd_signed_vma *end_local_got;
     1808      char *local_tls_type;
     1809      bfd_size_type locsymcount;
     1810      Elf_Internal_Shdr *symtab_hdr;
     1811      asection *srel;
     1812
     1813      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
     1814        continue;
     1815
     1816      for (s = ibfd->sections; s != NULL; s = s->next)
     1817        {
     1818          struct elf_i386_dyn_relocs *p;
     1819
     1820          for (p = *((struct elf_i386_dyn_relocs **)
     1821                     &elf_section_data (s)->local_dynrel);
     1822               p != NULL;
     1823               p = p->next)
     1824            {
     1825              if (!bfd_is_abs_section (p->sec)
     1826                  && bfd_is_abs_section (p->sec->output_section))
     1827                {
     1828                  /* Input section has been discarded, either because
     1829                     it is a copy of a linkonce section or due to
     1830                     linker script /DISCARD/, so we'll be discarding
     1831                     the relocs too.  */
     1832                }
     1833              else if (p->count != 0)
     1834                {
     1835                  srel = elf_section_data (p->sec)->sreloc;
     1836                  srel->_raw_size += p->count * sizeof (Elf32_External_Rel);
     1837                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
     1838                    info->flags |= DF_TEXTREL;
     1839                }
     1840            }
     1841        }
     1842
     1843      local_got = elf_local_got_refcounts (ibfd);
     1844      if (!local_got)
     1845        continue;
     1846
     1847      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
     1848      locsymcount = symtab_hdr->sh_info;
     1849      end_local_got = local_got + locsymcount;
     1850      local_tls_type = elf_i386_local_got_tls_type (ibfd);
     1851      s = htab->sgot;
     1852      srel = htab->srelgot;
     1853      for (; local_got < end_local_got; ++local_got, ++local_tls_type)
     1854        {
     1855          if (*local_got > 0)
     1856            {
     1857              *local_got = s->_raw_size;
     1858              s->_raw_size += 4;
     1859              if (*local_tls_type == GOT_TLS_GD
     1860                  || *local_tls_type == GOT_TLS_IE_BOTH)
     1861                s->_raw_size += 4;
     1862              if (info->shared
     1863                  || *local_tls_type == GOT_TLS_GD
     1864                  || (*local_tls_type & GOT_TLS_IE))
     1865                {
     1866                  if (*local_tls_type == GOT_TLS_IE_BOTH)
     1867                    srel->_raw_size += 2 * sizeof (Elf32_External_Rel);
     1868                  else
     1869                    srel->_raw_size += sizeof (Elf32_External_Rel);
     1870                }
     1871            }
     1872          else
     1873            *local_got = (bfd_vma) -1;
     1874        }
     1875    }
     1876
     1877  if (htab->tls_ldm_got.refcount > 0)
     1878    {
     1879      /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
     1880         relocs.  */
     1881      htab->tls_ldm_got.offset = htab->sgot->_raw_size;
     1882      htab->sgot->_raw_size += 8;
     1883      htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
     1884    }
    11151885  else
    1116     {
    1117       /* We may have created entries in the .rel.got section.
    1118          However, if we are not creating the dynamic sections, we will
    1119          not actually use these entries.  Reset the size of .rel.got,
    1120          which will cause it to get stripped from the output file
    1121          below.  */
    1122       s = bfd_get_section_by_name (dynobj, ".rel.got");
    1123       if (s != NULL)
    1124         s->_raw_size = 0;
    1125     }
    1126 
    1127   /* If this is a -Bsymbolic shared link, then we need to discard all
    1128      PC relative relocs against symbols defined in a regular object.
    1129      We allocated space for them in the check_relocs routine, but we
    1130      will not fill them in in the relocate_section routine.  */
    1131   if (info->shared)
    1132     elf_i386_link_hash_traverse (elf_i386_hash_table (info),
    1133                                  elf_i386_discard_copies,
    1134                                  (PTR) info);
    1135 
    1136   /* The check_relocs and adjust_dynamic_symbol entry points have
    1137      determined the sizes of the various dynamic sections.  Allocate
    1138      memory for them.  */
    1139   plt = false;
    1140   relocs = false;
    1141   reltext = false;
     1886    htab->tls_ldm_got.offset = -1;
     1887
     1888  /* Allocate global sym .plt and .got entries, and space for global
     1889     sym dynamic relocs.  */
     1890  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
     1891
     1892  /* We now have determined the sizes of the various dynamic sections.
     1893     Allocate memory for them.  */
     1894  relocs = FALSE;
    11421895  for (s = dynobj->sections; s != NULL; s = s->next)
    11431896    {
    1144       const char *name;
    1145       boolean strip;
    1146 
    11471897      if ((s->flags & SEC_LINKER_CREATED) == 0)
    11481898        continue;
    11491899
    1150       /* It's OK to base decisions on the section name, because none
    1151          of the dynobj section names depend upon the input files.  */
    1152       name = bfd_get_section_name (dynobj, s);
    1153 
    1154       strip = false;
    1155 
    1156       if (strcmp (name, ".plt") == 0)
    1157         {
    1158           if (s->_raw_size == 0)
    1159             {
    1160               /* Strip this section if we don't need it; see the
    1161                  comment below.  */
    1162               strip = true;
    1163             }
    1164           else
    1165             {
    1166               /* Remember whether there is a PLT.  */
    1167               plt = true;
    1168             }
    1169         }
    1170       else if (strncmp (name, ".rel", 4) == 0)
    1171         {
    1172           if (s->_raw_size == 0)
    1173             {
    1174               /* If we don't need this section, strip it from the
    1175                  output file.  This is mostly to handle .rel.bss and
    1176                  .rel.plt.  We must create both sections in
    1177                  create_dynamic_sections, because they must be created
    1178                  before the linker maps input sections to output
    1179                  sections.  The linker does that before
    1180                  adjust_dynamic_symbol is called, and it is that
    1181                  function which decides whether anything needs to go
    1182                  into these sections.  */
    1183               strip = true;
    1184             }
    1185           else
    1186             {
    1187               asection *target;
    1188 
    1189               /* Remember whether there are any reloc sections other
    1190                  than .rel.plt.  */
    1191               if (strcmp (name, ".rel.plt") != 0)
    1192                 {
    1193                   const char *outname;
    1194 
    1195                   relocs = true;
    1196 
    1197                   /* If this relocation section applies to a read only
    1198                      section, then we probably need a DT_TEXTREL
    1199                      entry.  The entries in the .rel.plt section
    1200                      really apply to the .got section, which we
    1201                      created ourselves and so know is not readonly.  */
    1202                   outname = bfd_get_section_name (output_bfd,
    1203                                                   s->output_section);
    1204                   target = bfd_get_section_by_name (output_bfd, outname + 4);
    1205                   if (target != NULL
    1206                       && (target->flags & SEC_READONLY) != 0
    1207                       && (target->flags & SEC_ALLOC) != 0)
    1208                     reltext = true;
    1209                 }
    1210 
    1211               /* We use the reloc_count field as a counter if we need
    1212                  to copy relocs into the output file.  */
    1213               s->reloc_count = 0;
    1214             }
    1215         }
    1216       else if (strncmp (name, ".got", 4) != 0)
     1900      if (s == htab->splt
     1901          || s == htab->sgot
     1902          || s == htab->sgotplt)
     1903        {
     1904          /* Strip this section if we don't need it; see the
     1905             comment below.  */
     1906        }
     1907      else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
     1908        {
     1909          if (s->_raw_size != 0 && s != htab->srelplt)
     1910            relocs = TRUE;
     1911
     1912          /* We use the reloc_count field as a counter if we need
     1913             to copy relocs into the output file.  */
     1914          s->reloc_count = 0;
     1915        }
     1916      else
    12171917        {
    12181918          /* It's not one of our sections, so don't allocate space.  */
     
    12201920        }
    12211921
    1222       if (strip)
    1223         {
     1922      if (s->_raw_size == 0)
     1923        {
     1924          /* If we don't need this section, strip it from the
     1925             output file.  This is mostly to handle .rel.bss and
     1926             .rel.plt.  We must create both sections in
     1927             create_dynamic_sections, because they must be created
     1928             before the linker maps input sections to output
     1929             sections.  The linker does that before
     1930             adjust_dynamic_symbol is called, and it is that
     1931             function which decides whether anything needs to go
     1932             into these sections.  */
     1933
    12241934          _bfd_strip_section_from_output (info, s);
    12251935          continue;
     
    12321942         of garbage.  */
    12331943      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
    1234       if (s->contents == NULL && s->_raw_size != 0)
    1235         return false;
    1236     }
    1237 
    1238   if (elf_hash_table (info)->dynamic_sections_created)
     1944      if (s->contents == NULL)
     1945        return FALSE;
     1946    }
     1947
     1948  if (htab->elf.dynamic_sections_created)
    12391949    {
    12401950      /* Add some entries to the .dynamic section.  We fill in the
     
    12431953         the .dynamic section.  The DT_DEBUG entry is filled in by the
    12441954         dynamic linker and used by the debugger.  */
     1955#define add_dynamic_entry(TAG, VAL) \
     1956  bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
     1957
    12451958      if (! info->shared)
    12461959        {
    1247           if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
    1248             return false;
    1249         }
    1250 
    1251       if (plt)
    1252         {
    1253           if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
    1254               || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
    1255               || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_REL)
    1256               || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
    1257             return false;
     1960          if (!add_dynamic_entry (DT_DEBUG, 0))
     1961            return FALSE;
     1962        }
     1963
     1964      if (htab->splt->_raw_size != 0)
     1965        {
     1966          if (!add_dynamic_entry (DT_PLTGOT, 0)
     1967              || !add_dynamic_entry (DT_PLTRELSZ, 0)
     1968              || !add_dynamic_entry (DT_PLTREL, DT_REL)
     1969              || !add_dynamic_entry (DT_JMPREL, 0))
     1970            return FALSE;
    12581971        }
    12591972
    12601973      if (relocs)
    12611974        {
    1262           if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0)
    1263               || ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0)
    1264               || ! bfd_elf32_add_dynamic_entry (info, DT_RELENT,
    1265                                                 sizeof (Elf32_External_Rel)))
    1266             return false;
    1267         }
    1268 
    1269       if (reltext)
    1270         {
    1271           if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
    1272             return false;
    1273           info->flags |= DF_TEXTREL;
    1274         }
    1275     }
    1276 
    1277   return true;
     1975          if (!add_dynamic_entry (DT_REL, 0)
     1976              || !add_dynamic_entry (DT_RELSZ, 0)
     1977              || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
     1978            return FALSE;
     1979
     1980          /* If any dynamic relocs apply to a read-only section,
     1981             then we need a DT_TEXTREL entry.  */
     1982          if ((info->flags & DF_TEXTREL) == 0)
     1983            elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
     1984                                    (PTR) info);
     1985
     1986          if ((info->flags & DF_TEXTREL) != 0)
     1987            {
     1988              if (!add_dynamic_entry (DT_TEXTREL, 0))
     1989                return FALSE;
     1990            }
     1991        }
     1992    }
     1993#undef add_dynamic_entry
     1994
     1995  return TRUE;
    12781996}
    12791997
    1280 /* This function is called via elf_i386_link_hash_traverse if we are
    1281    creating a shared object.  In the -Bsymbolic case, it discards the
    1282    space allocated to copy PC relative relocs against symbols which
    1283    are defined in regular objects.  For the normal non-symbolic case,
    1284    we also discard space for relocs that have become local due to
    1285    symbol visibility changes.  We allocated space for them in the
    1286    check_relocs routine, but we won't fill them in in the
    1287    relocate_section routine.  */
    1288 
    1289 static boolean
    1290 elf_i386_discard_copies (h, inf)
    1291      struct elf_i386_link_hash_entry *h;
    1292      PTR inf;
    1293 {
    1294   struct elf_i386_pcrel_relocs_copied *s;
    1295   struct bfd_link_info *info = (struct bfd_link_info *) inf;
    1296 
    1297   /* If a symbol has been forced local or we have found a regular
    1298      definition for the symbolic link case, then we won't be needing
    1299      any relocs.  */
    1300   if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
    1301       && ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
    1302           || info->symbolic))
    1303     {
    1304       for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
    1305         s->section->_raw_size -= s->count * sizeof (Elf32_External_Rel);
    1306     }
    1307 
    1308   return true;
     1998/* Set the correct type for an x86 ELF section.  We do this by the
     1999   section name, which is a hack, but ought to work.  */
     2000
     2001static bfd_boolean
     2002elf_i386_fake_sections (abfd, hdr, sec)
     2003     bfd *abfd ATTRIBUTE_UNUSED;
     2004     Elf_Internal_Shdr *hdr;
     2005     asection *sec;
     2006{
     2007  register const char *name;
     2008
     2009  name = bfd_get_section_name (abfd, sec);
     2010
     2011  /* This is an ugly, but unfortunately necessary hack that is
     2012     needed when producing EFI binaries on x86. It tells
     2013     elf.c:elf_fake_sections() not to consider ".reloc" as a section
     2014     containing ELF relocation info.  We need this hack in order to
     2015     be able to generate ELF binaries that can be translated into
     2016     EFI applications (which are essentially COFF objects).  Those
     2017     files contain a COFF ".reloc" section inside an ELFNN object,
     2018     which would normally cause BFD to segfault because it would
     2019     attempt to interpret this section as containing relocation
     2020     entries for section "oc".  With this hack enabled, ".reloc"
     2021     will be treated as a normal data section, which will avoid the
     2022     segfault.  However, you won't be able to create an ELFNN binary
     2023     with a section named "oc" that needs relocations, but that's
     2024     the kind of ugly side-effects you get when detecting section
     2025     types based on their names...  In practice, this limitation is
     2026     unlikely to bite.  */
     2027  if (strcmp (name, ".reloc") == 0)
     2028    hdr->sh_type = SHT_PROGBITS;
     2029
     2030  return TRUE;
    13092031}
    13102032
     2033/* Return the base VMA address which should be subtracted from real addresses
     2034   when resolving @dtpoff relocation.
     2035   This is PT_TLS segment p_vaddr.  */
     2036
     2037static bfd_vma
     2038dtpoff_base (info)
     2039     struct bfd_link_info *info;
     2040{
     2041  /* If tls_segment is NULL, we should have signalled an error already.  */
     2042  if (elf_hash_table (info)->tls_segment == NULL)
     2043    return 0;
     2044  return elf_hash_table (info)->tls_segment->start;
     2045}
     2046
     2047/* Return the relocation value for @tpoff relocation
     2048   if STT_TLS virtual address is ADDRESS.  */
     2049
     2050static bfd_vma
     2051tpoff (info, address)
     2052     struct bfd_link_info *info;
     2053     bfd_vma address;
     2054{
     2055  struct elf_link_tls_segment *tls_segment
     2056    = elf_hash_table (info)->tls_segment;
     2057
     2058  /* If tls_segment is NULL, we should have signalled an error already.  */
     2059  if (tls_segment == NULL)
     2060    return 0;
     2061  return (align_power (tls_segment->size, tls_segment->align)
     2062          + tls_segment->start - address);
     2063}
     2064
    13112065/* Relocate an i386 ELF section.  */
    13122066
    1313 static boolean
     2067static bfd_boolean
    13142068elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
    13152069                           contents, relocs, local_syms, local_sections)
     
    13232077     asection **local_sections;
    13242078{
    1325   bfd *dynobj;
     2079  struct elf_i386_link_hash_table *htab;
    13262080  Elf_Internal_Shdr *symtab_hdr;
    13272081  struct elf_link_hash_entry **sym_hashes;
    13282082  bfd_vma *local_got_offsets;
    1329   asection *sgot;
    1330   asection *splt;
    1331   asection *sreloc;
    13322083  Elf_Internal_Rela *rel;
    13332084  Elf_Internal_Rela *relend;
    13342085
    1335   dynobj = elf_hash_table (info)->dynobj;
     2086  htab = elf_i386_hash_table (info);
    13362087  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
    13372088  sym_hashes = elf_sym_hashes (input_bfd);
    13382089  local_got_offsets = elf_local_got_offsets (input_bfd);
    13392090
    1340   sreloc = NULL;
    1341   splt = NULL;
    1342   sgot = NULL;
    1343   if (dynobj != NULL)
    1344     {
    1345       splt = bfd_get_section_by_name (dynobj, ".plt");
    1346       sgot = bfd_get_section_by_name (dynobj, ".got");
    1347     }
    1348 
    13492091  rel = relocs;
    13502092  relend = relocs + input_section->reloc_count;
    13512093  for (; rel < relend; rel++)
    13522094    {
    1353       int r_type;
     2095      unsigned int r_type;
    13542096      reloc_howto_type *howto;
    13552097      unsigned long r_symndx;
     
    13572099      Elf_Internal_Sym *sym;
    13582100      asection *sec;
     2101      bfd_vma off;
    13592102      bfd_vma relocation;
     2103      bfd_boolean unresolved_reloc;
    13602104      bfd_reloc_status_type r;
    13612105      unsigned int indx;
     2106      int tls_type;
    13622107
    13632108      r_type = ELF32_R_TYPE (rel->r_info);
     
    13672112
    13682113      if ((indx = (unsigned) r_type) >= R_386_standard
    1369           && ((indx = (unsigned) r_type - R_386_ext_offset) - R_386_standard
    1370               >= R_386_ext - R_386_standard))
     2114          && ((indx = r_type - R_386_ext_offset) - R_386_standard
     2115              >= R_386_ext - R_386_standard)
     2116          && ((indx = r_type - R_386_tls_offset) - R_386_ext
     2117              >= R_386_tls - R_386_ext))
    13712118        {
    13722119          bfd_set_error (bfd_error_bad_value);
    1373           return false;
     2120          return FALSE;
    13742121        }
    13752122      howto = elf_howto_table + indx;
     
    13792126      if (info->relocateable)
    13802127        {
    1381           /* This is a relocateable link.  We don't have to change
     2128          bfd_vma val;
     2129          bfd_byte *where;
     2130
     2131          /* This is a relocatable link.  We don't have to change
    13822132             anything, unless the reloc is against a section symbol,
    13832133             in which case we have to adjust according to where the
    13842134             section symbol winds up in the output section.  */
    1385           if (r_symndx < symtab_hdr->sh_info)
    1386             {
    1387               sym = local_syms + r_symndx;
    1388               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
    1389                 {
    1390                   bfd_vma val;
    1391 
    1392                   sec = local_sections[r_symndx];
    1393                   val = bfd_get_32 (input_bfd, contents + rel->r_offset);
    1394                   val += sec->output_offset + sym->st_value;
    1395                   bfd_put_32 (input_bfd, val, contents + rel->r_offset);
    1396                 }
    1397             }
    1398 
     2135          if (r_symndx >= symtab_hdr->sh_info)
     2136            continue;
     2137
     2138          sym = local_syms + r_symndx;
     2139          if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
     2140            continue;
     2141
     2142          sec = local_sections[r_symndx];
     2143          val = sec->output_offset;
     2144          if (val == 0)
     2145            continue;
     2146
     2147          where = contents + rel->r_offset;
     2148          switch (howto->size)
     2149            {
     2150              /* FIXME: overflow checks.  */
     2151            case 0:
     2152              val += bfd_get_8 (input_bfd, where);
     2153              bfd_put_8 (input_bfd, val, where);
     2154              break;
     2155            case 1:
     2156              val += bfd_get_16 (input_bfd, where);
     2157              bfd_put_16 (input_bfd, val, where);
     2158              break;
     2159            case 2:
     2160              val += bfd_get_32 (input_bfd, where);
     2161              bfd_put_32 (input_bfd, val, where);
     2162              break;
     2163            default:
     2164              abort ();
     2165            }
    13992166          continue;
    14002167        }
     
    14042171      sym = NULL;
    14052172      sec = NULL;
     2173      unresolved_reloc = FALSE;
    14062174      if (r_symndx < symtab_hdr->sh_info)
    14072175        {
     
    14112179                        + sec->output_offset
    14122180                        + sym->st_value);
     2181          if ((sec->flags & SEC_MERGE)
     2182              && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
     2183            {
     2184              asection *msec;
     2185              bfd_vma addend;
     2186              bfd_byte *where = contents + rel->r_offset;
     2187
     2188              switch (howto->size)
     2189                {
     2190                case 0:
     2191                  addend = bfd_get_8 (input_bfd, where);
     2192                  if (howto->pc_relative)
     2193                    {
     2194                      addend = (addend ^ 0x80) - 0x80;
     2195                      addend += 1;
     2196                    }
     2197                  break;
     2198                case 1:
     2199                  addend = bfd_get_16 (input_bfd, where);
     2200                  if (howto->pc_relative)
     2201                    {
     2202                      addend = (addend ^ 0x8000) - 0x8000;
     2203                      addend += 2;
     2204                    }
     2205                  break;
     2206                case 2:
     2207                  addend = bfd_get_32 (input_bfd, where);
     2208                  if (howto->pc_relative)
     2209                    {
     2210                      addend = (addend ^ 0x80000000) - 0x80000000;
     2211                      addend += 4;
     2212                    }
     2213                  break;
     2214                default:
     2215                  abort ();
     2216                }
     2217
     2218              msec = sec;
     2219              addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend);
     2220              addend -= relocation;
     2221              addend += msec->output_section->vma + msec->output_offset;
     2222
     2223              switch (howto->size)
     2224                {
     2225                case 0:
     2226                  /* FIXME: overflow checks.  */
     2227                  if (howto->pc_relative)
     2228                    addend -= 1;
     2229                  bfd_put_8 (input_bfd, addend, where);
     2230                  break;
     2231                case 1:
     2232                  if (howto->pc_relative)
     2233                    addend -= 2;
     2234                  bfd_put_16 (input_bfd, addend, where);
     2235                  break;
     2236                case 2:
     2237                  if (howto->pc_relative)
     2238                    addend -= 4;
     2239                  bfd_put_32 (input_bfd, addend, where);
     2240                  break;
     2241                }
     2242            }
    14132243        }
    14142244      else
     
    14182248                 || h->root.type == bfd_link_hash_warning)
    14192249            h = (struct elf_link_hash_entry *) h->root.u.i.link;
     2250
     2251          relocation = 0;
    14202252          if (h->root.type == bfd_link_hash_defined
    14212253              || h->root.type == bfd_link_hash_defweak)
    14222254            {
    14232255              sec = h->root.u.def.section;
    1424               if (r_type == R_386_GOTPC
    1425                   || (r_type == R_386_PLT32
    1426                       && splt != NULL
    1427                       && h->plt.offset != (bfd_vma) -1)
    1428                   || (r_type == R_386_GOT32
    1429                       && elf_hash_table (info)->dynamic_sections_created
    1430                       && (! info->shared
    1431                           || (! info->symbolic && h->dynindx != -1)
    1432                           || (h->elf_link_hash_flags
    1433                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
    1434                   || (info->shared
    1435                       && ((! info->symbolic && h->dynindx != -1)
    1436                           || (h->elf_link_hash_flags
    1437                               & ELF_LINK_HASH_DEF_REGULAR) == 0)
    1438                       && (r_type == R_386_32
    1439                           || r_type == R_386_PC32)
    1440                       && ((input_section->flags & SEC_ALLOC) != 0
    1441                           /* DWARF will emit R_386_32 relocations in its
    1442                              sections against symbols defined externally
    1443                              in shared libraries.  We can't do anything
    1444                              with them here.  */
    1445                           || ((input_section->flags & SEC_DEBUGGING) != 0
    1446                               && (h->elf_link_hash_flags
    1447                                   & ELF_LINK_HASH_DEF_DYNAMIC) != 0))))
    1448                 {
    1449                   /* In these cases, we don't need the relocation
    1450                      value.  We check specially because in some
    1451                      obscure cases sec->output_section will be NULL.  */
    1452                   relocation = 0;
    1453                 }
    1454               else if (sec->output_section == NULL)
    1455                 {
    1456                   (*_bfd_error_handler)
    1457                     (_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
    1458                      bfd_get_filename (input_bfd), h->root.root.string,
    1459                      bfd_get_section_name (input_bfd, input_section));
    1460                   relocation = 0;
    1461                 }
     2256              if (sec->output_section == NULL)
     2257                /* Set a flag that will be cleared later if we find a
     2258                   relocation value for this symbol.  output_section
     2259                   is typically NULL for symbols satisfied by a shared
     2260                   library.  */
     2261                unresolved_reloc = TRUE;
    14622262              else
    14632263                relocation = (h->root.u.def.value
     
    14662266            }
    14672267          else if (h->root.type == bfd_link_hash_undefweak)
    1468             relocation = 0;
    1469           else if (info->shared && !info->symbolic
     2268            ;
     2269          else if (info->shared
    14702270                   && !info->no_undefined
    14712271                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
    1472             relocation = 0;
     2272            ;
    14732273          else
    14742274            {
     
    14782278                      (!info->shared || info->no_undefined
    14792279                       || ELF_ST_VISIBILITY (h->other)))))
    1480                 return false;
    1481               relocation = 0;
     2280                return FALSE;
    14822281            }
    14832282        }
     
    14882287          /* Relocation is to the entry for this symbol in the global
    14892288             offset table.  */
    1490           BFD_ASSERT (sgot != NULL);
     2289          if (htab->sgot == NULL)
     2290            abort ();
    14912291
    14922292          if (h != NULL)
    14932293            {
    1494               bfd_vma off;
     2294              bfd_boolean dyn;
    14952295
    14962296              off = h->got.offset;
    1497               BFD_ASSERT (off != (bfd_vma) -1);
    1498 
    1499               if (! elf_hash_table (info)->dynamic_sections_created
     2297              dyn = htab->elf.dynamic_sections_created;
     2298              if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
    15002299                  || (info->shared
    1501                       && (info->symbolic || h->dynindx == -1)
     2300                      && (info->symbolic
     2301                          || h->dynindx == -1
     2302                          || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
    15022303                      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
    15032304                {
     
    15192320                    {
    15202321                      bfd_put_32 (output_bfd, relocation,
    1521                                   sgot->contents + off);
     2322                                  htab->sgot->contents + off);
    15222323                      h->got.offset |= 1;
    15232324                    }
    15242325                }
    1525 
    1526               relocation = sgot->output_offset + off;
     2326              else
     2327                unresolved_reloc = FALSE;
    15272328            }
    15282329          else
    15292330            {
    1530               bfd_vma off;
    1531 
    1532               BFD_ASSERT (local_got_offsets != NULL
    1533                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
     2331              if (local_got_offsets == NULL)
     2332                abort ();
    15342333
    15352334              off = local_got_offsets[r_symndx];
    15362335
    15372336              /* The offset must always be a multiple of 4.  We use
    1538                 the least significant bit to record whether we have
    1539                 already generated the necessary reloc.  */
     2337                the least significant bit to record whether we have
     2338                already generated the necessary reloc.  */
    15402339              if ((off & 1) != 0)
    15412340                off &= ~1;
    15422341              else
    15432342                {
    1544                   bfd_put_32 (output_bfd, relocation, sgot->contents + off);
     2343                  bfd_put_32 (output_bfd, relocation,
     2344                              htab->sgot->contents + off);
    15452345
    15462346                  if (info->shared)
    15472347                    {
    1548                       asection *srelgot;
    1549                       Elf_Internal_Rel outrel;
    1550 
    1551                       srelgot = bfd_get_section_by_name (dynobj, ".rel.got");
    1552                       BFD_ASSERT (srelgot != NULL);
    1553 
    1554                       outrel.r_offset = (sgot->output_section->vma
    1555                                          + sgot->output_offset
     2348                      asection *s;
     2349                      Elf_Internal_Rela outrel;
     2350                      bfd_byte *loc;
     2351
     2352                      s = htab->srelgot;
     2353                      if (s == NULL)
     2354                        abort ();
     2355
     2356                      outrel.r_offset = (htab->sgot->output_section->vma
     2357                                         + htab->sgot->output_offset
    15562358                                         + off);
    15572359                      outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
    1558                       bfd_elf32_swap_reloc_out (output_bfd, &outrel,
    1559                                                 (((Elf32_External_Rel *)
    1560                                                   srelgot->contents)
    1561                                                  + srelgot->reloc_count));
    1562                       ++srelgot->reloc_count;
     2360                      loc = s->contents;
     2361                      loc += s->reloc_count++ * sizeof (Elf32_External_Rel);
     2362                      bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
    15632363                    }
    15642364
    15652365                  local_got_offsets[r_symndx] |= 1;
    15662366                }
    1567 
    1568               relocation = sgot->output_offset + off;
    1569             }
    1570 
     2367            }
     2368
     2369          if (off >= (bfd_vma) -2)
     2370            abort ();
     2371
     2372          relocation = htab->sgot->output_offset + off;
    15712373          break;
    15722374
     
    15742376          /* Relocation is relative to the start of the global offset
    15752377             table.  */
    1576 
    1577           if (sgot == NULL)
    1578             {
    1579               sgot = bfd_get_section_by_name (dynobj, ".got");
    1580               BFD_ASSERT (sgot != NULL);
    1581             }
    15822378
    15832379          /* Note that sgot->output_offset is not involved in this
     
    15862382             permitted by the ABI, we might have to change this
    15872383             calculation.  */
    1588           relocation -= sgot->output_section->vma;
    1589 
     2384          relocation -= htab->sgot->output_section->vma;
    15902385          break;
    15912386
    15922387        case R_386_GOTPC:
    15932388          /* Use global offset table as symbol value.  */
    1594 
    1595           if (sgot == NULL)
    1596             {
    1597               sgot = bfd_get_section_by_name (dynobj, ".got");
    1598               BFD_ASSERT (sgot != NULL);
    1599             }
    1600 
    1601           relocation = sgot->output_section->vma;
    1602 
     2389          relocation = htab->sgot->output_section->vma;
     2390          unresolved_reloc = FALSE;
    16032391          break;
    16042392
     
    16082396
    16092397          /* Resolve a PLT32 reloc against a local symbol directly,
    1610              without using the procedure linkage table.  */
     2398             without using the procedure linkage table.  */
    16112399          if (h == NULL)
    16122400            break;
    16132401
    16142402          if (h->plt.offset == (bfd_vma) -1
    1615               || splt == NULL)
     2403              || htab->splt == NULL)
    16162404            {
    16172405              /* We didn't make a PLT entry for this symbol.  This
    1618                 happens when statically linking PIC code, or when
    1619                 using -Bsymbolic.  */
     2406                happens when statically linking PIC code, or when
     2407                using -Bsymbolic.  */
    16202408              break;
    16212409            }
    16222410
    1623           relocation = (splt->output_section->vma
    1624                         + splt->output_offset
     2411          relocation = (htab->splt->output_section->vma
     2412                        + htab->splt->output_offset
    16252413                        + h->plt.offset);
    1626 
     2414          unresolved_reloc = FALSE;
    16272415          break;
    16282416
    16292417        case R_386_32:
    16302418        case R_386_PC32:
    1631           if (info->shared
    1632               && (input_section->flags & SEC_ALLOC) != 0
    1633               && (r_type != R_386_PC32
    1634                   || (h != NULL
    1635                       && h->dynindx != -1
    1636                       && (! info->symbolic
    1637                           || (h->elf_link_hash_flags
    1638                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
    1639             {
    1640               Elf_Internal_Rel outrel;
    1641               boolean skip, relocate;
     2419          /* r_symndx will be zero only for relocs against symbols
     2420             from removed linkonce sections, or sections discarded by
     2421             a linker script.  */
     2422          if (r_symndx == 0
     2423              || (input_section->flags & SEC_ALLOC) == 0)
     2424            break;
     2425
     2426          if ((info->shared
     2427               && (r_type != R_386_PC32
     2428                   || (h != NULL
     2429                       && h->dynindx != -1
     2430                       && (! info->symbolic
     2431                           || (h->elf_link_hash_flags
     2432                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
     2433              || (ELIMINATE_COPY_RELOCS
     2434                  && !info->shared
     2435                  && h != NULL
     2436                  && h->dynindx != -1
     2437                  && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
     2438                  && (((h->elf_link_hash_flags
     2439                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
     2440                       && (h->elf_link_hash_flags
     2441                           & ELF_LINK_HASH_DEF_REGULAR) == 0)
     2442                      || h->root.type == bfd_link_hash_undefweak
     2443                      || h->root.type == bfd_link_hash_undefined)))
     2444            {
     2445              Elf_Internal_Rela outrel;
     2446              bfd_byte *loc;
     2447              bfd_boolean skip, relocate;
     2448              asection *sreloc;
    16422449
    16432450              /* When generating a shared object, these relocations
     
    16452452                 time.  */
    16462453
    1647               if (sreloc == NULL)
    1648                 {
    1649                   const char *name;
    1650 
    1651                   name = (bfd_elf_string_from_elf_section
    1652                           (input_bfd,
    1653                            elf_elfheader (input_bfd)->e_shstrndx,
    1654                            elf_section_data (input_section)->rel_hdr.sh_name));
    1655                   if (name == NULL)
    1656                     return false;
    1657 
    1658                   if (strncmp (name, ".rel", 4) != 0
    1659                       || strcmp (bfd_get_section_name (input_bfd,
    1660                                                        input_section),
    1661                                  name + 4) != 0)
    1662                     {
    1663                       if (input_bfd->my_archive)
    1664                         (*_bfd_error_handler) (_("%s(%s): bad relocation section name `%s\'"),
    1665                                                bfd_get_filename (input_bfd->my_archive),
    1666                                                bfd_get_filename (input_bfd),
    1667                                                name);
    1668                       else
    1669                         (*_bfd_error_handler) (_("%s: bad relocation section name `%s\'"),
    1670                                                bfd_get_filename (input_bfd),
    1671                                                name);
    1672                       return false;
    1673                     }
    1674 
    1675                   sreloc = bfd_get_section_by_name (dynobj, name);
    1676                   BFD_ASSERT (sreloc != NULL);
    1677                 }
    1678 
    1679               skip = false;
    1680 
    1681               if (elf_section_data (input_section)->stab_info == NULL)
    1682                 outrel.r_offset = rel->r_offset;
     2454              skip = FALSE;
     2455              relocate = FALSE;
     2456
     2457              outrel.r_offset =
     2458                _bfd_elf_section_offset (output_bfd, info, input_section,
     2459                                         rel->r_offset);
     2460              if (outrel.r_offset == (bfd_vma) -1)
     2461                skip = TRUE;
     2462              else if (outrel.r_offset == (bfd_vma) -2)
     2463                skip = TRUE, relocate = TRUE;
     2464              outrel.r_offset += (input_section->output_section->vma
     2465                                  + input_section->output_offset);
     2466
     2467              if (skip)
     2468                memset (&outrel, 0, sizeof outrel);
     2469              else if (h != NULL
     2470                       && h->dynindx != -1
     2471                       && (r_type == R_386_PC32
     2472                           || !info->shared
     2473                           || !info->symbolic
     2474                           || (h->elf_link_hash_flags
     2475                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
     2476                outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
    16832477              else
    16842478                {
    1685                   bfd_vma off;
    1686 
    1687                   off = (_bfd_stab_section_offset
    1688                          (output_bfd, &elf_hash_table (info)->stab_info,
    1689                           input_section,
    1690                           &elf_section_data (input_section)->stab_info,
    1691                           rel->r_offset));
    1692                   if (off == (bfd_vma) -1)
    1693                     skip = true;
    1694                   outrel.r_offset = off;
     2479                  /* This symbol is local, or marked to become local.  */
     2480                  relocate = TRUE;
     2481                  outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
    16952482                }
    16962483
    1697               outrel.r_offset += (input_section->output_section->vma
    1698                                   + input_section->output_offset);
    1699 
    1700               if (skip)
    1701                 {
    1702                   memset (&outrel, 0, sizeof outrel);
    1703                   relocate = false;
    1704                 }
    1705               else if (r_type == R_386_PC32)
    1706                 {
    1707                   BFD_ASSERT (h != NULL && h->dynindx != -1);
    1708                   relocate = false;
    1709                   outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_PC32);
    1710                 }
    1711               else
    1712                 {
    1713                   /* h->dynindx may be -1 if this symbol was marked to
    1714                      become local.  */
    1715                   if (h == NULL
    1716                       || ((info->symbolic || h->dynindx == -1)
    1717                           && (h->elf_link_hash_flags
    1718                               & ELF_LINK_HASH_DEF_REGULAR) != 0))
    1719                     {
    1720                       relocate = true;
    1721                       outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
    1722                     }
    1723                   else
    1724                     {
    1725                       BFD_ASSERT (h->dynindx != -1);
    1726                       relocate = false;
    1727                       outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_32);
    1728                     }
    1729                 }
    1730 
    1731               bfd_elf32_swap_reloc_out (output_bfd, &outrel,
    1732                                         (((Elf32_External_Rel *)
    1733                                           sreloc->contents)
    1734                                          + sreloc->reloc_count));
    1735               ++sreloc->reloc_count;
     2484              sreloc = elf_section_data (input_section)->sreloc;
     2485              if (sreloc == NULL)
     2486                abort ();
     2487
     2488              loc = sreloc->contents;
     2489              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
     2490              bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
    17362491
    17372492              /* If this reloc is against an external symbol, we do
     
    17422497                continue;
    17432498            }
    1744 
     2499          break;
     2500
     2501        case R_386_TLS_IE:
     2502          if (info->shared)
     2503            {
     2504              Elf_Internal_Rela outrel;
     2505              bfd_byte *loc;
     2506              asection *sreloc;
     2507
     2508              outrel.r_offset = rel->r_offset
     2509                                + input_section->output_section->vma
     2510                                + input_section->output_offset;
     2511              outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
     2512              sreloc = elf_section_data (input_section)->sreloc;
     2513              if (sreloc == NULL)
     2514                abort ();
     2515              loc = sreloc->contents;
     2516              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
     2517              bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
     2518            }
     2519          /* Fall through */
     2520
     2521        case R_386_TLS_GD:
     2522        case R_386_TLS_IE_32:
     2523        case R_386_TLS_GOTIE:
     2524          r_type = elf_i386_tls_transition (info, r_type, h == NULL);
     2525          tls_type = GOT_UNKNOWN;
     2526          if (h == NULL && local_got_offsets)
     2527            tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
     2528          else if (h != NULL)
     2529            {
     2530              tls_type = elf_i386_hash_entry(h)->tls_type;
     2531              if (!info->shared && h->dynindx == -1 && (tls_type & GOT_TLS_IE))
     2532                r_type = R_386_TLS_LE_32;
     2533            }
     2534          if (tls_type == GOT_TLS_IE)
     2535            tls_type = GOT_TLS_IE_NEG;
     2536          if (r_type == R_386_TLS_GD)
     2537            {
     2538              if (tls_type == GOT_TLS_IE_POS)
     2539                r_type = R_386_TLS_GOTIE;
     2540              else if (tls_type & GOT_TLS_IE)
     2541                r_type = R_386_TLS_IE_32;
     2542            }
     2543
     2544          if (r_type == R_386_TLS_LE_32)
     2545            {
     2546              BFD_ASSERT (! unresolved_reloc);
     2547              if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
     2548                {
     2549                  unsigned int val, type;
     2550                  bfd_vma roff;
     2551
     2552                  /* GD->LE transition.  */
     2553                  BFD_ASSERT (rel->r_offset >= 2);
     2554                  type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
     2555                  BFD_ASSERT (type == 0x8d || type == 0x04);
     2556                  BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size);
     2557                  BFD_ASSERT (bfd_get_8 (input_bfd,
     2558                                         contents + rel->r_offset + 4)
     2559                              == 0xe8);
     2560                  BFD_ASSERT (rel + 1 < relend);
     2561                  BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
     2562                  roff = rel->r_offset + 5;
     2563                  val = bfd_get_8 (input_bfd,
     2564                                   contents + rel->r_offset - 1);
     2565                  if (type == 0x04)
     2566                    {
     2567                      /* leal foo(,%reg,1), %eax; call ___tls_get_addr
     2568                         Change it into:
     2569                         movl %gs:0, %eax; subl $foo@tpoff, %eax
     2570                         (6 byte form of subl).  */
     2571                      BFD_ASSERT (rel->r_offset >= 3);
     2572                      BFD_ASSERT (bfd_get_8 (input_bfd,
     2573                                             contents + rel->r_offset - 3)
     2574                                  == 0x8d);
     2575                      BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
     2576                      memcpy (contents + rel->r_offset - 3,
     2577                              "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
     2578                    }
     2579                  else
     2580                    {
     2581                      BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
     2582                      if (rel->r_offset + 10 <= input_section->_raw_size
     2583                          && bfd_get_8 (input_bfd,
     2584                                        contents + rel->r_offset + 9) == 0x90)
     2585                        {
     2586                          /* leal foo(%reg), %eax; call ___tls_get_addr; nop
     2587                             Change it into:
     2588                             movl %gs:0, %eax; subl $foo@tpoff, %eax
     2589                             (6 byte form of subl).  */
     2590                          memcpy (contents + rel->r_offset - 2,
     2591                                  "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
     2592                          roff = rel->r_offset + 6;
     2593                        }
     2594                      else
     2595                        {
     2596                          /* leal foo(%reg), %eax; call ___tls_get_addr
     2597                             Change it into:
     2598                             movl %gs:0, %eax; subl $foo@tpoff, %eax
     2599                             (5 byte form of subl).  */
     2600                          memcpy (contents + rel->r_offset - 2,
     2601                                  "\x65\xa1\0\0\0\0\x2d\0\0\0", 11);
     2602                        }
     2603                    }
     2604                  bfd_put_32 (output_bfd, tpoff (info, relocation),
     2605                              contents + roff);
     2606                  /* Skip R_386_PLT32.  */
     2607                  rel++;
     2608                  continue;
     2609                }
     2610              else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
     2611                {
     2612                  unsigned int val, type;
     2613
     2614                  /* IE->LE transition:
     2615                     Originally it can be one of:
     2616                     movl foo, %eax
     2617                     movl foo, %reg
     2618                     addl foo, %reg
     2619                     We change it into:
     2620                     movl $foo, %eax
     2621                     movl $foo, %reg
     2622                     addl $foo, %reg.  */
     2623                  BFD_ASSERT (rel->r_offset >= 1);
     2624                  val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
     2625                  BFD_ASSERT (rel->r_offset + 4 <= input_section->_raw_size);
     2626                  if (val == 0xa1)
     2627                    {
     2628                      /* movl foo, %eax.  */
     2629                      bfd_put_8 (output_bfd, 0xb8, contents + rel->r_offset - 1);
     2630                    }
     2631                  else
     2632                    {
     2633                      BFD_ASSERT (rel->r_offset >= 2);
     2634                      type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
     2635                      switch (type)
     2636                        {
     2637                        case 0x8b:
     2638                          /* movl */
     2639                          BFD_ASSERT ((val & 0xc7) == 0x05);
     2640                          bfd_put_8 (output_bfd, 0xc7,
     2641                                     contents + rel->r_offset - 2);
     2642                          bfd_put_8 (output_bfd,
     2643                                     0xc0 | ((val >> 3) & 7),
     2644                                     contents + rel->r_offset - 1);
     2645                          break;
     2646                        case 0x03:
     2647                          /* addl */
     2648                          BFD_ASSERT ((val & 0xc7) == 0x05);
     2649                          bfd_put_8 (output_bfd, 0x81,
     2650                                     contents + rel->r_offset - 2);
     2651                          bfd_put_8 (output_bfd,
     2652                                     0xc0 | ((val >> 3) & 7),
     2653                                     contents + rel->r_offset - 1);
     2654                          break;
     2655                        default:
     2656                          BFD_FAIL ();
     2657                          break;
     2658                        }
     2659                    }
     2660                  bfd_put_32 (output_bfd, -tpoff (info, relocation),
     2661                              contents + rel->r_offset);
     2662                  continue;
     2663                }
     2664              else
     2665                {
     2666                  unsigned int val, type;
     2667
     2668                  /* {IE_32,GOTIE}->LE transition:
     2669                     Originally it can be one of:
     2670                     subl foo(%reg1), %reg2
     2671                     movl foo(%reg1), %reg2
     2672                     addl foo(%reg1), %reg2
     2673                     We change it into:
     2674                     subl $foo, %reg2
     2675                     movl $foo, %reg2 (6 byte form)
     2676                     addl $foo, %reg2.  */
     2677                  BFD_ASSERT (rel->r_offset >= 2);
     2678                  type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
     2679                  val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
     2680                  BFD_ASSERT (rel->r_offset + 4 <= input_section->_raw_size);
     2681                  BFD_ASSERT ((val & 0xc0) == 0x80 && (val & 7) != 4);
     2682                  if (type == 0x8b)
     2683                    {
     2684                      /* movl */
     2685                      bfd_put_8 (output_bfd, 0xc7,
     2686                                 contents + rel->r_offset - 2);
     2687                      bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
     2688                                 contents + rel->r_offset - 1);
     2689                    }
     2690                  else if (type == 0x2b)
     2691                    {
     2692                      /* subl */
     2693                      bfd_put_8 (output_bfd, 0x81,
     2694                                 contents + rel->r_offset - 2);
     2695                      bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
     2696                                 contents + rel->r_offset - 1);
     2697                    }
     2698                  else if (type == 0x03)
     2699                    {
     2700                      /* addl */
     2701                      bfd_put_8 (output_bfd, 0x81,
     2702                                 contents + rel->r_offset - 2);
     2703                      bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
     2704                                 contents + rel->r_offset - 1);
     2705                    }
     2706                  else
     2707                    BFD_FAIL ();
     2708                  if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
     2709                    bfd_put_32 (output_bfd, -tpoff (info, relocation),
     2710                                contents + rel->r_offset);
     2711                  else
     2712                    bfd_put_32 (output_bfd, tpoff (info, relocation),
     2713                                contents + rel->r_offset);
     2714                  continue;
     2715                }
     2716            }
     2717
     2718          if (htab->sgot == NULL)
     2719            abort ();
     2720
     2721          if (h != NULL)
     2722            off = h->got.offset;
     2723          else
     2724            {
     2725              if (local_got_offsets == NULL)
     2726                abort ();
     2727
     2728              off = local_got_offsets[r_symndx];
     2729            }
     2730
     2731          if ((off & 1) != 0)
     2732            off &= ~1;
     2733          else
     2734            {
     2735              Elf_Internal_Rela outrel;
     2736              bfd_byte *loc;
     2737              int dr_type, indx;
     2738
     2739              if (htab->srelgot == NULL)
     2740                abort ();
     2741
     2742              outrel.r_offset = (htab->sgot->output_section->vma
     2743                                 + htab->sgot->output_offset + off);
     2744
     2745              indx = h && h->dynindx != -1 ? h->dynindx : 0;
     2746              if (r_type == R_386_TLS_GD)
     2747                dr_type = R_386_TLS_DTPMOD32;
     2748              else if (tls_type == GOT_TLS_IE_POS)
     2749                dr_type = R_386_TLS_TPOFF;
     2750              else
     2751                dr_type = R_386_TLS_TPOFF32;
     2752              if (dr_type == R_386_TLS_TPOFF && indx == 0)
     2753                bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
     2754                            htab->sgot->contents + off);
     2755              else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
     2756                bfd_put_32 (output_bfd, dtpoff_base (info) - relocation,
     2757                            htab->sgot->contents + off);
     2758              else
     2759                bfd_put_32 (output_bfd, 0,
     2760                            htab->sgot->contents + off);
     2761              outrel.r_info = ELF32_R_INFO (indx, dr_type);
     2762              loc = htab->srelgot->contents;
     2763              loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
     2764              bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
     2765
     2766              if (r_type == R_386_TLS_GD)
     2767                {
     2768                  if (indx == 0)
     2769                    {
     2770                      BFD_ASSERT (! unresolved_reloc);
     2771                      bfd_put_32 (output_bfd,
     2772                                  relocation - dtpoff_base (info),
     2773                                  htab->sgot->contents + off + 4);
     2774                    }
     2775                  else
     2776                    {
     2777                      bfd_put_32 (output_bfd, 0,
     2778                                  htab->sgot->contents + off + 4);
     2779                      outrel.r_info = ELF32_R_INFO (indx,
     2780                                                    R_386_TLS_DTPOFF32);
     2781                      outrel.r_offset += 4;
     2782                      htab->srelgot->reloc_count++;
     2783                      loc += sizeof (Elf32_External_Rel);
     2784                      bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
     2785                    }
     2786                }
     2787              else if (tls_type == GOT_TLS_IE_BOTH)
     2788                {
     2789                  bfd_put_32 (output_bfd,
     2790                              indx == 0 ? relocation - dtpoff_base (info) : 0,
     2791                              htab->sgot->contents + off + 4);
     2792                  outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
     2793                  outrel.r_offset += 4;
     2794                  htab->srelgot->reloc_count++;
     2795                  loc += sizeof (Elf32_External_Rel);
     2796                  bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
     2797                }
     2798
     2799              if (h != NULL)
     2800                h->got.offset |= 1;
     2801              else
     2802                local_got_offsets[r_symndx] |= 1;
     2803            }
     2804
     2805          if (off >= (bfd_vma) -2)
     2806            abort ();
     2807          if (r_type == ELF32_R_TYPE (rel->r_info))
     2808            {
     2809              relocation = htab->sgot->output_offset + off;
     2810              if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
     2811                  && tls_type == GOT_TLS_IE_BOTH)
     2812                relocation += 4;
     2813              if (r_type == R_386_TLS_IE)
     2814                relocation += htab->sgot->output_section->vma;
     2815              unresolved_reloc = FALSE;
     2816            }
     2817          else
     2818            {
     2819              unsigned int val, type;
     2820              bfd_vma roff;
     2821
     2822              /* GD->IE transition.  */
     2823              BFD_ASSERT (rel->r_offset >= 2);
     2824              type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
     2825              BFD_ASSERT (type == 0x8d || type == 0x04);
     2826              BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size);
     2827              BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
     2828                          == 0xe8);
     2829              BFD_ASSERT (rel + 1 < relend);
     2830              BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
     2831              roff = rel->r_offset - 3;
     2832              val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
     2833              if (type == 0x04)
     2834                {
     2835                  /* leal foo(,%reg,1), %eax; call ___tls_get_addr
     2836                     Change it into:
     2837                     movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
     2838                  BFD_ASSERT (rel->r_offset >= 3);
     2839                  BFD_ASSERT (bfd_get_8 (input_bfd,
     2840                                         contents + rel->r_offset - 3)
     2841                              == 0x8d);
     2842                  BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
     2843                  val >>= 3;
     2844                }
     2845              else
     2846                {
     2847                  /* leal foo(%reg), %eax; call ___tls_get_addr; nop
     2848                     Change it into:
     2849                     movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax.  */
     2850                  BFD_ASSERT (rel->r_offset + 10 <= input_section->_raw_size);
     2851                  BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
     2852                  BFD_ASSERT (bfd_get_8 (input_bfd,
     2853                                         contents + rel->r_offset + 9)
     2854                              == 0x90);
     2855                  roff = rel->r_offset - 2;
     2856                }
     2857              memcpy (contents + roff,
     2858                      "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
     2859              contents[roff + 7] = 0x80 | (val & 7);
     2860              /* If foo is used only with foo@gotntpoff(%reg) and
     2861                 foo@indntpoff, but not with foo@gottpoff(%reg), change
     2862                 subl $foo@gottpoff(%reg), %eax
     2863                 into:
     2864                 addl $foo@gotntpoff(%reg), %eax.  */
     2865              if (r_type == R_386_TLS_GOTIE)
     2866                {
     2867                  contents[roff + 6] = 0x03;
     2868                  if (tls_type == GOT_TLS_IE_BOTH)
     2869                    off += 4;
     2870                }
     2871              bfd_put_32 (output_bfd, htab->sgot->output_offset + off,
     2872                          contents + roff + 8);
     2873              /* Skip R_386_PLT32.  */
     2874              rel++;
     2875              continue;
     2876            }
     2877          break;
     2878
     2879        case R_386_TLS_LDM:
     2880          if (! info->shared)
     2881            {
     2882              unsigned int val;
     2883
     2884              /* LD->LE transition:
     2885                 Ensure it is:
     2886                 leal foo(%reg), %eax; call ___tls_get_addr.
     2887                 We change it into:
     2888                 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi.  */
     2889              BFD_ASSERT (rel->r_offset >= 2);
     2890              BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2)
     2891                          == 0x8d);
     2892              val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
     2893              BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
     2894              BFD_ASSERT (rel->r_offset + 9 <= input_section->_raw_size);
     2895              BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
     2896                          == 0xe8);
     2897              BFD_ASSERT (rel + 1 < relend);
     2898              BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
     2899              memcpy (contents + rel->r_offset - 2,
     2900                      "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
     2901              /* Skip R_386_PLT32.  */
     2902              rel++;
     2903              continue;
     2904            }
     2905
     2906          if (htab->sgot == NULL)
     2907            abort ();
     2908
     2909          off = htab->tls_ldm_got.offset;
     2910          if (off & 1)
     2911            off &= ~1;
     2912          else
     2913            {
     2914              Elf_Internal_Rela outrel;
     2915              bfd_byte *loc;
     2916
     2917              if (htab->srelgot == NULL)
     2918                abort ();
     2919
     2920              outrel.r_offset = (htab->sgot->output_section->vma
     2921                                 + htab->sgot->output_offset + off);
     2922
     2923              bfd_put_32 (output_bfd, 0,
     2924                          htab->sgot->contents + off);
     2925              bfd_put_32 (output_bfd, 0,
     2926                          htab->sgot->contents + off + 4);
     2927              outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
     2928              loc = htab->srelgot->contents;
     2929              loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
     2930              bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
     2931              htab->tls_ldm_got.offset |= 1;
     2932            }
     2933          relocation = htab->sgot->output_offset + off;
     2934          unresolved_reloc = FALSE;
     2935          break;
     2936
     2937        case R_386_TLS_LDO_32:
     2938          if (info->shared || (input_section->flags & SEC_CODE) == 0)
     2939            relocation -= dtpoff_base (info);
     2940          else
     2941            /* When converting LDO to LE, we must negate.  */
     2942            relocation = -tpoff (info, relocation);
     2943          break;
     2944
     2945        case R_386_TLS_LE_32:
     2946        case R_386_TLS_LE:
     2947          if (info->shared)
     2948            {
     2949              Elf_Internal_Rela outrel;
     2950              asection *sreloc;
     2951              bfd_byte *loc;
     2952              int indx;
     2953
     2954              outrel.r_offset = rel->r_offset
     2955                                + input_section->output_section->vma
     2956                                + input_section->output_offset;
     2957              if (h != NULL && h->dynindx != -1)
     2958                indx = h->dynindx;
     2959              else
     2960                indx = 0;
     2961              if (r_type == R_386_TLS_LE_32)
     2962                outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
     2963              else
     2964                outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
     2965              sreloc = elf_section_data (input_section)->sreloc;
     2966              if (sreloc == NULL)
     2967                abort ();
     2968              loc = sreloc->contents;
     2969              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
     2970              bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
     2971              if (indx)
     2972                continue;
     2973              else if (r_type == R_386_TLS_LE_32)
     2974                relocation = dtpoff_base (info) - relocation;
     2975              else
     2976                relocation -= dtpoff_base (info);
     2977            }
     2978          else if (r_type == R_386_TLS_LE_32)
     2979            relocation = tpoff (info, relocation);
     2980          else
     2981            relocation = -tpoff (info, relocation);
    17452982          break;
    17462983
    17472984        default:
    17482985          break;
     2986        }
     2987
     2988      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
     2989         because such sections are not SEC_ALLOC and thus ld.so will
     2990         not process them.  */
     2991      if (unresolved_reloc
     2992          && !((input_section->flags & SEC_DEBUGGING) != 0
     2993               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
     2994        {
     2995          (*_bfd_error_handler)
     2996            (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
     2997             bfd_archive_filename (input_bfd),
     2998             bfd_get_section_name (input_bfd, input_section),
     2999             (long) rel->r_offset,
     3000             h->root.root.string);
     3001          return FALSE;
    17493002        }
    17503003
     
    17553008      if (r != bfd_reloc_ok)
    17563009        {
    1757           switch (r)
    1758             {
    1759             default:
    1760             case bfd_reloc_outofrange:
    1761               abort ();
    1762             case bfd_reloc_overflow:
    1763               {
    1764                 const char *name;
    1765 
    1766                 if (h != NULL)
    1767                   name = h->root.root.string;
    1768                 else
    1769                   {
    1770                     name = bfd_elf_string_from_elf_section (input_bfd,
    1771                                                             symtab_hdr->sh_link,
    1772                                                             sym->st_name);
    1773                     if (name == NULL)
    1774                       return false;
    1775                     if (*name == '\0')
    1776                       name = bfd_section_name (input_bfd, sec);
    1777                   }
    1778                 if (! ((*info->callbacks->reloc_overflow)
    1779                        (info, name, howto->name, (bfd_vma) 0,
    1780                         input_bfd, input_section, rel->r_offset)))
    1781                   return false;
    1782               }
    1783               break;
    1784             }
    1785         }
    1786     }
    1787 
    1788   return true;
     3010          const char *name;
     3011
     3012          if (h != NULL)
     3013            name = h->root.root.string;
     3014          else
     3015            {
     3016              name = bfd_elf_string_from_elf_section (input_bfd,
     3017                                                      symtab_hdr->sh_link,
     3018                                                      sym->st_name);
     3019              if (name == NULL)
     3020                return FALSE;
     3021              if (*name == '\0')
     3022                name = bfd_section_name (input_bfd, sec);
     3023            }
     3024
     3025          if (r == bfd_reloc_overflow)
     3026            {
     3027              if (! ((*info->callbacks->reloc_overflow)
     3028                     (info, name, howto->name, (bfd_vma) 0,
     3029                      input_bfd, input_section, rel->r_offset)))
     3030                return FALSE;
     3031            }
     3032          else
     3033            {
     3034              (*_bfd_error_handler)
     3035                (_("%s(%s+0x%lx): reloc against `%s': error %d"),
     3036                 bfd_archive_filename (input_bfd),
     3037                 bfd_get_section_name (input_bfd, input_section),
     3038                 (long) rel->r_offset, name, (int) r);
     3039              return FALSE;
     3040            }
     3041        }
     3042    }
     3043
     3044  return TRUE;
    17893045}
    17903046
     
    17923048   dynamic sections here.  */
    17933049
    1794 static boolean
     3050static bfd_boolean
    17953051elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
    17963052     bfd *output_bfd;
     
    17993055     Elf_Internal_Sym *sym;
    18003056{
    1801   bfd *dynobj;
    1802 
    1803   dynobj = elf_hash_table (info)->dynobj;
     3057  struct elf_i386_link_hash_table *htab;
     3058
     3059  htab = elf_i386_hash_table (info);
    18043060
    18053061  if (h->plt.offset != (bfd_vma) -1)
    18063062    {
    1807       asection *splt;
    1808       asection *sgot;
    1809       asection *srel;
    18103063      bfd_vma plt_index;
    18113064      bfd_vma got_offset;
    1812       Elf_Internal_Rel rel;
     3065      Elf_Internal_Rela rel;
     3066      bfd_byte *loc;
    18133067
    18143068      /* This symbol has an entry in the procedure linkage table.  Set
    18153069         it up.  */
    18163070
    1817       BFD_ASSERT (h->dynindx != -1);
    1818 
    1819       splt = bfd_get_section_by_name (dynobj, ".plt");
    1820       sgot = bfd_get_section_by_name (dynobj, ".got.plt");
    1821       srel = bfd_get_section_by_name (dynobj, ".rel.plt");
    1822       BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
     3071      if (h->dynindx == -1
     3072          || htab->splt == NULL
     3073          || htab->sgotplt == NULL
     3074          || htab->srelplt == NULL)
     3075        abort ();
    18233076
    18243077      /* Get the index in the procedure linkage table which
     
    18363089      if (! info->shared)
    18373090        {
    1838           memcpy (splt->contents + h->plt.offset, elf_i386_plt_entry,
     3091          memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
    18393092                  PLT_ENTRY_SIZE);
    18403093          bfd_put_32 (output_bfd,
    1841                       (sgot->output_section->vma
    1842                        + sgot->output_offset
     3094                      (htab->sgotplt->output_section->vma
     3095                       + htab->sgotplt->output_offset
    18433096                       + got_offset),
    1844                       splt->contents + h->plt.offset + 2);
     3097                      htab->splt->contents + h->plt.offset + 2);
    18453098        }
    18463099      else
    18473100        {
    1848           memcpy (splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
     3101          memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
    18493102                  PLT_ENTRY_SIZE);
    18503103          bfd_put_32 (output_bfd, got_offset,
    1851                       splt->contents + h->plt.offset + 2);
     3104                      htab->splt->contents + h->plt.offset + 2);
    18523105        }
    18533106
    18543107      bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
    1855                   splt->contents + h->plt.offset + 7);
     3108                  htab->splt->contents + h->plt.offset + 7);
    18563109      bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
    1857                   splt->contents + h->plt.offset + 12);
     3110                  htab->splt->contents + h->plt.offset + 12);
    18583111
    18593112      /* Fill in the entry in the global offset table.  */
    18603113      bfd_put_32 (output_bfd,
    1861                   (splt->output_section->vma
    1862                    + splt->output_offset
     3114                  (htab->splt->output_section->vma
     3115                   + htab->splt->output_offset
    18633116                   + h->plt.offset
    18643117                   + 6),
    1865                   sgot->contents + got_offset);
     3118                  htab->sgotplt->contents + got_offset);
    18663119
    18673120      /* Fill in the entry in the .rel.plt section.  */
    1868       rel.r_offset = (sgot->output_section->vma
    1869                       + sgot->output_offset
     3121      rel.r_offset = (htab->sgotplt->output_section->vma
     3122                      + htab->sgotplt->output_offset
    18703123                      + got_offset);
    18713124      rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
    1872       bfd_elf32_swap_reloc_out (output_bfd, &rel,
    1873                                 ((Elf32_External_Rel *) srel->contents
    1874                                  + plt_index));
     3125      loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rel);
     3126      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
    18753127
    18763128      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
    18773129        {
    18783130          /* Mark the symbol as undefined, rather than as defined in
    1879              the .plt section.  Leave the value alone.  */
     3131             the .plt section.  Leave the value alone.  This is a clue
     3132             for the dynamic linker, to make function pointer
     3133             comparisons work between an application and shared
     3134             library.  */
    18803135          sym->st_shndx = SHN_UNDEF;
    18813136        }
    18823137    }
    18833138
    1884   if (h->got.offset != (bfd_vma) -1)
    1885     {
    1886       asection *sgot;
    1887       asection *srel;
    1888       Elf_Internal_Rel rel;
     3139  if (h->got.offset != (bfd_vma) -1
     3140      && elf_i386_hash_entry(h)->tls_type != GOT_TLS_GD
     3141      && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0)
     3142    {
     3143      Elf_Internal_Rela rel;
     3144      bfd_byte *loc;
    18893145
    18903146      /* This symbol has an entry in the global offset table.  Set it
    18913147         up.  */
    18923148
    1893       sgot = bfd_get_section_by_name (dynobj, ".got");
    1894       srel = bfd_get_section_by_name (dynobj, ".rel.got");
    1895       BFD_ASSERT (sgot != NULL && srel != NULL);
    1896 
    1897       rel.r_offset = (sgot->output_section->vma
    1898                       + sgot->output_offset
    1899                       + (h->got.offset &~ 1));
     3149      if (htab->sgot == NULL || htab->srelgot == NULL)
     3150        abort ();
     3151
     3152      rel.r_offset = (htab->sgot->output_section->vma
     3153                      + htab->sgot->output_offset
     3154                      + (h->got.offset & ~(bfd_vma) 1));
    19003155
    19013156      /* If this is a static link, or it is a -Bsymbolic link and the
     
    19043159         The entry in the global offset table will already have been
    19053160         initialized in the relocate_section function.  */
    1906       if (! elf_hash_table (info)->dynamic_sections_created
    1907           || (info->shared
    1908               && (info->symbolic || h->dynindx == -1)
    1909               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
    1910         {
     3161      if (info->shared
     3162          && (info->symbolic
     3163              || h->dynindx == -1
     3164              || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
     3165          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
     3166        {
     3167          BFD_ASSERT((h->got.offset & 1) != 0);
    19113168          rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
    19123169        }
     
    19143171        {
    19153172          BFD_ASSERT((h->got.offset & 1) == 0);
    1916           bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
     3173          bfd_put_32 (output_bfd, (bfd_vma) 0,
     3174                      htab->sgot->contents + h->got.offset);
    19173175          rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
    19183176        }
    19193177
    1920       bfd_elf32_swap_reloc_out (output_bfd, &rel,
    1921                                 ((Elf32_External_Rel *) srel->contents
    1922                                  + srel->reloc_count));
    1923       ++srel->reloc_count;
     3178      loc = htab->srelgot->contents;
     3179      loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
     3180      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
    19243181    }
    19253182
    19263183  if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
    19273184    {
    1928       asection *s;
    1929       Elf_Internal_Rel rel;
     3185      Elf_Internal_Rela rel;
     3186      bfd_byte *loc;
    19303187
    19313188      /* This symbol needs a copy reloc.  Set it up.  */
    19323189
    1933       BFD_ASSERT (h->dynindx != -1
    1934                   && (h->root.type == bfd_link_hash_defined
    1935                       || h->root.type == bfd_link_hash_defweak));
    1936 
    1937       s = bfd_get_section_by_name (h->root.u.def.section->owner,
    1938                                    ".rel.bss");
    1939       BFD_ASSERT (s != NULL);
     3190      if (h->dynindx == -1
     3191          || (h->root.type != bfd_link_hash_defined
     3192              && h->root.type != bfd_link_hash_defweak)
     3193          || htab->srelbss == NULL)
     3194        abort ();
    19403195
    19413196      rel.r_offset = (h->root.u.def.value
     
    19433198                      + h->root.u.def.section->output_offset);
    19443199      rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
    1945       bfd_elf32_swap_reloc_out (output_bfd, &rel,
    1946                                 ((Elf32_External_Rel *) s->contents
    1947                                  + s->reloc_count));
    1948       ++s->reloc_count;
     3200      loc = htab->srelbss->contents;
     3201      loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rel);
     3202      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
    19493203    }
    19503204
     
    19543208    sym->st_shndx = SHN_ABS;
    19553209
    1956   return true;
     3210  return TRUE;
    19573211}
    19583212
     3213/* Used to decide how to sort relocs in an optimal manner for the
     3214   dynamic linker, before writing them out.  */
     3215
     3216static enum elf_reloc_type_class
     3217elf_i386_reloc_type_class (rela)
     3218     const Elf_Internal_Rela *rela;
     3219{
     3220  switch ((int) ELF32_R_TYPE (rela->r_info))
     3221    {
     3222    case R_386_RELATIVE:
     3223      return reloc_class_relative;
     3224    case R_386_JUMP_SLOT:
     3225      return reloc_class_plt;
     3226    case R_386_COPY:
     3227      return reloc_class_copy;
     3228    default:
     3229      return reloc_class_normal;
     3230    }
     3231}
     3232
    19593233/* Finish up the dynamic sections.  */
    19603234
    1961 static boolean
     3235static bfd_boolean
    19623236elf_i386_finish_dynamic_sections (output_bfd, info)
    19633237     bfd *output_bfd;
    19643238     struct bfd_link_info *info;
    19653239{
     3240  struct elf_i386_link_hash_table *htab;
    19663241  bfd *dynobj;
    1967   asection *sgot;
    19683242  asection *sdyn;
    19693243
    1970   dynobj = elf_hash_table (info)->dynobj;
    1971 
    1972   sgot = bfd_get_section_by_name (dynobj, ".got.plt");
    1973   BFD_ASSERT (sgot != NULL);
     3244  htab = elf_i386_hash_table (info);
     3245  dynobj = htab->elf.dynobj;
    19743246  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
    19753247
    1976   if (elf_hash_table (info)->dynamic_sections_created)
    1977     {
    1978       asection *splt;
     3248  if (htab->elf.dynamic_sections_created)
     3249    {
    19793250      Elf32_External_Dyn *dyncon, *dynconend;
    19803251
    1981       BFD_ASSERT (sdyn != NULL);
     3252      if (sdyn == NULL || htab->sgot == NULL)
     3253        abort ();
    19823254
    19833255      dyncon = (Elf32_External_Dyn *) sdyn->contents;
     
    19863258        {
    19873259          Elf_Internal_Dyn dyn;
    1988           const char *name;
    19893260          asection *s;
    19903261
     
    19943265            {
    19953266            default:
     3267              continue;
     3268
     3269            case DT_PLTGOT:
     3270              dyn.d_un.d_ptr = htab->sgot->output_section->vma;
    19963271              break;
    19973272
    1998             case DT_PLTGOT:
    1999               name = ".got";
    2000               goto get_vma;
    20013273            case DT_JMPREL:
    2002               name = ".rel.plt";
    2003             get_vma:
    2004               s = bfd_get_section_by_name (output_bfd, name);
    2005               BFD_ASSERT (s != NULL);
    2006               dyn.d_un.d_ptr = s->vma;
    2007               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
     3274              s = htab->srelplt;
     3275              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
    20083276              break;
    20093277
    20103278            case DT_PLTRELSZ:
    2011               s = bfd_get_section_by_name (output_bfd, ".rel.plt");
    2012               BFD_ASSERT (s != NULL);
    2013               if (s->_cooked_size != 0)
    2014                 dyn.d_un.d_val = s->_cooked_size;
    2015               else
    2016                 dyn.d_un.d_val = s->_raw_size;
    2017               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
     3279              s = htab->srelplt;
     3280              dyn.d_un.d_val = s->_raw_size;
    20183281              break;
    20193282
     
    20243287                 what Solaris does.  However, UnixWare can not handle
    20253288                 that case.  Therefore, we override the DT_RELSZ entry
    2026                  here to make it not include the JMPREL relocs.  Since
    2027                  the linker script arranges for .rel.plt to follow all
    2028                  other relocation sections, we don't have to worry
    2029                  about changing the DT_REL entry.  */
    2030               s = bfd_get_section_by_name (output_bfd, ".rel.plt");
    2031               if (s != NULL)
    2032                 {
    2033                   if (s->_cooked_size != 0)
    2034                     dyn.d_un.d_val -= s->_cooked_size;
    2035                   else
    2036                     dyn.d_un.d_val -= s->_raw_size;
    2037                 }
    2038               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
     3289                 here to make it not include the JMPREL relocs.  */
     3290              s = htab->srelplt;
     3291              if (s == NULL)
     3292                continue;
     3293              dyn.d_un.d_val -= s->_raw_size;
    20393294              break;
    2040             }
     3295
     3296            case DT_REL:
     3297              /* We may not be using the standard ELF linker script.
     3298                 If .rel.plt is the first .rel section, we adjust
     3299                 DT_REL to not include it.  */
     3300              s = htab->srelplt;
     3301              if (s == NULL)
     3302                continue;
     3303              if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
     3304                continue;
     3305              dyn.d_un.d_ptr += s->_raw_size;
     3306              break;
     3307            }
     3308
     3309          bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
    20413310        }
    20423311
    20433312      /* Fill in the first entry in the procedure linkage table.  */
    2044       splt = bfd_get_section_by_name (dynobj, ".plt");
    2045       if (splt && splt->_raw_size > 0)
     3313      if (htab->splt && htab->splt->_raw_size > 0)
    20463314        {
    20473315          if (info->shared)
    2048             memcpy (splt->contents, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
     3316            memcpy (htab->splt->contents,
     3317                    elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
    20493318          else
    20503319            {
    2051               memcpy (splt->contents, elf_i386_plt0_entry, PLT_ENTRY_SIZE);
     3320              memcpy (htab->splt->contents,
     3321                      elf_i386_plt0_entry, PLT_ENTRY_SIZE);
    20523322              bfd_put_32 (output_bfd,
    2053                           sgot->output_section->vma + sgot->output_offset + 4,
    2054                           splt->contents + 2);
     3323                          (htab->sgotplt->output_section->vma
     3324                           + htab->sgotplt->output_offset
     3325                           + 4),
     3326                          htab->splt->contents + 2);
    20553327              bfd_put_32 (output_bfd,
    2056                           sgot->output_section->vma + sgot->output_offset + 8,
    2057                           splt->contents + 8);
     3328                          (htab->sgotplt->output_section->vma
     3329                           + htab->sgotplt->output_offset
     3330                           + 8),
     3331                          htab->splt->contents + 8);
    20583332            }
    20593333
    20603334          /* UnixWare sets the entsize of .plt to 4, although that doesn't
    20613335             really seem like the right value.  */
    2062           elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4;
    2063         }
    2064     }
    2065 
    2066   /* Fill in the first three entries in the global offset table.  */
    2067   if (sgot->_raw_size > 0)
    2068     {
    2069       if (sdyn == NULL)
    2070         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
    2071       else
    2072         bfd_put_32 (output_bfd,
    2073                     sdyn->output_section->vma + sdyn->output_offset,
    2074                     sgot->contents);
    2075       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
    2076       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
    2077     }
    2078 
    2079   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
    2080 
    2081   return true;
     3336          elf_section_data (htab->splt->output_section)
     3337            ->this_hdr.sh_entsize = 4;
     3338        }
     3339    }
     3340
     3341  if (htab->sgotplt)
     3342    {
     3343      /* Fill in the first three entries in the global offset table.  */
     3344      if (htab->sgotplt->_raw_size > 0)
     3345        {
     3346          bfd_put_32 (output_bfd,
     3347                      (sdyn == NULL ? (bfd_vma) 0
     3348                       : sdyn->output_section->vma + sdyn->output_offset),
     3349                      htab->sgotplt->contents);
     3350          bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4);
     3351          bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
     3352        }
     3353
     3354      elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
     3355    }
     3356  return TRUE;
    20823357}
    2083 
    2084 /* Set the correct type for an x86 ELF section.  We do this by the
    2085    section name, which is a hack, but ought to work.  */
    2086 
    2087 static boolean
    2088 elf_i386_fake_sections (abfd, hdr, sec)
    2089      bfd *abfd ATTRIBUTE_UNUSED;
    2090      Elf32_Internal_Shdr *hdr;
    2091      asection *sec;
    2092 {
    2093   register const char *name;
    2094 
    2095   name = bfd_get_section_name (abfd, sec);
    2096 
    2097   if (strcmp (name, ".reloc") == 0)
    2098     /*
    2099      * This is an ugly, but unfortunately necessary hack that is
    2100      * needed when producing EFI binaries on x86. It tells
    2101      * elf.c:elf_fake_sections() not to consider ".reloc" as a section
    2102      * containing ELF relocation info.  We need this hack in order to
    2103      * be able to generate ELF binaries that can be translated into
    2104      * EFI applications (which are essentially COFF objects).  Those
    2105      * files contain a COFF ".reloc" section inside an ELFNN object,
    2106      * which would normally cause BFD to segfault because it would
    2107      * attempt to interpret this section as containing relocation
    2108      * entries for section "oc".  With this hack enabled, ".reloc"
    2109      * will be treated as a normal data section, which will avoid the
    2110      * segfault.  However, you won't be able to create an ELFNN binary
    2111      * with a section named "oc" that needs relocations, but that's
    2112      * the kind of ugly side-effects you get when detecting section
    2113      * types based on their names...  In practice, this limitation is
    2114      * unlikely to bite.
    2115      */
    2116     hdr->sh_type = SHT_PROGBITS;
    2117 
    2118   return true;
    2119 }
    2120 
    21213358
    21223359#define TARGET_LITTLE_SYM               bfd_elf32_i386_vec
     
    21273364
    21283365#define elf_backend_can_gc_sections     1
     3366#define elf_backend_can_refcount        1
    21293367#define elf_backend_want_got_plt        1
    21303368#define elf_backend_plt_readonly        1
     
    21333371#define elf_backend_plt_header_size     PLT_ENTRY_SIZE
    21343372
    2135 #define elf_info_to_howto                     elf_i386_info_to_howto
     3373/* Support RELA for objdump of prelink objects.  */
     3374#define elf_info_to_howto                     elf_i386_info_to_howto_rel
    21363375#define elf_info_to_howto_rel                 elf_i386_info_to_howto_rel
    21373376
    2138 #define bfd_elf32_bfd_final_link              _bfd_elf32_gc_common_final_link
     3377#define bfd_elf32_mkobject                    elf_i386_mkobject
     3378#define elf_backend_object_p                  elf_i386_object_p
     3379
    21393380#define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
    21403381#define bfd_elf32_bfd_link_hash_table_create  elf_i386_link_hash_table_create
     
    21433384#define elf_backend_adjust_dynamic_symbol     elf_i386_adjust_dynamic_symbol
    21443385#define elf_backend_check_relocs              elf_i386_check_relocs
    2145 #define elf_backend_create_dynamic_sections   _bfd_elf_create_dynamic_sections
     3386#define elf_backend_copy_indirect_symbol      elf_i386_copy_indirect_symbol
     3387#define elf_backend_create_dynamic_sections   elf_i386_create_dynamic_sections
     3388#define elf_backend_fake_sections             elf_i386_fake_sections
    21463389#define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
    21473390#define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
    21483391#define elf_backend_gc_mark_hook              elf_i386_gc_mark_hook
    21493392#define elf_backend_gc_sweep_hook             elf_i386_gc_sweep_hook
     3393#define elf_backend_grok_prstatus             elf_i386_grok_prstatus
     3394#define elf_backend_grok_psinfo               elf_i386_grok_psinfo
     3395#define elf_backend_reloc_type_class          elf_i386_reloc_type_class
    21503396#define elf_backend_relocate_section          elf_i386_relocate_section
    21513397#define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
    2152 #define elf_backend_fake_sections             elf_i386_fake_sections
    21533398
    21543399#include "elf32-target.h"
     3400
     3401/* FreeBSD support.  */
     3402
     3403#undef  TARGET_LITTLE_SYM
     3404#define TARGET_LITTLE_SYM               bfd_elf32_i386_freebsd_vec
     3405#undef  TARGET_LITTLE_NAME
     3406#define TARGET_LITTLE_NAME              "elf32-i386-freebsd"
     3407
     3408/* The kernel recognizes executables as valid only if they carry a
     3409   "FreeBSD" label in the ELF header.  So we put this label on all
     3410   executables and (for simplicity) also all other object files.  */
     3411
     3412static void elf_i386_post_process_headers
     3413  PARAMS ((bfd *, struct bfd_link_info *));
     3414
     3415static void
     3416elf_i386_post_process_headers (abfd, link_info)
     3417     bfd *abfd;
     3418     struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
     3419{
     3420  Elf_Internal_Ehdr *i_ehdrp;
     3421
     3422  i_ehdrp = elf_elfheader (abfd);
     3423
     3424  /* Put an ABI label supported by FreeBSD >= 4.1.  */
     3425  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
     3426#ifdef OLD_FREEBSD_ABI_LABEL
     3427  /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
     3428  memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
     3429#endif
     3430}
     3431
     3432#undef  elf_backend_post_process_headers
     3433#define elf_backend_post_process_headers        elf_i386_post_process_headers
     3434#undef  elf32_bed
     3435#define elf32_bed                               elf32_i386_fbsd_bed
     3436
     3437#include "elf32-target.h"
Note: See TracChangeset for help on using the changeset viewer.