xref: /dflybsd-src/contrib/binutils-2.27/bfd/elf32-i386.c (revision e656dc90e3d65d744d534af2f5ea88cf8101ebcf)
1*a9fa9459Szrj /* Intel 80386/80486-specific support for 32-bit ELF
2*a9fa9459Szrj    Copyright (C) 1993-2016 Free Software Foundation, Inc.
3*a9fa9459Szrj 
4*a9fa9459Szrj    This file is part of BFD, the Binary File Descriptor library.
5*a9fa9459Szrj 
6*a9fa9459Szrj    This program is free software; you can redistribute it and/or modify
7*a9fa9459Szrj    it under the terms of the GNU General Public License as published by
8*a9fa9459Szrj    the Free Software Foundation; either version 3 of the License, or
9*a9fa9459Szrj    (at your option) any later version.
10*a9fa9459Szrj 
11*a9fa9459Szrj    This program is distributed in the hope that it will be useful,
12*a9fa9459Szrj    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*a9fa9459Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*a9fa9459Szrj    GNU General Public License for more details.
15*a9fa9459Szrj 
16*a9fa9459Szrj    You should have received a copy of the GNU General Public License
17*a9fa9459Szrj    along with this program; if not, write to the Free Software
18*a9fa9459Szrj    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19*a9fa9459Szrj    MA 02110-1301, USA.  */
20*a9fa9459Szrj 
21*a9fa9459Szrj #include "sysdep.h"
22*a9fa9459Szrj #include "bfd.h"
23*a9fa9459Szrj #include "bfdlink.h"
24*a9fa9459Szrj #include "libbfd.h"
25*a9fa9459Szrj #include "elf-bfd.h"
26*a9fa9459Szrj #include "elf-nacl.h"
27*a9fa9459Szrj #include "elf-vxworks.h"
28*a9fa9459Szrj #include "bfd_stdint.h"
29*a9fa9459Szrj #include "objalloc.h"
30*a9fa9459Szrj #include "hashtab.h"
31*a9fa9459Szrj #include "dwarf2.h"
32*a9fa9459Szrj #include "opcode/i386.h"
33*a9fa9459Szrj 
34*a9fa9459Szrj /* 386 uses REL relocations instead of RELA.  */
35*a9fa9459Szrj #define USE_REL	1
36*a9fa9459Szrj 
37*a9fa9459Szrj #include "elf/i386.h"
38*a9fa9459Szrj 
39*a9fa9459Szrj static reloc_howto_type elf_howto_table[]=
40*a9fa9459Szrj {
41*a9fa9459Szrj   HOWTO(R_386_NONE, 0, 3, 0, FALSE, 0, complain_overflow_dont,
42*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_NONE",
43*a9fa9459Szrj 	TRUE, 0x00000000, 0x00000000, FALSE),
44*a9fa9459Szrj   HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
45*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_32",
46*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
47*a9fa9459Szrj   HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
48*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_PC32",
49*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, TRUE),
50*a9fa9459Szrj   HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
51*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_GOT32",
52*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
53*a9fa9459Szrj   HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
54*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_PLT32",
55*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, TRUE),
56*a9fa9459Szrj   HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
57*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_COPY",
58*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
59*a9fa9459Szrj   HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
60*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_GLOB_DAT",
61*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
62*a9fa9459Szrj   HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
63*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
64*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
65*a9fa9459Szrj   HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
66*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_RELATIVE",
67*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
68*a9fa9459Szrj   HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
69*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_GOTOFF",
70*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
71*a9fa9459Szrj   HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
72*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_GOTPC",
73*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, TRUE),
74*a9fa9459Szrj 
75*a9fa9459Szrj   /* We have a gap in the reloc numbers here.
76*a9fa9459Szrj      R_386_standard counts the number up to this point, and
77*a9fa9459Szrj      R_386_ext_offset is the value to subtract from a reloc type of
78*a9fa9459Szrj      R_386_16 thru R_386_PC8 to form an index into this table.  */
79*a9fa9459Szrj #define R_386_standard (R_386_GOTPC + 1)
80*a9fa9459Szrj #define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard)
81*a9fa9459Szrj 
82*a9fa9459Szrj   /* These relocs are a GNU extension.  */
83*a9fa9459Szrj   HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
84*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
85*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
86*a9fa9459Szrj   HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
87*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_IE",
88*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
89*a9fa9459Szrj   HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
90*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
91*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
92*a9fa9459Szrj   HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
93*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_LE",
94*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
95*a9fa9459Szrj   HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
96*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_GD",
97*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
98*a9fa9459Szrj   HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
99*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_LDM",
100*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
101*a9fa9459Szrj   HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
102*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_16",
103*a9fa9459Szrj 	TRUE, 0xffff, 0xffff, FALSE),
104*a9fa9459Szrj   HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield,
105*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_PC16",
106*a9fa9459Szrj 	TRUE, 0xffff, 0xffff, TRUE),
107*a9fa9459Szrj   HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
108*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_8",
109*a9fa9459Szrj 	TRUE, 0xff, 0xff, FALSE),
110*a9fa9459Szrj   HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
111*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_PC8",
112*a9fa9459Szrj 	TRUE, 0xff, 0xff, TRUE),
113*a9fa9459Szrj 
114*a9fa9459Szrj #define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset)
115*a9fa9459Szrj #define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext)
116*a9fa9459Szrj   /* These are common with Solaris TLS implementation.  */
117*a9fa9459Szrj   HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
118*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
119*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
120*a9fa9459Szrj   HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
121*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_IE_32",
122*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
123*a9fa9459Szrj   HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
124*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_LE_32",
125*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
126*a9fa9459Szrj   HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
127*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
128*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
129*a9fa9459Szrj   HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
130*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
131*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
132*a9fa9459Szrj   HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
133*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
134*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
135*a9fa9459Szrj   HOWTO(R_386_SIZE32, 0, 2, 32, FALSE, 0, complain_overflow_unsigned,
136*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_SIZE32",
137*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
138*a9fa9459Szrj   HOWTO(R_386_TLS_GOTDESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
139*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_GOTDESC",
140*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
141*a9fa9459Szrj   HOWTO(R_386_TLS_DESC_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
142*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_DESC_CALL",
143*a9fa9459Szrj 	FALSE, 0, 0, FALSE),
144*a9fa9459Szrj   HOWTO(R_386_TLS_DESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
145*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_TLS_DESC",
146*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
147*a9fa9459Szrj   HOWTO(R_386_IRELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
148*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_IRELATIVE",
149*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
150*a9fa9459Szrj   HOWTO(R_386_GOT32X, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
151*a9fa9459Szrj 	bfd_elf_generic_reloc, "R_386_GOT32X",
152*a9fa9459Szrj 	TRUE, 0xffffffff, 0xffffffff, FALSE),
153*a9fa9459Szrj 
154*a9fa9459Szrj   /* Another gap.  */
155*a9fa9459Szrj #define R_386_ext2 (R_386_GOT32X + 1 - R_386_tls_offset)
156*a9fa9459Szrj #define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_ext2)
157*a9fa9459Szrj 
158*a9fa9459Szrj /* GNU extension to record C++ vtable hierarchy.  */
159*a9fa9459Szrj   HOWTO (R_386_GNU_VTINHERIT,	/* type */
160*a9fa9459Szrj 	 0,			/* rightshift */
161*a9fa9459Szrj 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
162*a9fa9459Szrj 	 0,			/* bitsize */
163*a9fa9459Szrj 	 FALSE,			/* pc_relative */
164*a9fa9459Szrj 	 0,			/* bitpos */
165*a9fa9459Szrj 	 complain_overflow_dont, /* complain_on_overflow */
166*a9fa9459Szrj 	 NULL,			/* special_function */
167*a9fa9459Szrj 	 "R_386_GNU_VTINHERIT",	/* name */
168*a9fa9459Szrj 	 FALSE,			/* partial_inplace */
169*a9fa9459Szrj 	 0,			/* src_mask */
170*a9fa9459Szrj 	 0,			/* dst_mask */
171*a9fa9459Szrj 	 FALSE),		/* pcrel_offset */
172*a9fa9459Szrj 
173*a9fa9459Szrj /* GNU extension to record C++ vtable member usage.  */
174*a9fa9459Szrj   HOWTO (R_386_GNU_VTENTRY,	/* type */
175*a9fa9459Szrj 	 0,			/* rightshift */
176*a9fa9459Szrj 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
177*a9fa9459Szrj 	 0,			/* bitsize */
178*a9fa9459Szrj 	 FALSE,			/* pc_relative */
179*a9fa9459Szrj 	 0,			/* bitpos */
180*a9fa9459Szrj 	 complain_overflow_dont, /* complain_on_overflow */
181*a9fa9459Szrj 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
182*a9fa9459Szrj 	 "R_386_GNU_VTENTRY",	/* name */
183*a9fa9459Szrj 	 FALSE,			/* partial_inplace */
184*a9fa9459Szrj 	 0,			/* src_mask */
185*a9fa9459Szrj 	 0,			/* dst_mask */
186*a9fa9459Szrj 	 FALSE)			/* pcrel_offset */
187*a9fa9459Szrj 
188*a9fa9459Szrj #define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
189*a9fa9459Szrj 
190*a9fa9459Szrj };
191*a9fa9459Szrj 
192*a9fa9459Szrj #ifdef DEBUG_GEN_RELOC
193*a9fa9459Szrj #define TRACE(str) \
194*a9fa9459Szrj   fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
195*a9fa9459Szrj #else
196*a9fa9459Szrj #define TRACE(str)
197*a9fa9459Szrj #endif
198*a9fa9459Szrj 
199*a9fa9459Szrj static reloc_howto_type *
elf_i386_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)200*a9fa9459Szrj elf_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
201*a9fa9459Szrj 			    bfd_reloc_code_real_type code)
202*a9fa9459Szrj {
203*a9fa9459Szrj   switch (code)
204*a9fa9459Szrj     {
205*a9fa9459Szrj     case BFD_RELOC_NONE:
206*a9fa9459Szrj       TRACE ("BFD_RELOC_NONE");
207*a9fa9459Szrj       return &elf_howto_table[R_386_NONE];
208*a9fa9459Szrj 
209*a9fa9459Szrj     case BFD_RELOC_32:
210*a9fa9459Szrj       TRACE ("BFD_RELOC_32");
211*a9fa9459Szrj       return &elf_howto_table[R_386_32];
212*a9fa9459Szrj 
213*a9fa9459Szrj     case BFD_RELOC_CTOR:
214*a9fa9459Szrj       TRACE ("BFD_RELOC_CTOR");
215*a9fa9459Szrj       return &elf_howto_table[R_386_32];
216*a9fa9459Szrj 
217*a9fa9459Szrj     case BFD_RELOC_32_PCREL:
218*a9fa9459Szrj       TRACE ("BFD_RELOC_PC32");
219*a9fa9459Szrj       return &elf_howto_table[R_386_PC32];
220*a9fa9459Szrj 
221*a9fa9459Szrj     case BFD_RELOC_386_GOT32:
222*a9fa9459Szrj       TRACE ("BFD_RELOC_386_GOT32");
223*a9fa9459Szrj       return &elf_howto_table[R_386_GOT32];
224*a9fa9459Szrj 
225*a9fa9459Szrj     case BFD_RELOC_386_PLT32:
226*a9fa9459Szrj       TRACE ("BFD_RELOC_386_PLT32");
227*a9fa9459Szrj       return &elf_howto_table[R_386_PLT32];
228*a9fa9459Szrj 
229*a9fa9459Szrj     case BFD_RELOC_386_COPY:
230*a9fa9459Szrj       TRACE ("BFD_RELOC_386_COPY");
231*a9fa9459Szrj       return &elf_howto_table[R_386_COPY];
232*a9fa9459Szrj 
233*a9fa9459Szrj     case BFD_RELOC_386_GLOB_DAT:
234*a9fa9459Szrj       TRACE ("BFD_RELOC_386_GLOB_DAT");
235*a9fa9459Szrj       return &elf_howto_table[R_386_GLOB_DAT];
236*a9fa9459Szrj 
237*a9fa9459Szrj     case BFD_RELOC_386_JUMP_SLOT:
238*a9fa9459Szrj       TRACE ("BFD_RELOC_386_JUMP_SLOT");
239*a9fa9459Szrj       return &elf_howto_table[R_386_JUMP_SLOT];
240*a9fa9459Szrj 
241*a9fa9459Szrj     case BFD_RELOC_386_RELATIVE:
242*a9fa9459Szrj       TRACE ("BFD_RELOC_386_RELATIVE");
243*a9fa9459Szrj       return &elf_howto_table[R_386_RELATIVE];
244*a9fa9459Szrj 
245*a9fa9459Szrj     case BFD_RELOC_386_GOTOFF:
246*a9fa9459Szrj       TRACE ("BFD_RELOC_386_GOTOFF");
247*a9fa9459Szrj       return &elf_howto_table[R_386_GOTOFF];
248*a9fa9459Szrj 
249*a9fa9459Szrj     case BFD_RELOC_386_GOTPC:
250*a9fa9459Szrj       TRACE ("BFD_RELOC_386_GOTPC");
251*a9fa9459Szrj       return &elf_howto_table[R_386_GOTPC];
252*a9fa9459Szrj 
253*a9fa9459Szrj       /* These relocs are a GNU extension.  */
254*a9fa9459Szrj     case BFD_RELOC_386_TLS_TPOFF:
255*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_TPOFF");
256*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset];
257*a9fa9459Szrj 
258*a9fa9459Szrj     case BFD_RELOC_386_TLS_IE:
259*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_IE");
260*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset];
261*a9fa9459Szrj 
262*a9fa9459Szrj     case BFD_RELOC_386_TLS_GOTIE:
263*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_GOTIE");
264*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset];
265*a9fa9459Szrj 
266*a9fa9459Szrj     case BFD_RELOC_386_TLS_LE:
267*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_LE");
268*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset];
269*a9fa9459Szrj 
270*a9fa9459Szrj     case BFD_RELOC_386_TLS_GD:
271*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_GD");
272*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset];
273*a9fa9459Szrj 
274*a9fa9459Szrj     case BFD_RELOC_386_TLS_LDM:
275*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_LDM");
276*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset];
277*a9fa9459Szrj 
278*a9fa9459Szrj     case BFD_RELOC_16:
279*a9fa9459Szrj       TRACE ("BFD_RELOC_16");
280*a9fa9459Szrj       return &elf_howto_table[R_386_16 - R_386_ext_offset];
281*a9fa9459Szrj 
282*a9fa9459Szrj     case BFD_RELOC_16_PCREL:
283*a9fa9459Szrj       TRACE ("BFD_RELOC_16_PCREL");
284*a9fa9459Szrj       return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
285*a9fa9459Szrj 
286*a9fa9459Szrj     case BFD_RELOC_8:
287*a9fa9459Szrj       TRACE ("BFD_RELOC_8");
288*a9fa9459Szrj       return &elf_howto_table[R_386_8 - R_386_ext_offset];
289*a9fa9459Szrj 
290*a9fa9459Szrj     case BFD_RELOC_8_PCREL:
291*a9fa9459Szrj       TRACE ("BFD_RELOC_8_PCREL");
292*a9fa9459Szrj       return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
293*a9fa9459Szrj 
294*a9fa9459Szrj     /* Common with Sun TLS implementation.  */
295*a9fa9459Szrj     case BFD_RELOC_386_TLS_LDO_32:
296*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_LDO_32");
297*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset];
298*a9fa9459Szrj 
299*a9fa9459Szrj     case BFD_RELOC_386_TLS_IE_32:
300*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_IE_32");
301*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset];
302*a9fa9459Szrj 
303*a9fa9459Szrj     case BFD_RELOC_386_TLS_LE_32:
304*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_LE_32");
305*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset];
306*a9fa9459Szrj 
307*a9fa9459Szrj     case BFD_RELOC_386_TLS_DTPMOD32:
308*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
309*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset];
310*a9fa9459Szrj 
311*a9fa9459Szrj     case BFD_RELOC_386_TLS_DTPOFF32:
312*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
313*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset];
314*a9fa9459Szrj 
315*a9fa9459Szrj     case BFD_RELOC_386_TLS_TPOFF32:
316*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_TPOFF32");
317*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset];
318*a9fa9459Szrj 
319*a9fa9459Szrj     case BFD_RELOC_SIZE32:
320*a9fa9459Szrj       TRACE ("BFD_RELOC_SIZE32");
321*a9fa9459Szrj       return &elf_howto_table[R_386_SIZE32 - R_386_tls_offset];
322*a9fa9459Szrj 
323*a9fa9459Szrj     case BFD_RELOC_386_TLS_GOTDESC:
324*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_GOTDESC");
325*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_GOTDESC - R_386_tls_offset];
326*a9fa9459Szrj 
327*a9fa9459Szrj     case BFD_RELOC_386_TLS_DESC_CALL:
328*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_DESC_CALL");
329*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_DESC_CALL - R_386_tls_offset];
330*a9fa9459Szrj 
331*a9fa9459Szrj     case BFD_RELOC_386_TLS_DESC:
332*a9fa9459Szrj       TRACE ("BFD_RELOC_386_TLS_DESC");
333*a9fa9459Szrj       return &elf_howto_table[R_386_TLS_DESC - R_386_tls_offset];
334*a9fa9459Szrj 
335*a9fa9459Szrj     case BFD_RELOC_386_IRELATIVE:
336*a9fa9459Szrj       TRACE ("BFD_RELOC_386_IRELATIVE");
337*a9fa9459Szrj       return &elf_howto_table[R_386_IRELATIVE - R_386_tls_offset];
338*a9fa9459Szrj 
339*a9fa9459Szrj     case BFD_RELOC_386_GOT32X:
340*a9fa9459Szrj       TRACE ("BFD_RELOC_386_GOT32X");
341*a9fa9459Szrj       return &elf_howto_table[R_386_GOT32X - R_386_tls_offset];
342*a9fa9459Szrj 
343*a9fa9459Szrj     case BFD_RELOC_VTABLE_INHERIT:
344*a9fa9459Szrj       TRACE ("BFD_RELOC_VTABLE_INHERIT");
345*a9fa9459Szrj       return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset];
346*a9fa9459Szrj 
347*a9fa9459Szrj     case BFD_RELOC_VTABLE_ENTRY:
348*a9fa9459Szrj       TRACE ("BFD_RELOC_VTABLE_ENTRY");
349*a9fa9459Szrj       return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset];
350*a9fa9459Szrj 
351*a9fa9459Szrj     default:
352*a9fa9459Szrj       break;
353*a9fa9459Szrj     }
354*a9fa9459Szrj 
355*a9fa9459Szrj   TRACE ("Unknown");
356*a9fa9459Szrj   return 0;
357*a9fa9459Szrj }
358*a9fa9459Szrj 
359*a9fa9459Szrj static reloc_howto_type *
elf_i386_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)360*a9fa9459Szrj elf_i386_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
361*a9fa9459Szrj 			    const char *r_name)
362*a9fa9459Szrj {
363*a9fa9459Szrj   unsigned int i;
364*a9fa9459Szrj 
365*a9fa9459Szrj   for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
366*a9fa9459Szrj     if (elf_howto_table[i].name != NULL
367*a9fa9459Szrj 	&& strcasecmp (elf_howto_table[i].name, r_name) == 0)
368*a9fa9459Szrj       return &elf_howto_table[i];
369*a9fa9459Szrj 
370*a9fa9459Szrj   return NULL;
371*a9fa9459Szrj }
372*a9fa9459Szrj 
373*a9fa9459Szrj static reloc_howto_type *
elf_i386_rtype_to_howto(bfd * abfd,unsigned r_type)374*a9fa9459Szrj elf_i386_rtype_to_howto (bfd *abfd, unsigned r_type)
375*a9fa9459Szrj {
376*a9fa9459Szrj   unsigned int indx;
377*a9fa9459Szrj 
378*a9fa9459Szrj   if ((indx = r_type) >= R_386_standard
379*a9fa9459Szrj       && ((indx = r_type - R_386_ext_offset) - R_386_standard
380*a9fa9459Szrj 	  >= R_386_ext - R_386_standard)
381*a9fa9459Szrj       && ((indx = r_type - R_386_tls_offset) - R_386_ext
382*a9fa9459Szrj 	  >= R_386_ext2 - R_386_ext)
383*a9fa9459Szrj       && ((indx = r_type - R_386_vt_offset) - R_386_ext2
384*a9fa9459Szrj 	  >= R_386_vt - R_386_ext2))
385*a9fa9459Szrj     {
386*a9fa9459Szrj       (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
387*a9fa9459Szrj 			     abfd, (int) r_type);
388*a9fa9459Szrj       indx = R_386_NONE;
389*a9fa9459Szrj     }
390*a9fa9459Szrj   /* PR 17512: file: 0f67f69d.  */
391*a9fa9459Szrj   if (elf_howto_table [indx].type != r_type)
392*a9fa9459Szrj     return NULL;
393*a9fa9459Szrj   return &elf_howto_table[indx];
394*a9fa9459Szrj }
395*a9fa9459Szrj 
396*a9fa9459Szrj static void
elf_i386_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)397*a9fa9459Szrj elf_i386_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
398*a9fa9459Szrj 			    arelent *cache_ptr,
399*a9fa9459Szrj 			    Elf_Internal_Rela *dst)
400*a9fa9459Szrj {
401*a9fa9459Szrj   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
402*a9fa9459Szrj   cache_ptr->howto = elf_i386_rtype_to_howto (abfd, r_type);
403*a9fa9459Szrj }
404*a9fa9459Szrj 
405*a9fa9459Szrj /* Return whether a symbol name implies a local label.  The UnixWare
406*a9fa9459Szrj    2.1 cc generates temporary symbols that start with .X, so we
407*a9fa9459Szrj    recognize them here.  FIXME: do other SVR4 compilers also use .X?.
408*a9fa9459Szrj    If so, we should move the .X recognition into
409*a9fa9459Szrj    _bfd_elf_is_local_label_name.  */
410*a9fa9459Szrj 
411*a9fa9459Szrj static bfd_boolean
elf_i386_is_local_label_name(bfd * abfd,const char * name)412*a9fa9459Szrj elf_i386_is_local_label_name (bfd *abfd, const char *name)
413*a9fa9459Szrj {
414*a9fa9459Szrj   if (name[0] == '.' && name[1] == 'X')
415*a9fa9459Szrj     return TRUE;
416*a9fa9459Szrj 
417*a9fa9459Szrj   return _bfd_elf_is_local_label_name (abfd, name);
418*a9fa9459Szrj }
419*a9fa9459Szrj 
420*a9fa9459Szrj /* Support for core dump NOTE sections.  */
421*a9fa9459Szrj 
422*a9fa9459Szrj static bfd_boolean
elf_i386_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)423*a9fa9459Szrj elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
424*a9fa9459Szrj {
425*a9fa9459Szrj   int offset;
426*a9fa9459Szrj   size_t size;
427*a9fa9459Szrj 
428*a9fa9459Szrj   if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
429*a9fa9459Szrj     {
430*a9fa9459Szrj       int pr_version = bfd_get_32 (abfd, note->descdata);
431*a9fa9459Szrj 
432*a9fa9459Szrj       if (pr_version != 1)
433*a9fa9459Szrj  	return FALSE;
434*a9fa9459Szrj 
435*a9fa9459Szrj       /* pr_cursig */
436*a9fa9459Szrj       elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 20);
437*a9fa9459Szrj 
438*a9fa9459Szrj       /* pr_pid */
439*a9fa9459Szrj       elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
440*a9fa9459Szrj 
441*a9fa9459Szrj       /* pr_reg */
442*a9fa9459Szrj       offset = 28;
443*a9fa9459Szrj       size = bfd_get_32 (abfd, note->descdata + 8);
444*a9fa9459Szrj     }
445*a9fa9459Szrj   else
446*a9fa9459Szrj     {
447*a9fa9459Szrj       switch (note->descsz)
448*a9fa9459Szrj 	{
449*a9fa9459Szrj 	default:
450*a9fa9459Szrj 	  return FALSE;
451*a9fa9459Szrj 
452*a9fa9459Szrj 	case 144:		/* Linux/i386 */
453*a9fa9459Szrj 	  /* pr_cursig */
454*a9fa9459Szrj 	  elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
455*a9fa9459Szrj 
456*a9fa9459Szrj 	  /* pr_pid */
457*a9fa9459Szrj 	  elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
458*a9fa9459Szrj 
459*a9fa9459Szrj 	  /* pr_reg */
460*a9fa9459Szrj 	  offset = 72;
461*a9fa9459Szrj 	  size = 68;
462*a9fa9459Szrj 
463*a9fa9459Szrj 	  break;
464*a9fa9459Szrj 	}
465*a9fa9459Szrj     }
466*a9fa9459Szrj 
467*a9fa9459Szrj   /* Make a ".reg/999" section.  */
468*a9fa9459Szrj   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
469*a9fa9459Szrj 					  size, note->descpos + offset);
470*a9fa9459Szrj }
471*a9fa9459Szrj 
472*a9fa9459Szrj static bfd_boolean
elf_i386_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)473*a9fa9459Szrj elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
474*a9fa9459Szrj {
475*a9fa9459Szrj   if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
476*a9fa9459Szrj     {
477*a9fa9459Szrj       int pr_version = bfd_get_32 (abfd, note->descdata);
478*a9fa9459Szrj 
479*a9fa9459Szrj       if (pr_version != 1)
480*a9fa9459Szrj 	return FALSE;
481*a9fa9459Szrj 
482*a9fa9459Szrj       elf_tdata (abfd)->core->program
483*a9fa9459Szrj 	= _bfd_elfcore_strndup (abfd, note->descdata + 8, 17);
484*a9fa9459Szrj       elf_tdata (abfd)->core->command
485*a9fa9459Szrj 	= _bfd_elfcore_strndup (abfd, note->descdata + 25, 81);
486*a9fa9459Szrj     }
487*a9fa9459Szrj   else
488*a9fa9459Szrj     {
489*a9fa9459Szrj       switch (note->descsz)
490*a9fa9459Szrj 	{
491*a9fa9459Szrj 	default:
492*a9fa9459Szrj 	  return FALSE;
493*a9fa9459Szrj 
494*a9fa9459Szrj 	case 124:		/* Linux/i386 elf_prpsinfo.  */
495*a9fa9459Szrj 	  elf_tdata (abfd)->core->pid
496*a9fa9459Szrj 	    = bfd_get_32 (abfd, note->descdata + 12);
497*a9fa9459Szrj 	  elf_tdata (abfd)->core->program
498*a9fa9459Szrj 	    = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
499*a9fa9459Szrj 	  elf_tdata (abfd)->core->command
500*a9fa9459Szrj 	    = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
501*a9fa9459Szrj 	}
502*a9fa9459Szrj     }
503*a9fa9459Szrj 
504*a9fa9459Szrj   /* Note that for some reason, a spurious space is tacked
505*a9fa9459Szrj      onto the end of the args in some (at least one anyway)
506*a9fa9459Szrj      implementations, so strip it off if it exists.  */
507*a9fa9459Szrj   {
508*a9fa9459Szrj     char *command = elf_tdata (abfd)->core->command;
509*a9fa9459Szrj     int n = strlen (command);
510*a9fa9459Szrj 
511*a9fa9459Szrj     if (0 < n && command[n - 1] == ' ')
512*a9fa9459Szrj       command[n - 1] = '\0';
513*a9fa9459Szrj   }
514*a9fa9459Szrj 
515*a9fa9459Szrj   return TRUE;
516*a9fa9459Szrj }
517*a9fa9459Szrj 
518*a9fa9459Szrj /* Functions for the i386 ELF linker.
519*a9fa9459Szrj 
520*a9fa9459Szrj    In order to gain some understanding of code in this file without
521*a9fa9459Szrj    knowing all the intricate details of the linker, note the
522*a9fa9459Szrj    following:
523*a9fa9459Szrj 
524*a9fa9459Szrj    Functions named elf_i386_* are called by external routines, other
525*a9fa9459Szrj    functions are only called locally.  elf_i386_* functions appear
526*a9fa9459Szrj    in this file more or less in the order in which they are called
527*a9fa9459Szrj    from external routines.  eg. elf_i386_check_relocs is called
528*a9fa9459Szrj    early in the link process, elf_i386_finish_dynamic_sections is
529*a9fa9459Szrj    one of the last functions.  */
530*a9fa9459Szrj 
531*a9fa9459Szrj 
532*a9fa9459Szrj /* The name of the dynamic interpreter.  This is put in the .interp
533*a9fa9459Szrj    section.  */
534*a9fa9459Szrj 
535*a9fa9459Szrj #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
536*a9fa9459Szrj 
537*a9fa9459Szrj /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
538*a9fa9459Szrj    copying dynamic variables from a shared lib into an app's dynbss
539*a9fa9459Szrj    section, and instead use a dynamic relocation to point into the
540*a9fa9459Szrj    shared lib.  */
541*a9fa9459Szrj #define ELIMINATE_COPY_RELOCS 1
542*a9fa9459Szrj 
543*a9fa9459Szrj /* The size in bytes of an entry in the procedure linkage table.  */
544*a9fa9459Szrj 
545*a9fa9459Szrj #define PLT_ENTRY_SIZE 16
546*a9fa9459Szrj 
547*a9fa9459Szrj /* The first entry in an absolute procedure linkage table looks like
548*a9fa9459Szrj    this.  See the SVR4 ABI i386 supplement to see how this works.
549*a9fa9459Szrj    Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte.  */
550*a9fa9459Szrj 
551*a9fa9459Szrj static const bfd_byte elf_i386_plt0_entry[12] =
552*a9fa9459Szrj {
553*a9fa9459Szrj   0xff, 0x35,	/* pushl contents of address */
554*a9fa9459Szrj   0, 0, 0, 0,	/* replaced with address of .got + 4.  */
555*a9fa9459Szrj   0xff, 0x25,	/* jmp indirect */
556*a9fa9459Szrj   0, 0, 0, 0	/* replaced with address of .got + 8.  */
557*a9fa9459Szrj };
558*a9fa9459Szrj 
559*a9fa9459Szrj /* Subsequent entries in an absolute procedure linkage table look like
560*a9fa9459Szrj    this.  */
561*a9fa9459Szrj 
562*a9fa9459Szrj static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
563*a9fa9459Szrj {
564*a9fa9459Szrj   0xff, 0x25,	/* jmp indirect */
565*a9fa9459Szrj   0, 0, 0, 0,	/* replaced with address of this symbol in .got.  */
566*a9fa9459Szrj   0x68,		/* pushl immediate */
567*a9fa9459Szrj   0, 0, 0, 0,	/* replaced with offset into relocation table.  */
568*a9fa9459Szrj   0xe9,		/* jmp relative */
569*a9fa9459Szrj   0, 0, 0, 0	/* replaced with offset to start of .plt.  */
570*a9fa9459Szrj };
571*a9fa9459Szrj 
572*a9fa9459Szrj /* The first entry in a PIC procedure linkage table look like this.
573*a9fa9459Szrj    Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte.  */
574*a9fa9459Szrj 
575*a9fa9459Szrj static const bfd_byte elf_i386_pic_plt0_entry[12] =
576*a9fa9459Szrj {
577*a9fa9459Szrj   0xff, 0xb3, 4, 0, 0, 0,	/* pushl 4(%ebx) */
578*a9fa9459Szrj   0xff, 0xa3, 8, 0, 0, 0	/* jmp *8(%ebx) */
579*a9fa9459Szrj };
580*a9fa9459Szrj 
581*a9fa9459Szrj /* Subsequent entries in a PIC procedure linkage table look like this.  */
582*a9fa9459Szrj 
583*a9fa9459Szrj static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
584*a9fa9459Szrj {
585*a9fa9459Szrj   0xff, 0xa3,	/* jmp *offset(%ebx) */
586*a9fa9459Szrj   0, 0, 0, 0,	/* replaced with offset of this symbol in .got.  */
587*a9fa9459Szrj   0x68,		/* pushl immediate */
588*a9fa9459Szrj   0, 0, 0, 0,	/* replaced with offset into relocation table.  */
589*a9fa9459Szrj   0xe9,		/* jmp relative */
590*a9fa9459Szrj   0, 0, 0, 0	/* replaced with offset to start of .plt.  */
591*a9fa9459Szrj };
592*a9fa9459Szrj 
593*a9fa9459Szrj /* Entries in the GOT procedure linkage table look like this.  */
594*a9fa9459Szrj 
595*a9fa9459Szrj static const bfd_byte elf_i386_got_plt_entry[8] =
596*a9fa9459Szrj {
597*a9fa9459Szrj   0xff, 0x25,	/* jmp indirect */
598*a9fa9459Szrj   0, 0, 0, 0,	/* replaced with offset of this symbol in .got.  */
599*a9fa9459Szrj   0x66, 0x90	/* xchg %ax,%ax  */
600*a9fa9459Szrj };
601*a9fa9459Szrj 
602*a9fa9459Szrj /* Entries in the PIC GOT procedure linkage table look like this.  */
603*a9fa9459Szrj 
604*a9fa9459Szrj static const bfd_byte elf_i386_pic_got_plt_entry[8] =
605*a9fa9459Szrj {
606*a9fa9459Szrj   0xff, 0xa3,	/* jmp *offset(%ebx)  */
607*a9fa9459Szrj   0, 0, 0, 0,	/* replaced with offset of this symbol in .got.  */
608*a9fa9459Szrj   0x66, 0x90	/* xchg %ax,%ax  */
609*a9fa9459Szrj };
610*a9fa9459Szrj 
611*a9fa9459Szrj /* .eh_frame covering the .plt section.  */
612*a9fa9459Szrj 
613*a9fa9459Szrj static const bfd_byte elf_i386_eh_frame_plt[] =
614*a9fa9459Szrj {
615*a9fa9459Szrj #define PLT_CIE_LENGTH		20
616*a9fa9459Szrj #define PLT_FDE_LENGTH		36
617*a9fa9459Szrj #define PLT_FDE_START_OFFSET	4 + PLT_CIE_LENGTH + 8
618*a9fa9459Szrj #define PLT_FDE_LEN_OFFSET	4 + PLT_CIE_LENGTH + 12
619*a9fa9459Szrj   PLT_CIE_LENGTH, 0, 0, 0,	/* CIE length */
620*a9fa9459Szrj   0, 0, 0, 0,			/* CIE ID */
621*a9fa9459Szrj   1,				/* CIE version */
622*a9fa9459Szrj   'z', 'R', 0,			/* Augmentation string */
623*a9fa9459Szrj   1,				/* Code alignment factor */
624*a9fa9459Szrj   0x7c,				/* Data alignment factor */
625*a9fa9459Szrj   8,				/* Return address column */
626*a9fa9459Szrj   1,				/* Augmentation size */
627*a9fa9459Szrj   DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding */
628*a9fa9459Szrj   DW_CFA_def_cfa, 4, 4,		/* DW_CFA_def_cfa: r4 (esp) ofs 4 */
629*a9fa9459Szrj   DW_CFA_offset + 8, 1,		/* DW_CFA_offset: r8 (eip) at cfa-4 */
630*a9fa9459Szrj   DW_CFA_nop, DW_CFA_nop,
631*a9fa9459Szrj 
632*a9fa9459Szrj   PLT_FDE_LENGTH, 0, 0, 0,	/* FDE length */
633*a9fa9459Szrj   PLT_CIE_LENGTH + 8, 0, 0, 0,	/* CIE pointer */
634*a9fa9459Szrj   0, 0, 0, 0,			/* R_386_PC32 .plt goes here */
635*a9fa9459Szrj   0, 0, 0, 0,			/* .plt size goes here */
636*a9fa9459Szrj   0,				/* Augmentation size */
637*a9fa9459Szrj   DW_CFA_def_cfa_offset, 8,	/* DW_CFA_def_cfa_offset: 8 */
638*a9fa9459Szrj   DW_CFA_advance_loc + 6,	/* DW_CFA_advance_loc: 6 to __PLT__+6 */
639*a9fa9459Szrj   DW_CFA_def_cfa_offset, 12,	/* DW_CFA_def_cfa_offset: 12 */
640*a9fa9459Szrj   DW_CFA_advance_loc + 10,	/* DW_CFA_advance_loc: 10 to __PLT__+16 */
641*a9fa9459Szrj   DW_CFA_def_cfa_expression,	/* DW_CFA_def_cfa_expression */
642*a9fa9459Szrj   11,				/* Block length */
643*a9fa9459Szrj   DW_OP_breg4, 4,		/* DW_OP_breg4 (esp): 4 */
644*a9fa9459Szrj   DW_OP_breg8, 0,		/* DW_OP_breg8 (eip): 0 */
645*a9fa9459Szrj   DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge,
646*a9fa9459Szrj   DW_OP_lit2, DW_OP_shl, DW_OP_plus,
647*a9fa9459Szrj   DW_CFA_nop, DW_CFA_nop, DW_CFA_nop, DW_CFA_nop
648*a9fa9459Szrj };
649*a9fa9459Szrj 
650*a9fa9459Szrj struct elf_i386_plt_layout
651*a9fa9459Szrj {
652*a9fa9459Szrj   /* The first entry in an absolute procedure linkage table looks like this.  */
653*a9fa9459Szrj   const bfd_byte *plt0_entry;
654*a9fa9459Szrj   unsigned int plt0_entry_size;
655*a9fa9459Szrj 
656*a9fa9459Szrj   /* Offsets into plt0_entry that are to be replaced with GOT[1] and GOT[2].  */
657*a9fa9459Szrj   unsigned int plt0_got1_offset;
658*a9fa9459Szrj   unsigned int plt0_got2_offset;
659*a9fa9459Szrj 
660*a9fa9459Szrj   /* Later entries in an absolute procedure linkage table look like this.  */
661*a9fa9459Szrj   const bfd_byte *plt_entry;
662*a9fa9459Szrj   unsigned int plt_entry_size;
663*a9fa9459Szrj 
664*a9fa9459Szrj   /* Offsets into plt_entry that are to be replaced with...  */
665*a9fa9459Szrj   unsigned int plt_got_offset;    /* ... address of this symbol in .got. */
666*a9fa9459Szrj   unsigned int plt_reloc_offset;  /* ... offset into relocation table. */
667*a9fa9459Szrj   unsigned int plt_plt_offset;    /* ... offset to start of .plt. */
668*a9fa9459Szrj 
669*a9fa9459Szrj   /* Offset into plt_entry where the initial value of the GOT entry points.  */
670*a9fa9459Szrj   unsigned int plt_lazy_offset;
671*a9fa9459Szrj 
672*a9fa9459Szrj   /* The first entry in a PIC procedure linkage table looks like this.  */
673*a9fa9459Szrj   const bfd_byte *pic_plt0_entry;
674*a9fa9459Szrj 
675*a9fa9459Szrj   /* Subsequent entries in a PIC procedure linkage table look like this.  */
676*a9fa9459Szrj   const bfd_byte *pic_plt_entry;
677*a9fa9459Szrj 
678*a9fa9459Szrj   /* .eh_frame covering the .plt section.  */
679*a9fa9459Szrj   const bfd_byte *eh_frame_plt;
680*a9fa9459Szrj   unsigned int eh_frame_plt_size;
681*a9fa9459Szrj };
682*a9fa9459Szrj 
683*a9fa9459Szrj #define GET_PLT_ENTRY_SIZE(abfd) \
684*a9fa9459Szrj   get_elf_i386_backend_data (abfd)->plt->plt_entry_size
685*a9fa9459Szrj 
686*a9fa9459Szrj /* These are the standard parameters.  */
687*a9fa9459Szrj static const struct elf_i386_plt_layout elf_i386_plt =
688*a9fa9459Szrj   {
689*a9fa9459Szrj     elf_i386_plt0_entry,                /* plt0_entry */
690*a9fa9459Szrj     sizeof (elf_i386_plt0_entry),       /* plt0_entry_size */
691*a9fa9459Szrj     2,                                  /* plt0_got1_offset */
692*a9fa9459Szrj     8,                                  /* plt0_got2_offset */
693*a9fa9459Szrj     elf_i386_plt_entry,                 /* plt_entry */
694*a9fa9459Szrj     PLT_ENTRY_SIZE,                     /* plt_entry_size */
695*a9fa9459Szrj     2,                                  /* plt_got_offset */
696*a9fa9459Szrj     7,                                  /* plt_reloc_offset */
697*a9fa9459Szrj     12,                                 /* plt_plt_offset */
698*a9fa9459Szrj     6,                                  /* plt_lazy_offset */
699*a9fa9459Szrj     elf_i386_pic_plt0_entry,            /* pic_plt0_entry */
700*a9fa9459Szrj     elf_i386_pic_plt_entry,             /* pic_plt_entry */
701*a9fa9459Szrj     elf_i386_eh_frame_plt,              /* eh_frame_plt */
702*a9fa9459Szrj     sizeof (elf_i386_eh_frame_plt),     /* eh_frame_plt_size */
703*a9fa9459Szrj   };
704*a9fa9459Szrj 
705*a9fa9459Szrj 
706*a9fa9459Szrj /* On VxWorks, the .rel.plt.unloaded section has absolute relocations
707*a9fa9459Szrj    for the PLTResolve stub and then for each PLT entry.  */
708*a9fa9459Szrj #define PLTRESOLVE_RELOCS_SHLIB 0
709*a9fa9459Szrj #define PLTRESOLVE_RELOCS 2
710*a9fa9459Szrj #define PLT_NON_JUMP_SLOT_RELOCS 2
711*a9fa9459Szrj 
712*a9fa9459Szrj /* Architecture-specific backend data for i386.  */
713*a9fa9459Szrj 
714*a9fa9459Szrj struct elf_i386_backend_data
715*a9fa9459Szrj {
716*a9fa9459Szrj   /* Parameters describing PLT generation.  */
717*a9fa9459Szrj   const struct elf_i386_plt_layout *plt;
718*a9fa9459Szrj 
719*a9fa9459Szrj   /* Value used to fill the unused bytes of the first PLT entry.  */
720*a9fa9459Szrj   bfd_byte plt0_pad_byte;
721*a9fa9459Szrj 
722*a9fa9459Szrj   /* True if the target system is VxWorks.  */
723*a9fa9459Szrj   int is_vxworks;
724*a9fa9459Szrj };
725*a9fa9459Szrj 
726*a9fa9459Szrj #define get_elf_i386_backend_data(abfd) \
727*a9fa9459Szrj   ((const struct elf_i386_backend_data *) \
728*a9fa9459Szrj    get_elf_backend_data (abfd)->arch_data)
729*a9fa9459Szrj 
730*a9fa9459Szrj /* These are the standard parameters.  */
731*a9fa9459Szrj static const struct elf_i386_backend_data elf_i386_arch_bed =
732*a9fa9459Szrj   {
733*a9fa9459Szrj     &elf_i386_plt,                      /* plt */
734*a9fa9459Szrj     0,                                  /* plt0_pad_byte */
735*a9fa9459Szrj     0,                                  /* is_vxworks */
736*a9fa9459Szrj   };
737*a9fa9459Szrj 
738*a9fa9459Szrj #define	elf_backend_arch_data	&elf_i386_arch_bed
739*a9fa9459Szrj 
740*a9fa9459Szrj /* Is a undefined weak symbol which is resolved to 0.  Reference to an
741*a9fa9459Szrj    undefined weak symbol is resolved to 0 when building executable if
742*a9fa9459Szrj    it isn't dynamic and
743*a9fa9459Szrj    1. Has non-GOT/non-PLT relocations in text section.  Or
744*a9fa9459Szrj    2. Has no GOT/PLT relocation.
745*a9fa9459Szrj  */
746*a9fa9459Szrj #define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, GOT_RELOC, EH)	\
747*a9fa9459Szrj   ((EH)->elf.root.type == bfd_link_hash_undefweak		\
748*a9fa9459Szrj    && bfd_link_executable (INFO)				\
749*a9fa9459Szrj    && (elf_i386_hash_table (INFO)->interp == NULL	 	\
750*a9fa9459Szrj        || !(GOT_RELOC)						\
751*a9fa9459Szrj        || (EH)->has_non_got_reloc				\
752*a9fa9459Szrj        || !(INFO)->dynamic_undefined_weak))
753*a9fa9459Szrj 
754*a9fa9459Szrj /* i386 ELF linker hash entry.  */
755*a9fa9459Szrj 
756*a9fa9459Szrj struct elf_i386_link_hash_entry
757*a9fa9459Szrj {
758*a9fa9459Szrj   struct elf_link_hash_entry elf;
759*a9fa9459Szrj 
760*a9fa9459Szrj   /* Track dynamic relocs copied for this symbol.  */
761*a9fa9459Szrj   struct elf_dyn_relocs *dyn_relocs;
762*a9fa9459Szrj 
763*a9fa9459Szrj #define GOT_UNKNOWN	0
764*a9fa9459Szrj #define GOT_NORMAL	1
765*a9fa9459Szrj #define GOT_TLS_GD	2
766*a9fa9459Szrj #define GOT_TLS_IE	4
767*a9fa9459Szrj #define GOT_TLS_IE_POS	5
768*a9fa9459Szrj #define GOT_TLS_IE_NEG	6
769*a9fa9459Szrj #define GOT_TLS_IE_BOTH 7
770*a9fa9459Szrj #define GOT_TLS_GDESC	8
771*a9fa9459Szrj #define GOT_TLS_GD_BOTH_P(type)						\
772*a9fa9459Szrj   ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
773*a9fa9459Szrj #define GOT_TLS_GD_P(type)						\
774*a9fa9459Szrj   ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
775*a9fa9459Szrj #define GOT_TLS_GDESC_P(type)						\
776*a9fa9459Szrj   ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
777*a9fa9459Szrj #define GOT_TLS_GD_ANY_P(type)						\
778*a9fa9459Szrj   (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
779*a9fa9459Szrj   unsigned char tls_type;
780*a9fa9459Szrj 
781*a9fa9459Szrj   /* Symbol is referenced by R_386_GOTOFF relocation.  */
782*a9fa9459Szrj   unsigned int gotoff_ref : 1;
783*a9fa9459Szrj 
784*a9fa9459Szrj   /* Symbol has GOT or PLT relocations.  */
785*a9fa9459Szrj   unsigned int has_got_reloc : 1;
786*a9fa9459Szrj 
787*a9fa9459Szrj   /* Symbol has non-GOT/non-PLT relocations in text sections.  */
788*a9fa9459Szrj   unsigned int has_non_got_reloc : 1;
789*a9fa9459Szrj 
790*a9fa9459Szrj   /* 0: symbol isn't ___tls_get_addr.
791*a9fa9459Szrj      1: symbol is ___tls_get_addr.
792*a9fa9459Szrj      2: symbol is unknown.  */
793*a9fa9459Szrj   unsigned int tls_get_addr : 2;
794*a9fa9459Szrj 
795*a9fa9459Szrj   /* Reference count of C/C++ function pointer relocations in read-write
796*a9fa9459Szrj      section which can be resolved at run-time.  */
797*a9fa9459Szrj   bfd_signed_vma func_pointer_refcount;
798*a9fa9459Szrj 
799*a9fa9459Szrj   /* Information about the GOT PLT entry. Filled when there are both
800*a9fa9459Szrj      GOT and PLT relocations against the same function.  */
801*a9fa9459Szrj   union gotplt_union plt_got;
802*a9fa9459Szrj 
803*a9fa9459Szrj   /* Offset of the GOTPLT entry reserved for the TLS descriptor,
804*a9fa9459Szrj      starting at the end of the jump table.  */
805*a9fa9459Szrj   bfd_vma tlsdesc_got;
806*a9fa9459Szrj };
807*a9fa9459Szrj 
808*a9fa9459Szrj #define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent))
809*a9fa9459Szrj 
810*a9fa9459Szrj struct elf_i386_obj_tdata
811*a9fa9459Szrj {
812*a9fa9459Szrj   struct elf_obj_tdata root;
813*a9fa9459Szrj 
814*a9fa9459Szrj   /* tls_type for each local got entry.  */
815*a9fa9459Szrj   char *local_got_tls_type;
816*a9fa9459Szrj 
817*a9fa9459Szrj   /* GOTPLT entries for TLS descriptors.  */
818*a9fa9459Szrj   bfd_vma *local_tlsdesc_gotent;
819*a9fa9459Szrj };
820*a9fa9459Szrj 
821*a9fa9459Szrj #define elf_i386_tdata(abfd) \
822*a9fa9459Szrj   ((struct elf_i386_obj_tdata *) (abfd)->tdata.any)
823*a9fa9459Szrj 
824*a9fa9459Szrj #define elf_i386_local_got_tls_type(abfd) \
825*a9fa9459Szrj   (elf_i386_tdata (abfd)->local_got_tls_type)
826*a9fa9459Szrj 
827*a9fa9459Szrj #define elf_i386_local_tlsdesc_gotent(abfd) \
828*a9fa9459Szrj   (elf_i386_tdata (abfd)->local_tlsdesc_gotent)
829*a9fa9459Szrj 
830*a9fa9459Szrj #define is_i386_elf(bfd)				\
831*a9fa9459Szrj   (bfd_get_flavour (bfd) == bfd_target_elf_flavour	\
832*a9fa9459Szrj    && elf_tdata (bfd) != NULL				\
833*a9fa9459Szrj    && elf_object_id (bfd) == I386_ELF_DATA)
834*a9fa9459Szrj 
835*a9fa9459Szrj static bfd_boolean
elf_i386_mkobject(bfd * abfd)836*a9fa9459Szrj elf_i386_mkobject (bfd *abfd)
837*a9fa9459Szrj {
838*a9fa9459Szrj   return bfd_elf_allocate_object (abfd, sizeof (struct elf_i386_obj_tdata),
839*a9fa9459Szrj 				  I386_ELF_DATA);
840*a9fa9459Szrj }
841*a9fa9459Szrj 
842*a9fa9459Szrj /* i386 ELF linker hash table.  */
843*a9fa9459Szrj 
844*a9fa9459Szrj struct elf_i386_link_hash_table
845*a9fa9459Szrj {
846*a9fa9459Szrj   struct elf_link_hash_table elf;
847*a9fa9459Szrj 
848*a9fa9459Szrj   /* Short-cuts to get to dynamic linker sections.  */
849*a9fa9459Szrj   asection *interp;
850*a9fa9459Szrj   asection *sdynbss;
851*a9fa9459Szrj   asection *srelbss;
852*a9fa9459Szrj   asection *plt_eh_frame;
853*a9fa9459Szrj   asection *plt_got;
854*a9fa9459Szrj 
855*a9fa9459Szrj   union
856*a9fa9459Szrj   {
857*a9fa9459Szrj     bfd_signed_vma refcount;
858*a9fa9459Szrj     bfd_vma offset;
859*a9fa9459Szrj   } tls_ldm_got;
860*a9fa9459Szrj 
861*a9fa9459Szrj   /* The amount of space used by the reserved portion of the sgotplt
862*a9fa9459Szrj      section, plus whatever space is used by the jump slots.  */
863*a9fa9459Szrj   bfd_vma sgotplt_jump_table_size;
864*a9fa9459Szrj 
865*a9fa9459Szrj   /* Small local sym cache.  */
866*a9fa9459Szrj   struct sym_cache sym_cache;
867*a9fa9459Szrj 
868*a9fa9459Szrj   /* _TLS_MODULE_BASE_ symbol.  */
869*a9fa9459Szrj   struct bfd_link_hash_entry *tls_module_base;
870*a9fa9459Szrj 
871*a9fa9459Szrj   /* Used by local STT_GNU_IFUNC symbols.  */
872*a9fa9459Szrj   htab_t loc_hash_table;
873*a9fa9459Szrj   void * loc_hash_memory;
874*a9fa9459Szrj 
875*a9fa9459Szrj   /* The (unloaded but important) .rel.plt.unloaded section on VxWorks.  */
876*a9fa9459Szrj   asection *srelplt2;
877*a9fa9459Szrj 
878*a9fa9459Szrj   /* The index of the next unused R_386_TLS_DESC slot in .rel.plt.  */
879*a9fa9459Szrj   bfd_vma next_tls_desc_index;
880*a9fa9459Szrj 
881*a9fa9459Szrj   /* The index of the next unused R_386_JUMP_SLOT slot in .rel.plt.  */
882*a9fa9459Szrj   bfd_vma next_jump_slot_index;
883*a9fa9459Szrj 
884*a9fa9459Szrj   /* The index of the next unused R_386_IRELATIVE slot in .rel.plt.  */
885*a9fa9459Szrj   bfd_vma next_irelative_index;
886*a9fa9459Szrj 
887*a9fa9459Szrj   /* TRUE if there are dynamic relocs against IFUNC symbols that apply
888*a9fa9459Szrj      to read-only sections.  */
889*a9fa9459Szrj   bfd_boolean readonly_dynrelocs_against_ifunc;
890*a9fa9459Szrj };
891*a9fa9459Szrj 
892*a9fa9459Szrj /* Get the i386 ELF linker hash table from a link_info structure.  */
893*a9fa9459Szrj 
894*a9fa9459Szrj #define elf_i386_hash_table(p) \
895*a9fa9459Szrj   (elf_hash_table_id  ((struct elf_link_hash_table *) ((p)->hash)) \
896*a9fa9459Szrj   == I386_ELF_DATA ? ((struct elf_i386_link_hash_table *) ((p)->hash)) : NULL)
897*a9fa9459Szrj 
898*a9fa9459Szrj #define elf_i386_compute_jump_table_size(htab) \
899*a9fa9459Szrj   ((htab)->elf.srelplt->reloc_count * 4)
900*a9fa9459Szrj 
901*a9fa9459Szrj /* Create an entry in an i386 ELF linker hash table.  */
902*a9fa9459Szrj 
903*a9fa9459Szrj static struct bfd_hash_entry *
elf_i386_link_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)904*a9fa9459Szrj elf_i386_link_hash_newfunc (struct bfd_hash_entry *entry,
905*a9fa9459Szrj 			    struct bfd_hash_table *table,
906*a9fa9459Szrj 			    const char *string)
907*a9fa9459Szrj {
908*a9fa9459Szrj   /* Allocate the structure if it has not already been allocated by a
909*a9fa9459Szrj      subclass.  */
910*a9fa9459Szrj   if (entry == NULL)
911*a9fa9459Szrj     {
912*a9fa9459Szrj       entry = (struct bfd_hash_entry *)
913*a9fa9459Szrj           bfd_hash_allocate (table, sizeof (struct elf_i386_link_hash_entry));
914*a9fa9459Szrj       if (entry == NULL)
915*a9fa9459Szrj 	return entry;
916*a9fa9459Szrj     }
917*a9fa9459Szrj 
918*a9fa9459Szrj   /* Call the allocation method of the superclass.  */
919*a9fa9459Szrj   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
920*a9fa9459Szrj   if (entry != NULL)
921*a9fa9459Szrj     {
922*a9fa9459Szrj       struct elf_i386_link_hash_entry *eh;
923*a9fa9459Szrj 
924*a9fa9459Szrj       eh = (struct elf_i386_link_hash_entry *) entry;
925*a9fa9459Szrj       eh->dyn_relocs = NULL;
926*a9fa9459Szrj       eh->tls_type = GOT_UNKNOWN;
927*a9fa9459Szrj       eh->gotoff_ref = 0;
928*a9fa9459Szrj       eh->has_got_reloc = 0;
929*a9fa9459Szrj       eh->has_non_got_reloc = 0;
930*a9fa9459Szrj       eh->tls_get_addr = 2;
931*a9fa9459Szrj       eh->func_pointer_refcount = 0;
932*a9fa9459Szrj       eh->plt_got.offset = (bfd_vma) -1;
933*a9fa9459Szrj       eh->tlsdesc_got = (bfd_vma) -1;
934*a9fa9459Szrj     }
935*a9fa9459Szrj 
936*a9fa9459Szrj   return entry;
937*a9fa9459Szrj }
938*a9fa9459Szrj 
939*a9fa9459Szrj /* Compute a hash of a local hash entry.  We use elf_link_hash_entry
940*a9fa9459Szrj   for local symbol so that we can handle local STT_GNU_IFUNC symbols
941*a9fa9459Szrj   as global symbol.  We reuse indx and dynstr_index for local symbol
942*a9fa9459Szrj   hash since they aren't used by global symbols in this backend.  */
943*a9fa9459Szrj 
944*a9fa9459Szrj static hashval_t
elf_i386_local_htab_hash(const void * ptr)945*a9fa9459Szrj elf_i386_local_htab_hash (const void *ptr)
946*a9fa9459Szrj {
947*a9fa9459Szrj   struct elf_link_hash_entry *h
948*a9fa9459Szrj     = (struct elf_link_hash_entry *) ptr;
949*a9fa9459Szrj   return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
950*a9fa9459Szrj }
951*a9fa9459Szrj 
952*a9fa9459Szrj /* Compare local hash entries.  */
953*a9fa9459Szrj 
954*a9fa9459Szrj static int
elf_i386_local_htab_eq(const void * ptr1,const void * ptr2)955*a9fa9459Szrj elf_i386_local_htab_eq (const void *ptr1, const void *ptr2)
956*a9fa9459Szrj {
957*a9fa9459Szrj   struct elf_link_hash_entry *h1
958*a9fa9459Szrj      = (struct elf_link_hash_entry *) ptr1;
959*a9fa9459Szrj   struct elf_link_hash_entry *h2
960*a9fa9459Szrj     = (struct elf_link_hash_entry *) ptr2;
961*a9fa9459Szrj 
962*a9fa9459Szrj   return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
963*a9fa9459Szrj }
964*a9fa9459Szrj 
965*a9fa9459Szrj /* Find and/or create a hash entry for local symbol.  */
966*a9fa9459Szrj 
967*a9fa9459Szrj static struct elf_link_hash_entry *
elf_i386_get_local_sym_hash(struct elf_i386_link_hash_table * htab,bfd * abfd,const Elf_Internal_Rela * rel,bfd_boolean create)968*a9fa9459Szrj elf_i386_get_local_sym_hash (struct elf_i386_link_hash_table *htab,
969*a9fa9459Szrj 			     bfd *abfd, const Elf_Internal_Rela *rel,
970*a9fa9459Szrj 			     bfd_boolean create)
971*a9fa9459Szrj {
972*a9fa9459Szrj   struct elf_i386_link_hash_entry e, *ret;
973*a9fa9459Szrj   asection *sec = abfd->sections;
974*a9fa9459Szrj   hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
975*a9fa9459Szrj 				       ELF32_R_SYM (rel->r_info));
976*a9fa9459Szrj   void **slot;
977*a9fa9459Szrj 
978*a9fa9459Szrj   e.elf.indx = sec->id;
979*a9fa9459Szrj   e.elf.dynstr_index = ELF32_R_SYM (rel->r_info);
980*a9fa9459Szrj   slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
981*a9fa9459Szrj 				   create ? INSERT : NO_INSERT);
982*a9fa9459Szrj 
983*a9fa9459Szrj   if (!slot)
984*a9fa9459Szrj     return NULL;
985*a9fa9459Szrj 
986*a9fa9459Szrj   if (*slot)
987*a9fa9459Szrj     {
988*a9fa9459Szrj       ret = (struct elf_i386_link_hash_entry *) *slot;
989*a9fa9459Szrj       return &ret->elf;
990*a9fa9459Szrj     }
991*a9fa9459Szrj 
992*a9fa9459Szrj   ret = (struct elf_i386_link_hash_entry *)
993*a9fa9459Szrj 	objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
994*a9fa9459Szrj 			sizeof (struct elf_i386_link_hash_entry));
995*a9fa9459Szrj   if (ret)
996*a9fa9459Szrj     {
997*a9fa9459Szrj       memset (ret, 0, sizeof (*ret));
998*a9fa9459Szrj       ret->elf.indx = sec->id;
999*a9fa9459Szrj       ret->elf.dynstr_index = ELF32_R_SYM (rel->r_info);
1000*a9fa9459Szrj       ret->elf.dynindx = -1;
1001*a9fa9459Szrj       ret->func_pointer_refcount = 0;
1002*a9fa9459Szrj       ret->plt_got.offset = (bfd_vma) -1;
1003*a9fa9459Szrj       *slot = ret;
1004*a9fa9459Szrj     }
1005*a9fa9459Szrj   return &ret->elf;
1006*a9fa9459Szrj }
1007*a9fa9459Szrj 
1008*a9fa9459Szrj /* Destroy an i386 ELF linker hash table.  */
1009*a9fa9459Szrj 
1010*a9fa9459Szrj static void
elf_i386_link_hash_table_free(bfd * obfd)1011*a9fa9459Szrj elf_i386_link_hash_table_free (bfd *obfd)
1012*a9fa9459Szrj {
1013*a9fa9459Szrj   struct elf_i386_link_hash_table *htab
1014*a9fa9459Szrj     = (struct elf_i386_link_hash_table *) obfd->link.hash;
1015*a9fa9459Szrj 
1016*a9fa9459Szrj   if (htab->loc_hash_table)
1017*a9fa9459Szrj     htab_delete (htab->loc_hash_table);
1018*a9fa9459Szrj   if (htab->loc_hash_memory)
1019*a9fa9459Szrj     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
1020*a9fa9459Szrj   _bfd_elf_link_hash_table_free (obfd);
1021*a9fa9459Szrj }
1022*a9fa9459Szrj 
1023*a9fa9459Szrj /* Create an i386 ELF linker hash table.  */
1024*a9fa9459Szrj 
1025*a9fa9459Szrj static struct bfd_link_hash_table *
elf_i386_link_hash_table_create(bfd * abfd)1026*a9fa9459Szrj elf_i386_link_hash_table_create (bfd *abfd)
1027*a9fa9459Szrj {
1028*a9fa9459Szrj   struct elf_i386_link_hash_table *ret;
1029*a9fa9459Szrj   bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
1030*a9fa9459Szrj 
1031*a9fa9459Szrj   ret = (struct elf_i386_link_hash_table *) bfd_zmalloc (amt);
1032*a9fa9459Szrj   if (ret == NULL)
1033*a9fa9459Szrj     return NULL;
1034*a9fa9459Szrj 
1035*a9fa9459Szrj   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1036*a9fa9459Szrj 				      elf_i386_link_hash_newfunc,
1037*a9fa9459Szrj 				      sizeof (struct elf_i386_link_hash_entry),
1038*a9fa9459Szrj 				      I386_ELF_DATA))
1039*a9fa9459Szrj     {
1040*a9fa9459Szrj       free (ret);
1041*a9fa9459Szrj       return NULL;
1042*a9fa9459Szrj     }
1043*a9fa9459Szrj 
1044*a9fa9459Szrj   ret->loc_hash_table = htab_try_create (1024,
1045*a9fa9459Szrj 					 elf_i386_local_htab_hash,
1046*a9fa9459Szrj 					 elf_i386_local_htab_eq,
1047*a9fa9459Szrj 					 NULL);
1048*a9fa9459Szrj   ret->loc_hash_memory = objalloc_create ();
1049*a9fa9459Szrj   if (!ret->loc_hash_table || !ret->loc_hash_memory)
1050*a9fa9459Szrj     {
1051*a9fa9459Szrj       elf_i386_link_hash_table_free (abfd);
1052*a9fa9459Szrj       return NULL;
1053*a9fa9459Szrj     }
1054*a9fa9459Szrj   ret->elf.root.hash_table_free = elf_i386_link_hash_table_free;
1055*a9fa9459Szrj 
1056*a9fa9459Szrj   return &ret->elf.root;
1057*a9fa9459Szrj }
1058*a9fa9459Szrj 
1059*a9fa9459Szrj /* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
1060*a9fa9459Szrj    .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
1061*a9fa9459Szrj    hash table.  */
1062*a9fa9459Szrj 
1063*a9fa9459Szrj static bfd_boolean
elf_i386_create_dynamic_sections(bfd * dynobj,struct bfd_link_info * info)1064*a9fa9459Szrj elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1065*a9fa9459Szrj {
1066*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
1067*a9fa9459Szrj 
1068*a9fa9459Szrj   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1069*a9fa9459Szrj     return FALSE;
1070*a9fa9459Szrj 
1071*a9fa9459Szrj   htab = elf_i386_hash_table (info);
1072*a9fa9459Szrj   if (htab == NULL)
1073*a9fa9459Szrj     return FALSE;
1074*a9fa9459Szrj 
1075*a9fa9459Szrj   /* Set the contents of the .interp section to the interpreter.  */
1076*a9fa9459Szrj   if (bfd_link_executable (info) && !info->nointerp)
1077*a9fa9459Szrj     {
1078*a9fa9459Szrj       asection *s = bfd_get_linker_section (dynobj, ".interp");
1079*a9fa9459Szrj       if (s == NULL)
1080*a9fa9459Szrj 	abort ();
1081*a9fa9459Szrj       s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1082*a9fa9459Szrj       s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1083*a9fa9459Szrj       htab->interp = s;
1084*a9fa9459Szrj     }
1085*a9fa9459Szrj 
1086*a9fa9459Szrj   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1087*a9fa9459Szrj   if (!htab->sdynbss)
1088*a9fa9459Szrj     abort ();
1089*a9fa9459Szrj 
1090*a9fa9459Szrj   if (bfd_link_executable (info))
1091*a9fa9459Szrj     {
1092*a9fa9459Szrj       /* Always allow copy relocs for building executables.  */
1093*a9fa9459Szrj       asection *s = bfd_get_linker_section (dynobj, ".rel.bss");
1094*a9fa9459Szrj       if (s == NULL)
1095*a9fa9459Szrj 	{
1096*a9fa9459Szrj 	  const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
1097*a9fa9459Szrj 	  s = bfd_make_section_anyway_with_flags (dynobj,
1098*a9fa9459Szrj 						  ".rel.bss",
1099*a9fa9459Szrj 						  (bed->dynamic_sec_flags
1100*a9fa9459Szrj 						   | SEC_READONLY));
1101*a9fa9459Szrj 	  if (s == NULL
1102*a9fa9459Szrj 	      || ! bfd_set_section_alignment (dynobj, s,
1103*a9fa9459Szrj 					      bed->s->log_file_align))
1104*a9fa9459Szrj 	    return FALSE;
1105*a9fa9459Szrj 	}
1106*a9fa9459Szrj       htab->srelbss = s;
1107*a9fa9459Szrj     }
1108*a9fa9459Szrj 
1109*a9fa9459Szrj   if (get_elf_i386_backend_data (dynobj)->is_vxworks
1110*a9fa9459Szrj       && !elf_vxworks_create_dynamic_sections (dynobj, info,
1111*a9fa9459Szrj 					       &htab->srelplt2))
1112*a9fa9459Szrj     return FALSE;
1113*a9fa9459Szrj 
1114*a9fa9459Szrj   if (!info->no_ld_generated_unwind_info
1115*a9fa9459Szrj       && htab->plt_eh_frame == NULL
1116*a9fa9459Szrj       && htab->elf.splt != NULL)
1117*a9fa9459Szrj     {
1118*a9fa9459Szrj       flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1119*a9fa9459Szrj 			| SEC_HAS_CONTENTS | SEC_IN_MEMORY
1120*a9fa9459Szrj 			| SEC_LINKER_CREATED);
1121*a9fa9459Szrj       htab->plt_eh_frame
1122*a9fa9459Szrj 	= bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags);
1123*a9fa9459Szrj       if (htab->plt_eh_frame == NULL
1124*a9fa9459Szrj 	  || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 2))
1125*a9fa9459Szrj 	return FALSE;
1126*a9fa9459Szrj     }
1127*a9fa9459Szrj 
1128*a9fa9459Szrj   return TRUE;
1129*a9fa9459Szrj }
1130*a9fa9459Szrj 
1131*a9fa9459Szrj /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1132*a9fa9459Szrj 
1133*a9fa9459Szrj static void
elf_i386_copy_indirect_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * dir,struct elf_link_hash_entry * ind)1134*a9fa9459Szrj elf_i386_copy_indirect_symbol (struct bfd_link_info *info,
1135*a9fa9459Szrj 			       struct elf_link_hash_entry *dir,
1136*a9fa9459Szrj 			       struct elf_link_hash_entry *ind)
1137*a9fa9459Szrj {
1138*a9fa9459Szrj   struct elf_i386_link_hash_entry *edir, *eind;
1139*a9fa9459Szrj 
1140*a9fa9459Szrj   edir = (struct elf_i386_link_hash_entry *) dir;
1141*a9fa9459Szrj   eind = (struct elf_i386_link_hash_entry *) ind;
1142*a9fa9459Szrj 
1143*a9fa9459Szrj   if (eind->dyn_relocs != NULL)
1144*a9fa9459Szrj     {
1145*a9fa9459Szrj       if (edir->dyn_relocs != NULL)
1146*a9fa9459Szrj 	{
1147*a9fa9459Szrj 	  struct elf_dyn_relocs **pp;
1148*a9fa9459Szrj 	  struct elf_dyn_relocs *p;
1149*a9fa9459Szrj 
1150*a9fa9459Szrj 	  /* Add reloc counts against the indirect sym to the direct sym
1151*a9fa9459Szrj 	     list.  Merge any entries against the same section.  */
1152*a9fa9459Szrj 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1153*a9fa9459Szrj 	    {
1154*a9fa9459Szrj 	      struct elf_dyn_relocs *q;
1155*a9fa9459Szrj 
1156*a9fa9459Szrj 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
1157*a9fa9459Szrj 		if (q->sec == p->sec)
1158*a9fa9459Szrj 		  {
1159*a9fa9459Szrj 		    q->pc_count += p->pc_count;
1160*a9fa9459Szrj 		    q->count += p->count;
1161*a9fa9459Szrj 		    *pp = p->next;
1162*a9fa9459Szrj 		    break;
1163*a9fa9459Szrj 		  }
1164*a9fa9459Szrj 	      if (q == NULL)
1165*a9fa9459Szrj 		pp = &p->next;
1166*a9fa9459Szrj 	    }
1167*a9fa9459Szrj 	  *pp = edir->dyn_relocs;
1168*a9fa9459Szrj 	}
1169*a9fa9459Szrj 
1170*a9fa9459Szrj       edir->dyn_relocs = eind->dyn_relocs;
1171*a9fa9459Szrj       eind->dyn_relocs = NULL;
1172*a9fa9459Szrj     }
1173*a9fa9459Szrj 
1174*a9fa9459Szrj   if (ind->root.type == bfd_link_hash_indirect
1175*a9fa9459Szrj       && dir->got.refcount <= 0)
1176*a9fa9459Szrj     {
1177*a9fa9459Szrj       edir->tls_type = eind->tls_type;
1178*a9fa9459Szrj       eind->tls_type = GOT_UNKNOWN;
1179*a9fa9459Szrj     }
1180*a9fa9459Szrj 
1181*a9fa9459Szrj   /* Copy gotoff_ref so that elf_i386_adjust_dynamic_symbol will
1182*a9fa9459Szrj      generate a R_386_COPY reloc.  */
1183*a9fa9459Szrj   edir->gotoff_ref |= eind->gotoff_ref;
1184*a9fa9459Szrj 
1185*a9fa9459Szrj   edir->has_got_reloc |= eind->has_got_reloc;
1186*a9fa9459Szrj   edir->has_non_got_reloc |= eind->has_non_got_reloc;
1187*a9fa9459Szrj 
1188*a9fa9459Szrj   if (ELIMINATE_COPY_RELOCS
1189*a9fa9459Szrj       && ind->root.type != bfd_link_hash_indirect
1190*a9fa9459Szrj       && dir->dynamic_adjusted)
1191*a9fa9459Szrj     {
1192*a9fa9459Szrj       /* If called to transfer flags for a weakdef during processing
1193*a9fa9459Szrj 	 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
1194*a9fa9459Szrj 	 We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
1195*a9fa9459Szrj       dir->ref_dynamic |= ind->ref_dynamic;
1196*a9fa9459Szrj       dir->ref_regular |= ind->ref_regular;
1197*a9fa9459Szrj       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
1198*a9fa9459Szrj       dir->needs_plt |= ind->needs_plt;
1199*a9fa9459Szrj       dir->pointer_equality_needed |= ind->pointer_equality_needed;
1200*a9fa9459Szrj     }
1201*a9fa9459Szrj   else
1202*a9fa9459Szrj     {
1203*a9fa9459Szrj       if (eind->func_pointer_refcount > 0)
1204*a9fa9459Szrj 	{
1205*a9fa9459Szrj 	  edir->func_pointer_refcount += eind->func_pointer_refcount;
1206*a9fa9459Szrj 	  eind->func_pointer_refcount = 0;
1207*a9fa9459Szrj 	}
1208*a9fa9459Szrj 
1209*a9fa9459Szrj       _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1210*a9fa9459Szrj     }
1211*a9fa9459Szrj }
1212*a9fa9459Szrj 
1213*a9fa9459Szrj /* Return TRUE if the TLS access code sequence support transition
1214*a9fa9459Szrj    from R_TYPE.  */
1215*a9fa9459Szrj 
1216*a9fa9459Szrj static bfd_boolean
elf_i386_check_tls_transition(asection * sec,bfd_byte * contents,Elf_Internal_Shdr * symtab_hdr,struct elf_link_hash_entry ** sym_hashes,unsigned int r_type,const Elf_Internal_Rela * rel,const Elf_Internal_Rela * relend)1217*a9fa9459Szrj elf_i386_check_tls_transition (asection *sec,
1218*a9fa9459Szrj 			       bfd_byte *contents,
1219*a9fa9459Szrj 			       Elf_Internal_Shdr *symtab_hdr,
1220*a9fa9459Szrj 			       struct elf_link_hash_entry **sym_hashes,
1221*a9fa9459Szrj 			       unsigned int r_type,
1222*a9fa9459Szrj 			       const Elf_Internal_Rela *rel,
1223*a9fa9459Szrj 			       const Elf_Internal_Rela *relend)
1224*a9fa9459Szrj {
1225*a9fa9459Szrj   unsigned int val, type, reg;
1226*a9fa9459Szrj   unsigned long r_symndx;
1227*a9fa9459Szrj   struct elf_link_hash_entry *h;
1228*a9fa9459Szrj   bfd_vma offset;
1229*a9fa9459Szrj   bfd_byte *call;
1230*a9fa9459Szrj   bfd_boolean indirect_call, tls_get_addr;
1231*a9fa9459Szrj 
1232*a9fa9459Szrj   offset = rel->r_offset;
1233*a9fa9459Szrj   switch (r_type)
1234*a9fa9459Szrj     {
1235*a9fa9459Szrj     case R_386_TLS_GD:
1236*a9fa9459Szrj     case R_386_TLS_LDM:
1237*a9fa9459Szrj       if (offset < 2 || (rel + 1) >= relend)
1238*a9fa9459Szrj 	return FALSE;
1239*a9fa9459Szrj 
1240*a9fa9459Szrj       indirect_call = FALSE;
1241*a9fa9459Szrj       call = contents + offset + 4;
1242*a9fa9459Szrj       val = *(call - 5);
1243*a9fa9459Szrj       type = *(call - 6);
1244*a9fa9459Szrj       if (r_type == R_386_TLS_GD)
1245*a9fa9459Szrj 	{
1246*a9fa9459Szrj 	  /* Check transition from GD access model.  Only
1247*a9fa9459Szrj 		leal foo@tlsgd(,%ebx,1), %eax
1248*a9fa9459Szrj 		call ___tls_get_addr@PLT
1249*a9fa9459Szrj 	     or
1250*a9fa9459Szrj 		leal foo@tlsgd(%ebx) %eax
1251*a9fa9459Szrj 		call ___tls_get_addr@PLT
1252*a9fa9459Szrj 		nop
1253*a9fa9459Szrj 	     or
1254*a9fa9459Szrj 		leal foo@tlsgd(%reg), %eax
1255*a9fa9459Szrj 		call *___tls_get_addr@GOT(%reg)
1256*a9fa9459Szrj 		which may be converted to
1257*a9fa9459Szrj 		addr32 call ___tls_get_addr
1258*a9fa9459Szrj 	     can transit to different access model.  */
1259*a9fa9459Szrj 	  if ((offset + 10) > sec->size
1260*a9fa9459Szrj 	      || (type != 0x8d && type != 0x04))
1261*a9fa9459Szrj 	    return FALSE;
1262*a9fa9459Szrj 
1263*a9fa9459Szrj 	  if (type == 0x04)
1264*a9fa9459Szrj 	    {
1265*a9fa9459Szrj 	      /* leal foo@tlsgd(,%ebx,1), %eax
1266*a9fa9459Szrj 		 call ___tls_get_addr@PLT  */
1267*a9fa9459Szrj 	      if (offset < 3)
1268*a9fa9459Szrj 		return FALSE;
1269*a9fa9459Szrj 
1270*a9fa9459Szrj 	      if (*(call - 7) != 0x8d
1271*a9fa9459Szrj 		  || val != 0x1d
1272*a9fa9459Szrj 		  || call[0] != 0xe8)
1273*a9fa9459Szrj 		return FALSE;
1274*a9fa9459Szrj 	    }
1275*a9fa9459Szrj 	  else
1276*a9fa9459Szrj 	    {
1277*a9fa9459Szrj 	      /* This must be
1278*a9fa9459Szrj 			leal foo@tlsgd(%ebx), %eax
1279*a9fa9459Szrj 			call ___tls_get_addr@PLT
1280*a9fa9459Szrj 			nop
1281*a9fa9459Szrj 		 or
1282*a9fa9459Szrj 			leal foo@tlsgd(%reg), %eax
1283*a9fa9459Szrj 			call *___tls_get_addr@GOT(%reg)
1284*a9fa9459Szrj 			which may be converted to
1285*a9fa9459Szrj 			addr32 call ___tls_get_addr
1286*a9fa9459Szrj 
1287*a9fa9459Szrj 		 %eax can't be used as the GOT base register since it
1288*a9fa9459Szrj 		 is used to pass parameter to ___tls_get_addr.  */
1289*a9fa9459Szrj 	      reg = val & 7;
1290*a9fa9459Szrj 	      if ((val & 0xf8) != 0x80 || reg == 4 || reg == 0)
1291*a9fa9459Szrj 		return FALSE;
1292*a9fa9459Szrj 
1293*a9fa9459Szrj 	      indirect_call = call[0] == 0xff;
1294*a9fa9459Szrj 	      if (!(reg == 3 && call[0] == 0xe8 && call[5] == 0x90)
1295*a9fa9459Szrj 		  && !(call[0] == 0x67 && call[1] == 0xe8)
1296*a9fa9459Szrj 		  && !(indirect_call
1297*a9fa9459Szrj 		       && (call[1] & 0xf8) == 0x90
1298*a9fa9459Szrj 		       && (call[1] & 0x7) == reg))
1299*a9fa9459Szrj 		return FALSE;
1300*a9fa9459Szrj 	    }
1301*a9fa9459Szrj 	}
1302*a9fa9459Szrj       else
1303*a9fa9459Szrj 	{
1304*a9fa9459Szrj 	  /* Check transition from LD access model.  Only
1305*a9fa9459Szrj 		leal foo@tlsldm(%ebx), %eax
1306*a9fa9459Szrj 		call ___tls_get_addr@PLT
1307*a9fa9459Szrj 	     or
1308*a9fa9459Szrj 		leal foo@tlsldm(%reg), %eax
1309*a9fa9459Szrj 		call *___tls_get_addr@GOT(%reg)
1310*a9fa9459Szrj 		which may be converted to
1311*a9fa9459Szrj 		addr32 call ___tls_get_addr
1312*a9fa9459Szrj 	     can transit to different access model.  */
1313*a9fa9459Szrj 	  if (type != 0x8d || (offset + 9) > sec->size)
1314*a9fa9459Szrj 	    return FALSE;
1315*a9fa9459Szrj 
1316*a9fa9459Szrj 	  /* %eax can't be used as the GOT base register since it is
1317*a9fa9459Szrj 	     used to pass parameter to ___tls_get_addr.  */
1318*a9fa9459Szrj 	  reg = val & 7;
1319*a9fa9459Szrj 	  if ((val & 0xf8) != 0x80 || reg == 4 || reg == 0)
1320*a9fa9459Szrj 	    return FALSE;
1321*a9fa9459Szrj 
1322*a9fa9459Szrj 	  indirect_call = call[0] == 0xff;
1323*a9fa9459Szrj 	  if (!(reg == 3 && call[0] == 0xe8)
1324*a9fa9459Szrj 	      && !(call[0] == 0x67 && call[1] == 0xe8)
1325*a9fa9459Szrj 	      && !(indirect_call
1326*a9fa9459Szrj 		   && (call[1] & 0xf8) == 0x90
1327*a9fa9459Szrj 		   && (call[1] & 0x7) == reg))
1328*a9fa9459Szrj 	    return FALSE;
1329*a9fa9459Szrj 	}
1330*a9fa9459Szrj 
1331*a9fa9459Szrj       r_symndx = ELF32_R_SYM (rel[1].r_info);
1332*a9fa9459Szrj       if (r_symndx < symtab_hdr->sh_info)
1333*a9fa9459Szrj 	return FALSE;
1334*a9fa9459Szrj 
1335*a9fa9459Szrj       tls_get_addr = FALSE;
1336*a9fa9459Szrj       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1337*a9fa9459Szrj       if (h != NULL && h->root.root.string != NULL)
1338*a9fa9459Szrj 	{
1339*a9fa9459Szrj 	  struct elf_i386_link_hash_entry *eh
1340*a9fa9459Szrj 	    = (struct elf_i386_link_hash_entry *) h;
1341*a9fa9459Szrj 	  tls_get_addr = eh->tls_get_addr == 1;
1342*a9fa9459Szrj 	  if (eh->tls_get_addr > 1)
1343*a9fa9459Szrj 	    {
1344*a9fa9459Szrj 	      /* Use strncmp to check ___tls_get_addr since
1345*a9fa9459Szrj 		 ___tls_get_addr may be versioned.  */
1346*a9fa9459Szrj 	      if (strncmp (h->root.root.string, "___tls_get_addr", 15)
1347*a9fa9459Szrj 		  == 0)
1348*a9fa9459Szrj 		{
1349*a9fa9459Szrj 		  eh->tls_get_addr = 1;
1350*a9fa9459Szrj 		  tls_get_addr = TRUE;
1351*a9fa9459Szrj 		}
1352*a9fa9459Szrj 	      else
1353*a9fa9459Szrj 		eh->tls_get_addr = 0;
1354*a9fa9459Szrj 	    }
1355*a9fa9459Szrj 	}
1356*a9fa9459Szrj 
1357*a9fa9459Szrj       if (!tls_get_addr)
1358*a9fa9459Szrj 	return FALSE;
1359*a9fa9459Szrj       else if (indirect_call)
1360*a9fa9459Szrj 	return (ELF32_R_TYPE (rel[1].r_info) == R_386_GOT32X);
1361*a9fa9459Szrj       else
1362*a9fa9459Szrj 	return (ELF32_R_TYPE (rel[1].r_info) == R_386_PC32
1363*a9fa9459Szrj 		|| ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
1364*a9fa9459Szrj 
1365*a9fa9459Szrj     case R_386_TLS_IE:
1366*a9fa9459Szrj       /* Check transition from IE access model:
1367*a9fa9459Szrj 		movl foo@indntpoff(%rip), %eax
1368*a9fa9459Szrj 		movl foo@indntpoff(%rip), %reg
1369*a9fa9459Szrj 		addl foo@indntpoff(%rip), %reg
1370*a9fa9459Szrj        */
1371*a9fa9459Szrj 
1372*a9fa9459Szrj       if (offset < 1 || (offset + 4) > sec->size)
1373*a9fa9459Szrj 	return FALSE;
1374*a9fa9459Szrj 
1375*a9fa9459Szrj       /* Check "movl foo@tpoff(%rip), %eax" first.  */
1376*a9fa9459Szrj       val = bfd_get_8 (abfd, contents + offset - 1);
1377*a9fa9459Szrj       if (val == 0xa1)
1378*a9fa9459Szrj 	return TRUE;
1379*a9fa9459Szrj 
1380*a9fa9459Szrj       if (offset < 2)
1381*a9fa9459Szrj 	return FALSE;
1382*a9fa9459Szrj 
1383*a9fa9459Szrj       /* Check movl|addl foo@tpoff(%rip), %reg.   */
1384*a9fa9459Szrj       type = bfd_get_8 (abfd, contents + offset - 2);
1385*a9fa9459Szrj       return ((type == 0x8b || type == 0x03)
1386*a9fa9459Szrj 	      && (val & 0xc7) == 0x05);
1387*a9fa9459Szrj 
1388*a9fa9459Szrj     case R_386_TLS_GOTIE:
1389*a9fa9459Szrj     case R_386_TLS_IE_32:
1390*a9fa9459Szrj       /* Check transition from {IE_32,GOTIE} access model:
1391*a9fa9459Szrj 		subl foo@{tpoff,gontoff}(%reg1), %reg2
1392*a9fa9459Szrj 		movl foo@{tpoff,gontoff}(%reg1), %reg2
1393*a9fa9459Szrj 		addl foo@{tpoff,gontoff}(%reg1), %reg2
1394*a9fa9459Szrj        */
1395*a9fa9459Szrj 
1396*a9fa9459Szrj       if (offset < 2 || (offset + 4) > sec->size)
1397*a9fa9459Szrj 	return FALSE;
1398*a9fa9459Szrj 
1399*a9fa9459Szrj       val = bfd_get_8 (abfd, contents + offset - 1);
1400*a9fa9459Szrj       if ((val & 0xc0) != 0x80 || (val & 7) == 4)
1401*a9fa9459Szrj 	return FALSE;
1402*a9fa9459Szrj 
1403*a9fa9459Szrj       type = bfd_get_8 (abfd, contents + offset - 2);
1404*a9fa9459Szrj       return type == 0x8b || type == 0x2b || type == 0x03;
1405*a9fa9459Szrj 
1406*a9fa9459Szrj     case R_386_TLS_GOTDESC:
1407*a9fa9459Szrj       /* Check transition from GDesc access model:
1408*a9fa9459Szrj 		leal x@tlsdesc(%ebx), %eax
1409*a9fa9459Szrj 
1410*a9fa9459Szrj 	 Make sure it's a leal adding ebx to a 32-bit offset
1411*a9fa9459Szrj 	 into any register, although it's probably almost always
1412*a9fa9459Szrj 	 going to be eax.  */
1413*a9fa9459Szrj 
1414*a9fa9459Szrj       if (offset < 2 || (offset + 4) > sec->size)
1415*a9fa9459Szrj 	return FALSE;
1416*a9fa9459Szrj 
1417*a9fa9459Szrj       if (bfd_get_8 (abfd, contents + offset - 2) != 0x8d)
1418*a9fa9459Szrj 	return FALSE;
1419*a9fa9459Szrj 
1420*a9fa9459Szrj       val = bfd_get_8 (abfd, contents + offset - 1);
1421*a9fa9459Szrj       return (val & 0xc7) == 0x83;
1422*a9fa9459Szrj 
1423*a9fa9459Szrj     case R_386_TLS_DESC_CALL:
1424*a9fa9459Szrj       /* Check transition from GDesc access model:
1425*a9fa9459Szrj 		call *x@tlsdesc(%eax)
1426*a9fa9459Szrj        */
1427*a9fa9459Szrj       if (offset + 2 <= sec->size)
1428*a9fa9459Szrj 	{
1429*a9fa9459Szrj 	  /* Make sure that it's a call *x@tlsdesc(%eax).  */
1430*a9fa9459Szrj 	  call = contents + offset;
1431*a9fa9459Szrj 	  return call[0] == 0xff && call[1] == 0x10;
1432*a9fa9459Szrj 	}
1433*a9fa9459Szrj 
1434*a9fa9459Szrj       return FALSE;
1435*a9fa9459Szrj 
1436*a9fa9459Szrj     default:
1437*a9fa9459Szrj       abort ();
1438*a9fa9459Szrj     }
1439*a9fa9459Szrj }
1440*a9fa9459Szrj 
1441*a9fa9459Szrj /* Return TRUE if the TLS access transition is OK or no transition
1442*a9fa9459Szrj    will be performed.  Update R_TYPE if there is a transition.  */
1443*a9fa9459Szrj 
1444*a9fa9459Szrj static bfd_boolean
elf_i386_tls_transition(struct bfd_link_info * info,bfd * abfd,asection * sec,bfd_byte * contents,Elf_Internal_Shdr * symtab_hdr,struct elf_link_hash_entry ** sym_hashes,unsigned int * r_type,int tls_type,const Elf_Internal_Rela * rel,const Elf_Internal_Rela * relend,struct elf_link_hash_entry * h,unsigned long r_symndx,bfd_boolean from_relocate_section)1445*a9fa9459Szrj elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
1446*a9fa9459Szrj 			 asection *sec, bfd_byte *contents,
1447*a9fa9459Szrj 			 Elf_Internal_Shdr *symtab_hdr,
1448*a9fa9459Szrj 			 struct elf_link_hash_entry **sym_hashes,
1449*a9fa9459Szrj 			 unsigned int *r_type, int tls_type,
1450*a9fa9459Szrj 			 const Elf_Internal_Rela *rel,
1451*a9fa9459Szrj 			 const Elf_Internal_Rela *relend,
1452*a9fa9459Szrj 			 struct elf_link_hash_entry *h,
1453*a9fa9459Szrj 			 unsigned long r_symndx,
1454*a9fa9459Szrj 			 bfd_boolean from_relocate_section)
1455*a9fa9459Szrj {
1456*a9fa9459Szrj   unsigned int from_type = *r_type;
1457*a9fa9459Szrj   unsigned int to_type = from_type;
1458*a9fa9459Szrj   bfd_boolean check = TRUE;
1459*a9fa9459Szrj 
1460*a9fa9459Szrj   /* Skip TLS transition for functions.  */
1461*a9fa9459Szrj   if (h != NULL
1462*a9fa9459Szrj       && (h->type == STT_FUNC
1463*a9fa9459Szrj 	  || h->type == STT_GNU_IFUNC))
1464*a9fa9459Szrj     return TRUE;
1465*a9fa9459Szrj 
1466*a9fa9459Szrj   switch (from_type)
1467*a9fa9459Szrj     {
1468*a9fa9459Szrj     case R_386_TLS_GD:
1469*a9fa9459Szrj     case R_386_TLS_GOTDESC:
1470*a9fa9459Szrj     case R_386_TLS_DESC_CALL:
1471*a9fa9459Szrj     case R_386_TLS_IE_32:
1472*a9fa9459Szrj     case R_386_TLS_IE:
1473*a9fa9459Szrj     case R_386_TLS_GOTIE:
1474*a9fa9459Szrj       if (bfd_link_executable (info))
1475*a9fa9459Szrj 	{
1476*a9fa9459Szrj 	  if (h == NULL)
1477*a9fa9459Szrj 	    to_type = R_386_TLS_LE_32;
1478*a9fa9459Szrj 	  else if (from_type != R_386_TLS_IE
1479*a9fa9459Szrj 		   && from_type != R_386_TLS_GOTIE)
1480*a9fa9459Szrj 	    to_type = R_386_TLS_IE_32;
1481*a9fa9459Szrj 	}
1482*a9fa9459Szrj 
1483*a9fa9459Szrj       /* When we are called from elf_i386_relocate_section, there may
1484*a9fa9459Szrj 	 be additional transitions based on TLS_TYPE.  */
1485*a9fa9459Szrj       if (from_relocate_section)
1486*a9fa9459Szrj 	{
1487*a9fa9459Szrj 	  unsigned int new_to_type = to_type;
1488*a9fa9459Szrj 
1489*a9fa9459Szrj 	  if (bfd_link_executable (info)
1490*a9fa9459Szrj 	      && h != NULL
1491*a9fa9459Szrj 	      && h->dynindx == -1
1492*a9fa9459Szrj 	      && (tls_type & GOT_TLS_IE))
1493*a9fa9459Szrj 	    new_to_type = R_386_TLS_LE_32;
1494*a9fa9459Szrj 
1495*a9fa9459Szrj 	  if (to_type == R_386_TLS_GD
1496*a9fa9459Szrj 	      || to_type == R_386_TLS_GOTDESC
1497*a9fa9459Szrj 	      || to_type == R_386_TLS_DESC_CALL)
1498*a9fa9459Szrj 	    {
1499*a9fa9459Szrj 	      if (tls_type == GOT_TLS_IE_POS)
1500*a9fa9459Szrj 		new_to_type = R_386_TLS_GOTIE;
1501*a9fa9459Szrj 	      else if (tls_type & GOT_TLS_IE)
1502*a9fa9459Szrj 		new_to_type = R_386_TLS_IE_32;
1503*a9fa9459Szrj 	    }
1504*a9fa9459Szrj 
1505*a9fa9459Szrj 	  /* We checked the transition before when we were called from
1506*a9fa9459Szrj 	     elf_i386_check_relocs.  We only want to check the new
1507*a9fa9459Szrj 	     transition which hasn't been checked before.  */
1508*a9fa9459Szrj 	  check = new_to_type != to_type && from_type == to_type;
1509*a9fa9459Szrj 	  to_type = new_to_type;
1510*a9fa9459Szrj 	}
1511*a9fa9459Szrj 
1512*a9fa9459Szrj       break;
1513*a9fa9459Szrj 
1514*a9fa9459Szrj     case R_386_TLS_LDM:
1515*a9fa9459Szrj       if (bfd_link_executable (info))
1516*a9fa9459Szrj 	to_type = R_386_TLS_LE_32;
1517*a9fa9459Szrj       break;
1518*a9fa9459Szrj 
1519*a9fa9459Szrj     default:
1520*a9fa9459Szrj       return TRUE;
1521*a9fa9459Szrj     }
1522*a9fa9459Szrj 
1523*a9fa9459Szrj   /* Return TRUE if there is no transition.  */
1524*a9fa9459Szrj   if (from_type == to_type)
1525*a9fa9459Szrj     return TRUE;
1526*a9fa9459Szrj 
1527*a9fa9459Szrj   /* Check if the transition can be performed.  */
1528*a9fa9459Szrj   if (check
1529*a9fa9459Szrj       && ! elf_i386_check_tls_transition (sec, contents,
1530*a9fa9459Szrj 					  symtab_hdr, sym_hashes,
1531*a9fa9459Szrj 					  from_type, rel, relend))
1532*a9fa9459Szrj     {
1533*a9fa9459Szrj       reloc_howto_type *from, *to;
1534*a9fa9459Szrj       const char *name;
1535*a9fa9459Szrj 
1536*a9fa9459Szrj       from = elf_i386_rtype_to_howto (abfd, from_type);
1537*a9fa9459Szrj       to = elf_i386_rtype_to_howto (abfd, to_type);
1538*a9fa9459Szrj 
1539*a9fa9459Szrj       if (h)
1540*a9fa9459Szrj 	name = h->root.root.string;
1541*a9fa9459Szrj       else
1542*a9fa9459Szrj 	{
1543*a9fa9459Szrj 	  struct elf_i386_link_hash_table *htab;
1544*a9fa9459Szrj 
1545*a9fa9459Szrj 	  htab = elf_i386_hash_table (info);
1546*a9fa9459Szrj 	  if (htab == NULL)
1547*a9fa9459Szrj 	    name = "*unknown*";
1548*a9fa9459Szrj 	  else
1549*a9fa9459Szrj 	    {
1550*a9fa9459Szrj 	      Elf_Internal_Sym *isym;
1551*a9fa9459Szrj 
1552*a9fa9459Szrj 	      isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1553*a9fa9459Szrj 					    abfd, r_symndx);
1554*a9fa9459Szrj 	      name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1555*a9fa9459Szrj 	    }
1556*a9fa9459Szrj 	}
1557*a9fa9459Szrj 
1558*a9fa9459Szrj       (*_bfd_error_handler)
1559*a9fa9459Szrj 	(_("%B: TLS transition from %s to %s against `%s' at 0x%lx "
1560*a9fa9459Szrj 	   "in section `%A' failed"),
1561*a9fa9459Szrj 	 abfd, sec, from->name, to->name, name,
1562*a9fa9459Szrj 	 (unsigned long) rel->r_offset);
1563*a9fa9459Szrj       bfd_set_error (bfd_error_bad_value);
1564*a9fa9459Szrj       return FALSE;
1565*a9fa9459Szrj     }
1566*a9fa9459Szrj 
1567*a9fa9459Szrj   *r_type = to_type;
1568*a9fa9459Szrj   return TRUE;
1569*a9fa9459Szrj }
1570*a9fa9459Szrj 
1571*a9fa9459Szrj /* With the local symbol, foo, we convert
1572*a9fa9459Szrj    mov foo@GOT[(%reg1)], %reg2
1573*a9fa9459Szrj    to
1574*a9fa9459Szrj    lea foo[@GOTOFF(%reg1)], %reg2
1575*a9fa9459Szrj    and convert
1576*a9fa9459Szrj    call/jmp *foo@GOT[(%reg)]
1577*a9fa9459Szrj    to
1578*a9fa9459Szrj    nop call foo/jmp foo nop
1579*a9fa9459Szrj    When PIC is false, convert
1580*a9fa9459Szrj    test %reg1, foo@GOT[(%reg2)]
1581*a9fa9459Szrj    to
1582*a9fa9459Szrj    test $foo, %reg1
1583*a9fa9459Szrj    and convert
1584*a9fa9459Szrj    binop foo@GOT[(%reg1)], %reg2
1585*a9fa9459Szrj    to
1586*a9fa9459Szrj    binop $foo, %reg2
1587*a9fa9459Szrj    where binop is one of adc, add, and, cmp, or, sbb, sub, xor
1588*a9fa9459Szrj    instructions.  */
1589*a9fa9459Szrj 
1590*a9fa9459Szrj static
1591*a9fa9459Szrj bfd_boolean
elf_i386_convert_load_reloc(bfd * abfd,Elf_Internal_Shdr * symtab_hdr,bfd_byte * contents,Elf_Internal_Rela * irel,struct elf_link_hash_entry * h,bfd_boolean * converted,struct bfd_link_info * link_info)1592*a9fa9459Szrj elf_i386_convert_load_reloc (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
1593*a9fa9459Szrj 			     bfd_byte *contents,
1594*a9fa9459Szrj 			     Elf_Internal_Rela *irel,
1595*a9fa9459Szrj 			     struct elf_link_hash_entry *h,
1596*a9fa9459Szrj 			     bfd_boolean *converted,
1597*a9fa9459Szrj 			     struct bfd_link_info *link_info)
1598*a9fa9459Szrj {
1599*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
1600*a9fa9459Szrj   unsigned int opcode;
1601*a9fa9459Szrj   unsigned int modrm;
1602*a9fa9459Szrj   bfd_boolean baseless;
1603*a9fa9459Szrj   Elf_Internal_Sym *isym;
1604*a9fa9459Szrj   unsigned int addend;
1605*a9fa9459Szrj   unsigned int nop;
1606*a9fa9459Szrj   bfd_vma nop_offset;
1607*a9fa9459Szrj   bfd_boolean is_pic;
1608*a9fa9459Szrj   bfd_boolean to_reloc_32;
1609*a9fa9459Szrj   unsigned int r_type;
1610*a9fa9459Szrj   unsigned int r_symndx;
1611*a9fa9459Szrj   bfd_vma roff = irel->r_offset;
1612*a9fa9459Szrj 
1613*a9fa9459Szrj   if (roff < 2)
1614*a9fa9459Szrj     return TRUE;
1615*a9fa9459Szrj 
1616*a9fa9459Szrj   /* Addend for R_386_GOT32X relocations must be 0.  */
1617*a9fa9459Szrj   addend = bfd_get_32 (abfd, contents + roff);
1618*a9fa9459Szrj   if (addend != 0)
1619*a9fa9459Szrj     return TRUE;
1620*a9fa9459Szrj 
1621*a9fa9459Szrj   htab = elf_i386_hash_table (link_info);
1622*a9fa9459Szrj   is_pic = bfd_link_pic (link_info);
1623*a9fa9459Szrj 
1624*a9fa9459Szrj   r_type = ELF32_R_TYPE (irel->r_info);
1625*a9fa9459Szrj   r_symndx = ELF32_R_SYM (irel->r_info);
1626*a9fa9459Szrj 
1627*a9fa9459Szrj   modrm = bfd_get_8 (abfd, contents + roff - 1);
1628*a9fa9459Szrj   baseless = (modrm & 0xc7) == 0x5;
1629*a9fa9459Szrj 
1630*a9fa9459Szrj   if (baseless && is_pic)
1631*a9fa9459Szrj     {
1632*a9fa9459Szrj       /* For PIC, disallow R_386_GOT32X without a base register
1633*a9fa9459Szrj 	 since we don't know what the GOT base is.  */
1634*a9fa9459Szrj       const char *name;
1635*a9fa9459Szrj 
1636*a9fa9459Szrj       if (h == NULL)
1637*a9fa9459Szrj 	{
1638*a9fa9459Szrj 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache, abfd,
1639*a9fa9459Szrj 					r_symndx);
1640*a9fa9459Szrj 	  name = bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);
1641*a9fa9459Szrj 	}
1642*a9fa9459Szrj       else
1643*a9fa9459Szrj 	name = h->root.root.string;
1644*a9fa9459Szrj 
1645*a9fa9459Szrj       (*_bfd_error_handler)
1646*a9fa9459Szrj 	(_("%B: direct GOT relocation R_386_GOT32X against `%s' without base register can not be used when making a shared object"),
1647*a9fa9459Szrj 	 abfd, name);
1648*a9fa9459Szrj       return FALSE;
1649*a9fa9459Szrj     }
1650*a9fa9459Szrj 
1651*a9fa9459Szrj   opcode = bfd_get_8 (abfd, contents + roff - 2);
1652*a9fa9459Szrj 
1653*a9fa9459Szrj   /* Convert to R_386_32 if PIC is false or there is no base
1654*a9fa9459Szrj      register.  */
1655*a9fa9459Szrj   to_reloc_32 = !is_pic || baseless;
1656*a9fa9459Szrj 
1657*a9fa9459Szrj   /* Try to convert R_386_GOT32X.  Get the symbol referred to by the
1658*a9fa9459Szrj      reloc.  */
1659*a9fa9459Szrj   if (h == NULL)
1660*a9fa9459Szrj     {
1661*a9fa9459Szrj       if (opcode == 0x0ff)
1662*a9fa9459Szrj 	/* Convert "call/jmp *foo@GOT[(%reg)]".  */
1663*a9fa9459Szrj 	goto convert_branch;
1664*a9fa9459Szrj       else
1665*a9fa9459Szrj 	/* Convert "mov foo@GOT[(%reg1)], %reg2",
1666*a9fa9459Szrj 	   "test %reg1, foo@GOT(%reg2)" and
1667*a9fa9459Szrj 	   "binop foo@GOT[(%reg1)], %reg2". */
1668*a9fa9459Szrj 	goto convert_load;
1669*a9fa9459Szrj     }
1670*a9fa9459Szrj 
1671*a9fa9459Szrj   /* Undefined weak symbol is only bound locally in executable
1672*a9fa9459Szrj      and its reference is resolved as 0.  */
1673*a9fa9459Szrj   if (UNDEFINED_WEAK_RESOLVED_TO_ZERO (link_info, TRUE,
1674*a9fa9459Szrj 				       elf_i386_hash_entry (h)))
1675*a9fa9459Szrj     {
1676*a9fa9459Szrj       if (opcode == 0xff)
1677*a9fa9459Szrj 	{
1678*a9fa9459Szrj 	  /* No direct branch to 0 for PIC.  */
1679*a9fa9459Szrj 	  if (is_pic)
1680*a9fa9459Szrj 	    return TRUE;
1681*a9fa9459Szrj 	  else
1682*a9fa9459Szrj 	    goto convert_branch;
1683*a9fa9459Szrj 	}
1684*a9fa9459Szrj       else
1685*a9fa9459Szrj 	{
1686*a9fa9459Szrj 	  /* We can convert load of address 0 to R_386_32.  */
1687*a9fa9459Szrj 	  to_reloc_32 = TRUE;
1688*a9fa9459Szrj 	  goto convert_load;
1689*a9fa9459Szrj 	}
1690*a9fa9459Szrj     }
1691*a9fa9459Szrj 
1692*a9fa9459Szrj   if (opcode == 0xff)
1693*a9fa9459Szrj     {
1694*a9fa9459Szrj       /* We have "call/jmp *foo@GOT[(%reg)]".  */
1695*a9fa9459Szrj       if ((h->root.type == bfd_link_hash_defined
1696*a9fa9459Szrj 	   || h->root.type == bfd_link_hash_defweak)
1697*a9fa9459Szrj 	  && SYMBOL_REFERENCES_LOCAL (link_info, h))
1698*a9fa9459Szrj 	{
1699*a9fa9459Szrj 	  /* The function is locally defined.   */
1700*a9fa9459Szrj convert_branch:
1701*a9fa9459Szrj 	  /* Convert R_386_GOT32X to R_386_PC32.  */
1702*a9fa9459Szrj 	  if (modrm == 0x15 || (modrm & 0xf8) == 0x90)
1703*a9fa9459Szrj 	    {
1704*a9fa9459Szrj 	      struct elf_i386_link_hash_entry *eh
1705*a9fa9459Szrj 		= (struct elf_i386_link_hash_entry *) h;
1706*a9fa9459Szrj 
1707*a9fa9459Szrj 	      /* Convert to "nop call foo".  ADDR_PREFIX_OPCODE
1708*a9fa9459Szrj 		 is a nop prefix.  */
1709*a9fa9459Szrj 	      modrm = 0xe8;
1710*a9fa9459Szrj 	      /* To support TLS optimization, always use addr32 prefix
1711*a9fa9459Szrj 		 for "call *___tls_get_addr@GOT(%reg)".  */
1712*a9fa9459Szrj 	      if (eh && eh->tls_get_addr == 1)
1713*a9fa9459Szrj 		{
1714*a9fa9459Szrj 		  nop = 0x67;
1715*a9fa9459Szrj 		  nop_offset = irel->r_offset - 2;
1716*a9fa9459Szrj 		}
1717*a9fa9459Szrj 	      else
1718*a9fa9459Szrj 		{
1719*a9fa9459Szrj 		  nop = link_info->call_nop_byte;
1720*a9fa9459Szrj 		  if (link_info->call_nop_as_suffix)
1721*a9fa9459Szrj 		    {
1722*a9fa9459Szrj 		      nop_offset = roff + 3;
1723*a9fa9459Szrj 		      irel->r_offset -= 1;
1724*a9fa9459Szrj 		    }
1725*a9fa9459Szrj 		  else
1726*a9fa9459Szrj 		    nop_offset = roff - 2;
1727*a9fa9459Szrj 		}
1728*a9fa9459Szrj 	    }
1729*a9fa9459Szrj 	  else
1730*a9fa9459Szrj 	    {
1731*a9fa9459Szrj 	      /* Convert to "jmp foo nop".  */
1732*a9fa9459Szrj 	      modrm = 0xe9;
1733*a9fa9459Szrj 	      nop = NOP_OPCODE;
1734*a9fa9459Szrj 	      nop_offset = roff + 3;
1735*a9fa9459Szrj 	      irel->r_offset -= 1;
1736*a9fa9459Szrj 	    }
1737*a9fa9459Szrj 
1738*a9fa9459Szrj 	  bfd_put_8 (abfd, nop, contents + nop_offset);
1739*a9fa9459Szrj 	  bfd_put_8 (abfd, modrm, contents + irel->r_offset - 1);
1740*a9fa9459Szrj 	  /* When converting to PC-relative relocation, we
1741*a9fa9459Szrj 	     need to adjust addend by -4.  */
1742*a9fa9459Szrj 	  bfd_put_32 (abfd, -4, contents + irel->r_offset);
1743*a9fa9459Szrj 	  irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
1744*a9fa9459Szrj 
1745*a9fa9459Szrj 	  *converted = TRUE;
1746*a9fa9459Szrj 	}
1747*a9fa9459Szrj     }
1748*a9fa9459Szrj   else
1749*a9fa9459Szrj     {
1750*a9fa9459Szrj       /* We have "mov foo@GOT[(%re1g)], %reg2",
1751*a9fa9459Szrj 	 "test %reg1, foo@GOT(%reg2)" and
1752*a9fa9459Szrj 	 "binop foo@GOT[(%reg1)], %reg2".
1753*a9fa9459Szrj 
1754*a9fa9459Szrj 	 Avoid optimizing _DYNAMIC since ld.so may use its
1755*a9fa9459Szrj 	 link-time address.  */
1756*a9fa9459Szrj       if (h == htab->elf.hdynamic)
1757*a9fa9459Szrj 	return TRUE;
1758*a9fa9459Szrj 
1759*a9fa9459Szrj       /* def_regular is set by an assignment in a linker script in
1760*a9fa9459Szrj 	 bfd_elf_record_link_assignment.  */
1761*a9fa9459Szrj       if ((h->def_regular
1762*a9fa9459Szrj 	   || h->root.type == bfd_link_hash_defined
1763*a9fa9459Szrj 	   || h->root.type == bfd_link_hash_defweak)
1764*a9fa9459Szrj 	  && SYMBOL_REFERENCES_LOCAL (link_info, h))
1765*a9fa9459Szrj 	{
1766*a9fa9459Szrj convert_load:
1767*a9fa9459Szrj 	  if (opcode == 0x8b)
1768*a9fa9459Szrj 	    {
1769*a9fa9459Szrj 	      if (to_reloc_32)
1770*a9fa9459Szrj 		{
1771*a9fa9459Szrj 		  /* Convert "mov foo@GOT[(%reg1)], %reg2" to
1772*a9fa9459Szrj 		     "mov $foo, %reg2" with R_386_32.  */
1773*a9fa9459Szrj 		  r_type = R_386_32;
1774*a9fa9459Szrj 		  modrm = 0xc0 | (modrm & 0x38) >> 3;
1775*a9fa9459Szrj 		  bfd_put_8 (abfd, modrm, contents + roff - 1);
1776*a9fa9459Szrj 		  opcode = 0xc7;
1777*a9fa9459Szrj 		}
1778*a9fa9459Szrj 	      else
1779*a9fa9459Szrj 		{
1780*a9fa9459Szrj 		  /* Convert "mov foo@GOT(%reg1), %reg2" to
1781*a9fa9459Szrj 		     "lea foo@GOTOFF(%reg1), %reg2".  */
1782*a9fa9459Szrj 		  r_type = R_386_GOTOFF;
1783*a9fa9459Szrj 		  opcode = 0x8d;
1784*a9fa9459Szrj 		}
1785*a9fa9459Szrj 	    }
1786*a9fa9459Szrj 	  else
1787*a9fa9459Szrj 	    {
1788*a9fa9459Szrj 	      /* Only R_386_32 is supported.  */
1789*a9fa9459Szrj 	      if (!to_reloc_32)
1790*a9fa9459Szrj 		return TRUE;
1791*a9fa9459Szrj 
1792*a9fa9459Szrj 	      if (opcode == 0x85)
1793*a9fa9459Szrj 		{
1794*a9fa9459Szrj 		  /* Convert "test %reg1, foo@GOT(%reg2)" to
1795*a9fa9459Szrj 		     "test $foo, %reg1".  */
1796*a9fa9459Szrj 		  modrm = 0xc0 | (modrm & 0x38) >> 3;
1797*a9fa9459Szrj 		  opcode = 0xf7;
1798*a9fa9459Szrj 		}
1799*a9fa9459Szrj 	      else
1800*a9fa9459Szrj 		{
1801*a9fa9459Szrj 		  /* Convert "binop foo@GOT(%reg1), %reg2" to
1802*a9fa9459Szrj 		     "binop $foo, %reg2".  */
1803*a9fa9459Szrj 		  modrm = (0xc0
1804*a9fa9459Szrj 			   | (modrm & 0x38) >> 3
1805*a9fa9459Szrj 			   | (opcode & 0x3c));
1806*a9fa9459Szrj 		  opcode = 0x81;
1807*a9fa9459Szrj 		}
1808*a9fa9459Szrj 	      bfd_put_8 (abfd, modrm, contents + roff - 1);
1809*a9fa9459Szrj 	      r_type = R_386_32;
1810*a9fa9459Szrj 	    }
1811*a9fa9459Szrj 
1812*a9fa9459Szrj 	  bfd_put_8 (abfd, opcode, contents + roff - 2);
1813*a9fa9459Szrj 	  irel->r_info = ELF32_R_INFO (r_symndx, r_type);
1814*a9fa9459Szrj 
1815*a9fa9459Szrj 	  *converted = TRUE;
1816*a9fa9459Szrj 	}
1817*a9fa9459Szrj     }
1818*a9fa9459Szrj 
1819*a9fa9459Szrj   return TRUE;
1820*a9fa9459Szrj }
1821*a9fa9459Szrj 
1822*a9fa9459Szrj /* Rename some of the generic section flags to better document how they
1823*a9fa9459Szrj    are used here.  */
1824*a9fa9459Szrj #define need_convert_load	sec_flg0
1825*a9fa9459Szrj #define check_relocs_failed	sec_flg1
1826*a9fa9459Szrj 
1827*a9fa9459Szrj /* Look through the relocs for a section during the first phase, and
1828*a9fa9459Szrj    calculate needed space in the global offset table, procedure linkage
1829*a9fa9459Szrj    table, and dynamic reloc sections.  */
1830*a9fa9459Szrj 
1831*a9fa9459Szrj static bfd_boolean
elf_i386_check_relocs(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)1832*a9fa9459Szrj elf_i386_check_relocs (bfd *abfd,
1833*a9fa9459Szrj 		       struct bfd_link_info *info,
1834*a9fa9459Szrj 		       asection *sec,
1835*a9fa9459Szrj 		       const Elf_Internal_Rela *relocs)
1836*a9fa9459Szrj {
1837*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
1838*a9fa9459Szrj   Elf_Internal_Shdr *symtab_hdr;
1839*a9fa9459Szrj   struct elf_link_hash_entry **sym_hashes;
1840*a9fa9459Szrj   const Elf_Internal_Rela *rel;
1841*a9fa9459Szrj   const Elf_Internal_Rela *rel_end;
1842*a9fa9459Szrj   asection *sreloc;
1843*a9fa9459Szrj   bfd_byte *contents;
1844*a9fa9459Szrj   bfd_boolean use_plt_got;
1845*a9fa9459Szrj 
1846*a9fa9459Szrj   if (bfd_link_relocatable (info))
1847*a9fa9459Szrj     return TRUE;
1848*a9fa9459Szrj 
1849*a9fa9459Szrj   /* Don't do anything special with non-loaded, non-alloced sections.
1850*a9fa9459Szrj      In particular, any relocs in such sections should not affect GOT
1851*a9fa9459Szrj      and PLT reference counting (ie. we don't allow them to create GOT
1852*a9fa9459Szrj      or PLT entries), there's no possibility or desire to optimize TLS
1853*a9fa9459Szrj      relocs, and there's not much point in propagating relocs to shared
1854*a9fa9459Szrj      libs that the dynamic linker won't relocate.  */
1855*a9fa9459Szrj   if ((sec->flags & SEC_ALLOC) == 0)
1856*a9fa9459Szrj     return TRUE;
1857*a9fa9459Szrj 
1858*a9fa9459Szrj   BFD_ASSERT (is_i386_elf (abfd));
1859*a9fa9459Szrj 
1860*a9fa9459Szrj   htab = elf_i386_hash_table (info);
1861*a9fa9459Szrj   if (htab == NULL)
1862*a9fa9459Szrj     {
1863*a9fa9459Szrj       sec->check_relocs_failed = 1;
1864*a9fa9459Szrj       return FALSE;
1865*a9fa9459Szrj     }
1866*a9fa9459Szrj 
1867*a9fa9459Szrj   /* Get the section contents.  */
1868*a9fa9459Szrj   if (elf_section_data (sec)->this_hdr.contents != NULL)
1869*a9fa9459Szrj     contents = elf_section_data (sec)->this_hdr.contents;
1870*a9fa9459Szrj   else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
1871*a9fa9459Szrj     {
1872*a9fa9459Szrj       sec->check_relocs_failed = 1;
1873*a9fa9459Szrj       return FALSE;
1874*a9fa9459Szrj     }
1875*a9fa9459Szrj 
1876*a9fa9459Szrj   use_plt_got = (!get_elf_i386_backend_data (abfd)->is_vxworks
1877*a9fa9459Szrj 		 && (get_elf_i386_backend_data (abfd)
1878*a9fa9459Szrj 		     == &elf_i386_arch_bed));
1879*a9fa9459Szrj 
1880*a9fa9459Szrj   symtab_hdr = &elf_symtab_hdr (abfd);
1881*a9fa9459Szrj   sym_hashes = elf_sym_hashes (abfd);
1882*a9fa9459Szrj 
1883*a9fa9459Szrj   sreloc = NULL;
1884*a9fa9459Szrj 
1885*a9fa9459Szrj   rel_end = relocs + sec->reloc_count;
1886*a9fa9459Szrj   for (rel = relocs; rel < rel_end; rel++)
1887*a9fa9459Szrj     {
1888*a9fa9459Szrj       unsigned int r_type;
1889*a9fa9459Szrj       unsigned long r_symndx;
1890*a9fa9459Szrj       struct elf_link_hash_entry *h;
1891*a9fa9459Szrj       struct elf_i386_link_hash_entry *eh;
1892*a9fa9459Szrj       Elf_Internal_Sym *isym;
1893*a9fa9459Szrj       const char *name;
1894*a9fa9459Szrj       bfd_boolean size_reloc;
1895*a9fa9459Szrj 
1896*a9fa9459Szrj       r_symndx = ELF32_R_SYM (rel->r_info);
1897*a9fa9459Szrj       r_type = ELF32_R_TYPE (rel->r_info);
1898*a9fa9459Szrj 
1899*a9fa9459Szrj       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1900*a9fa9459Szrj 	{
1901*a9fa9459Szrj 	  (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1902*a9fa9459Szrj 				 abfd,
1903*a9fa9459Szrj 				 r_symndx);
1904*a9fa9459Szrj 	  goto error_return;
1905*a9fa9459Szrj 	}
1906*a9fa9459Szrj 
1907*a9fa9459Szrj       if (r_symndx < symtab_hdr->sh_info)
1908*a9fa9459Szrj 	{
1909*a9fa9459Szrj 	  /* A local symbol.  */
1910*a9fa9459Szrj 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1911*a9fa9459Szrj 					abfd, r_symndx);
1912*a9fa9459Szrj 	  if (isym == NULL)
1913*a9fa9459Szrj 	    goto error_return;
1914*a9fa9459Szrj 
1915*a9fa9459Szrj 	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
1916*a9fa9459Szrj 	  if (ELF32_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
1917*a9fa9459Szrj 	    {
1918*a9fa9459Szrj 	      h = elf_i386_get_local_sym_hash (htab, abfd, rel, TRUE);
1919*a9fa9459Szrj 	      if (h == NULL)
1920*a9fa9459Szrj 		goto error_return;
1921*a9fa9459Szrj 
1922*a9fa9459Szrj 	      /* Fake a STT_GNU_IFUNC symbol.  */
1923*a9fa9459Szrj 	      h->type = STT_GNU_IFUNC;
1924*a9fa9459Szrj 	      h->def_regular = 1;
1925*a9fa9459Szrj 	      h->ref_regular = 1;
1926*a9fa9459Szrj 	      h->forced_local = 1;
1927*a9fa9459Szrj 	      h->root.type = bfd_link_hash_defined;
1928*a9fa9459Szrj 	    }
1929*a9fa9459Szrj 	  else
1930*a9fa9459Szrj 	    h = NULL;
1931*a9fa9459Szrj 	}
1932*a9fa9459Szrj       else
1933*a9fa9459Szrj 	{
1934*a9fa9459Szrj 	  isym = NULL;
1935*a9fa9459Szrj 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1936*a9fa9459Szrj 	  while (h->root.type == bfd_link_hash_indirect
1937*a9fa9459Szrj 		 || h->root.type == bfd_link_hash_warning)
1938*a9fa9459Szrj 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
1939*a9fa9459Szrj 	}
1940*a9fa9459Szrj 
1941*a9fa9459Szrj       eh = (struct elf_i386_link_hash_entry *) h;
1942*a9fa9459Szrj       if (h != NULL)
1943*a9fa9459Szrj 	{
1944*a9fa9459Szrj 	  switch (r_type)
1945*a9fa9459Szrj 	    {
1946*a9fa9459Szrj 	    default:
1947*a9fa9459Szrj 	      break;
1948*a9fa9459Szrj 
1949*a9fa9459Szrj 	    case R_386_GOTOFF:
1950*a9fa9459Szrj 	      eh->gotoff_ref = 1;
1951*a9fa9459Szrj 	    case R_386_32:
1952*a9fa9459Szrj 	    case R_386_PC32:
1953*a9fa9459Szrj 	    case R_386_PLT32:
1954*a9fa9459Szrj 	    case R_386_GOT32:
1955*a9fa9459Szrj 	    case R_386_GOT32X:
1956*a9fa9459Szrj 	      if (htab->elf.dynobj == NULL)
1957*a9fa9459Szrj 		htab->elf.dynobj = abfd;
1958*a9fa9459Szrj 	      /* Create the ifunc sections for static executables.  */
1959*a9fa9459Szrj 	      if (h->type == STT_GNU_IFUNC
1960*a9fa9459Szrj 		  && !_bfd_elf_create_ifunc_sections (htab->elf.dynobj,
1961*a9fa9459Szrj 						      info))
1962*a9fa9459Szrj 		goto error_return;
1963*a9fa9459Szrj 	      break;
1964*a9fa9459Szrj 	    }
1965*a9fa9459Szrj 
1966*a9fa9459Szrj 	  /* It is referenced by a non-shared object. */
1967*a9fa9459Szrj 	  h->ref_regular = 1;
1968*a9fa9459Szrj 	  h->root.non_ir_ref = 1;
1969*a9fa9459Szrj 
1970*a9fa9459Szrj 	  if (h->type == STT_GNU_IFUNC)
1971*a9fa9459Szrj 	    elf_tdata (info->output_bfd)->has_gnu_symbols
1972*a9fa9459Szrj 	      |= elf_gnu_symbol_ifunc;
1973*a9fa9459Szrj 	}
1974*a9fa9459Szrj 
1975*a9fa9459Szrj       if (! elf_i386_tls_transition (info, abfd, sec, contents,
1976*a9fa9459Szrj 				     symtab_hdr, sym_hashes,
1977*a9fa9459Szrj 				     &r_type, GOT_UNKNOWN,
1978*a9fa9459Szrj 				     rel, rel_end, h, r_symndx, FALSE))
1979*a9fa9459Szrj 	goto error_return;
1980*a9fa9459Szrj 
1981*a9fa9459Szrj       switch (r_type)
1982*a9fa9459Szrj 	{
1983*a9fa9459Szrj 	case R_386_TLS_LDM:
1984*a9fa9459Szrj 	  htab->tls_ldm_got.refcount += 1;
1985*a9fa9459Szrj 	  goto create_got;
1986*a9fa9459Szrj 
1987*a9fa9459Szrj 	case R_386_PLT32:
1988*a9fa9459Szrj 	  /* This symbol requires a procedure linkage table entry.  We
1989*a9fa9459Szrj 	     actually build the entry in adjust_dynamic_symbol,
1990*a9fa9459Szrj 	     because this might be a case of linking PIC code which is
1991*a9fa9459Szrj 	     never referenced by a dynamic object, in which case we
1992*a9fa9459Szrj 	     don't need to generate a procedure linkage table entry
1993*a9fa9459Szrj 	     after all.  */
1994*a9fa9459Szrj 
1995*a9fa9459Szrj 	  /* If this is a local symbol, we resolve it directly without
1996*a9fa9459Szrj 	     creating a procedure linkage table entry.  */
1997*a9fa9459Szrj 	  if (h == NULL)
1998*a9fa9459Szrj 	    continue;
1999*a9fa9459Szrj 
2000*a9fa9459Szrj 	  eh->has_got_reloc = 1;
2001*a9fa9459Szrj 	  h->needs_plt = 1;
2002*a9fa9459Szrj 	  h->plt.refcount += 1;
2003*a9fa9459Szrj 	  break;
2004*a9fa9459Szrj 
2005*a9fa9459Szrj 	case R_386_SIZE32:
2006*a9fa9459Szrj 	  size_reloc = TRUE;
2007*a9fa9459Szrj 	  goto do_size;
2008*a9fa9459Szrj 
2009*a9fa9459Szrj 	case R_386_TLS_IE_32:
2010*a9fa9459Szrj 	case R_386_TLS_IE:
2011*a9fa9459Szrj 	case R_386_TLS_GOTIE:
2012*a9fa9459Szrj 	  if (!bfd_link_executable (info))
2013*a9fa9459Szrj 	    info->flags |= DF_STATIC_TLS;
2014*a9fa9459Szrj 	  /* Fall through */
2015*a9fa9459Szrj 
2016*a9fa9459Szrj 	case R_386_GOT32:
2017*a9fa9459Szrj 	case R_386_GOT32X:
2018*a9fa9459Szrj 	case R_386_TLS_GD:
2019*a9fa9459Szrj 	case R_386_TLS_GOTDESC:
2020*a9fa9459Szrj 	case R_386_TLS_DESC_CALL:
2021*a9fa9459Szrj 	  /* This symbol requires a global offset table entry.  */
2022*a9fa9459Szrj 	  {
2023*a9fa9459Szrj 	    int tls_type, old_tls_type;
2024*a9fa9459Szrj 
2025*a9fa9459Szrj 	    switch (r_type)
2026*a9fa9459Szrj 	      {
2027*a9fa9459Szrj 	      default:
2028*a9fa9459Szrj 	      case R_386_GOT32:
2029*a9fa9459Szrj 	      case R_386_GOT32X:
2030*a9fa9459Szrj 		tls_type = GOT_NORMAL;
2031*a9fa9459Szrj 		break;
2032*a9fa9459Szrj 	      case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
2033*a9fa9459Szrj 	      case R_386_TLS_GOTDESC:
2034*a9fa9459Szrj 	      case R_386_TLS_DESC_CALL:
2035*a9fa9459Szrj 		tls_type = GOT_TLS_GDESC; break;
2036*a9fa9459Szrj 	      case R_386_TLS_IE_32:
2037*a9fa9459Szrj 		if (ELF32_R_TYPE (rel->r_info) == r_type)
2038*a9fa9459Szrj 		  tls_type = GOT_TLS_IE_NEG;
2039*a9fa9459Szrj 		else
2040*a9fa9459Szrj 		  /* If this is a GD->IE transition, we may use either of
2041*a9fa9459Szrj 		     R_386_TLS_TPOFF and R_386_TLS_TPOFF32.  */
2042*a9fa9459Szrj 		  tls_type = GOT_TLS_IE;
2043*a9fa9459Szrj 		break;
2044*a9fa9459Szrj 	      case R_386_TLS_IE:
2045*a9fa9459Szrj 	      case R_386_TLS_GOTIE:
2046*a9fa9459Szrj 		tls_type = GOT_TLS_IE_POS; break;
2047*a9fa9459Szrj 	      }
2048*a9fa9459Szrj 
2049*a9fa9459Szrj 	    if (h != NULL)
2050*a9fa9459Szrj 	      {
2051*a9fa9459Szrj 		h->got.refcount += 1;
2052*a9fa9459Szrj 		old_tls_type = elf_i386_hash_entry(h)->tls_type;
2053*a9fa9459Szrj 	      }
2054*a9fa9459Szrj 	    else
2055*a9fa9459Szrj 	      {
2056*a9fa9459Szrj 		bfd_signed_vma *local_got_refcounts;
2057*a9fa9459Szrj 
2058*a9fa9459Szrj 		/* This is a global offset table entry for a local symbol.  */
2059*a9fa9459Szrj 		local_got_refcounts = elf_local_got_refcounts (abfd);
2060*a9fa9459Szrj 		if (local_got_refcounts == NULL)
2061*a9fa9459Szrj 		  {
2062*a9fa9459Szrj 		    bfd_size_type size;
2063*a9fa9459Szrj 
2064*a9fa9459Szrj 		    size = symtab_hdr->sh_info;
2065*a9fa9459Szrj 		    size *= (sizeof (bfd_signed_vma)
2066*a9fa9459Szrj 			     + sizeof (bfd_vma) + sizeof(char));
2067*a9fa9459Szrj 		    local_got_refcounts = (bfd_signed_vma *)
2068*a9fa9459Szrj                         bfd_zalloc (abfd, size);
2069*a9fa9459Szrj 		    if (local_got_refcounts == NULL)
2070*a9fa9459Szrj 		      goto error_return;
2071*a9fa9459Szrj 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
2072*a9fa9459Szrj 		    elf_i386_local_tlsdesc_gotent (abfd)
2073*a9fa9459Szrj 		      = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
2074*a9fa9459Szrj 		    elf_i386_local_got_tls_type (abfd)
2075*a9fa9459Szrj 		      = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
2076*a9fa9459Szrj 		  }
2077*a9fa9459Szrj 		local_got_refcounts[r_symndx] += 1;
2078*a9fa9459Szrj 		old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
2079*a9fa9459Szrj 	      }
2080*a9fa9459Szrj 
2081*a9fa9459Szrj 	    if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
2082*a9fa9459Szrj 	      tls_type |= old_tls_type;
2083*a9fa9459Szrj 	    /* If a TLS symbol is accessed using IE at least once,
2084*a9fa9459Szrj 	       there is no point to use dynamic model for it.  */
2085*a9fa9459Szrj 	    else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
2086*a9fa9459Szrj 		     && (! GOT_TLS_GD_ANY_P (old_tls_type)
2087*a9fa9459Szrj 			 || (tls_type & GOT_TLS_IE) == 0))
2088*a9fa9459Szrj 	      {
2089*a9fa9459Szrj 		if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
2090*a9fa9459Szrj 		  tls_type = old_tls_type;
2091*a9fa9459Szrj 		else if (GOT_TLS_GD_ANY_P (old_tls_type)
2092*a9fa9459Szrj 			 && GOT_TLS_GD_ANY_P (tls_type))
2093*a9fa9459Szrj 		  tls_type |= old_tls_type;
2094*a9fa9459Szrj 		else
2095*a9fa9459Szrj 		  {
2096*a9fa9459Szrj 		    if (h)
2097*a9fa9459Szrj 		      name = h->root.root.string;
2098*a9fa9459Szrj 		    else
2099*a9fa9459Szrj 		      name = bfd_elf_sym_name (abfd, symtab_hdr, isym,
2100*a9fa9459Szrj 					     NULL);
2101*a9fa9459Szrj 		    (*_bfd_error_handler)
2102*a9fa9459Szrj 		      (_("%B: `%s' accessed both as normal and "
2103*a9fa9459Szrj 			 "thread local symbol"),
2104*a9fa9459Szrj 		       abfd, name);
2105*a9fa9459Szrj 		    bfd_set_error (bfd_error_bad_value);
2106*a9fa9459Szrj 		    goto error_return;
2107*a9fa9459Szrj 		  }
2108*a9fa9459Szrj 	      }
2109*a9fa9459Szrj 
2110*a9fa9459Szrj 	    if (old_tls_type != tls_type)
2111*a9fa9459Szrj 	      {
2112*a9fa9459Szrj 		if (h != NULL)
2113*a9fa9459Szrj 		  elf_i386_hash_entry (h)->tls_type = tls_type;
2114*a9fa9459Szrj 		else
2115*a9fa9459Szrj 		  elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
2116*a9fa9459Szrj 	      }
2117*a9fa9459Szrj 	  }
2118*a9fa9459Szrj 	  /* Fall through */
2119*a9fa9459Szrj 
2120*a9fa9459Szrj 	case R_386_GOTOFF:
2121*a9fa9459Szrj 	case R_386_GOTPC:
2122*a9fa9459Szrj 	create_got:
2123*a9fa9459Szrj 	  if (htab->elf.sgot == NULL)
2124*a9fa9459Szrj 	    {
2125*a9fa9459Szrj 	      if (htab->elf.dynobj == NULL)
2126*a9fa9459Szrj 		htab->elf.dynobj = abfd;
2127*a9fa9459Szrj 	      if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
2128*a9fa9459Szrj 		goto error_return;
2129*a9fa9459Szrj 	    }
2130*a9fa9459Szrj 	  if (r_type != R_386_TLS_IE)
2131*a9fa9459Szrj 	    {
2132*a9fa9459Szrj 	      if (eh != NULL)
2133*a9fa9459Szrj 		eh->has_got_reloc = 1;
2134*a9fa9459Szrj 	      break;
2135*a9fa9459Szrj 	    }
2136*a9fa9459Szrj 	  /* Fall through */
2137*a9fa9459Szrj 
2138*a9fa9459Szrj 	case R_386_TLS_LE_32:
2139*a9fa9459Szrj 	case R_386_TLS_LE:
2140*a9fa9459Szrj 	  if (eh != NULL)
2141*a9fa9459Szrj 	    eh->has_got_reloc = 1;
2142*a9fa9459Szrj 	  if (bfd_link_executable (info))
2143*a9fa9459Szrj 	    break;
2144*a9fa9459Szrj 	  info->flags |= DF_STATIC_TLS;
2145*a9fa9459Szrj 	  goto do_relocation;
2146*a9fa9459Szrj 
2147*a9fa9459Szrj 	case R_386_32:
2148*a9fa9459Szrj 	case R_386_PC32:
2149*a9fa9459Szrj 	  if (eh != NULL && (sec->flags & SEC_CODE) != 0)
2150*a9fa9459Szrj 	    eh->has_non_got_reloc = 1;
2151*a9fa9459Szrj do_relocation:
2152*a9fa9459Szrj 	  /* We are called after all symbols have been resolved.  Only
2153*a9fa9459Szrj 	     relocation against STT_GNU_IFUNC symbol must go through
2154*a9fa9459Szrj 	     PLT.  */
2155*a9fa9459Szrj 	  if (h != NULL
2156*a9fa9459Szrj 	      && (bfd_link_executable (info)
2157*a9fa9459Szrj 		  || h->type == STT_GNU_IFUNC))
2158*a9fa9459Szrj 	    {
2159*a9fa9459Szrj 	      /* If this reloc is in a read-only section, we might
2160*a9fa9459Szrj 		 need a copy reloc.  We can't check reliably at this
2161*a9fa9459Szrj 		 stage whether the section is read-only, as input
2162*a9fa9459Szrj 		 sections have not yet been mapped to output sections.
2163*a9fa9459Szrj 		 Tentatively set the flag for now, and correct in
2164*a9fa9459Szrj 		 adjust_dynamic_symbol.  */
2165*a9fa9459Szrj 	      h->non_got_ref = 1;
2166*a9fa9459Szrj 
2167*a9fa9459Szrj 	      /* We may need a .plt entry if the symbol is a function
2168*a9fa9459Szrj 		 defined in a shared lib or is a STT_GNU_IFUNC function
2169*a9fa9459Szrj 		 referenced from the code or read-only section.  */
2170*a9fa9459Szrj 	      if (!h->def_regular
2171*a9fa9459Szrj 		  || (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
2172*a9fa9459Szrj 		h->plt.refcount += 1;
2173*a9fa9459Szrj 
2174*a9fa9459Szrj 	      if (r_type == R_386_PC32)
2175*a9fa9459Szrj 		{
2176*a9fa9459Szrj 		  /* Since something like ".long foo - ." may be used
2177*a9fa9459Szrj 		     as pointer, make sure that PLT is used if foo is
2178*a9fa9459Szrj 		     a function defined in a shared library.  */
2179*a9fa9459Szrj 		  if ((sec->flags & SEC_CODE) == 0)
2180*a9fa9459Szrj 		    h->pointer_equality_needed = 1;
2181*a9fa9459Szrj 		}
2182*a9fa9459Szrj 	      else
2183*a9fa9459Szrj 		{
2184*a9fa9459Szrj 		  h->pointer_equality_needed = 1;
2185*a9fa9459Szrj 		  /* R_386_32 can be resolved at run-time.  */
2186*a9fa9459Szrj 		  if (r_type == R_386_32
2187*a9fa9459Szrj 		      && (sec->flags & SEC_READONLY) == 0)
2188*a9fa9459Szrj 		    eh->func_pointer_refcount += 1;
2189*a9fa9459Szrj 		}
2190*a9fa9459Szrj 	    }
2191*a9fa9459Szrj 
2192*a9fa9459Szrj 	  size_reloc = FALSE;
2193*a9fa9459Szrj do_size:
2194*a9fa9459Szrj 	  /* If we are creating a shared library, and this is a reloc
2195*a9fa9459Szrj 	     against a global symbol, or a non PC relative reloc
2196*a9fa9459Szrj 	     against a local symbol, then we need to copy the reloc
2197*a9fa9459Szrj 	     into the shared library.  However, if we are linking with
2198*a9fa9459Szrj 	     -Bsymbolic, we do not need to copy a reloc against a
2199*a9fa9459Szrj 	     global symbol which is defined in an object we are
2200*a9fa9459Szrj 	     including in the link (i.e., DEF_REGULAR is set).  At
2201*a9fa9459Szrj 	     this point we have not seen all the input files, so it is
2202*a9fa9459Szrj 	     possible that DEF_REGULAR is not set now but will be set
2203*a9fa9459Szrj 	     later (it is never cleared).  In case of a weak definition,
2204*a9fa9459Szrj 	     DEF_REGULAR may be cleared later by a strong definition in
2205*a9fa9459Szrj 	     a shared library.  We account for that possibility below by
2206*a9fa9459Szrj 	     storing information in the relocs_copied field of the hash
2207*a9fa9459Szrj 	     table entry.  A similar situation occurs when creating
2208*a9fa9459Szrj 	     shared libraries and symbol visibility changes render the
2209*a9fa9459Szrj 	     symbol local.
2210*a9fa9459Szrj 
2211*a9fa9459Szrj 	     If on the other hand, we are creating an executable, we
2212*a9fa9459Szrj 	     may need to keep relocations for symbols satisfied by a
2213*a9fa9459Szrj 	     dynamic library if we manage to avoid copy relocs for the
2214*a9fa9459Szrj 	     symbol.
2215*a9fa9459Szrj 
2216*a9fa9459Szrj 	     Generate dynamic pointer relocation against STT_GNU_IFUNC
2217*a9fa9459Szrj 	     symbol in the non-code section.  */
2218*a9fa9459Szrj 	  if ((bfd_link_pic (info)
2219*a9fa9459Szrj 	       && (r_type != R_386_PC32
2220*a9fa9459Szrj 		   || (h != NULL
2221*a9fa9459Szrj 		       && (! (bfd_link_pie (info)
2222*a9fa9459Szrj 			      || SYMBOLIC_BIND (info, h))
2223*a9fa9459Szrj 			   || h->root.type == bfd_link_hash_defweak
2224*a9fa9459Szrj 			   || !h->def_regular))))
2225*a9fa9459Szrj 	      || (h != NULL
2226*a9fa9459Szrj 		  && h->type == STT_GNU_IFUNC
2227*a9fa9459Szrj 		  && r_type == R_386_32
2228*a9fa9459Szrj 		  && (sec->flags & SEC_CODE) == 0)
2229*a9fa9459Szrj 	      || (ELIMINATE_COPY_RELOCS
2230*a9fa9459Szrj 		  && !bfd_link_pic (info)
2231*a9fa9459Szrj 		  && h != NULL
2232*a9fa9459Szrj 		  && (h->root.type == bfd_link_hash_defweak
2233*a9fa9459Szrj 		      || !h->def_regular)))
2234*a9fa9459Szrj 	    {
2235*a9fa9459Szrj 	      struct elf_dyn_relocs *p;
2236*a9fa9459Szrj 	      struct elf_dyn_relocs **head;
2237*a9fa9459Szrj 
2238*a9fa9459Szrj 	      /* We must copy these reloc types into the output file.
2239*a9fa9459Szrj 		 Create a reloc section in dynobj and make room for
2240*a9fa9459Szrj 		 this reloc.  */
2241*a9fa9459Szrj 	      if (sreloc == NULL)
2242*a9fa9459Szrj 		{
2243*a9fa9459Szrj 		  if (htab->elf.dynobj == NULL)
2244*a9fa9459Szrj 		    htab->elf.dynobj = abfd;
2245*a9fa9459Szrj 
2246*a9fa9459Szrj 		  sreloc = _bfd_elf_make_dynamic_reloc_section
2247*a9fa9459Szrj 		    (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ FALSE);
2248*a9fa9459Szrj 
2249*a9fa9459Szrj 		  if (sreloc == NULL)
2250*a9fa9459Szrj 		    goto error_return;
2251*a9fa9459Szrj 		}
2252*a9fa9459Szrj 
2253*a9fa9459Szrj 	      /* If this is a global symbol, we count the number of
2254*a9fa9459Szrj 		 relocations we need for this symbol.  */
2255*a9fa9459Szrj 	      if (h != NULL)
2256*a9fa9459Szrj 		{
2257*a9fa9459Szrj 		  head = &eh->dyn_relocs;
2258*a9fa9459Szrj 		}
2259*a9fa9459Szrj 	      else
2260*a9fa9459Szrj 		{
2261*a9fa9459Szrj 		  /* Track dynamic relocs needed for local syms too.
2262*a9fa9459Szrj 		     We really need local syms available to do this
2263*a9fa9459Szrj 		     easily.  Oh well.  */
2264*a9fa9459Szrj 		  void **vpp;
2265*a9fa9459Szrj 		  asection *s;
2266*a9fa9459Szrj 
2267*a9fa9459Szrj 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2268*a9fa9459Szrj 						abfd, r_symndx);
2269*a9fa9459Szrj 		  if (isym == NULL)
2270*a9fa9459Szrj 		    goto error_return;
2271*a9fa9459Szrj 
2272*a9fa9459Szrj 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2273*a9fa9459Szrj 		  if (s == NULL)
2274*a9fa9459Szrj 		    s = sec;
2275*a9fa9459Szrj 
2276*a9fa9459Szrj 		  vpp = &elf_section_data (s)->local_dynrel;
2277*a9fa9459Szrj 		  head = (struct elf_dyn_relocs **)vpp;
2278*a9fa9459Szrj 		}
2279*a9fa9459Szrj 
2280*a9fa9459Szrj 	      p = *head;
2281*a9fa9459Szrj 	      if (p == NULL || p->sec != sec)
2282*a9fa9459Szrj 		{
2283*a9fa9459Szrj 		  bfd_size_type amt = sizeof *p;
2284*a9fa9459Szrj 		  p = (struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj,
2285*a9fa9459Szrj                                                            amt);
2286*a9fa9459Szrj 		  if (p == NULL)
2287*a9fa9459Szrj 		    goto error_return;
2288*a9fa9459Szrj 		  p->next = *head;
2289*a9fa9459Szrj 		  *head = p;
2290*a9fa9459Szrj 		  p->sec = sec;
2291*a9fa9459Szrj 		  p->count = 0;
2292*a9fa9459Szrj 		  p->pc_count = 0;
2293*a9fa9459Szrj 		}
2294*a9fa9459Szrj 
2295*a9fa9459Szrj 	      p->count += 1;
2296*a9fa9459Szrj 	      /* Count size relocation as PC-relative relocation.  */
2297*a9fa9459Szrj 	      if (r_type == R_386_PC32 || size_reloc)
2298*a9fa9459Szrj 		p->pc_count += 1;
2299*a9fa9459Szrj 	    }
2300*a9fa9459Szrj 	  break;
2301*a9fa9459Szrj 
2302*a9fa9459Szrj 	  /* This relocation describes the C++ object vtable hierarchy.
2303*a9fa9459Szrj 	     Reconstruct it for later use during GC.  */
2304*a9fa9459Szrj 	case R_386_GNU_VTINHERIT:
2305*a9fa9459Szrj 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2306*a9fa9459Szrj 	    goto error_return;
2307*a9fa9459Szrj 	  break;
2308*a9fa9459Szrj 
2309*a9fa9459Szrj 	  /* This relocation describes which C++ vtable entries are actually
2310*a9fa9459Szrj 	     used.  Record for later use during GC.  */
2311*a9fa9459Szrj 	case R_386_GNU_VTENTRY:
2312*a9fa9459Szrj 	  BFD_ASSERT (h != NULL);
2313*a9fa9459Szrj 	  if (h != NULL
2314*a9fa9459Szrj 	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
2315*a9fa9459Szrj 	    goto error_return;
2316*a9fa9459Szrj 	  break;
2317*a9fa9459Szrj 
2318*a9fa9459Szrj 	default:
2319*a9fa9459Szrj 	  break;
2320*a9fa9459Szrj 	}
2321*a9fa9459Szrj 
2322*a9fa9459Szrj       if (use_plt_got
2323*a9fa9459Szrj 	  && h != NULL
2324*a9fa9459Szrj 	  && h->plt.refcount > 0
2325*a9fa9459Szrj 	  && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2326*a9fa9459Szrj 	      || h->got.refcount > 0)
2327*a9fa9459Szrj 	  && htab->plt_got == NULL)
2328*a9fa9459Szrj 	{
2329*a9fa9459Szrj 	  /* Create the GOT procedure linkage table.  */
2330*a9fa9459Szrj 	  unsigned int plt_got_align;
2331*a9fa9459Szrj 	  const struct elf_backend_data *bed;
2332*a9fa9459Szrj 
2333*a9fa9459Szrj 	  bed = get_elf_backend_data (info->output_bfd);
2334*a9fa9459Szrj 	  BFD_ASSERT (sizeof (elf_i386_got_plt_entry) == 8
2335*a9fa9459Szrj 		      && (sizeof (elf_i386_got_plt_entry)
2336*a9fa9459Szrj 			  == sizeof (elf_i386_pic_got_plt_entry)));
2337*a9fa9459Szrj 	  plt_got_align = 3;
2338*a9fa9459Szrj 
2339*a9fa9459Szrj 	  if (htab->elf.dynobj == NULL)
2340*a9fa9459Szrj 	    htab->elf.dynobj = abfd;
2341*a9fa9459Szrj 	  htab->plt_got
2342*a9fa9459Szrj 	    = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2343*a9fa9459Szrj 						  ".plt.got",
2344*a9fa9459Szrj 						  (bed->dynamic_sec_flags
2345*a9fa9459Szrj 						   | SEC_ALLOC
2346*a9fa9459Szrj 						   | SEC_CODE
2347*a9fa9459Szrj 						   | SEC_LOAD
2348*a9fa9459Szrj 						   | SEC_READONLY));
2349*a9fa9459Szrj 	  if (htab->plt_got == NULL
2350*a9fa9459Szrj 	      || !bfd_set_section_alignment (htab->elf.dynobj,
2351*a9fa9459Szrj 					     htab->plt_got,
2352*a9fa9459Szrj 					     plt_got_align))
2353*a9fa9459Szrj 	    goto error_return;
2354*a9fa9459Szrj 	}
2355*a9fa9459Szrj 
2356*a9fa9459Szrj       if (r_type == R_386_GOT32X
2357*a9fa9459Szrj 	  && (h == NULL || h->type != STT_GNU_IFUNC))
2358*a9fa9459Szrj 	sec->need_convert_load = 1;
2359*a9fa9459Szrj     }
2360*a9fa9459Szrj 
2361*a9fa9459Szrj   if (elf_section_data (sec)->this_hdr.contents != contents)
2362*a9fa9459Szrj     {
2363*a9fa9459Szrj       if (!info->keep_memory)
2364*a9fa9459Szrj 	free (contents);
2365*a9fa9459Szrj       else
2366*a9fa9459Szrj 	{
2367*a9fa9459Szrj 	  /* Cache the section contents for elf_link_input_bfd.  */
2368*a9fa9459Szrj 	  elf_section_data (sec)->this_hdr.contents = contents;
2369*a9fa9459Szrj 	}
2370*a9fa9459Szrj     }
2371*a9fa9459Szrj 
2372*a9fa9459Szrj   return TRUE;
2373*a9fa9459Szrj 
2374*a9fa9459Szrj error_return:
2375*a9fa9459Szrj   if (elf_section_data (sec)->this_hdr.contents != contents)
2376*a9fa9459Szrj     free (contents);
2377*a9fa9459Szrj   sec->check_relocs_failed = 1;
2378*a9fa9459Szrj   return FALSE;
2379*a9fa9459Szrj }
2380*a9fa9459Szrj 
2381*a9fa9459Szrj /* Return the section that should be marked against GC for a given
2382*a9fa9459Szrj    relocation.  */
2383*a9fa9459Szrj 
2384*a9fa9459Szrj static asection *
elf_i386_gc_mark_hook(asection * sec,struct bfd_link_info * info,Elf_Internal_Rela * rel,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)2385*a9fa9459Szrj elf_i386_gc_mark_hook (asection *sec,
2386*a9fa9459Szrj 		       struct bfd_link_info *info,
2387*a9fa9459Szrj 		       Elf_Internal_Rela *rel,
2388*a9fa9459Szrj 		       struct elf_link_hash_entry *h,
2389*a9fa9459Szrj 		       Elf_Internal_Sym *sym)
2390*a9fa9459Szrj {
2391*a9fa9459Szrj   if (h != NULL)
2392*a9fa9459Szrj     switch (ELF32_R_TYPE (rel->r_info))
2393*a9fa9459Szrj       {
2394*a9fa9459Szrj       case R_386_GNU_VTINHERIT:
2395*a9fa9459Szrj       case R_386_GNU_VTENTRY:
2396*a9fa9459Szrj 	return NULL;
2397*a9fa9459Szrj       }
2398*a9fa9459Szrj 
2399*a9fa9459Szrj   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2400*a9fa9459Szrj }
2401*a9fa9459Szrj 
2402*a9fa9459Szrj /* Remove undefined weak symbol from the dynamic symbol table if it
2403*a9fa9459Szrj    is resolved to 0.   */
2404*a9fa9459Szrj 
2405*a9fa9459Szrj static bfd_boolean
elf_i386_fixup_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * h)2406*a9fa9459Szrj elf_i386_fixup_symbol (struct bfd_link_info *info,
2407*a9fa9459Szrj 		       struct elf_link_hash_entry *h)
2408*a9fa9459Szrj {
2409*a9fa9459Szrj   if (h->dynindx != -1
2410*a9fa9459Szrj       && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2411*a9fa9459Szrj 					  elf_i386_hash_entry (h)->has_got_reloc,
2412*a9fa9459Szrj 					  elf_i386_hash_entry (h)))
2413*a9fa9459Szrj     {
2414*a9fa9459Szrj       h->dynindx = -1;
2415*a9fa9459Szrj       _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2416*a9fa9459Szrj 			      h->dynstr_index);
2417*a9fa9459Szrj     }
2418*a9fa9459Szrj   return TRUE;
2419*a9fa9459Szrj }
2420*a9fa9459Szrj 
2421*a9fa9459Szrj /* Adjust a symbol defined by a dynamic object and referenced by a
2422*a9fa9459Szrj    regular object.  The current definition is in some section of the
2423*a9fa9459Szrj    dynamic object, but we're not including those sections.  We have to
2424*a9fa9459Szrj    change the definition to something the rest of the link can
2425*a9fa9459Szrj    understand.  */
2426*a9fa9459Szrj 
2427*a9fa9459Szrj static bfd_boolean
elf_i386_adjust_dynamic_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * h)2428*a9fa9459Szrj elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
2429*a9fa9459Szrj 				struct elf_link_hash_entry *h)
2430*a9fa9459Szrj {
2431*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
2432*a9fa9459Szrj   asection *s;
2433*a9fa9459Szrj   struct elf_i386_link_hash_entry *eh;
2434*a9fa9459Szrj   struct elf_dyn_relocs *p;
2435*a9fa9459Szrj 
2436*a9fa9459Szrj   /* STT_GNU_IFUNC symbol must go through PLT. */
2437*a9fa9459Szrj   if (h->type == STT_GNU_IFUNC)
2438*a9fa9459Szrj     {
2439*a9fa9459Szrj       /* All local STT_GNU_IFUNC references must be treate as local
2440*a9fa9459Szrj 	 calls via local PLT.  */
2441*a9fa9459Szrj       if (h->ref_regular
2442*a9fa9459Szrj 	  && SYMBOL_CALLS_LOCAL (info, h))
2443*a9fa9459Szrj 	{
2444*a9fa9459Szrj 	  bfd_size_type pc_count = 0, count = 0;
2445*a9fa9459Szrj 	  struct elf_dyn_relocs **pp;
2446*a9fa9459Szrj 
2447*a9fa9459Szrj 	  eh = (struct elf_i386_link_hash_entry *) h;
2448*a9fa9459Szrj 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2449*a9fa9459Szrj 	    {
2450*a9fa9459Szrj 	      pc_count += p->pc_count;
2451*a9fa9459Szrj 	      p->count -= p->pc_count;
2452*a9fa9459Szrj 	      p->pc_count = 0;
2453*a9fa9459Szrj 	      count += p->count;
2454*a9fa9459Szrj 	      if (p->count == 0)
2455*a9fa9459Szrj 		*pp = p->next;
2456*a9fa9459Szrj 	      else
2457*a9fa9459Szrj 		pp = &p->next;
2458*a9fa9459Szrj 	    }
2459*a9fa9459Szrj 
2460*a9fa9459Szrj 	  if (pc_count || count)
2461*a9fa9459Szrj 	    {
2462*a9fa9459Szrj 	      h->non_got_ref = 1;
2463*a9fa9459Szrj 	      if (pc_count)
2464*a9fa9459Szrj 		{
2465*a9fa9459Szrj 		  /* Increment PLT reference count only for PC-relative
2466*a9fa9459Szrj 		     references.  */
2467*a9fa9459Szrj 		  h->needs_plt = 1;
2468*a9fa9459Szrj 		  if (h->plt.refcount <= 0)
2469*a9fa9459Szrj 		    h->plt.refcount = 1;
2470*a9fa9459Szrj 		  else
2471*a9fa9459Szrj 		    h->plt.refcount += 1;
2472*a9fa9459Szrj 		}
2473*a9fa9459Szrj 	    }
2474*a9fa9459Szrj 	}
2475*a9fa9459Szrj 
2476*a9fa9459Szrj       if (h->plt.refcount <= 0)
2477*a9fa9459Szrj 	{
2478*a9fa9459Szrj 	  h->plt.offset = (bfd_vma) -1;
2479*a9fa9459Szrj 	  h->needs_plt = 0;
2480*a9fa9459Szrj 	}
2481*a9fa9459Szrj       return TRUE;
2482*a9fa9459Szrj     }
2483*a9fa9459Szrj 
2484*a9fa9459Szrj   /* If this is a function, put it in the procedure linkage table.  We
2485*a9fa9459Szrj      will fill in the contents of the procedure linkage table later,
2486*a9fa9459Szrj      when we know the address of the .got section.  */
2487*a9fa9459Szrj   if (h->type == STT_FUNC
2488*a9fa9459Szrj       || h->needs_plt)
2489*a9fa9459Szrj     {
2490*a9fa9459Szrj       if (h->plt.refcount <= 0
2491*a9fa9459Szrj 	  || SYMBOL_CALLS_LOCAL (info, h)
2492*a9fa9459Szrj 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2493*a9fa9459Szrj 	      && h->root.type == bfd_link_hash_undefweak))
2494*a9fa9459Szrj 	{
2495*a9fa9459Szrj 	  /* This case can occur if we saw a PLT32 reloc in an input
2496*a9fa9459Szrj 	     file, but the symbol was never referred to by a dynamic
2497*a9fa9459Szrj 	     object, or if all references were garbage collected.  In
2498*a9fa9459Szrj 	     such a case, we don't actually need to build a procedure
2499*a9fa9459Szrj 	     linkage table, and we can just do a PC32 reloc instead.  */
2500*a9fa9459Szrj 	  h->plt.offset = (bfd_vma) -1;
2501*a9fa9459Szrj 	  h->needs_plt = 0;
2502*a9fa9459Szrj 	}
2503*a9fa9459Szrj 
2504*a9fa9459Szrj       return TRUE;
2505*a9fa9459Szrj     }
2506*a9fa9459Szrj   else
2507*a9fa9459Szrj     /* It's possible that we incorrectly decided a .plt reloc was
2508*a9fa9459Szrj        needed for an R_386_PC32 reloc to a non-function sym in
2509*a9fa9459Szrj        check_relocs.  We can't decide accurately between function and
2510*a9fa9459Szrj        non-function syms in check-relocs;  Objects loaded later in
2511*a9fa9459Szrj        the link may change h->type.  So fix it now.  */
2512*a9fa9459Szrj     h->plt.offset = (bfd_vma) -1;
2513*a9fa9459Szrj 
2514*a9fa9459Szrj   /* If this is a weak symbol, and there is a real definition, the
2515*a9fa9459Szrj      processor independent code will have arranged for us to see the
2516*a9fa9459Szrj      real definition first, and we can just use the same value.  */
2517*a9fa9459Szrj   if (h->u.weakdef != NULL)
2518*a9fa9459Szrj     {
2519*a9fa9459Szrj       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2520*a9fa9459Szrj 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
2521*a9fa9459Szrj       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2522*a9fa9459Szrj       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2523*a9fa9459Szrj       if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
2524*a9fa9459Szrj 	h->non_got_ref = h->u.weakdef->non_got_ref;
2525*a9fa9459Szrj       return TRUE;
2526*a9fa9459Szrj     }
2527*a9fa9459Szrj 
2528*a9fa9459Szrj   /* This is a reference to a symbol defined by a dynamic object which
2529*a9fa9459Szrj      is not a function.  */
2530*a9fa9459Szrj 
2531*a9fa9459Szrj   /* If we are creating a shared library, we must presume that the
2532*a9fa9459Szrj      only references to the symbol are via the global offset table.
2533*a9fa9459Szrj      For such cases we need not do anything here; the relocations will
2534*a9fa9459Szrj      be handled correctly by relocate_section.  */
2535*a9fa9459Szrj   if (!bfd_link_executable (info))
2536*a9fa9459Szrj     return TRUE;
2537*a9fa9459Szrj 
2538*a9fa9459Szrj   /* If there are no references to this symbol that do not use the
2539*a9fa9459Szrj      GOT nor R_386_GOTOFF relocation, we don't need to generate a copy
2540*a9fa9459Szrj      reloc.  */
2541*a9fa9459Szrj   eh = (struct elf_i386_link_hash_entry *) h;
2542*a9fa9459Szrj   if (!h->non_got_ref && !eh->gotoff_ref)
2543*a9fa9459Szrj     return TRUE;
2544*a9fa9459Szrj 
2545*a9fa9459Szrj   /* If -z nocopyreloc was given, we won't generate them either.  */
2546*a9fa9459Szrj   if (info->nocopyreloc)
2547*a9fa9459Szrj     {
2548*a9fa9459Szrj       h->non_got_ref = 0;
2549*a9fa9459Szrj       return TRUE;
2550*a9fa9459Szrj     }
2551*a9fa9459Szrj 
2552*a9fa9459Szrj   htab = elf_i386_hash_table (info);
2553*a9fa9459Szrj   if (htab == NULL)
2554*a9fa9459Szrj     return FALSE;
2555*a9fa9459Szrj 
2556*a9fa9459Szrj   /* If there aren't any dynamic relocs in read-only sections nor
2557*a9fa9459Szrj      R_386_GOTOFF relocation, then we can keep the dynamic relocs and
2558*a9fa9459Szrj      avoid the copy reloc.  This doesn't work on VxWorks, where we can
2559*a9fa9459Szrj      not have dynamic relocations (other than copy and jump slot
2560*a9fa9459Szrj      relocations) in an executable.  */
2561*a9fa9459Szrj   if (ELIMINATE_COPY_RELOCS
2562*a9fa9459Szrj       && !eh->gotoff_ref
2563*a9fa9459Szrj       && !get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2564*a9fa9459Szrj     {
2565*a9fa9459Szrj       for (p = eh->dyn_relocs; p != NULL; p = p->next)
2566*a9fa9459Szrj 	{
2567*a9fa9459Szrj 	  s = p->sec->output_section;
2568*a9fa9459Szrj 	  if (s != NULL && (s->flags & SEC_READONLY) != 0)
2569*a9fa9459Szrj 	    break;
2570*a9fa9459Szrj 	}
2571*a9fa9459Szrj 
2572*a9fa9459Szrj       if (p == NULL)
2573*a9fa9459Szrj 	{
2574*a9fa9459Szrj 	  h->non_got_ref = 0;
2575*a9fa9459Szrj 	  return TRUE;
2576*a9fa9459Szrj 	}
2577*a9fa9459Szrj     }
2578*a9fa9459Szrj 
2579*a9fa9459Szrj   /* We must allocate the symbol in our .dynbss section, which will
2580*a9fa9459Szrj      become part of the .bss section of the executable.  There will be
2581*a9fa9459Szrj      an entry for this symbol in the .dynsym section.  The dynamic
2582*a9fa9459Szrj      object will contain position independent code, so all references
2583*a9fa9459Szrj      from the dynamic object to this symbol will go through the global
2584*a9fa9459Szrj      offset table.  The dynamic linker will use the .dynsym entry to
2585*a9fa9459Szrj      determine the address it must put in the global offset table, so
2586*a9fa9459Szrj      both the dynamic object and the regular object will refer to the
2587*a9fa9459Szrj      same memory location for the variable.  */
2588*a9fa9459Szrj 
2589*a9fa9459Szrj   /* We must generate a R_386_COPY reloc to tell the dynamic linker to
2590*a9fa9459Szrj      copy the initial value out of the dynamic object and into the
2591*a9fa9459Szrj      runtime process image.  */
2592*a9fa9459Szrj   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2593*a9fa9459Szrj     {
2594*a9fa9459Szrj       htab->srelbss->size += sizeof (Elf32_External_Rel);
2595*a9fa9459Szrj       h->needs_copy = 1;
2596*a9fa9459Szrj     }
2597*a9fa9459Szrj 
2598*a9fa9459Szrj   s = htab->sdynbss;
2599*a9fa9459Szrj 
2600*a9fa9459Szrj   return _bfd_elf_adjust_dynamic_copy (info, h, s);
2601*a9fa9459Szrj }
2602*a9fa9459Szrj 
2603*a9fa9459Szrj /* Allocate space in .plt, .got and associated reloc sections for
2604*a9fa9459Szrj    dynamic relocs.  */
2605*a9fa9459Szrj 
2606*a9fa9459Szrj static bfd_boolean
elf_i386_allocate_dynrelocs(struct elf_link_hash_entry * h,void * inf)2607*a9fa9459Szrj elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2608*a9fa9459Szrj {
2609*a9fa9459Szrj   struct bfd_link_info *info;
2610*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
2611*a9fa9459Szrj   struct elf_i386_link_hash_entry *eh;
2612*a9fa9459Szrj   struct elf_dyn_relocs *p;
2613*a9fa9459Szrj   unsigned plt_entry_size;
2614*a9fa9459Szrj   bfd_boolean resolved_to_zero;
2615*a9fa9459Szrj 
2616*a9fa9459Szrj   if (h->root.type == bfd_link_hash_indirect)
2617*a9fa9459Szrj     return TRUE;
2618*a9fa9459Szrj 
2619*a9fa9459Szrj   eh = (struct elf_i386_link_hash_entry *) h;
2620*a9fa9459Szrj 
2621*a9fa9459Szrj   info = (struct bfd_link_info *) inf;
2622*a9fa9459Szrj   htab = elf_i386_hash_table (info);
2623*a9fa9459Szrj   if (htab == NULL)
2624*a9fa9459Szrj     return FALSE;
2625*a9fa9459Szrj 
2626*a9fa9459Szrj   plt_entry_size = GET_PLT_ENTRY_SIZE (info->output_bfd);
2627*a9fa9459Szrj 
2628*a9fa9459Szrj   resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
2629*a9fa9459Szrj 						      eh->has_got_reloc,
2630*a9fa9459Szrj 						      eh);
2631*a9fa9459Szrj 
2632*a9fa9459Szrj   /* Clear the reference count of function pointer relocations if
2633*a9fa9459Szrj      symbol isn't a normal function.  */
2634*a9fa9459Szrj   if (h->type != STT_FUNC)
2635*a9fa9459Szrj     eh->func_pointer_refcount = 0;
2636*a9fa9459Szrj 
2637*a9fa9459Szrj   /* We can't use the GOT PLT if pointer equality is needed since
2638*a9fa9459Szrj      finish_dynamic_symbol won't clear symbol value and the dynamic
2639*a9fa9459Szrj      linker won't update the GOT slot.  We will get into an infinite
2640*a9fa9459Szrj      loop at run-time.  */
2641*a9fa9459Szrj   if (htab->plt_got != NULL
2642*a9fa9459Szrj       && h->type != STT_GNU_IFUNC
2643*a9fa9459Szrj       && !h->pointer_equality_needed
2644*a9fa9459Szrj       && h->plt.refcount > 0
2645*a9fa9459Szrj       && h->got.refcount > 0)
2646*a9fa9459Szrj     {
2647*a9fa9459Szrj       /* Don't use the regular PLT if there are both GOT and GOTPLT
2648*a9fa9459Szrj          reloctions.  */
2649*a9fa9459Szrj       h->plt.offset = (bfd_vma) -1;
2650*a9fa9459Szrj 
2651*a9fa9459Szrj       /* Use the GOT PLT.  */
2652*a9fa9459Szrj       eh->plt_got.refcount = 1;
2653*a9fa9459Szrj     }
2654*a9fa9459Szrj 
2655*a9fa9459Szrj   /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
2656*a9fa9459Szrj      here if it is defined and referenced in a non-shared object.  */
2657*a9fa9459Szrj   if (h->type == STT_GNU_IFUNC
2658*a9fa9459Szrj       && h->def_regular)
2659*a9fa9459Szrj     return _bfd_elf_allocate_ifunc_dyn_relocs (info, h, &eh->dyn_relocs,
2660*a9fa9459Szrj 					       &htab->readonly_dynrelocs_against_ifunc,
2661*a9fa9459Szrj 					       plt_entry_size,
2662*a9fa9459Szrj 					       plt_entry_size, 4, TRUE);
2663*a9fa9459Szrj   /* Don't create the PLT entry if there are only function pointer
2664*a9fa9459Szrj      relocations which can be resolved at run-time.  */
2665*a9fa9459Szrj   else if (htab->elf.dynamic_sections_created
2666*a9fa9459Szrj 	   && (h->plt.refcount > eh->func_pointer_refcount
2667*a9fa9459Szrj 	       || eh->plt_got.refcount > 0))
2668*a9fa9459Szrj     {
2669*a9fa9459Szrj       bfd_boolean use_plt_got;
2670*a9fa9459Szrj 
2671*a9fa9459Szrj       /* Clear the reference count of function pointer relocations
2672*a9fa9459Szrj 	 if PLT is used.  */
2673*a9fa9459Szrj       eh->func_pointer_refcount = 0;
2674*a9fa9459Szrj 
2675*a9fa9459Szrj       if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
2676*a9fa9459Szrj 	{
2677*a9fa9459Szrj 	  /* Don't use the regular PLT for DF_BIND_NOW. */
2678*a9fa9459Szrj 	  h->plt.offset = (bfd_vma) -1;
2679*a9fa9459Szrj 
2680*a9fa9459Szrj 	  /* Use the GOT PLT.  */
2681*a9fa9459Szrj 	  h->got.refcount = 1;
2682*a9fa9459Szrj 	  eh->plt_got.refcount = 1;
2683*a9fa9459Szrj 	}
2684*a9fa9459Szrj 
2685*a9fa9459Szrj       use_plt_got = eh->plt_got.refcount > 0;
2686*a9fa9459Szrj 
2687*a9fa9459Szrj       /* Make sure this symbol is output as a dynamic symbol.
2688*a9fa9459Szrj 	 Undefined weak syms won't yet be marked as dynamic.  */
2689*a9fa9459Szrj       if (h->dynindx == -1
2690*a9fa9459Szrj 	  && !h->forced_local
2691*a9fa9459Szrj 	  && !resolved_to_zero)
2692*a9fa9459Szrj 	{
2693*a9fa9459Szrj 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2694*a9fa9459Szrj 	    return FALSE;
2695*a9fa9459Szrj 	}
2696*a9fa9459Szrj 
2697*a9fa9459Szrj       if (bfd_link_pic (info)
2698*a9fa9459Szrj 	  || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
2699*a9fa9459Szrj 	{
2700*a9fa9459Szrj 	  asection *s = htab->elf.splt;
2701*a9fa9459Szrj 	  asection *got_s = htab->plt_got;
2702*a9fa9459Szrj 
2703*a9fa9459Szrj 	  /* If this is the first .plt entry, make room for the special
2704*a9fa9459Szrj 	     first entry.  The .plt section is used by prelink to undo
2705*a9fa9459Szrj 	     prelinking for dynamic relocations.  */
2706*a9fa9459Szrj 	  if (s->size == 0)
2707*a9fa9459Szrj 	    s->size = plt_entry_size;
2708*a9fa9459Szrj 
2709*a9fa9459Szrj 	  if (use_plt_got)
2710*a9fa9459Szrj 	    eh->plt_got.offset = got_s->size;
2711*a9fa9459Szrj 	  else
2712*a9fa9459Szrj 	    h->plt.offset = s->size;
2713*a9fa9459Szrj 
2714*a9fa9459Szrj 	  /* If this symbol is not defined in a regular file, and we are
2715*a9fa9459Szrj 	     not generating a shared library, then set the symbol to this
2716*a9fa9459Szrj 	     location in the .plt.  This is required to make function
2717*a9fa9459Szrj 	     pointers compare as equal between the normal executable and
2718*a9fa9459Szrj 	     the shared library.  */
2719*a9fa9459Szrj 	  if (! bfd_link_pic (info)
2720*a9fa9459Szrj 	      && !h->def_regular)
2721*a9fa9459Szrj 	    {
2722*a9fa9459Szrj 	      if (use_plt_got)
2723*a9fa9459Szrj 		{
2724*a9fa9459Szrj 		  /* We need to make a call to the entry of the GOT PLT
2725*a9fa9459Szrj 		     instead of regular PLT entry.  */
2726*a9fa9459Szrj 		  h->root.u.def.section = got_s;
2727*a9fa9459Szrj 		  h->root.u.def.value = eh->plt_got.offset;
2728*a9fa9459Szrj 		}
2729*a9fa9459Szrj 	      else
2730*a9fa9459Szrj 		{
2731*a9fa9459Szrj 		  h->root.u.def.section = s;
2732*a9fa9459Szrj 		  h->root.u.def.value = h->plt.offset;
2733*a9fa9459Szrj 		}
2734*a9fa9459Szrj 	    }
2735*a9fa9459Szrj 
2736*a9fa9459Szrj 	  /* Make room for this entry.  */
2737*a9fa9459Szrj 	  if (use_plt_got)
2738*a9fa9459Szrj 	    got_s->size += sizeof (elf_i386_got_plt_entry);
2739*a9fa9459Szrj 	  else
2740*a9fa9459Szrj 	    {
2741*a9fa9459Szrj 	      s->size += plt_entry_size;
2742*a9fa9459Szrj 
2743*a9fa9459Szrj 	      /* We also need to make an entry in the .got.plt section,
2744*a9fa9459Szrj 		 which will be placed in the .got section by the linker
2745*a9fa9459Szrj 		 script.  */
2746*a9fa9459Szrj 	      htab->elf.sgotplt->size += 4;
2747*a9fa9459Szrj 
2748*a9fa9459Szrj 	      /* There should be no PLT relocation against resolved
2749*a9fa9459Szrj 		 undefined weak symbol in executable.  */
2750*a9fa9459Szrj 	      if (!resolved_to_zero)
2751*a9fa9459Szrj 		{
2752*a9fa9459Szrj 		  /* We also need to make an entry in the .rel.plt
2753*a9fa9459Szrj 		     section.  */
2754*a9fa9459Szrj 		  htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2755*a9fa9459Szrj 		  htab->elf.srelplt->reloc_count++;
2756*a9fa9459Szrj 		}
2757*a9fa9459Szrj 	    }
2758*a9fa9459Szrj 
2759*a9fa9459Szrj 	  if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
2760*a9fa9459Szrj               && !bfd_link_pic (info))
2761*a9fa9459Szrj 	    {
2762*a9fa9459Szrj 	      /* VxWorks has a second set of relocations for each PLT entry
2763*a9fa9459Szrj 		 in executables.  They go in a separate relocation section,
2764*a9fa9459Szrj 		 which is processed by the kernel loader.  */
2765*a9fa9459Szrj 
2766*a9fa9459Szrj 	      /* There are two relocations for the initial PLT entry: an
2767*a9fa9459Szrj 		 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
2768*a9fa9459Szrj 		 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
2769*a9fa9459Szrj 
2770*a9fa9459Szrj 	      if (h->plt.offset == plt_entry_size)
2771*a9fa9459Szrj 		htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2772*a9fa9459Szrj 
2773*a9fa9459Szrj 	      /* There are two extra relocations for each subsequent PLT entry:
2774*a9fa9459Szrj 		 an R_386_32 relocation for the GOT entry, and an R_386_32
2775*a9fa9459Szrj 		 relocation for the PLT entry.  */
2776*a9fa9459Szrj 
2777*a9fa9459Szrj 	      htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
2778*a9fa9459Szrj 	    }
2779*a9fa9459Szrj 	}
2780*a9fa9459Szrj       else
2781*a9fa9459Szrj 	{
2782*a9fa9459Szrj 	  eh->plt_got.offset = (bfd_vma) -1;
2783*a9fa9459Szrj 	  h->plt.offset = (bfd_vma) -1;
2784*a9fa9459Szrj 	  h->needs_plt = 0;
2785*a9fa9459Szrj 	}
2786*a9fa9459Szrj     }
2787*a9fa9459Szrj   else
2788*a9fa9459Szrj     {
2789*a9fa9459Szrj       eh->plt_got.offset = (bfd_vma) -1;
2790*a9fa9459Szrj       h->plt.offset = (bfd_vma) -1;
2791*a9fa9459Szrj       h->needs_plt = 0;
2792*a9fa9459Szrj     }
2793*a9fa9459Szrj 
2794*a9fa9459Szrj   eh->tlsdesc_got = (bfd_vma) -1;
2795*a9fa9459Szrj 
2796*a9fa9459Szrj   /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
2797*a9fa9459Szrj      make it a R_386_TLS_LE_32 requiring no TLS entry.  */
2798*a9fa9459Szrj   if (h->got.refcount > 0
2799*a9fa9459Szrj       && bfd_link_executable (info)
2800*a9fa9459Szrj       && h->dynindx == -1
2801*a9fa9459Szrj       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
2802*a9fa9459Szrj     h->got.offset = (bfd_vma) -1;
2803*a9fa9459Szrj   else if (h->got.refcount > 0)
2804*a9fa9459Szrj     {
2805*a9fa9459Szrj       asection *s;
2806*a9fa9459Szrj       bfd_boolean dyn;
2807*a9fa9459Szrj       int tls_type = elf_i386_hash_entry(h)->tls_type;
2808*a9fa9459Szrj 
2809*a9fa9459Szrj       /* Make sure this symbol is output as a dynamic symbol.
2810*a9fa9459Szrj 	 Undefined weak syms won't yet be marked as dynamic.  */
2811*a9fa9459Szrj       if (h->dynindx == -1
2812*a9fa9459Szrj 	  && !h->forced_local
2813*a9fa9459Szrj 	  && !resolved_to_zero)
2814*a9fa9459Szrj 	{
2815*a9fa9459Szrj 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
2816*a9fa9459Szrj 	    return FALSE;
2817*a9fa9459Szrj 	}
2818*a9fa9459Szrj 
2819*a9fa9459Szrj       s = htab->elf.sgot;
2820*a9fa9459Szrj       if (GOT_TLS_GDESC_P (tls_type))
2821*a9fa9459Szrj 	{
2822*a9fa9459Szrj 	  eh->tlsdesc_got = htab->elf.sgotplt->size
2823*a9fa9459Szrj 	    - elf_i386_compute_jump_table_size (htab);
2824*a9fa9459Szrj 	  htab->elf.sgotplt->size += 8;
2825*a9fa9459Szrj 	  h->got.offset = (bfd_vma) -2;
2826*a9fa9459Szrj 	}
2827*a9fa9459Szrj       if (! GOT_TLS_GDESC_P (tls_type)
2828*a9fa9459Szrj 	  || GOT_TLS_GD_P (tls_type))
2829*a9fa9459Szrj 	{
2830*a9fa9459Szrj 	  h->got.offset = s->size;
2831*a9fa9459Szrj 	  s->size += 4;
2832*a9fa9459Szrj 	  /* R_386_TLS_GD needs 2 consecutive GOT slots.  */
2833*a9fa9459Szrj 	  if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
2834*a9fa9459Szrj 	    s->size += 4;
2835*a9fa9459Szrj 	}
2836*a9fa9459Szrj       dyn = htab->elf.dynamic_sections_created;
2837*a9fa9459Szrj       /* R_386_TLS_IE_32 needs one dynamic relocation,
2838*a9fa9459Szrj 	 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
2839*a9fa9459Szrj 	 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
2840*a9fa9459Szrj 	 need two), R_386_TLS_GD needs one if local symbol and two if
2841*a9fa9459Szrj 	 global.  No dynamic relocation against resolved undefined weak
2842*a9fa9459Szrj 	 symbol in executable.  */
2843*a9fa9459Szrj       if (tls_type == GOT_TLS_IE_BOTH)
2844*a9fa9459Szrj 	htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2845*a9fa9459Szrj       else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
2846*a9fa9459Szrj 	       || (tls_type & GOT_TLS_IE))
2847*a9fa9459Szrj 	htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2848*a9fa9459Szrj       else if (GOT_TLS_GD_P (tls_type))
2849*a9fa9459Szrj 	htab->elf.srelgot->size += 2 * sizeof (Elf32_External_Rel);
2850*a9fa9459Szrj       else if (! GOT_TLS_GDESC_P (tls_type)
2851*a9fa9459Szrj 	       && ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2852*a9fa9459Szrj 		    && !resolved_to_zero)
2853*a9fa9459Szrj 		   || h->root.type != bfd_link_hash_undefweak)
2854*a9fa9459Szrj 	       && (bfd_link_pic (info)
2855*a9fa9459Szrj 		   || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
2856*a9fa9459Szrj 	htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
2857*a9fa9459Szrj       if (GOT_TLS_GDESC_P (tls_type))
2858*a9fa9459Szrj 	htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
2859*a9fa9459Szrj     }
2860*a9fa9459Szrj   else
2861*a9fa9459Szrj     h->got.offset = (bfd_vma) -1;
2862*a9fa9459Szrj 
2863*a9fa9459Szrj   if (eh->dyn_relocs == NULL)
2864*a9fa9459Szrj     return TRUE;
2865*a9fa9459Szrj 
2866*a9fa9459Szrj   /* In the shared -Bsymbolic case, discard space allocated for
2867*a9fa9459Szrj      dynamic pc-relative relocs against symbols which turn out to be
2868*a9fa9459Szrj      defined in regular objects.  For the normal shared case, discard
2869*a9fa9459Szrj      space for pc-relative relocs that have become local due to symbol
2870*a9fa9459Szrj      visibility changes.  */
2871*a9fa9459Szrj 
2872*a9fa9459Szrj   if (bfd_link_pic (info))
2873*a9fa9459Szrj     {
2874*a9fa9459Szrj       /* The only reloc that uses pc_count is R_386_PC32, which will
2875*a9fa9459Szrj 	 appear on a call or on something like ".long foo - .".  We
2876*a9fa9459Szrj 	 want calls to protected symbols to resolve directly to the
2877*a9fa9459Szrj 	 function rather than going via the plt.  If people want
2878*a9fa9459Szrj 	 function pointer comparisons to work as expected then they
2879*a9fa9459Szrj 	 should avoid writing assembly like ".long foo - .".  */
2880*a9fa9459Szrj       if (SYMBOL_CALLS_LOCAL (info, h))
2881*a9fa9459Szrj 	{
2882*a9fa9459Szrj 	  struct elf_dyn_relocs **pp;
2883*a9fa9459Szrj 
2884*a9fa9459Szrj 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2885*a9fa9459Szrj 	    {
2886*a9fa9459Szrj 	      p->count -= p->pc_count;
2887*a9fa9459Szrj 	      p->pc_count = 0;
2888*a9fa9459Szrj 	      if (p->count == 0)
2889*a9fa9459Szrj 		*pp = p->next;
2890*a9fa9459Szrj 	      else
2891*a9fa9459Szrj 		pp = &p->next;
2892*a9fa9459Szrj 	    }
2893*a9fa9459Szrj 	}
2894*a9fa9459Szrj 
2895*a9fa9459Szrj       if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks)
2896*a9fa9459Szrj 	{
2897*a9fa9459Szrj 	  struct elf_dyn_relocs **pp;
2898*a9fa9459Szrj 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2899*a9fa9459Szrj 	    {
2900*a9fa9459Szrj 	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
2901*a9fa9459Szrj 		*pp = p->next;
2902*a9fa9459Szrj 	      else
2903*a9fa9459Szrj 		pp = &p->next;
2904*a9fa9459Szrj 	    }
2905*a9fa9459Szrj 	}
2906*a9fa9459Szrj 
2907*a9fa9459Szrj       /* Also discard relocs on undefined weak syms with non-default
2908*a9fa9459Szrj 	 visibility or in PIE.  */
2909*a9fa9459Szrj       if (eh->dyn_relocs != NULL
2910*a9fa9459Szrj 	  && h->root.type == bfd_link_hash_undefweak)
2911*a9fa9459Szrj 	{
2912*a9fa9459Szrj 	  /* Undefined weak symbol is never bound locally in shared
2913*a9fa9459Szrj 	     library.  */
2914*a9fa9459Szrj 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2915*a9fa9459Szrj 	      || resolved_to_zero)
2916*a9fa9459Szrj 	    {
2917*a9fa9459Szrj 	      if (h->non_got_ref)
2918*a9fa9459Szrj 		{
2919*a9fa9459Szrj 		  /* Keep dynamic non-GOT/non-PLT relocation so that we
2920*a9fa9459Szrj 		     can branch to 0 without PLT.  */
2921*a9fa9459Szrj 		  struct elf_dyn_relocs **pp;
2922*a9fa9459Szrj 
2923*a9fa9459Szrj 		  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2924*a9fa9459Szrj 		    if (p->pc_count == 0)
2925*a9fa9459Szrj 		      *pp = p->next;
2926*a9fa9459Szrj 		    else
2927*a9fa9459Szrj 		      {
2928*a9fa9459Szrj 			/* Remove non-R_386_PC32 relocation.  */
2929*a9fa9459Szrj 			p->count = p->pc_count;
2930*a9fa9459Szrj 			pp = &p->next;
2931*a9fa9459Szrj 		      }
2932*a9fa9459Szrj 
2933*a9fa9459Szrj 		  if (eh->dyn_relocs != NULL)
2934*a9fa9459Szrj 		    {
2935*a9fa9459Szrj 		      /* Make sure undefined weak symbols are output
2936*a9fa9459Szrj 			 as dynamic symbols in PIEs for dynamic non-GOT
2937*a9fa9459Szrj 			 non-PLT reloations.  */
2938*a9fa9459Szrj 		      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2939*a9fa9459Szrj 			return FALSE;
2940*a9fa9459Szrj 		    }
2941*a9fa9459Szrj 		}
2942*a9fa9459Szrj 	      else
2943*a9fa9459Szrj 		eh->dyn_relocs = NULL;
2944*a9fa9459Szrj 	    }
2945*a9fa9459Szrj 	  else if (h->dynindx == -1
2946*a9fa9459Szrj 		   && !h->forced_local)
2947*a9fa9459Szrj 	    {
2948*a9fa9459Szrj 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2949*a9fa9459Szrj 		return FALSE;
2950*a9fa9459Szrj 	    }
2951*a9fa9459Szrj 	}
2952*a9fa9459Szrj     }
2953*a9fa9459Szrj   else if (ELIMINATE_COPY_RELOCS)
2954*a9fa9459Szrj     {
2955*a9fa9459Szrj       /* For the non-shared case, discard space for relocs against
2956*a9fa9459Szrj 	 symbols which turn out to need copy relocs or are not
2957*a9fa9459Szrj 	 dynamic.  Keep dynamic relocations for run-time function
2958*a9fa9459Szrj 	 pointer initialization.  */
2959*a9fa9459Szrj 
2960*a9fa9459Szrj       if ((!h->non_got_ref
2961*a9fa9459Szrj 	   || eh->func_pointer_refcount > 0
2962*a9fa9459Szrj 	   || (h->root.type == bfd_link_hash_undefweak
2963*a9fa9459Szrj 	       && !resolved_to_zero))
2964*a9fa9459Szrj 	  && ((h->def_dynamic
2965*a9fa9459Szrj 	       && !h->def_regular)
2966*a9fa9459Szrj 	      || (htab->elf.dynamic_sections_created
2967*a9fa9459Szrj 		  && (h->root.type == bfd_link_hash_undefweak
2968*a9fa9459Szrj 		      || h->root.type == bfd_link_hash_undefined))))
2969*a9fa9459Szrj 	{
2970*a9fa9459Szrj 	  /* Make sure this symbol is output as a dynamic symbol.
2971*a9fa9459Szrj 	     Undefined weak syms won't yet be marked as dynamic.  */
2972*a9fa9459Szrj 	  if (h->dynindx == -1
2973*a9fa9459Szrj 	      && !h->forced_local
2974*a9fa9459Szrj 	      && !resolved_to_zero)
2975*a9fa9459Szrj 	    {
2976*a9fa9459Szrj 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
2977*a9fa9459Szrj 		return FALSE;
2978*a9fa9459Szrj 	    }
2979*a9fa9459Szrj 
2980*a9fa9459Szrj 	  /* If that succeeded, we know we'll be keeping all the
2981*a9fa9459Szrj 	     relocs.  */
2982*a9fa9459Szrj 	  if (h->dynindx != -1)
2983*a9fa9459Szrj 	    goto keep;
2984*a9fa9459Szrj 	}
2985*a9fa9459Szrj 
2986*a9fa9459Szrj       eh->dyn_relocs = NULL;
2987*a9fa9459Szrj       eh->func_pointer_refcount = 0;
2988*a9fa9459Szrj 
2989*a9fa9459Szrj     keep: ;
2990*a9fa9459Szrj     }
2991*a9fa9459Szrj 
2992*a9fa9459Szrj   /* Finally, allocate space.  */
2993*a9fa9459Szrj   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2994*a9fa9459Szrj     {
2995*a9fa9459Szrj       asection *sreloc;
2996*a9fa9459Szrj 
2997*a9fa9459Szrj       sreloc = elf_section_data (p->sec)->sreloc;
2998*a9fa9459Szrj 
2999*a9fa9459Szrj       BFD_ASSERT (sreloc != NULL);
3000*a9fa9459Szrj       sreloc->size += p->count * sizeof (Elf32_External_Rel);
3001*a9fa9459Szrj     }
3002*a9fa9459Szrj 
3003*a9fa9459Szrj   return TRUE;
3004*a9fa9459Szrj }
3005*a9fa9459Szrj 
3006*a9fa9459Szrj /* Allocate space in .plt, .got and associated reloc sections for
3007*a9fa9459Szrj    local dynamic relocs.  */
3008*a9fa9459Szrj 
3009*a9fa9459Szrj static bfd_boolean
elf_i386_allocate_local_dynrelocs(void ** slot,void * inf)3010*a9fa9459Szrj elf_i386_allocate_local_dynrelocs (void **slot, void *inf)
3011*a9fa9459Szrj {
3012*a9fa9459Szrj   struct elf_link_hash_entry *h
3013*a9fa9459Szrj     = (struct elf_link_hash_entry *) *slot;
3014*a9fa9459Szrj 
3015*a9fa9459Szrj   if (h->type != STT_GNU_IFUNC
3016*a9fa9459Szrj       || !h->def_regular
3017*a9fa9459Szrj       || !h->ref_regular
3018*a9fa9459Szrj       || !h->forced_local
3019*a9fa9459Szrj       || h->root.type != bfd_link_hash_defined)
3020*a9fa9459Szrj     abort ();
3021*a9fa9459Szrj 
3022*a9fa9459Szrj   return elf_i386_allocate_dynrelocs (h, inf);
3023*a9fa9459Szrj }
3024*a9fa9459Szrj 
3025*a9fa9459Szrj /* Find any dynamic relocs that apply to read-only sections.  */
3026*a9fa9459Szrj 
3027*a9fa9459Szrj static bfd_boolean
elf_i386_readonly_dynrelocs(struct elf_link_hash_entry * h,void * inf)3028*a9fa9459Szrj elf_i386_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3029*a9fa9459Szrj {
3030*a9fa9459Szrj   struct elf_i386_link_hash_entry *eh;
3031*a9fa9459Szrj   struct elf_dyn_relocs *p;
3032*a9fa9459Szrj 
3033*a9fa9459Szrj   /* Skip local IFUNC symbols. */
3034*a9fa9459Szrj   if (h->forced_local && h->type == STT_GNU_IFUNC)
3035*a9fa9459Szrj     return TRUE;
3036*a9fa9459Szrj 
3037*a9fa9459Szrj   eh = (struct elf_i386_link_hash_entry *) h;
3038*a9fa9459Szrj   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3039*a9fa9459Szrj     {
3040*a9fa9459Szrj       asection *s = p->sec->output_section;
3041*a9fa9459Szrj 
3042*a9fa9459Szrj       if (s != NULL && (s->flags & SEC_READONLY) != 0)
3043*a9fa9459Szrj 	{
3044*a9fa9459Szrj 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
3045*a9fa9459Szrj 
3046*a9fa9459Szrj 	  info->flags |= DF_TEXTREL;
3047*a9fa9459Szrj 
3048*a9fa9459Szrj 	  if ((info->warn_shared_textrel && bfd_link_pic (info))
3049*a9fa9459Szrj 	      || info->error_textrel)
3050*a9fa9459Szrj 	    info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
3051*a9fa9459Szrj 				    p->sec->owner, h->root.root.string,
3052*a9fa9459Szrj 				    p->sec);
3053*a9fa9459Szrj 
3054*a9fa9459Szrj 	  /* Not an error, just cut short the traversal.  */
3055*a9fa9459Szrj 	  return FALSE;
3056*a9fa9459Szrj 	}
3057*a9fa9459Szrj     }
3058*a9fa9459Szrj   return TRUE;
3059*a9fa9459Szrj }
3060*a9fa9459Szrj 
3061*a9fa9459Szrj /* Convert load via the GOT slot to load immediate.  */
3062*a9fa9459Szrj 
3063*a9fa9459Szrj static bfd_boolean
elf_i386_convert_load(bfd * abfd,asection * sec,struct bfd_link_info * link_info)3064*a9fa9459Szrj elf_i386_convert_load (bfd *abfd, asection *sec,
3065*a9fa9459Szrj 		       struct bfd_link_info *link_info)
3066*a9fa9459Szrj {
3067*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
3068*a9fa9459Szrj   Elf_Internal_Shdr *symtab_hdr;
3069*a9fa9459Szrj   Elf_Internal_Rela *internal_relocs;
3070*a9fa9459Szrj   Elf_Internal_Rela *irel, *irelend;
3071*a9fa9459Szrj   bfd_byte *contents;
3072*a9fa9459Szrj   bfd_boolean changed;
3073*a9fa9459Szrj   bfd_signed_vma *local_got_refcounts;
3074*a9fa9459Szrj 
3075*a9fa9459Szrj   /* Don't even try to convert non-ELF outputs.  */
3076*a9fa9459Szrj   if (!is_elf_hash_table (link_info->hash))
3077*a9fa9459Szrj     return FALSE;
3078*a9fa9459Szrj 
3079*a9fa9459Szrj   /* Nothing to do if there is no need or no output.  */
3080*a9fa9459Szrj   if ((sec->flags & (SEC_CODE | SEC_RELOC)) != (SEC_CODE | SEC_RELOC)
3081*a9fa9459Szrj       || sec->need_convert_load == 0
3082*a9fa9459Szrj       || bfd_is_abs_section (sec->output_section))
3083*a9fa9459Szrj     return TRUE;
3084*a9fa9459Szrj 
3085*a9fa9459Szrj   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3086*a9fa9459Szrj 
3087*a9fa9459Szrj   /* Load the relocations for this section.  */
3088*a9fa9459Szrj   internal_relocs = (_bfd_elf_link_read_relocs
3089*a9fa9459Szrj 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
3090*a9fa9459Szrj 		      link_info->keep_memory));
3091*a9fa9459Szrj   if (internal_relocs == NULL)
3092*a9fa9459Szrj     return FALSE;
3093*a9fa9459Szrj 
3094*a9fa9459Szrj   changed = FALSE;
3095*a9fa9459Szrj   htab = elf_i386_hash_table (link_info);
3096*a9fa9459Szrj   local_got_refcounts = elf_local_got_refcounts (abfd);
3097*a9fa9459Szrj 
3098*a9fa9459Szrj   /* Get the section contents.  */
3099*a9fa9459Szrj   if (elf_section_data (sec)->this_hdr.contents != NULL)
3100*a9fa9459Szrj     contents = elf_section_data (sec)->this_hdr.contents;
3101*a9fa9459Szrj   else
3102*a9fa9459Szrj     {
3103*a9fa9459Szrj       if (!bfd_malloc_and_get_section (abfd, sec, &contents))
3104*a9fa9459Szrj 	goto error_return;
3105*a9fa9459Szrj     }
3106*a9fa9459Szrj 
3107*a9fa9459Szrj   irelend = internal_relocs + sec->reloc_count;
3108*a9fa9459Szrj   for (irel = internal_relocs; irel < irelend; irel++)
3109*a9fa9459Szrj     {
3110*a9fa9459Szrj       unsigned int r_type = ELF32_R_TYPE (irel->r_info);
3111*a9fa9459Szrj       unsigned int r_symndx;
3112*a9fa9459Szrj       struct elf_link_hash_entry *h;
3113*a9fa9459Szrj       bfd_boolean converted;
3114*a9fa9459Szrj 
3115*a9fa9459Szrj       /* Don't convert R_386_GOT32 since we can't tell if it is applied
3116*a9fa9459Szrj 	 to "mov $foo@GOT, %reg" which isn't a load via GOT.  */
3117*a9fa9459Szrj       if (r_type != R_386_GOT32X)
3118*a9fa9459Szrj 	continue;
3119*a9fa9459Szrj 
3120*a9fa9459Szrj       r_symndx = ELF32_R_SYM (irel->r_info);
3121*a9fa9459Szrj       if (r_symndx < symtab_hdr->sh_info)
3122*a9fa9459Szrj 	h = elf_i386_get_local_sym_hash (htab, sec->owner,
3123*a9fa9459Szrj 					 (const Elf_Internal_Rela *) irel,
3124*a9fa9459Szrj 					 FALSE);
3125*a9fa9459Szrj       else
3126*a9fa9459Szrj 	{
3127*a9fa9459Szrj 	  h = elf_sym_hashes (abfd)[r_symndx - symtab_hdr->sh_info];
3128*a9fa9459Szrj 	   while (h->root.type == bfd_link_hash_indirect
3129*a9fa9459Szrj 		  || h->root.type == bfd_link_hash_warning)
3130*a9fa9459Szrj 	     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3131*a9fa9459Szrj 	}
3132*a9fa9459Szrj 
3133*a9fa9459Szrj       /* STT_GNU_IFUNC must keep GOT32 relocations.  */
3134*a9fa9459Szrj       if (h != NULL && h->type == STT_GNU_IFUNC)
3135*a9fa9459Szrj 	continue;
3136*a9fa9459Szrj 
3137*a9fa9459Szrj       converted = FALSE;
3138*a9fa9459Szrj       if (!elf_i386_convert_load_reloc (abfd, symtab_hdr, contents,
3139*a9fa9459Szrj 					irel, h, &converted, link_info))
3140*a9fa9459Szrj 	goto error_return;
3141*a9fa9459Szrj 
3142*a9fa9459Szrj       if (converted)
3143*a9fa9459Szrj 	{
3144*a9fa9459Szrj 	  changed = converted;
3145*a9fa9459Szrj 	  if (h)
3146*a9fa9459Szrj 	    {
3147*a9fa9459Szrj 	      if (h->got.refcount > 0)
3148*a9fa9459Szrj 		h->got.refcount -= 1;
3149*a9fa9459Szrj 	    }
3150*a9fa9459Szrj 	  else
3151*a9fa9459Szrj 	    {
3152*a9fa9459Szrj 	      if (local_got_refcounts != NULL
3153*a9fa9459Szrj 		  && local_got_refcounts[r_symndx] > 0)
3154*a9fa9459Szrj 		local_got_refcounts[r_symndx] -= 1;
3155*a9fa9459Szrj 	    }
3156*a9fa9459Szrj 	}
3157*a9fa9459Szrj     }
3158*a9fa9459Szrj 
3159*a9fa9459Szrj   if (contents != NULL
3160*a9fa9459Szrj       && elf_section_data (sec)->this_hdr.contents != contents)
3161*a9fa9459Szrj     {
3162*a9fa9459Szrj       if (!changed && !link_info->keep_memory)
3163*a9fa9459Szrj 	free (contents);
3164*a9fa9459Szrj       else
3165*a9fa9459Szrj 	{
3166*a9fa9459Szrj 	  /* Cache the section contents for elf_link_input_bfd.  */
3167*a9fa9459Szrj 	  elf_section_data (sec)->this_hdr.contents = contents;
3168*a9fa9459Szrj 	}
3169*a9fa9459Szrj     }
3170*a9fa9459Szrj 
3171*a9fa9459Szrj   if (elf_section_data (sec)->relocs != internal_relocs)
3172*a9fa9459Szrj     {
3173*a9fa9459Szrj       if (!changed)
3174*a9fa9459Szrj 	free (internal_relocs);
3175*a9fa9459Szrj       else
3176*a9fa9459Szrj 	elf_section_data (sec)->relocs = internal_relocs;
3177*a9fa9459Szrj     }
3178*a9fa9459Szrj 
3179*a9fa9459Szrj   return TRUE;
3180*a9fa9459Szrj 
3181*a9fa9459Szrj  error_return:
3182*a9fa9459Szrj   if (contents != NULL
3183*a9fa9459Szrj       && elf_section_data (sec)->this_hdr.contents != contents)
3184*a9fa9459Szrj     free (contents);
3185*a9fa9459Szrj   if (internal_relocs != NULL
3186*a9fa9459Szrj       && elf_section_data (sec)->relocs != internal_relocs)
3187*a9fa9459Szrj     free (internal_relocs);
3188*a9fa9459Szrj   return FALSE;
3189*a9fa9459Szrj }
3190*a9fa9459Szrj 
3191*a9fa9459Szrj /* Set the sizes of the dynamic sections.  */
3192*a9fa9459Szrj 
3193*a9fa9459Szrj static bfd_boolean
elf_i386_size_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)3194*a9fa9459Szrj elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3195*a9fa9459Szrj {
3196*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
3197*a9fa9459Szrj   bfd *dynobj;
3198*a9fa9459Szrj   asection *s;
3199*a9fa9459Szrj   bfd_boolean relocs;
3200*a9fa9459Szrj   bfd *ibfd;
3201*a9fa9459Szrj 
3202*a9fa9459Szrj   htab = elf_i386_hash_table (info);
3203*a9fa9459Szrj   if (htab == NULL)
3204*a9fa9459Szrj     return FALSE;
3205*a9fa9459Szrj   dynobj = htab->elf.dynobj;
3206*a9fa9459Szrj   if (dynobj == NULL)
3207*a9fa9459Szrj     abort ();
3208*a9fa9459Szrj 
3209*a9fa9459Szrj   /* Set up .got offsets for local syms, and space for local dynamic
3210*a9fa9459Szrj      relocs.  */
3211*a9fa9459Szrj   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3212*a9fa9459Szrj     {
3213*a9fa9459Szrj       bfd_signed_vma *local_got;
3214*a9fa9459Szrj       bfd_signed_vma *end_local_got;
3215*a9fa9459Szrj       char *local_tls_type;
3216*a9fa9459Szrj       bfd_vma *local_tlsdesc_gotent;
3217*a9fa9459Szrj       bfd_size_type locsymcount;
3218*a9fa9459Szrj       Elf_Internal_Shdr *symtab_hdr;
3219*a9fa9459Szrj       asection *srel;
3220*a9fa9459Szrj 
3221*a9fa9459Szrj       if (! is_i386_elf (ibfd))
3222*a9fa9459Szrj 	continue;
3223*a9fa9459Szrj 
3224*a9fa9459Szrj       for (s = ibfd->sections; s != NULL; s = s->next)
3225*a9fa9459Szrj 	{
3226*a9fa9459Szrj 	  struct elf_dyn_relocs *p;
3227*a9fa9459Szrj 
3228*a9fa9459Szrj 	  if (!elf_i386_convert_load (ibfd, s, info))
3229*a9fa9459Szrj 	    return FALSE;
3230*a9fa9459Szrj 
3231*a9fa9459Szrj 	  for (p = ((struct elf_dyn_relocs *)
3232*a9fa9459Szrj 		     elf_section_data (s)->local_dynrel);
3233*a9fa9459Szrj 	       p != NULL;
3234*a9fa9459Szrj 	       p = p->next)
3235*a9fa9459Szrj 	    {
3236*a9fa9459Szrj 	      if (!bfd_is_abs_section (p->sec)
3237*a9fa9459Szrj 		  && bfd_is_abs_section (p->sec->output_section))
3238*a9fa9459Szrj 		{
3239*a9fa9459Szrj 		  /* Input section has been discarded, either because
3240*a9fa9459Szrj 		     it is a copy of a linkonce section or due to
3241*a9fa9459Szrj 		     linker script /DISCARD/, so we'll be discarding
3242*a9fa9459Szrj 		     the relocs too.  */
3243*a9fa9459Szrj 		}
3244*a9fa9459Szrj 	      else if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3245*a9fa9459Szrj 		       && strcmp (p->sec->output_section->name,
3246*a9fa9459Szrj 				  ".tls_vars") == 0)
3247*a9fa9459Szrj 		{
3248*a9fa9459Szrj 		  /* Relocations in vxworks .tls_vars sections are
3249*a9fa9459Szrj 		     handled specially by the loader.  */
3250*a9fa9459Szrj 		}
3251*a9fa9459Szrj 	      else if (p->count != 0)
3252*a9fa9459Szrj 		{
3253*a9fa9459Szrj 		  srel = elf_section_data (p->sec)->sreloc;
3254*a9fa9459Szrj 		  srel->size += p->count * sizeof (Elf32_External_Rel);
3255*a9fa9459Szrj 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0
3256*a9fa9459Szrj 		      && (info->flags & DF_TEXTREL) == 0)
3257*a9fa9459Szrj 		    {
3258*a9fa9459Szrj 		      info->flags |= DF_TEXTREL;
3259*a9fa9459Szrj 		      if ((info->warn_shared_textrel && bfd_link_pic (info))
3260*a9fa9459Szrj 			  || info->error_textrel)
3261*a9fa9459Szrj 			info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"),
3262*a9fa9459Szrj 						p->sec->owner, p->sec);
3263*a9fa9459Szrj 		    }
3264*a9fa9459Szrj 		}
3265*a9fa9459Szrj 	    }
3266*a9fa9459Szrj 	}
3267*a9fa9459Szrj 
3268*a9fa9459Szrj       local_got = elf_local_got_refcounts (ibfd);
3269*a9fa9459Szrj       if (!local_got)
3270*a9fa9459Szrj 	continue;
3271*a9fa9459Szrj 
3272*a9fa9459Szrj       symtab_hdr = &elf_symtab_hdr (ibfd);
3273*a9fa9459Szrj       locsymcount = symtab_hdr->sh_info;
3274*a9fa9459Szrj       end_local_got = local_got + locsymcount;
3275*a9fa9459Szrj       local_tls_type = elf_i386_local_got_tls_type (ibfd);
3276*a9fa9459Szrj       local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
3277*a9fa9459Szrj       s = htab->elf.sgot;
3278*a9fa9459Szrj       srel = htab->elf.srelgot;
3279*a9fa9459Szrj       for (; local_got < end_local_got;
3280*a9fa9459Szrj 	   ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3281*a9fa9459Szrj 	{
3282*a9fa9459Szrj 	  *local_tlsdesc_gotent = (bfd_vma) -1;
3283*a9fa9459Szrj 	  if (*local_got > 0)
3284*a9fa9459Szrj 	    {
3285*a9fa9459Szrj 	      if (GOT_TLS_GDESC_P (*local_tls_type))
3286*a9fa9459Szrj 		{
3287*a9fa9459Szrj 		  *local_tlsdesc_gotent = htab->elf.sgotplt->size
3288*a9fa9459Szrj 		    - elf_i386_compute_jump_table_size (htab);
3289*a9fa9459Szrj 		  htab->elf.sgotplt->size += 8;
3290*a9fa9459Szrj 		  *local_got = (bfd_vma) -2;
3291*a9fa9459Szrj 		}
3292*a9fa9459Szrj 	      if (! GOT_TLS_GDESC_P (*local_tls_type)
3293*a9fa9459Szrj 		  || GOT_TLS_GD_P (*local_tls_type))
3294*a9fa9459Szrj 		{
3295*a9fa9459Szrj 		  *local_got = s->size;
3296*a9fa9459Szrj 		  s->size += 4;
3297*a9fa9459Szrj 		  if (GOT_TLS_GD_P (*local_tls_type)
3298*a9fa9459Szrj 		      || *local_tls_type == GOT_TLS_IE_BOTH)
3299*a9fa9459Szrj 		    s->size += 4;
3300*a9fa9459Szrj 		}
3301*a9fa9459Szrj 	      if (bfd_link_pic (info)
3302*a9fa9459Szrj 		  || GOT_TLS_GD_ANY_P (*local_tls_type)
3303*a9fa9459Szrj 		  || (*local_tls_type & GOT_TLS_IE))
3304*a9fa9459Szrj 		{
3305*a9fa9459Szrj 		  if (*local_tls_type == GOT_TLS_IE_BOTH)
3306*a9fa9459Szrj 		    srel->size += 2 * sizeof (Elf32_External_Rel);
3307*a9fa9459Szrj 		  else if (GOT_TLS_GD_P (*local_tls_type)
3308*a9fa9459Szrj 			   || ! GOT_TLS_GDESC_P (*local_tls_type))
3309*a9fa9459Szrj 		    srel->size += sizeof (Elf32_External_Rel);
3310*a9fa9459Szrj 		  if (GOT_TLS_GDESC_P (*local_tls_type))
3311*a9fa9459Szrj 		    htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
3312*a9fa9459Szrj 		}
3313*a9fa9459Szrj 	    }
3314*a9fa9459Szrj 	  else
3315*a9fa9459Szrj 	    *local_got = (bfd_vma) -1;
3316*a9fa9459Szrj 	}
3317*a9fa9459Szrj     }
3318*a9fa9459Szrj 
3319*a9fa9459Szrj   if (htab->tls_ldm_got.refcount > 0)
3320*a9fa9459Szrj     {
3321*a9fa9459Szrj       /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
3322*a9fa9459Szrj 	 relocs.  */
3323*a9fa9459Szrj       htab->tls_ldm_got.offset = htab->elf.sgot->size;
3324*a9fa9459Szrj       htab->elf.sgot->size += 8;
3325*a9fa9459Szrj       htab->elf.srelgot->size += sizeof (Elf32_External_Rel);
3326*a9fa9459Szrj     }
3327*a9fa9459Szrj   else
3328*a9fa9459Szrj     htab->tls_ldm_got.offset = -1;
3329*a9fa9459Szrj 
3330*a9fa9459Szrj   /* Allocate global sym .plt and .got entries, and space for global
3331*a9fa9459Szrj      sym dynamic relocs.  */
3332*a9fa9459Szrj   elf_link_hash_traverse (&htab->elf, elf_i386_allocate_dynrelocs, info);
3333*a9fa9459Szrj 
3334*a9fa9459Szrj   /* Allocate .plt and .got entries, and space for local symbols.  */
3335*a9fa9459Szrj   htab_traverse (htab->loc_hash_table,
3336*a9fa9459Szrj 		 elf_i386_allocate_local_dynrelocs,
3337*a9fa9459Szrj 		 info);
3338*a9fa9459Szrj 
3339*a9fa9459Szrj   /* For every jump slot reserved in the sgotplt, reloc_count is
3340*a9fa9459Szrj      incremented.  However, when we reserve space for TLS descriptors,
3341*a9fa9459Szrj      it's not incremented, so in order to compute the space reserved
3342*a9fa9459Szrj      for them, it suffices to multiply the reloc count by the jump
3343*a9fa9459Szrj      slot size.
3344*a9fa9459Szrj 
3345*a9fa9459Szrj      PR ld/13302: We start next_irelative_index at the end of .rela.plt
3346*a9fa9459Szrj      so that R_386_IRELATIVE entries come last.  */
3347*a9fa9459Szrj   if (htab->elf.srelplt)
3348*a9fa9459Szrj     {
3349*a9fa9459Szrj       htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
3350*a9fa9459Szrj       htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
3351*a9fa9459Szrj       htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
3352*a9fa9459Szrj     }
3353*a9fa9459Szrj   else if (htab->elf.irelplt)
3354*a9fa9459Szrj     htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
3355*a9fa9459Szrj 
3356*a9fa9459Szrj 
3357*a9fa9459Szrj   if (htab->elf.sgotplt)
3358*a9fa9459Szrj     {
3359*a9fa9459Szrj       /* Don't allocate .got.plt section if there are no GOT nor PLT
3360*a9fa9459Szrj          entries and there is no reference to _GLOBAL_OFFSET_TABLE_.  */
3361*a9fa9459Szrj       if ((htab->elf.hgot == NULL
3362*a9fa9459Szrj 	   || !htab->elf.hgot->ref_regular_nonweak)
3363*a9fa9459Szrj 	  && (htab->elf.sgotplt->size
3364*a9fa9459Szrj 	      == get_elf_backend_data (output_bfd)->got_header_size)
3365*a9fa9459Szrj 	  && (htab->elf.splt == NULL
3366*a9fa9459Szrj 	      || htab->elf.splt->size == 0)
3367*a9fa9459Szrj 	  && (htab->elf.sgot == NULL
3368*a9fa9459Szrj 	      || htab->elf.sgot->size == 0)
3369*a9fa9459Szrj 	  && (htab->elf.iplt == NULL
3370*a9fa9459Szrj 	      || htab->elf.iplt->size == 0)
3371*a9fa9459Szrj 	  && (htab->elf.igotplt == NULL
3372*a9fa9459Szrj 	      || htab->elf.igotplt->size == 0))
3373*a9fa9459Szrj 	htab->elf.sgotplt->size = 0;
3374*a9fa9459Szrj     }
3375*a9fa9459Szrj 
3376*a9fa9459Szrj 
3377*a9fa9459Szrj   if (htab->plt_eh_frame != NULL
3378*a9fa9459Szrj       && htab->elf.splt != NULL
3379*a9fa9459Szrj       && htab->elf.splt->size != 0
3380*a9fa9459Szrj       && !bfd_is_abs_section (htab->elf.splt->output_section)
3381*a9fa9459Szrj       && _bfd_elf_eh_frame_present (info))
3382*a9fa9459Szrj     htab->plt_eh_frame->size = sizeof (elf_i386_eh_frame_plt);
3383*a9fa9459Szrj 
3384*a9fa9459Szrj   /* We now have determined the sizes of the various dynamic sections.
3385*a9fa9459Szrj      Allocate memory for them.  */
3386*a9fa9459Szrj   relocs = FALSE;
3387*a9fa9459Szrj   for (s = dynobj->sections; s != NULL; s = s->next)
3388*a9fa9459Szrj     {
3389*a9fa9459Szrj       bfd_boolean strip_section = TRUE;
3390*a9fa9459Szrj 
3391*a9fa9459Szrj       if ((s->flags & SEC_LINKER_CREATED) == 0)
3392*a9fa9459Szrj 	continue;
3393*a9fa9459Szrj 
3394*a9fa9459Szrj       if (s == htab->elf.splt
3395*a9fa9459Szrj 	  || s == htab->elf.sgot)
3396*a9fa9459Szrj 	{
3397*a9fa9459Szrj 	  /* Strip this section if we don't need it; see the
3398*a9fa9459Szrj 	     comment below.  */
3399*a9fa9459Szrj 	  /* We'd like to strip these sections if they aren't needed, but if
3400*a9fa9459Szrj 	     we've exported dynamic symbols from them we must leave them.
3401*a9fa9459Szrj 	     It's too late to tell BFD to get rid of the symbols.  */
3402*a9fa9459Szrj 
3403*a9fa9459Szrj 	  if (htab->elf.hplt != NULL)
3404*a9fa9459Szrj 	    strip_section = FALSE;
3405*a9fa9459Szrj 	}
3406*a9fa9459Szrj       else if (s == htab->elf.sgotplt
3407*a9fa9459Szrj 	       || s == htab->elf.iplt
3408*a9fa9459Szrj 	       || s == htab->elf.igotplt
3409*a9fa9459Szrj 	       || s == htab->plt_got
3410*a9fa9459Szrj 	       || s == htab->plt_eh_frame
3411*a9fa9459Szrj 	       || s == htab->sdynbss)
3412*a9fa9459Szrj 	{
3413*a9fa9459Szrj 	  /* Strip these too.  */
3414*a9fa9459Szrj 	}
3415*a9fa9459Szrj       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rel"))
3416*a9fa9459Szrj 	{
3417*a9fa9459Szrj 	  if (s->size != 0
3418*a9fa9459Szrj 	      && s != htab->elf.srelplt
3419*a9fa9459Szrj 	      && s != htab->srelplt2)
3420*a9fa9459Szrj 	    relocs = TRUE;
3421*a9fa9459Szrj 
3422*a9fa9459Szrj 	  /* We use the reloc_count field as a counter if we need
3423*a9fa9459Szrj 	     to copy relocs into the output file.  */
3424*a9fa9459Szrj 	  s->reloc_count = 0;
3425*a9fa9459Szrj 	}
3426*a9fa9459Szrj       else
3427*a9fa9459Szrj 	{
3428*a9fa9459Szrj 	  /* It's not one of our sections, so don't allocate space.  */
3429*a9fa9459Szrj 	  continue;
3430*a9fa9459Szrj 	}
3431*a9fa9459Szrj 
3432*a9fa9459Szrj       if (s->size == 0)
3433*a9fa9459Szrj 	{
3434*a9fa9459Szrj 	  /* If we don't need this section, strip it from the
3435*a9fa9459Szrj 	     output file.  This is mostly to handle .rel.bss and
3436*a9fa9459Szrj 	     .rel.plt.  We must create both sections in
3437*a9fa9459Szrj 	     create_dynamic_sections, because they must be created
3438*a9fa9459Szrj 	     before the linker maps input sections to output
3439*a9fa9459Szrj 	     sections.  The linker does that before
3440*a9fa9459Szrj 	     adjust_dynamic_symbol is called, and it is that
3441*a9fa9459Szrj 	     function which decides whether anything needs to go
3442*a9fa9459Szrj 	     into these sections.  */
3443*a9fa9459Szrj 	  if (strip_section)
3444*a9fa9459Szrj 	    s->flags |= SEC_EXCLUDE;
3445*a9fa9459Szrj 	  continue;
3446*a9fa9459Szrj 	}
3447*a9fa9459Szrj 
3448*a9fa9459Szrj       if ((s->flags & SEC_HAS_CONTENTS) == 0)
3449*a9fa9459Szrj 	continue;
3450*a9fa9459Szrj 
3451*a9fa9459Szrj       /* Allocate memory for the section contents.  We use bfd_zalloc
3452*a9fa9459Szrj 	 here in case unused entries are not reclaimed before the
3453*a9fa9459Szrj 	 section's contents are written out.  This should not happen,
3454*a9fa9459Szrj 	 but this way if it does, we get a R_386_NONE reloc instead
3455*a9fa9459Szrj 	 of garbage.  */
3456*a9fa9459Szrj       s->contents = (unsigned char *) bfd_zalloc (dynobj, s->size);
3457*a9fa9459Szrj       if (s->contents == NULL)
3458*a9fa9459Szrj 	return FALSE;
3459*a9fa9459Szrj     }
3460*a9fa9459Szrj 
3461*a9fa9459Szrj   if (htab->plt_eh_frame != NULL
3462*a9fa9459Szrj       && htab->plt_eh_frame->contents != NULL)
3463*a9fa9459Szrj     {
3464*a9fa9459Szrj       memcpy (htab->plt_eh_frame->contents, elf_i386_eh_frame_plt,
3465*a9fa9459Szrj 	      sizeof (elf_i386_eh_frame_plt));
3466*a9fa9459Szrj       bfd_put_32 (dynobj, htab->elf.splt->size,
3467*a9fa9459Szrj 		  htab->plt_eh_frame->contents + PLT_FDE_LEN_OFFSET);
3468*a9fa9459Szrj     }
3469*a9fa9459Szrj 
3470*a9fa9459Szrj   if (htab->elf.dynamic_sections_created)
3471*a9fa9459Szrj     {
3472*a9fa9459Szrj       /* Add some entries to the .dynamic section.  We fill in the
3473*a9fa9459Szrj 	 values later, in elf_i386_finish_dynamic_sections, but we
3474*a9fa9459Szrj 	 must add the entries now so that we get the correct size for
3475*a9fa9459Szrj 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
3476*a9fa9459Szrj 	 dynamic linker and used by the debugger.  */
3477*a9fa9459Szrj #define add_dynamic_entry(TAG, VAL) \
3478*a9fa9459Szrj   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3479*a9fa9459Szrj 
3480*a9fa9459Szrj       if (bfd_link_executable (info))
3481*a9fa9459Szrj 	{
3482*a9fa9459Szrj 	  if (!add_dynamic_entry (DT_DEBUG, 0))
3483*a9fa9459Szrj 	    return FALSE;
3484*a9fa9459Szrj 	}
3485*a9fa9459Szrj 
3486*a9fa9459Szrj       if (htab->elf.splt->size != 0)
3487*a9fa9459Szrj 	{
3488*a9fa9459Szrj 	  /* DT_PLTGOT is used by prelink even if there is no PLT
3489*a9fa9459Szrj 	     relocation.  */
3490*a9fa9459Szrj 	  if (!add_dynamic_entry (DT_PLTGOT, 0))
3491*a9fa9459Szrj 	    return FALSE;
3492*a9fa9459Szrj 
3493*a9fa9459Szrj 	  if (htab->elf.srelplt->size != 0)
3494*a9fa9459Szrj 	    {
3495*a9fa9459Szrj 	      if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3496*a9fa9459Szrj 		  || !add_dynamic_entry (DT_PLTREL, DT_REL)
3497*a9fa9459Szrj 		  || !add_dynamic_entry (DT_JMPREL, 0))
3498*a9fa9459Szrj 		return FALSE;
3499*a9fa9459Szrj 	    }
3500*a9fa9459Szrj 	}
3501*a9fa9459Szrj 
3502*a9fa9459Szrj       if (relocs)
3503*a9fa9459Szrj 	{
3504*a9fa9459Szrj 	  if (!add_dynamic_entry (DT_REL, 0)
3505*a9fa9459Szrj 	      || !add_dynamic_entry (DT_RELSZ, 0)
3506*a9fa9459Szrj 	      || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
3507*a9fa9459Szrj 	    return FALSE;
3508*a9fa9459Szrj 
3509*a9fa9459Szrj 	  /* If any dynamic relocs apply to a read-only section,
3510*a9fa9459Szrj 	     then we need a DT_TEXTREL entry.  */
3511*a9fa9459Szrj 	  if ((info->flags & DF_TEXTREL) == 0)
3512*a9fa9459Szrj 	    elf_link_hash_traverse (&htab->elf,
3513*a9fa9459Szrj 				    elf_i386_readonly_dynrelocs, info);
3514*a9fa9459Szrj 
3515*a9fa9459Szrj 	  if ((info->flags & DF_TEXTREL) != 0)
3516*a9fa9459Szrj 	    {
3517*a9fa9459Szrj 	      if (htab->readonly_dynrelocs_against_ifunc)
3518*a9fa9459Szrj 		{
3519*a9fa9459Szrj 		  info->callbacks->einfo
3520*a9fa9459Szrj 		    (_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n"));
3521*a9fa9459Szrj 		  bfd_set_error (bfd_error_bad_value);
3522*a9fa9459Szrj 		  return FALSE;
3523*a9fa9459Szrj 		}
3524*a9fa9459Szrj 
3525*a9fa9459Szrj 	      if (!add_dynamic_entry (DT_TEXTREL, 0))
3526*a9fa9459Szrj 		return FALSE;
3527*a9fa9459Szrj 	    }
3528*a9fa9459Szrj 	}
3529*a9fa9459Szrj       if (get_elf_i386_backend_data (output_bfd)->is_vxworks
3530*a9fa9459Szrj 	  && !elf_vxworks_add_dynamic_entries (output_bfd, info))
3531*a9fa9459Szrj 	return FALSE;
3532*a9fa9459Szrj     }
3533*a9fa9459Szrj #undef add_dynamic_entry
3534*a9fa9459Szrj 
3535*a9fa9459Szrj   return TRUE;
3536*a9fa9459Szrj }
3537*a9fa9459Szrj 
3538*a9fa9459Szrj static bfd_boolean
elf_i386_always_size_sections(bfd * output_bfd,struct bfd_link_info * info)3539*a9fa9459Szrj elf_i386_always_size_sections (bfd *output_bfd,
3540*a9fa9459Szrj 			       struct bfd_link_info *info)
3541*a9fa9459Szrj {
3542*a9fa9459Szrj   asection *tls_sec = elf_hash_table (info)->tls_sec;
3543*a9fa9459Szrj 
3544*a9fa9459Szrj   if (tls_sec)
3545*a9fa9459Szrj     {
3546*a9fa9459Szrj       struct elf_link_hash_entry *tlsbase;
3547*a9fa9459Szrj 
3548*a9fa9459Szrj       tlsbase = elf_link_hash_lookup (elf_hash_table (info),
3549*a9fa9459Szrj 				      "_TLS_MODULE_BASE_",
3550*a9fa9459Szrj 				      FALSE, FALSE, FALSE);
3551*a9fa9459Szrj 
3552*a9fa9459Szrj       if (tlsbase && tlsbase->type == STT_TLS)
3553*a9fa9459Szrj 	{
3554*a9fa9459Szrj 	  struct elf_i386_link_hash_table *htab;
3555*a9fa9459Szrj 	  struct bfd_link_hash_entry *bh = NULL;
3556*a9fa9459Szrj 	  const struct elf_backend_data *bed
3557*a9fa9459Szrj 	    = get_elf_backend_data (output_bfd);
3558*a9fa9459Szrj 
3559*a9fa9459Szrj 	  htab = elf_i386_hash_table (info);
3560*a9fa9459Szrj 	  if (htab == NULL)
3561*a9fa9459Szrj 	    return FALSE;
3562*a9fa9459Szrj 
3563*a9fa9459Szrj 	  if (!(_bfd_generic_link_add_one_symbol
3564*a9fa9459Szrj 		(info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
3565*a9fa9459Szrj 		 tls_sec, 0, NULL, FALSE,
3566*a9fa9459Szrj 		 bed->collect, &bh)))
3567*a9fa9459Szrj 	    return FALSE;
3568*a9fa9459Szrj 
3569*a9fa9459Szrj 	  htab->tls_module_base = bh;
3570*a9fa9459Szrj 
3571*a9fa9459Szrj 	  tlsbase = (struct elf_link_hash_entry *)bh;
3572*a9fa9459Szrj 	  tlsbase->def_regular = 1;
3573*a9fa9459Szrj 	  tlsbase->other = STV_HIDDEN;
3574*a9fa9459Szrj 	  tlsbase->root.linker_def = 1;
3575*a9fa9459Szrj 	  (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
3576*a9fa9459Szrj 	}
3577*a9fa9459Szrj     }
3578*a9fa9459Szrj 
3579*a9fa9459Szrj   return TRUE;
3580*a9fa9459Szrj }
3581*a9fa9459Szrj 
3582*a9fa9459Szrj /* Set the correct type for an x86 ELF section.  We do this by the
3583*a9fa9459Szrj    section name, which is a hack, but ought to work.  */
3584*a9fa9459Szrj 
3585*a9fa9459Szrj static bfd_boolean
elf_i386_fake_sections(bfd * abfd ATTRIBUTE_UNUSED,Elf_Internal_Shdr * hdr,asection * sec)3586*a9fa9459Szrj elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3587*a9fa9459Szrj 			Elf_Internal_Shdr *hdr,
3588*a9fa9459Szrj 			asection *sec)
3589*a9fa9459Szrj {
3590*a9fa9459Szrj   const char *name;
3591*a9fa9459Szrj 
3592*a9fa9459Szrj   name = bfd_get_section_name (abfd, sec);
3593*a9fa9459Szrj 
3594*a9fa9459Szrj   /* This is an ugly, but unfortunately necessary hack that is
3595*a9fa9459Szrj      needed when producing EFI binaries on x86. It tells
3596*a9fa9459Szrj      elf.c:elf_fake_sections() not to consider ".reloc" as a section
3597*a9fa9459Szrj      containing ELF relocation info.  We need this hack in order to
3598*a9fa9459Szrj      be able to generate ELF binaries that can be translated into
3599*a9fa9459Szrj      EFI applications (which are essentially COFF objects).  Those
3600*a9fa9459Szrj      files contain a COFF ".reloc" section inside an ELFNN object,
3601*a9fa9459Szrj      which would normally cause BFD to segfault because it would
3602*a9fa9459Szrj      attempt to interpret this section as containing relocation
3603*a9fa9459Szrj      entries for section "oc".  With this hack enabled, ".reloc"
3604*a9fa9459Szrj      will be treated as a normal data section, which will avoid the
3605*a9fa9459Szrj      segfault.  However, you won't be able to create an ELFNN binary
3606*a9fa9459Szrj      with a section named "oc" that needs relocations, but that's
3607*a9fa9459Szrj      the kind of ugly side-effects you get when detecting section
3608*a9fa9459Szrj      types based on their names...  In practice, this limitation is
3609*a9fa9459Szrj      unlikely to bite.  */
3610*a9fa9459Szrj   if (strcmp (name, ".reloc") == 0)
3611*a9fa9459Szrj     hdr->sh_type = SHT_PROGBITS;
3612*a9fa9459Szrj 
3613*a9fa9459Szrj   return TRUE;
3614*a9fa9459Szrj }
3615*a9fa9459Szrj 
3616*a9fa9459Szrj /* _TLS_MODULE_BASE_ needs to be treated especially when linking
3617*a9fa9459Szrj    executables.  Rather than setting it to the beginning of the TLS
3618*a9fa9459Szrj    section, we have to set it to the end.    This function may be called
3619*a9fa9459Szrj    multiple times, it is idempotent.  */
3620*a9fa9459Szrj 
3621*a9fa9459Szrj static void
elf_i386_set_tls_module_base(struct bfd_link_info * info)3622*a9fa9459Szrj elf_i386_set_tls_module_base (struct bfd_link_info *info)
3623*a9fa9459Szrj {
3624*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
3625*a9fa9459Szrj   struct bfd_link_hash_entry *base;
3626*a9fa9459Szrj 
3627*a9fa9459Szrj   if (!bfd_link_executable (info))
3628*a9fa9459Szrj     return;
3629*a9fa9459Szrj 
3630*a9fa9459Szrj   htab = elf_i386_hash_table (info);
3631*a9fa9459Szrj   if (htab == NULL)
3632*a9fa9459Szrj     return;
3633*a9fa9459Szrj 
3634*a9fa9459Szrj   base = htab->tls_module_base;
3635*a9fa9459Szrj   if (base == NULL)
3636*a9fa9459Szrj     return;
3637*a9fa9459Szrj 
3638*a9fa9459Szrj   base->u.def.value = htab->elf.tls_size;
3639*a9fa9459Szrj }
3640*a9fa9459Szrj 
3641*a9fa9459Szrj /* Return the base VMA address which should be subtracted from real addresses
3642*a9fa9459Szrj    when resolving @dtpoff relocation.
3643*a9fa9459Szrj    This is PT_TLS segment p_vaddr.  */
3644*a9fa9459Szrj 
3645*a9fa9459Szrj static bfd_vma
elf_i386_dtpoff_base(struct bfd_link_info * info)3646*a9fa9459Szrj elf_i386_dtpoff_base (struct bfd_link_info *info)
3647*a9fa9459Szrj {
3648*a9fa9459Szrj   /* If tls_sec is NULL, we should have signalled an error already.  */
3649*a9fa9459Szrj   if (elf_hash_table (info)->tls_sec == NULL)
3650*a9fa9459Szrj     return 0;
3651*a9fa9459Szrj   return elf_hash_table (info)->tls_sec->vma;
3652*a9fa9459Szrj }
3653*a9fa9459Szrj 
3654*a9fa9459Szrj /* Return the relocation value for @tpoff relocation
3655*a9fa9459Szrj    if STT_TLS virtual address is ADDRESS.  */
3656*a9fa9459Szrj 
3657*a9fa9459Szrj static bfd_vma
elf_i386_tpoff(struct bfd_link_info * info,bfd_vma address)3658*a9fa9459Szrj elf_i386_tpoff (struct bfd_link_info *info, bfd_vma address)
3659*a9fa9459Szrj {
3660*a9fa9459Szrj   struct elf_link_hash_table *htab = elf_hash_table (info);
3661*a9fa9459Szrj   const struct elf_backend_data *bed = get_elf_backend_data (info->output_bfd);
3662*a9fa9459Szrj   bfd_vma static_tls_size;
3663*a9fa9459Szrj 
3664*a9fa9459Szrj   /* If tls_sec is NULL, we should have signalled an error already.  */
3665*a9fa9459Szrj   if (htab->tls_sec == NULL)
3666*a9fa9459Szrj     return 0;
3667*a9fa9459Szrj 
3668*a9fa9459Szrj   /* Consider special static TLS alignment requirements.  */
3669*a9fa9459Szrj   static_tls_size = BFD_ALIGN (htab->tls_size, bed->static_tls_alignment);
3670*a9fa9459Szrj   return static_tls_size + htab->tls_sec->vma - address;
3671*a9fa9459Szrj }
3672*a9fa9459Szrj 
3673*a9fa9459Szrj /* Relocate an i386 ELF section.  */
3674*a9fa9459Szrj 
3675*a9fa9459Szrj static bfd_boolean
elf_i386_relocate_section(bfd * output_bfd,struct bfd_link_info * info,bfd * input_bfd,asection * input_section,bfd_byte * contents,Elf_Internal_Rela * relocs,Elf_Internal_Sym * local_syms,asection ** local_sections)3676*a9fa9459Szrj elf_i386_relocate_section (bfd *output_bfd,
3677*a9fa9459Szrj 			   struct bfd_link_info *info,
3678*a9fa9459Szrj 			   bfd *input_bfd,
3679*a9fa9459Szrj 			   asection *input_section,
3680*a9fa9459Szrj 			   bfd_byte *contents,
3681*a9fa9459Szrj 			   Elf_Internal_Rela *relocs,
3682*a9fa9459Szrj 			   Elf_Internal_Sym *local_syms,
3683*a9fa9459Szrj 			   asection **local_sections)
3684*a9fa9459Szrj {
3685*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
3686*a9fa9459Szrj   Elf_Internal_Shdr *symtab_hdr;
3687*a9fa9459Szrj   struct elf_link_hash_entry **sym_hashes;
3688*a9fa9459Szrj   bfd_vma *local_got_offsets;
3689*a9fa9459Szrj   bfd_vma *local_tlsdesc_gotents;
3690*a9fa9459Szrj   Elf_Internal_Rela *rel;
3691*a9fa9459Szrj   Elf_Internal_Rela *wrel;
3692*a9fa9459Szrj   Elf_Internal_Rela *relend;
3693*a9fa9459Szrj   bfd_boolean is_vxworks_tls;
3694*a9fa9459Szrj   unsigned plt_entry_size;
3695*a9fa9459Szrj 
3696*a9fa9459Szrj   BFD_ASSERT (is_i386_elf (input_bfd));
3697*a9fa9459Szrj 
3698*a9fa9459Szrj   /* Skip if check_relocs failed.  */
3699*a9fa9459Szrj   if (input_section->check_relocs_failed)
3700*a9fa9459Szrj     return FALSE;
3701*a9fa9459Szrj 
3702*a9fa9459Szrj   htab = elf_i386_hash_table (info);
3703*a9fa9459Szrj   if (htab == NULL)
3704*a9fa9459Szrj     return FALSE;
3705*a9fa9459Szrj   symtab_hdr = &elf_symtab_hdr (input_bfd);
3706*a9fa9459Szrj   sym_hashes = elf_sym_hashes (input_bfd);
3707*a9fa9459Szrj   local_got_offsets = elf_local_got_offsets (input_bfd);
3708*a9fa9459Szrj   local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
3709*a9fa9459Szrj   /* We have to handle relocations in vxworks .tls_vars sections
3710*a9fa9459Szrj      specially, because the dynamic loader is 'weird'.  */
3711*a9fa9459Szrj   is_vxworks_tls = (get_elf_i386_backend_data (output_bfd)->is_vxworks
3712*a9fa9459Szrj                     && bfd_link_pic (info)
3713*a9fa9459Szrj 		    && !strcmp (input_section->output_section->name,
3714*a9fa9459Szrj 				".tls_vars"));
3715*a9fa9459Szrj 
3716*a9fa9459Szrj   elf_i386_set_tls_module_base (info);
3717*a9fa9459Szrj 
3718*a9fa9459Szrj   plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
3719*a9fa9459Szrj 
3720*a9fa9459Szrj   rel = wrel = relocs;
3721*a9fa9459Szrj   relend = relocs + input_section->reloc_count;
3722*a9fa9459Szrj   for (; rel < relend; wrel++, rel++)
3723*a9fa9459Szrj     {
3724*a9fa9459Szrj       unsigned int r_type;
3725*a9fa9459Szrj       reloc_howto_type *howto;
3726*a9fa9459Szrj       unsigned long r_symndx;
3727*a9fa9459Szrj       struct elf_link_hash_entry *h;
3728*a9fa9459Szrj       struct elf_i386_link_hash_entry *eh;
3729*a9fa9459Szrj       Elf_Internal_Sym *sym;
3730*a9fa9459Szrj       asection *sec;
3731*a9fa9459Szrj       bfd_vma off, offplt, plt_offset;
3732*a9fa9459Szrj       bfd_vma relocation;
3733*a9fa9459Szrj       bfd_boolean unresolved_reloc;
3734*a9fa9459Szrj       bfd_reloc_status_type r;
3735*a9fa9459Szrj       unsigned int indx;
3736*a9fa9459Szrj       int tls_type;
3737*a9fa9459Szrj       bfd_vma st_size;
3738*a9fa9459Szrj       asection *resolved_plt;
3739*a9fa9459Szrj       bfd_boolean resolved_to_zero;
3740*a9fa9459Szrj 
3741*a9fa9459Szrj       r_type = ELF32_R_TYPE (rel->r_info);
3742*a9fa9459Szrj       if (r_type == R_386_GNU_VTINHERIT
3743*a9fa9459Szrj 	  || r_type == R_386_GNU_VTENTRY)
3744*a9fa9459Szrj 	{
3745*a9fa9459Szrj 	  if (wrel != rel)
3746*a9fa9459Szrj 	    *wrel = *rel;
3747*a9fa9459Szrj 	  continue;
3748*a9fa9459Szrj 	}
3749*a9fa9459Szrj 
3750*a9fa9459Szrj       if ((indx = r_type) >= R_386_standard
3751*a9fa9459Szrj 	  && ((indx = r_type - R_386_ext_offset) - R_386_standard
3752*a9fa9459Szrj 	      >= R_386_ext - R_386_standard)
3753*a9fa9459Szrj 	  && ((indx = r_type - R_386_tls_offset) - R_386_ext
3754*a9fa9459Szrj 	      >= R_386_ext2 - R_386_ext))
3755*a9fa9459Szrj 	{
3756*a9fa9459Szrj 	  (*_bfd_error_handler)
3757*a9fa9459Szrj 	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
3758*a9fa9459Szrj 	     input_bfd, input_section, r_type);
3759*a9fa9459Szrj 	  bfd_set_error (bfd_error_bad_value);
3760*a9fa9459Szrj 	  return FALSE;
3761*a9fa9459Szrj 	}
3762*a9fa9459Szrj       howto = elf_howto_table + indx;
3763*a9fa9459Szrj 
3764*a9fa9459Szrj       r_symndx = ELF32_R_SYM (rel->r_info);
3765*a9fa9459Szrj       h = NULL;
3766*a9fa9459Szrj       sym = NULL;
3767*a9fa9459Szrj       sec = NULL;
3768*a9fa9459Szrj       unresolved_reloc = FALSE;
3769*a9fa9459Szrj       if (r_symndx < symtab_hdr->sh_info)
3770*a9fa9459Szrj 	{
3771*a9fa9459Szrj 	  sym = local_syms + r_symndx;
3772*a9fa9459Szrj 	  sec = local_sections[r_symndx];
3773*a9fa9459Szrj 	  relocation = (sec->output_section->vma
3774*a9fa9459Szrj 			+ sec->output_offset
3775*a9fa9459Szrj 			+ sym->st_value);
3776*a9fa9459Szrj 	  st_size = sym->st_size;
3777*a9fa9459Szrj 
3778*a9fa9459Szrj 	  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION
3779*a9fa9459Szrj 	      && ((sec->flags & SEC_MERGE) != 0
3780*a9fa9459Szrj 		  || (bfd_link_relocatable (info)
3781*a9fa9459Szrj 		      && sec->output_offset != 0)))
3782*a9fa9459Szrj 	    {
3783*a9fa9459Szrj 	      bfd_vma addend;
3784*a9fa9459Szrj 	      bfd_byte *where = contents + rel->r_offset;
3785*a9fa9459Szrj 
3786*a9fa9459Szrj 	      switch (howto->size)
3787*a9fa9459Szrj 		{
3788*a9fa9459Szrj 		case 0:
3789*a9fa9459Szrj 		  addend = bfd_get_8 (input_bfd, where);
3790*a9fa9459Szrj 		  if (howto->pc_relative)
3791*a9fa9459Szrj 		    {
3792*a9fa9459Szrj 		      addend = (addend ^ 0x80) - 0x80;
3793*a9fa9459Szrj 		      addend += 1;
3794*a9fa9459Szrj 		    }
3795*a9fa9459Szrj 		  break;
3796*a9fa9459Szrj 		case 1:
3797*a9fa9459Szrj 		  addend = bfd_get_16 (input_bfd, where);
3798*a9fa9459Szrj 		  if (howto->pc_relative)
3799*a9fa9459Szrj 		    {
3800*a9fa9459Szrj 		      addend = (addend ^ 0x8000) - 0x8000;
3801*a9fa9459Szrj 		      addend += 2;
3802*a9fa9459Szrj 		    }
3803*a9fa9459Szrj 		  break;
3804*a9fa9459Szrj 		case 2:
3805*a9fa9459Szrj 		  addend = bfd_get_32 (input_bfd, where);
3806*a9fa9459Szrj 		  if (howto->pc_relative)
3807*a9fa9459Szrj 		    {
3808*a9fa9459Szrj 		      addend = (addend ^ 0x80000000) - 0x80000000;
3809*a9fa9459Szrj 		      addend += 4;
3810*a9fa9459Szrj 		    }
3811*a9fa9459Szrj 		  break;
3812*a9fa9459Szrj 		default:
3813*a9fa9459Szrj 		  abort ();
3814*a9fa9459Szrj 		}
3815*a9fa9459Szrj 
3816*a9fa9459Szrj 	      if (bfd_link_relocatable (info))
3817*a9fa9459Szrj 		addend += sec->output_offset;
3818*a9fa9459Szrj 	      else
3819*a9fa9459Szrj 		{
3820*a9fa9459Szrj 		  asection *msec = sec;
3821*a9fa9459Szrj 		  addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec,
3822*a9fa9459Szrj 						   addend);
3823*a9fa9459Szrj 		  addend -= relocation;
3824*a9fa9459Szrj 		  addend += msec->output_section->vma + msec->output_offset;
3825*a9fa9459Szrj 		}
3826*a9fa9459Szrj 
3827*a9fa9459Szrj 	      switch (howto->size)
3828*a9fa9459Szrj 		{
3829*a9fa9459Szrj 		case 0:
3830*a9fa9459Szrj 		  /* FIXME: overflow checks.  */
3831*a9fa9459Szrj 		  if (howto->pc_relative)
3832*a9fa9459Szrj 		    addend -= 1;
3833*a9fa9459Szrj 		  bfd_put_8 (input_bfd, addend, where);
3834*a9fa9459Szrj 		  break;
3835*a9fa9459Szrj 		case 1:
3836*a9fa9459Szrj 		  if (howto->pc_relative)
3837*a9fa9459Szrj 		    addend -= 2;
3838*a9fa9459Szrj 		  bfd_put_16 (input_bfd, addend, where);
3839*a9fa9459Szrj 		  break;
3840*a9fa9459Szrj 		case 2:
3841*a9fa9459Szrj 		  if (howto->pc_relative)
3842*a9fa9459Szrj 		    addend -= 4;
3843*a9fa9459Szrj 		  bfd_put_32 (input_bfd, addend, where);
3844*a9fa9459Szrj 		  break;
3845*a9fa9459Szrj 		}
3846*a9fa9459Szrj 	    }
3847*a9fa9459Szrj 	  else if (!bfd_link_relocatable (info)
3848*a9fa9459Szrj 		   && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
3849*a9fa9459Szrj 	    {
3850*a9fa9459Szrj 	      /* Relocate against local STT_GNU_IFUNC symbol.  */
3851*a9fa9459Szrj 	      h = elf_i386_get_local_sym_hash (htab, input_bfd, rel,
3852*a9fa9459Szrj 					       FALSE);
3853*a9fa9459Szrj 	      if (h == NULL)
3854*a9fa9459Szrj 		abort ();
3855*a9fa9459Szrj 
3856*a9fa9459Szrj 	      /* Set STT_GNU_IFUNC symbol value.  */
3857*a9fa9459Szrj 	      h->root.u.def.value = sym->st_value;
3858*a9fa9459Szrj 	      h->root.u.def.section = sec;
3859*a9fa9459Szrj 	    }
3860*a9fa9459Szrj 	}
3861*a9fa9459Szrj       else
3862*a9fa9459Szrj 	{
3863*a9fa9459Szrj 	  bfd_boolean warned ATTRIBUTE_UNUSED;
3864*a9fa9459Szrj 	  bfd_boolean ignored ATTRIBUTE_UNUSED;
3865*a9fa9459Szrj 
3866*a9fa9459Szrj 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3867*a9fa9459Szrj 				   r_symndx, symtab_hdr, sym_hashes,
3868*a9fa9459Szrj 				   h, sec, relocation,
3869*a9fa9459Szrj 				   unresolved_reloc, warned, ignored);
3870*a9fa9459Szrj 	  st_size = h->size;
3871*a9fa9459Szrj 	}
3872*a9fa9459Szrj 
3873*a9fa9459Szrj       if (sec != NULL && discarded_section (sec))
3874*a9fa9459Szrj 	{
3875*a9fa9459Szrj 	  _bfd_clear_contents (howto, input_bfd, input_section,
3876*a9fa9459Szrj 			       contents + rel->r_offset);
3877*a9fa9459Szrj 	  wrel->r_offset = rel->r_offset;
3878*a9fa9459Szrj 	  wrel->r_info = 0;
3879*a9fa9459Szrj 	  wrel->r_addend = 0;
3880*a9fa9459Szrj 
3881*a9fa9459Szrj 	  /* For ld -r, remove relocations in debug sections against
3882*a9fa9459Szrj 	     sections defined in discarded sections.  Not done for
3883*a9fa9459Szrj 	     eh_frame editing code expects to be present.  */
3884*a9fa9459Szrj 	   if (bfd_link_relocatable (info)
3885*a9fa9459Szrj 	       && (input_section->flags & SEC_DEBUGGING))
3886*a9fa9459Szrj 	     wrel--;
3887*a9fa9459Szrj 
3888*a9fa9459Szrj 	   continue;
3889*a9fa9459Szrj 	}
3890*a9fa9459Szrj 
3891*a9fa9459Szrj       if (bfd_link_relocatable (info))
3892*a9fa9459Szrj 	{
3893*a9fa9459Szrj 	  if (wrel != rel)
3894*a9fa9459Szrj 	    *wrel = *rel;
3895*a9fa9459Szrj 	  continue;
3896*a9fa9459Szrj 	}
3897*a9fa9459Szrj 
3898*a9fa9459Szrj       /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
3899*a9fa9459Szrj 	 it here if it is defined in a non-shared object.  */
3900*a9fa9459Szrj       if (h != NULL
3901*a9fa9459Szrj 	  && h->type == STT_GNU_IFUNC
3902*a9fa9459Szrj 	  && h->def_regular)
3903*a9fa9459Szrj 	{
3904*a9fa9459Szrj 	  asection *plt, *gotplt, *base_got;
3905*a9fa9459Szrj 	  bfd_vma plt_index;
3906*a9fa9459Szrj 	  const char *name;
3907*a9fa9459Szrj 
3908*a9fa9459Szrj 	  if ((input_section->flags & SEC_ALLOC) == 0)
3909*a9fa9459Szrj 	    {
3910*a9fa9459Szrj 	      /* Dynamic relocs are not propagated for SEC_DEBUGGING
3911*a9fa9459Szrj 		 sections because such sections are not SEC_ALLOC and
3912*a9fa9459Szrj 		 thus ld.so will not process them.  */
3913*a9fa9459Szrj 	      if ((input_section->flags & SEC_DEBUGGING) != 0)
3914*a9fa9459Szrj 		continue;
3915*a9fa9459Szrj 	      abort ();
3916*a9fa9459Szrj 	    }
3917*a9fa9459Szrj 
3918*a9fa9459Szrj 	  /* STT_GNU_IFUNC symbol must go through PLT.  */
3919*a9fa9459Szrj 	  if (htab->elf.splt != NULL)
3920*a9fa9459Szrj 	    {
3921*a9fa9459Szrj 	      plt = htab->elf.splt;
3922*a9fa9459Szrj 	      gotplt = htab->elf.sgotplt;
3923*a9fa9459Szrj 	    }
3924*a9fa9459Szrj 	  else
3925*a9fa9459Szrj 	    {
3926*a9fa9459Szrj 	      plt = htab->elf.iplt;
3927*a9fa9459Szrj 	      gotplt = htab->elf.igotplt;
3928*a9fa9459Szrj 	    }
3929*a9fa9459Szrj 
3930*a9fa9459Szrj 	  switch (r_type)
3931*a9fa9459Szrj 	    {
3932*a9fa9459Szrj 	    default:
3933*a9fa9459Szrj 	      break;
3934*a9fa9459Szrj 
3935*a9fa9459Szrj 	    case R_386_GOT32:
3936*a9fa9459Szrj 	    case R_386_GOT32X:
3937*a9fa9459Szrj 	      base_got = htab->elf.sgot;
3938*a9fa9459Szrj 	      off = h->got.offset;
3939*a9fa9459Szrj 
3940*a9fa9459Szrj 	      if (base_got == NULL)
3941*a9fa9459Szrj 		abort ();
3942*a9fa9459Szrj 
3943*a9fa9459Szrj 	      if (off == (bfd_vma) -1)
3944*a9fa9459Szrj 		{
3945*a9fa9459Szrj 		  /* We can't use h->got.offset here to save state, or
3946*a9fa9459Szrj 		     even just remember the offset, as finish_dynamic_symbol
3947*a9fa9459Szrj 		     would use that as offset into .got.  */
3948*a9fa9459Szrj 
3949*a9fa9459Szrj 		  if (h->plt.offset == (bfd_vma) -1)
3950*a9fa9459Szrj 		    abort ();
3951*a9fa9459Szrj 
3952*a9fa9459Szrj 		  if (htab->elf.splt != NULL)
3953*a9fa9459Szrj 		    {
3954*a9fa9459Szrj 		      plt_index = h->plt.offset / plt_entry_size - 1;
3955*a9fa9459Szrj 		      off = (plt_index + 3) * 4;
3956*a9fa9459Szrj 		      base_got = htab->elf.sgotplt;
3957*a9fa9459Szrj 		    }
3958*a9fa9459Szrj 		  else
3959*a9fa9459Szrj 		    {
3960*a9fa9459Szrj 		      plt_index = h->plt.offset / plt_entry_size;
3961*a9fa9459Szrj 		      off = plt_index * 4;
3962*a9fa9459Szrj 		      base_got = htab->elf.igotplt;
3963*a9fa9459Szrj 		    }
3964*a9fa9459Szrj 
3965*a9fa9459Szrj 		  if (h->dynindx == -1
3966*a9fa9459Szrj 		      || h->forced_local
3967*a9fa9459Szrj 		      || info->symbolic)
3968*a9fa9459Szrj 		    {
3969*a9fa9459Szrj 		      /* This references the local defitionion.  We must
3970*a9fa9459Szrj 			 initialize this entry in the global offset table.
3971*a9fa9459Szrj 			 Since the offset must always be a multiple of 8,
3972*a9fa9459Szrj 			 we use the least significant bit to record
3973*a9fa9459Szrj 			 whether we have initialized it already.
3974*a9fa9459Szrj 
3975*a9fa9459Szrj 			 When doing a dynamic link, we create a .rela.got
3976*a9fa9459Szrj 			 relocation entry to initialize the value.  This
3977*a9fa9459Szrj 			 is done in the finish_dynamic_symbol routine.	 */
3978*a9fa9459Szrj 		      if ((off & 1) != 0)
3979*a9fa9459Szrj 			off &= ~1;
3980*a9fa9459Szrj 		      else
3981*a9fa9459Szrj 			{
3982*a9fa9459Szrj 			  bfd_put_32 (output_bfd, relocation,
3983*a9fa9459Szrj 				      base_got->contents + off);
3984*a9fa9459Szrj 			  h->got.offset |= 1;
3985*a9fa9459Szrj 			}
3986*a9fa9459Szrj 		    }
3987*a9fa9459Szrj 
3988*a9fa9459Szrj 		  relocation = off;
3989*a9fa9459Szrj 		}
3990*a9fa9459Szrj 	      else
3991*a9fa9459Szrj 		relocation = (base_got->output_section->vma
3992*a9fa9459Szrj 			      + base_got->output_offset + off
3993*a9fa9459Szrj 			      - gotplt->output_section->vma
3994*a9fa9459Szrj 			      - gotplt->output_offset);
3995*a9fa9459Szrj 
3996*a9fa9459Szrj 	      if ((*(contents + rel->r_offset - 1) & 0xc7) == 0x5)
3997*a9fa9459Szrj 		{
3998*a9fa9459Szrj 		  if (bfd_link_pic (info))
3999*a9fa9459Szrj 		    goto disallow_got32;
4000*a9fa9459Szrj 
4001*a9fa9459Szrj 		  /* Add the GOT base if there is no base register.  */
4002*a9fa9459Szrj 		  relocation += (gotplt->output_section->vma
4003*a9fa9459Szrj 				 + gotplt->output_offset);
4004*a9fa9459Szrj 		}
4005*a9fa9459Szrj 	      else if (htab->elf.splt == NULL)
4006*a9fa9459Szrj 		{
4007*a9fa9459Szrj 		  /* Adjust for static executables.  */
4008*a9fa9459Szrj 		  relocation += gotplt->output_offset;
4009*a9fa9459Szrj 		}
4010*a9fa9459Szrj 
4011*a9fa9459Szrj 	      goto do_relocation;
4012*a9fa9459Szrj 	    }
4013*a9fa9459Szrj 
4014*a9fa9459Szrj 	  if (h->plt.offset == (bfd_vma) -1)
4015*a9fa9459Szrj 	    {
4016*a9fa9459Szrj 	      /* Handle static pointers of STT_GNU_IFUNC symbols.  */
4017*a9fa9459Szrj 	      if (r_type == R_386_32
4018*a9fa9459Szrj 		  && (input_section->flags & SEC_CODE) == 0)
4019*a9fa9459Szrj 		goto do_ifunc_pointer;
4020*a9fa9459Szrj 	      goto bad_ifunc_reloc;
4021*a9fa9459Szrj 	    }
4022*a9fa9459Szrj 
4023*a9fa9459Szrj 	  relocation = (plt->output_section->vma
4024*a9fa9459Szrj 			+ plt->output_offset + h->plt.offset);
4025*a9fa9459Szrj 
4026*a9fa9459Szrj 	  switch (r_type)
4027*a9fa9459Szrj 	    {
4028*a9fa9459Szrj 	    default:
4029*a9fa9459Szrj bad_ifunc_reloc:
4030*a9fa9459Szrj 	      if (h->root.root.string)
4031*a9fa9459Szrj 		name = h->root.root.string;
4032*a9fa9459Szrj 	      else
4033*a9fa9459Szrj 		name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4034*a9fa9459Szrj 					 NULL);
4035*a9fa9459Szrj 	      (*_bfd_error_handler)
4036*a9fa9459Szrj 		(_("%B: relocation %s against STT_GNU_IFUNC "
4037*a9fa9459Szrj 		   "symbol `%s' isn't supported"), input_bfd,
4038*a9fa9459Szrj 		 howto->name, name);
4039*a9fa9459Szrj 	      bfd_set_error (bfd_error_bad_value);
4040*a9fa9459Szrj 	      return FALSE;
4041*a9fa9459Szrj 
4042*a9fa9459Szrj 	    case R_386_32:
4043*a9fa9459Szrj 	      /* Generate dynamic relcoation only when there is a
4044*a9fa9459Szrj 		 non-GOT reference in a shared object.  */
4045*a9fa9459Szrj 	      if ((bfd_link_pic (info) && h->non_got_ref)
4046*a9fa9459Szrj 		  || h->plt.offset == (bfd_vma) -1)
4047*a9fa9459Szrj 		{
4048*a9fa9459Szrj 		  Elf_Internal_Rela outrel;
4049*a9fa9459Szrj 		  asection *sreloc;
4050*a9fa9459Szrj 		  bfd_vma offset;
4051*a9fa9459Szrj 
4052*a9fa9459Szrj do_ifunc_pointer:
4053*a9fa9459Szrj 		  /* Need a dynamic relocation to get the real function
4054*a9fa9459Szrj 		     adddress.  */
4055*a9fa9459Szrj 		  offset = _bfd_elf_section_offset (output_bfd,
4056*a9fa9459Szrj 						    info,
4057*a9fa9459Szrj 						    input_section,
4058*a9fa9459Szrj 						    rel->r_offset);
4059*a9fa9459Szrj 		  if (offset == (bfd_vma) -1
4060*a9fa9459Szrj 		      || offset == (bfd_vma) -2)
4061*a9fa9459Szrj 		    abort ();
4062*a9fa9459Szrj 
4063*a9fa9459Szrj 		  outrel.r_offset = (input_section->output_section->vma
4064*a9fa9459Szrj 				     + input_section->output_offset
4065*a9fa9459Szrj 				     + offset);
4066*a9fa9459Szrj 
4067*a9fa9459Szrj 		  if (h->dynindx == -1
4068*a9fa9459Szrj 		      || h->forced_local
4069*a9fa9459Szrj 		      || bfd_link_executable (info))
4070*a9fa9459Szrj 		    {
4071*a9fa9459Szrj 		      /* This symbol is resolved locally.  */
4072*a9fa9459Szrj 		      outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
4073*a9fa9459Szrj 		      bfd_put_32 (output_bfd,
4074*a9fa9459Szrj 				  (h->root.u.def.value
4075*a9fa9459Szrj 				   + h->root.u.def.section->output_section->vma
4076*a9fa9459Szrj 				   + h->root.u.def.section->output_offset),
4077*a9fa9459Szrj 				  contents + offset);
4078*a9fa9459Szrj 		    }
4079*a9fa9459Szrj 		  else
4080*a9fa9459Szrj 		    outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4081*a9fa9459Szrj 
4082*a9fa9459Szrj 		  /* Dynamic relocations are stored in
4083*a9fa9459Szrj 		     1. .rel.ifunc section in PIC object.
4084*a9fa9459Szrj 		     2. .rel.got section in dynamic executable.
4085*a9fa9459Szrj 		     3. .rel.iplt section in static executable.  */
4086*a9fa9459Szrj 		  if (bfd_link_pic (info))
4087*a9fa9459Szrj 		    sreloc = htab->elf.irelifunc;
4088*a9fa9459Szrj 		  else if (htab->elf.splt != NULL)
4089*a9fa9459Szrj 		    sreloc = htab->elf.srelgot;
4090*a9fa9459Szrj 		  else
4091*a9fa9459Szrj 		    sreloc = htab->elf.irelplt;
4092*a9fa9459Szrj 		  elf_append_rel (output_bfd, sreloc, &outrel);
4093*a9fa9459Szrj 
4094*a9fa9459Szrj 		  /* If this reloc is against an external symbol, we
4095*a9fa9459Szrj 		     do not want to fiddle with the addend.  Otherwise,
4096*a9fa9459Szrj 		     we need to include the symbol value so that it
4097*a9fa9459Szrj 		     becomes an addend for the dynamic reloc.  For an
4098*a9fa9459Szrj 		     internal symbol, we have updated addend.  */
4099*a9fa9459Szrj 		  continue;
4100*a9fa9459Szrj 		}
4101*a9fa9459Szrj 	      /* FALLTHROUGH */
4102*a9fa9459Szrj 	    case R_386_PC32:
4103*a9fa9459Szrj 	    case R_386_PLT32:
4104*a9fa9459Szrj 	      goto do_relocation;
4105*a9fa9459Szrj 
4106*a9fa9459Szrj 	    case R_386_GOTOFF:
4107*a9fa9459Szrj 	      relocation -= (gotplt->output_section->vma
4108*a9fa9459Szrj 			     + gotplt->output_offset);
4109*a9fa9459Szrj 	      goto do_relocation;
4110*a9fa9459Szrj 	    }
4111*a9fa9459Szrj 	}
4112*a9fa9459Szrj 
4113*a9fa9459Szrj       eh = (struct elf_i386_link_hash_entry *) h;
4114*a9fa9459Szrj       resolved_to_zero = (eh != NULL
4115*a9fa9459Szrj 			  && UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
4116*a9fa9459Szrj 							      eh->has_got_reloc,
4117*a9fa9459Szrj 							      eh));
4118*a9fa9459Szrj 
4119*a9fa9459Szrj       switch (r_type)
4120*a9fa9459Szrj 	{
4121*a9fa9459Szrj 	case R_386_GOT32X:
4122*a9fa9459Szrj 	  /* Avoid optimizing _DYNAMIC since ld.so may use its
4123*a9fa9459Szrj 	     link-time address.  */
4124*a9fa9459Szrj 	  if (h == htab->elf.hdynamic)
4125*a9fa9459Szrj 	    goto r_386_got32;
4126*a9fa9459Szrj 
4127*a9fa9459Szrj 	  if (bfd_link_pic (info))
4128*a9fa9459Szrj 	    {
4129*a9fa9459Szrj 	      /* It is OK to convert mov to lea and convert indirect
4130*a9fa9459Szrj 		 branch to direct branch.  It is OK to convert adc,
4131*a9fa9459Szrj 		 add, and, cmp, or, sbb, sub, test, xor only when PIC
4132*a9fa9459Szrj 		 is false.   */
4133*a9fa9459Szrj 	      unsigned int opcode, addend;
4134*a9fa9459Szrj 	      addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
4135*a9fa9459Szrj 	      if (addend != 0)
4136*a9fa9459Szrj 		goto r_386_got32;
4137*a9fa9459Szrj 	      opcode = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4138*a9fa9459Szrj 	      if (opcode != 0x8b && opcode != 0xff)
4139*a9fa9459Szrj 		goto r_386_got32;
4140*a9fa9459Szrj 	    }
4141*a9fa9459Szrj 
4142*a9fa9459Szrj 	  /* Resolve "mov GOT[(%reg)], %reg",
4143*a9fa9459Szrj 	     "call/jmp *GOT[(%reg)]", "test %reg, foo@GOT[(%reg)]"
4144*a9fa9459Szrj 	     and "binop foo@GOT[(%reg)], %reg".  */
4145*a9fa9459Szrj 	  if (h == NULL
4146*a9fa9459Szrj 	      || (h->plt.offset == (bfd_vma) -1
4147*a9fa9459Szrj 		  && h->got.offset == (bfd_vma) -1)
4148*a9fa9459Szrj 	      || htab->elf.sgotplt == NULL)
4149*a9fa9459Szrj 	    abort ();
4150*a9fa9459Szrj 
4151*a9fa9459Szrj 	  offplt = (htab->elf.sgotplt->output_section->vma
4152*a9fa9459Szrj 		    + htab->elf.sgotplt->output_offset);
4153*a9fa9459Szrj 
4154*a9fa9459Szrj 	  /* It is relative to .got.plt section.  */
4155*a9fa9459Szrj 	  if (h->got.offset != (bfd_vma) -1)
4156*a9fa9459Szrj 	    /* Use GOT entry.  Mask off the least significant bit in
4157*a9fa9459Szrj 	       GOT offset which may be set by R_386_GOT32 processing
4158*a9fa9459Szrj 	       below.  */
4159*a9fa9459Szrj 	    relocation = (htab->elf.sgot->output_section->vma
4160*a9fa9459Szrj 			  + htab->elf.sgot->output_offset
4161*a9fa9459Szrj 			  + (h->got.offset & ~1) - offplt);
4162*a9fa9459Szrj 	  else
4163*a9fa9459Szrj 	    /* Use GOTPLT entry.  */
4164*a9fa9459Szrj 	    relocation = (h->plt.offset / plt_entry_size - 1 + 3) * 4;
4165*a9fa9459Szrj 
4166*a9fa9459Szrj 	  if (!bfd_link_pic (info))
4167*a9fa9459Szrj 	    {
4168*a9fa9459Szrj 	      /* If not PIC, add the .got.plt section address for
4169*a9fa9459Szrj 		 baseless addressing.  */
4170*a9fa9459Szrj 	      unsigned int modrm;
4171*a9fa9459Szrj 	      modrm = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4172*a9fa9459Szrj 	      if ((modrm & 0xc7) == 0x5)
4173*a9fa9459Szrj 		relocation += offplt;
4174*a9fa9459Szrj 	    }
4175*a9fa9459Szrj 
4176*a9fa9459Szrj 	  unresolved_reloc = FALSE;
4177*a9fa9459Szrj 	  break;
4178*a9fa9459Szrj 
4179*a9fa9459Szrj 	case R_386_GOT32:
4180*a9fa9459Szrj r_386_got32:
4181*a9fa9459Szrj 	  /* Relocation is to the entry for this symbol in the global
4182*a9fa9459Szrj 	     offset table.  */
4183*a9fa9459Szrj 	  if (htab->elf.sgot == NULL)
4184*a9fa9459Szrj 	    abort ();
4185*a9fa9459Szrj 
4186*a9fa9459Szrj 	  if (h != NULL)
4187*a9fa9459Szrj 	    {
4188*a9fa9459Szrj 	      bfd_boolean dyn;
4189*a9fa9459Szrj 
4190*a9fa9459Szrj 	      off = h->got.offset;
4191*a9fa9459Szrj 	      dyn = htab->elf.dynamic_sections_created;
4192*a9fa9459Szrj 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
4193*a9fa9459Szrj 						     bfd_link_pic (info),
4194*a9fa9459Szrj 						     h)
4195*a9fa9459Szrj 		  || (bfd_link_pic (info)
4196*a9fa9459Szrj 		      && SYMBOL_REFERENCES_LOCAL (info, h))
4197*a9fa9459Szrj 		  || (ELF_ST_VISIBILITY (h->other)
4198*a9fa9459Szrj 		      && h->root.type == bfd_link_hash_undefweak))
4199*a9fa9459Szrj 		{
4200*a9fa9459Szrj 		  /* This is actually a static link, or it is a
4201*a9fa9459Szrj 		     -Bsymbolic link and the symbol is defined
4202*a9fa9459Szrj 		     locally, or the symbol was forced to be local
4203*a9fa9459Szrj 		     because of a version file.  We must initialize
4204*a9fa9459Szrj 		     this entry in the global offset table.  Since the
4205*a9fa9459Szrj 		     offset must always be a multiple of 4, we use the
4206*a9fa9459Szrj 		     least significant bit to record whether we have
4207*a9fa9459Szrj 		     initialized it already.
4208*a9fa9459Szrj 
4209*a9fa9459Szrj 		     When doing a dynamic link, we create a .rel.got
4210*a9fa9459Szrj 		     relocation entry to initialize the value.  This
4211*a9fa9459Szrj 		     is done in the finish_dynamic_symbol routine.  */
4212*a9fa9459Szrj 		  if ((off & 1) != 0)
4213*a9fa9459Szrj 		    off &= ~1;
4214*a9fa9459Szrj 		  else
4215*a9fa9459Szrj 		    {
4216*a9fa9459Szrj 		      bfd_put_32 (output_bfd, relocation,
4217*a9fa9459Szrj 				  htab->elf.sgot->contents + off);
4218*a9fa9459Szrj 		      h->got.offset |= 1;
4219*a9fa9459Szrj 		    }
4220*a9fa9459Szrj 		}
4221*a9fa9459Szrj 	      else
4222*a9fa9459Szrj 		unresolved_reloc = FALSE;
4223*a9fa9459Szrj 	    }
4224*a9fa9459Szrj 	  else
4225*a9fa9459Szrj 	    {
4226*a9fa9459Szrj 	      if (local_got_offsets == NULL)
4227*a9fa9459Szrj 		abort ();
4228*a9fa9459Szrj 
4229*a9fa9459Szrj 	      off = local_got_offsets[r_symndx];
4230*a9fa9459Szrj 
4231*a9fa9459Szrj 	      /* The offset must always be a multiple of 4.  We use
4232*a9fa9459Szrj 		 the least significant bit to record whether we have
4233*a9fa9459Szrj 		 already generated the necessary reloc.  */
4234*a9fa9459Szrj 	      if ((off & 1) != 0)
4235*a9fa9459Szrj 		off &= ~1;
4236*a9fa9459Szrj 	      else
4237*a9fa9459Szrj 		{
4238*a9fa9459Szrj 		  bfd_put_32 (output_bfd, relocation,
4239*a9fa9459Szrj 			      htab->elf.sgot->contents + off);
4240*a9fa9459Szrj 
4241*a9fa9459Szrj 		  if (bfd_link_pic (info))
4242*a9fa9459Szrj 		    {
4243*a9fa9459Szrj 		      asection *s;
4244*a9fa9459Szrj 		      Elf_Internal_Rela outrel;
4245*a9fa9459Szrj 
4246*a9fa9459Szrj 		      s = htab->elf.srelgot;
4247*a9fa9459Szrj 		      if (s == NULL)
4248*a9fa9459Szrj 			abort ();
4249*a9fa9459Szrj 
4250*a9fa9459Szrj 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
4251*a9fa9459Szrj 					 + htab->elf.sgot->output_offset
4252*a9fa9459Szrj 					 + off);
4253*a9fa9459Szrj 		      outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4254*a9fa9459Szrj 		      elf_append_rel (output_bfd, s, &outrel);
4255*a9fa9459Szrj 		    }
4256*a9fa9459Szrj 
4257*a9fa9459Szrj 		  local_got_offsets[r_symndx] |= 1;
4258*a9fa9459Szrj 		}
4259*a9fa9459Szrj 	    }
4260*a9fa9459Szrj 
4261*a9fa9459Szrj 	  if (off >= (bfd_vma) -2)
4262*a9fa9459Szrj 	    abort ();
4263*a9fa9459Szrj 
4264*a9fa9459Szrj 	  relocation = (htab->elf.sgot->output_section->vma
4265*a9fa9459Szrj 			+ htab->elf.sgot->output_offset + off);
4266*a9fa9459Szrj 	  if ((*(contents + rel->r_offset - 1) & 0xc7) == 0x5)
4267*a9fa9459Szrj 	    {
4268*a9fa9459Szrj 	      if (bfd_link_pic (info))
4269*a9fa9459Szrj 		{
4270*a9fa9459Szrj 		  /* For PIC, disallow R_386_GOT32 without a base
4271*a9fa9459Szrj 		     register since we don't know what the GOT base
4272*a9fa9459Szrj 		     is.  */
4273*a9fa9459Szrj 		  const char *name;
4274*a9fa9459Szrj 
4275*a9fa9459Szrj disallow_got32:
4276*a9fa9459Szrj 		  if (h == NULL)
4277*a9fa9459Szrj 		    name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4278*a9fa9459Szrj 					     NULL);
4279*a9fa9459Szrj 		  else
4280*a9fa9459Szrj 		    name = h->root.root.string;
4281*a9fa9459Szrj 
4282*a9fa9459Szrj 		  (*_bfd_error_handler)
4283*a9fa9459Szrj 		    (_("%B: direct GOT relocation %s against `%s' without base register can not be used when making a shared object"),
4284*a9fa9459Szrj 		     input_bfd, howto->name, name);
4285*a9fa9459Szrj 		  bfd_set_error (bfd_error_bad_value);
4286*a9fa9459Szrj 		  return FALSE;
4287*a9fa9459Szrj 		}
4288*a9fa9459Szrj 	    }
4289*a9fa9459Szrj 	  else
4290*a9fa9459Szrj 	    {
4291*a9fa9459Szrj 	      /* Subtract the .got.plt section address only with a base
4292*a9fa9459Szrj 		 register.  */
4293*a9fa9459Szrj 	      relocation -= (htab->elf.sgotplt->output_section->vma
4294*a9fa9459Szrj 			     + htab->elf.sgotplt->output_offset);
4295*a9fa9459Szrj 	    }
4296*a9fa9459Szrj 
4297*a9fa9459Szrj 	  break;
4298*a9fa9459Szrj 
4299*a9fa9459Szrj 	case R_386_GOTOFF:
4300*a9fa9459Szrj 	  /* Relocation is relative to the start of the global offset
4301*a9fa9459Szrj 	     table.  */
4302*a9fa9459Szrj 
4303*a9fa9459Szrj 	  /* Check to make sure it isn't a protected function or data
4304*a9fa9459Szrj 	     symbol for shared library since it may not be local when
4305*a9fa9459Szrj 	     used as function address or with copy relocation.  We also
4306*a9fa9459Szrj 	     need to make sure that a symbol is referenced locally.  */
4307*a9fa9459Szrj 	  if (!bfd_link_executable (info) && h)
4308*a9fa9459Szrj 	    {
4309*a9fa9459Szrj 	      if (!h->def_regular)
4310*a9fa9459Szrj 		{
4311*a9fa9459Szrj 		  const char *v;
4312*a9fa9459Szrj 
4313*a9fa9459Szrj 		  switch (ELF_ST_VISIBILITY (h->other))
4314*a9fa9459Szrj 		    {
4315*a9fa9459Szrj 		    case STV_HIDDEN:
4316*a9fa9459Szrj 		      v = _("hidden symbol");
4317*a9fa9459Szrj 		      break;
4318*a9fa9459Szrj 		    case STV_INTERNAL:
4319*a9fa9459Szrj 		      v = _("internal symbol");
4320*a9fa9459Szrj 		      break;
4321*a9fa9459Szrj 		    case STV_PROTECTED:
4322*a9fa9459Szrj 		      v = _("protected symbol");
4323*a9fa9459Szrj 		      break;
4324*a9fa9459Szrj 		    default:
4325*a9fa9459Szrj 		      v = _("symbol");
4326*a9fa9459Szrj 		      break;
4327*a9fa9459Szrj 		    }
4328*a9fa9459Szrj 
4329*a9fa9459Szrj 		  (*_bfd_error_handler)
4330*a9fa9459Szrj 		    (_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
4331*a9fa9459Szrj 		     input_bfd, v, h->root.root.string);
4332*a9fa9459Szrj 		  bfd_set_error (bfd_error_bad_value);
4333*a9fa9459Szrj 		  return FALSE;
4334*a9fa9459Szrj 		}
4335*a9fa9459Szrj 	      else if (!SYMBOL_REFERENCES_LOCAL (info, h)
4336*a9fa9459Szrj 		       && (h->type == STT_FUNC
4337*a9fa9459Szrj 			   || h->type == STT_OBJECT)
4338*a9fa9459Szrj 		       && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
4339*a9fa9459Szrj 		{
4340*a9fa9459Szrj 		  (*_bfd_error_handler)
4341*a9fa9459Szrj 		    (_("%B: relocation R_386_GOTOFF against protected %s `%s' can not be used when making a shared object"),
4342*a9fa9459Szrj 		     input_bfd,
4343*a9fa9459Szrj 		     h->type == STT_FUNC ? "function" : "data",
4344*a9fa9459Szrj 		     h->root.root.string);
4345*a9fa9459Szrj 		  bfd_set_error (bfd_error_bad_value);
4346*a9fa9459Szrj 		  return FALSE;
4347*a9fa9459Szrj 		}
4348*a9fa9459Szrj 	    }
4349*a9fa9459Szrj 
4350*a9fa9459Szrj 	  /* Note that sgot is not involved in this
4351*a9fa9459Szrj 	     calculation.  We always want the start of .got.plt.  If we
4352*a9fa9459Szrj 	     defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
4353*a9fa9459Szrj 	     permitted by the ABI, we might have to change this
4354*a9fa9459Szrj 	     calculation.  */
4355*a9fa9459Szrj 	  relocation -= htab->elf.sgotplt->output_section->vma
4356*a9fa9459Szrj 			+ htab->elf.sgotplt->output_offset;
4357*a9fa9459Szrj 	  break;
4358*a9fa9459Szrj 
4359*a9fa9459Szrj 	case R_386_GOTPC:
4360*a9fa9459Szrj 	  /* Use global offset table as symbol value.  */
4361*a9fa9459Szrj 	  relocation = htab->elf.sgotplt->output_section->vma
4362*a9fa9459Szrj 		       + htab->elf.sgotplt->output_offset;
4363*a9fa9459Szrj 	  unresolved_reloc = FALSE;
4364*a9fa9459Szrj 	  break;
4365*a9fa9459Szrj 
4366*a9fa9459Szrj 	case R_386_PLT32:
4367*a9fa9459Szrj 	  /* Relocation is to the entry for this symbol in the
4368*a9fa9459Szrj 	     procedure linkage table.  */
4369*a9fa9459Szrj 
4370*a9fa9459Szrj 	  /* Resolve a PLT32 reloc against a local symbol directly,
4371*a9fa9459Szrj 	     without using the procedure linkage table.  */
4372*a9fa9459Szrj 	  if (h == NULL)
4373*a9fa9459Szrj 	    break;
4374*a9fa9459Szrj 
4375*a9fa9459Szrj 	  if ((h->plt.offset == (bfd_vma) -1
4376*a9fa9459Szrj 	       && eh->plt_got.offset == (bfd_vma) -1)
4377*a9fa9459Szrj 	      || htab->elf.splt == NULL)
4378*a9fa9459Szrj 	    {
4379*a9fa9459Szrj 	      /* We didn't make a PLT entry for this symbol.  This
4380*a9fa9459Szrj 		 happens when statically linking PIC code, or when
4381*a9fa9459Szrj 		 using -Bsymbolic.  */
4382*a9fa9459Szrj 	      break;
4383*a9fa9459Szrj 	    }
4384*a9fa9459Szrj 
4385*a9fa9459Szrj 	  if (h->plt.offset != (bfd_vma) -1)
4386*a9fa9459Szrj 	    {
4387*a9fa9459Szrj 	      resolved_plt = htab->elf.splt;
4388*a9fa9459Szrj 	      plt_offset = h->plt.offset;
4389*a9fa9459Szrj 	    }
4390*a9fa9459Szrj 	  else
4391*a9fa9459Szrj 	    {
4392*a9fa9459Szrj 	      resolved_plt = htab->plt_got;
4393*a9fa9459Szrj 	      plt_offset = eh->plt_got.offset;
4394*a9fa9459Szrj 	    }
4395*a9fa9459Szrj 
4396*a9fa9459Szrj 	  relocation = (resolved_plt->output_section->vma
4397*a9fa9459Szrj 			+ resolved_plt->output_offset
4398*a9fa9459Szrj 			+ plt_offset);
4399*a9fa9459Szrj 	  unresolved_reloc = FALSE;
4400*a9fa9459Szrj 	  break;
4401*a9fa9459Szrj 
4402*a9fa9459Szrj 	case R_386_SIZE32:
4403*a9fa9459Szrj 	  /* Set to symbol size.  */
4404*a9fa9459Szrj 	  relocation = st_size;
4405*a9fa9459Szrj 	  /* Fall through.  */
4406*a9fa9459Szrj 
4407*a9fa9459Szrj 	case R_386_32:
4408*a9fa9459Szrj 	case R_386_PC32:
4409*a9fa9459Szrj 	  if ((input_section->flags & SEC_ALLOC) == 0
4410*a9fa9459Szrj 	      || is_vxworks_tls)
4411*a9fa9459Szrj 	    break;
4412*a9fa9459Szrj 
4413*a9fa9459Szrj 	  /* Copy dynamic function pointer relocations.  Don't generate
4414*a9fa9459Szrj 	     dynamic relocations against resolved undefined weak symbols
4415*a9fa9459Szrj 	     in PIE, except for R_386_PC32.  */
4416*a9fa9459Szrj 	  if ((bfd_link_pic (info)
4417*a9fa9459Szrj 	       && (h == NULL
4418*a9fa9459Szrj 		   || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
4419*a9fa9459Szrj 			&& (!resolved_to_zero
4420*a9fa9459Szrj 			    || r_type == R_386_PC32))
4421*a9fa9459Szrj 		       || h->root.type != bfd_link_hash_undefweak))
4422*a9fa9459Szrj 	       && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
4423*a9fa9459Szrj 		   || !SYMBOL_CALLS_LOCAL (info, h)))
4424*a9fa9459Szrj 	      || (ELIMINATE_COPY_RELOCS
4425*a9fa9459Szrj 		  && !bfd_link_pic (info)
4426*a9fa9459Szrj 		  && h != NULL
4427*a9fa9459Szrj 		  && h->dynindx != -1
4428*a9fa9459Szrj 		  && (!h->non_got_ref
4429*a9fa9459Szrj 		      || eh->func_pointer_refcount > 0
4430*a9fa9459Szrj 		      || (h->root.type == bfd_link_hash_undefweak
4431*a9fa9459Szrj 			  && !resolved_to_zero))
4432*a9fa9459Szrj 		  && ((h->def_dynamic && !h->def_regular)
4433*a9fa9459Szrj 		      /* Undefined weak symbol is bound locally when
4434*a9fa9459Szrj 			 PIC is false.  */
4435*a9fa9459Szrj 		      || h->root.type == bfd_link_hash_undefweak)))
4436*a9fa9459Szrj 	    {
4437*a9fa9459Szrj 	      Elf_Internal_Rela outrel;
4438*a9fa9459Szrj 	      bfd_boolean skip, relocate;
4439*a9fa9459Szrj 	      asection *sreloc;
4440*a9fa9459Szrj 
4441*a9fa9459Szrj 	      /* When generating a shared object, these relocations
4442*a9fa9459Szrj 		 are copied into the output file to be resolved at run
4443*a9fa9459Szrj 		 time.  */
4444*a9fa9459Szrj 
4445*a9fa9459Szrj 	      skip = FALSE;
4446*a9fa9459Szrj 	      relocate = FALSE;
4447*a9fa9459Szrj 
4448*a9fa9459Szrj 	      outrel.r_offset =
4449*a9fa9459Szrj 		_bfd_elf_section_offset (output_bfd, info, input_section,
4450*a9fa9459Szrj 					 rel->r_offset);
4451*a9fa9459Szrj 	      if (outrel.r_offset == (bfd_vma) -1)
4452*a9fa9459Szrj 		skip = TRUE;
4453*a9fa9459Szrj 	      else if (outrel.r_offset == (bfd_vma) -2)
4454*a9fa9459Szrj 		skip = TRUE, relocate = TRUE;
4455*a9fa9459Szrj 	      outrel.r_offset += (input_section->output_section->vma
4456*a9fa9459Szrj 				  + input_section->output_offset);
4457*a9fa9459Szrj 
4458*a9fa9459Szrj 	      if (skip)
4459*a9fa9459Szrj 		memset (&outrel, 0, sizeof outrel);
4460*a9fa9459Szrj 	      else if (h != NULL
4461*a9fa9459Szrj 		       && h->dynindx != -1
4462*a9fa9459Szrj 		       && (r_type == R_386_PC32
4463*a9fa9459Szrj 			   || !(bfd_link_executable (info)
4464*a9fa9459Szrj 				|| SYMBOLIC_BIND (info, h))
4465*a9fa9459Szrj 			   || !h->def_regular))
4466*a9fa9459Szrj 		outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
4467*a9fa9459Szrj 	      else
4468*a9fa9459Szrj 		{
4469*a9fa9459Szrj 		  /* This symbol is local, or marked to become local.  */
4470*a9fa9459Szrj 		  relocate = TRUE;
4471*a9fa9459Szrj 		  outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4472*a9fa9459Szrj 		}
4473*a9fa9459Szrj 
4474*a9fa9459Szrj 	      sreloc = elf_section_data (input_section)->sreloc;
4475*a9fa9459Szrj 
4476*a9fa9459Szrj 	      if (sreloc == NULL || sreloc->contents == NULL)
4477*a9fa9459Szrj 		{
4478*a9fa9459Szrj 		  r = bfd_reloc_notsupported;
4479*a9fa9459Szrj 		  goto check_relocation_error;
4480*a9fa9459Szrj 		}
4481*a9fa9459Szrj 
4482*a9fa9459Szrj 	      elf_append_rel (output_bfd, sreloc, &outrel);
4483*a9fa9459Szrj 
4484*a9fa9459Szrj 	      /* If this reloc is against an external symbol, we do
4485*a9fa9459Szrj 		 not want to fiddle with the addend.  Otherwise, we
4486*a9fa9459Szrj 		 need to include the symbol value so that it becomes
4487*a9fa9459Szrj 		 an addend for the dynamic reloc.  */
4488*a9fa9459Szrj 	      if (! relocate)
4489*a9fa9459Szrj 		continue;
4490*a9fa9459Szrj 	    }
4491*a9fa9459Szrj 	  break;
4492*a9fa9459Szrj 
4493*a9fa9459Szrj 	case R_386_TLS_IE:
4494*a9fa9459Szrj 	  if (!bfd_link_executable (info))
4495*a9fa9459Szrj 	    {
4496*a9fa9459Szrj 	      Elf_Internal_Rela outrel;
4497*a9fa9459Szrj 	      asection *sreloc;
4498*a9fa9459Szrj 
4499*a9fa9459Szrj 	      outrel.r_offset = rel->r_offset
4500*a9fa9459Szrj 				+ input_section->output_section->vma
4501*a9fa9459Szrj 				+ input_section->output_offset;
4502*a9fa9459Szrj 	      outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
4503*a9fa9459Szrj 	      sreloc = elf_section_data (input_section)->sreloc;
4504*a9fa9459Szrj 	      if (sreloc == NULL)
4505*a9fa9459Szrj 		abort ();
4506*a9fa9459Szrj 	      elf_append_rel (output_bfd, sreloc, &outrel);
4507*a9fa9459Szrj 	    }
4508*a9fa9459Szrj 	  /* Fall through */
4509*a9fa9459Szrj 
4510*a9fa9459Szrj 	case R_386_TLS_GD:
4511*a9fa9459Szrj 	case R_386_TLS_GOTDESC:
4512*a9fa9459Szrj 	case R_386_TLS_DESC_CALL:
4513*a9fa9459Szrj 	case R_386_TLS_IE_32:
4514*a9fa9459Szrj 	case R_386_TLS_GOTIE:
4515*a9fa9459Szrj 	  tls_type = GOT_UNKNOWN;
4516*a9fa9459Szrj 	  if (h == NULL && local_got_offsets)
4517*a9fa9459Szrj 	    tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
4518*a9fa9459Szrj 	  else if (h != NULL)
4519*a9fa9459Szrj 	    tls_type = elf_i386_hash_entry(h)->tls_type;
4520*a9fa9459Szrj 	  if (tls_type == GOT_TLS_IE)
4521*a9fa9459Szrj 	    tls_type = GOT_TLS_IE_NEG;
4522*a9fa9459Szrj 
4523*a9fa9459Szrj 	  if (! elf_i386_tls_transition (info, input_bfd,
4524*a9fa9459Szrj 					 input_section, contents,
4525*a9fa9459Szrj 					 symtab_hdr, sym_hashes,
4526*a9fa9459Szrj 					 &r_type, tls_type, rel,
4527*a9fa9459Szrj 					 relend, h, r_symndx, TRUE))
4528*a9fa9459Szrj 	    return FALSE;
4529*a9fa9459Szrj 
4530*a9fa9459Szrj 	  if (r_type == R_386_TLS_LE_32)
4531*a9fa9459Szrj 	    {
4532*a9fa9459Szrj 	      BFD_ASSERT (! unresolved_reloc);
4533*a9fa9459Szrj 	      if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4534*a9fa9459Szrj 		{
4535*a9fa9459Szrj 		  unsigned int type;
4536*a9fa9459Szrj 		  bfd_vma roff;
4537*a9fa9459Szrj 
4538*a9fa9459Szrj 		  /* GD->LE transition.  */
4539*a9fa9459Szrj 		  type = *(contents + rel->r_offset - 2);
4540*a9fa9459Szrj 		  if (type == 0x04)
4541*a9fa9459Szrj 		    {
4542*a9fa9459Szrj 		      /* Change
4543*a9fa9459Szrj 				leal foo@tlsgd(,%ebx,1), %eax
4544*a9fa9459Szrj 				call ___tls_get_addr@PLT
4545*a9fa9459Szrj 			 into:
4546*a9fa9459Szrj 				movl %gs:0, %eax
4547*a9fa9459Szrj 				subl $foo@tpoff, %eax
4548*a9fa9459Szrj 			 (6 byte form of subl).  */
4549*a9fa9459Szrj 		      roff = rel->r_offset + 5;
4550*a9fa9459Szrj 		    }
4551*a9fa9459Szrj 		  else
4552*a9fa9459Szrj 		    {
4553*a9fa9459Szrj 		      /* Change
4554*a9fa9459Szrj 				leal foo@tlsgd(%ebx), %eax
4555*a9fa9459Szrj 				call ___tls_get_addr@PLT
4556*a9fa9459Szrj 				nop
4557*a9fa9459Szrj 			 or
4558*a9fa9459Szrj 				leal foo@tlsgd(%reg), %eax
4559*a9fa9459Szrj 				call *___tls_get_addr@GOT(%reg)
4560*a9fa9459Szrj 				which may be converted to
4561*a9fa9459Szrj 				addr32 call ___tls_get_addr
4562*a9fa9459Szrj 			 into:
4563*a9fa9459Szrj 				movl %gs:0, %eax; subl $foo@tpoff, %eax
4564*a9fa9459Szrj 			 (6 byte form of subl).  */
4565*a9fa9459Szrj 		      roff = rel->r_offset + 6;
4566*a9fa9459Szrj 		    }
4567*a9fa9459Szrj 		  memcpy (contents + roff - 8,
4568*a9fa9459Szrj 			  "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
4569*a9fa9459Szrj 		  bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4570*a9fa9459Szrj 			      contents + roff);
4571*a9fa9459Szrj 		  /* Skip R_386_PC32, R_386_PLT32 and R_386_GOT32X.  */
4572*a9fa9459Szrj 		  rel++;
4573*a9fa9459Szrj 		  wrel++;
4574*a9fa9459Szrj 		  continue;
4575*a9fa9459Szrj 		}
4576*a9fa9459Szrj 	      else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4577*a9fa9459Szrj 		{
4578*a9fa9459Szrj 		  /* GDesc -> LE transition.
4579*a9fa9459Szrj 		     It's originally something like:
4580*a9fa9459Szrj 		     leal x@tlsdesc(%ebx), %eax
4581*a9fa9459Szrj 
4582*a9fa9459Szrj 		     leal x@ntpoff, %eax
4583*a9fa9459Szrj 
4584*a9fa9459Szrj 		     Registers other than %eax may be set up here.  */
4585*a9fa9459Szrj 
4586*a9fa9459Szrj 		  unsigned int val;
4587*a9fa9459Szrj 		  bfd_vma roff;
4588*a9fa9459Szrj 
4589*a9fa9459Szrj 		  roff = rel->r_offset;
4590*a9fa9459Szrj 		  val = bfd_get_8 (input_bfd, contents + roff - 1);
4591*a9fa9459Szrj 
4592*a9fa9459Szrj 		  /* Now modify the instruction as appropriate.  */
4593*a9fa9459Szrj 		  /* aoliva FIXME: remove the above and xor the byte
4594*a9fa9459Szrj 		     below with 0x86.  */
4595*a9fa9459Szrj 		  bfd_put_8 (output_bfd, val ^ 0x86,
4596*a9fa9459Szrj 			     contents + roff - 1);
4597*a9fa9459Szrj 		  bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4598*a9fa9459Szrj 			      contents + roff);
4599*a9fa9459Szrj 		  continue;
4600*a9fa9459Szrj 		}
4601*a9fa9459Szrj 	      else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4602*a9fa9459Szrj 		{
4603*a9fa9459Szrj 		  /* GDesc -> LE transition.
4604*a9fa9459Szrj 		     It's originally:
4605*a9fa9459Szrj 		     call *(%eax)
4606*a9fa9459Szrj 		     Turn it into:
4607*a9fa9459Szrj 		     xchg %ax,%ax  */
4608*a9fa9459Szrj 
4609*a9fa9459Szrj 		  bfd_vma roff;
4610*a9fa9459Szrj 
4611*a9fa9459Szrj 		  roff = rel->r_offset;
4612*a9fa9459Szrj 		  bfd_put_8 (output_bfd, 0x66, contents + roff);
4613*a9fa9459Szrj 		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4614*a9fa9459Szrj 		  continue;
4615*a9fa9459Szrj 		}
4616*a9fa9459Szrj 	      else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
4617*a9fa9459Szrj 		{
4618*a9fa9459Szrj 		  unsigned int val;
4619*a9fa9459Szrj 
4620*a9fa9459Szrj 		  /* IE->LE transition:
4621*a9fa9459Szrj 		     Originally it can be one of:
4622*a9fa9459Szrj 		     movl foo, %eax
4623*a9fa9459Szrj 		     movl foo, %reg
4624*a9fa9459Szrj 		     addl foo, %reg
4625*a9fa9459Szrj 		     We change it into:
4626*a9fa9459Szrj 		     movl $foo, %eax
4627*a9fa9459Szrj 		     movl $foo, %reg
4628*a9fa9459Szrj 		     addl $foo, %reg.  */
4629*a9fa9459Szrj 		  val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4630*a9fa9459Szrj 		  if (val == 0xa1)
4631*a9fa9459Szrj 		    {
4632*a9fa9459Szrj 		      /* movl foo, %eax.  */
4633*a9fa9459Szrj 		      bfd_put_8 (output_bfd, 0xb8,
4634*a9fa9459Szrj 				 contents + rel->r_offset - 1);
4635*a9fa9459Szrj 		    }
4636*a9fa9459Szrj 		  else
4637*a9fa9459Szrj 		    {
4638*a9fa9459Szrj 		      unsigned int type;
4639*a9fa9459Szrj 
4640*a9fa9459Szrj 		      type = bfd_get_8 (input_bfd,
4641*a9fa9459Szrj 					contents + rel->r_offset - 2);
4642*a9fa9459Szrj 		      switch (type)
4643*a9fa9459Szrj 			{
4644*a9fa9459Szrj 			case 0x8b:
4645*a9fa9459Szrj 			  /* movl */
4646*a9fa9459Szrj 			  bfd_put_8 (output_bfd, 0xc7,
4647*a9fa9459Szrj 				     contents + rel->r_offset - 2);
4648*a9fa9459Szrj 			  bfd_put_8 (output_bfd,
4649*a9fa9459Szrj 				     0xc0 | ((val >> 3) & 7),
4650*a9fa9459Szrj 				     contents + rel->r_offset - 1);
4651*a9fa9459Szrj 			  break;
4652*a9fa9459Szrj 			case 0x03:
4653*a9fa9459Szrj 			  /* addl */
4654*a9fa9459Szrj 			  bfd_put_8 (output_bfd, 0x81,
4655*a9fa9459Szrj 				     contents + rel->r_offset - 2);
4656*a9fa9459Szrj 			  bfd_put_8 (output_bfd,
4657*a9fa9459Szrj 				     0xc0 | ((val >> 3) & 7),
4658*a9fa9459Szrj 				     contents + rel->r_offset - 1);
4659*a9fa9459Szrj 			  break;
4660*a9fa9459Szrj 			default:
4661*a9fa9459Szrj 			  BFD_FAIL ();
4662*a9fa9459Szrj 			  break;
4663*a9fa9459Szrj 			}
4664*a9fa9459Szrj 		    }
4665*a9fa9459Szrj 		  bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4666*a9fa9459Szrj 			      contents + rel->r_offset);
4667*a9fa9459Szrj 		  continue;
4668*a9fa9459Szrj 		}
4669*a9fa9459Szrj 	      else
4670*a9fa9459Szrj 		{
4671*a9fa9459Szrj 		  unsigned int val, type;
4672*a9fa9459Szrj 
4673*a9fa9459Szrj 		  /* {IE_32,GOTIE}->LE transition:
4674*a9fa9459Szrj 		     Originally it can be one of:
4675*a9fa9459Szrj 		     subl foo(%reg1), %reg2
4676*a9fa9459Szrj 		     movl foo(%reg1), %reg2
4677*a9fa9459Szrj 		     addl foo(%reg1), %reg2
4678*a9fa9459Szrj 		     We change it into:
4679*a9fa9459Szrj 		     subl $foo, %reg2
4680*a9fa9459Szrj 		     movl $foo, %reg2 (6 byte form)
4681*a9fa9459Szrj 		     addl $foo, %reg2.  */
4682*a9fa9459Szrj 		  type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
4683*a9fa9459Szrj 		  val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
4684*a9fa9459Szrj 		  if (type == 0x8b)
4685*a9fa9459Szrj 		    {
4686*a9fa9459Szrj 		      /* movl */
4687*a9fa9459Szrj 		      bfd_put_8 (output_bfd, 0xc7,
4688*a9fa9459Szrj 				 contents + rel->r_offset - 2);
4689*a9fa9459Szrj 		      bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4690*a9fa9459Szrj 				 contents + rel->r_offset - 1);
4691*a9fa9459Szrj 		    }
4692*a9fa9459Szrj 		  else if (type == 0x2b)
4693*a9fa9459Szrj 		    {
4694*a9fa9459Szrj 		      /* subl */
4695*a9fa9459Szrj 		      bfd_put_8 (output_bfd, 0x81,
4696*a9fa9459Szrj 				 contents + rel->r_offset - 2);
4697*a9fa9459Szrj 		      bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
4698*a9fa9459Szrj 				 contents + rel->r_offset - 1);
4699*a9fa9459Szrj 		    }
4700*a9fa9459Szrj 		  else if (type == 0x03)
4701*a9fa9459Szrj 		    {
4702*a9fa9459Szrj 		      /* addl */
4703*a9fa9459Szrj 		      bfd_put_8 (output_bfd, 0x81,
4704*a9fa9459Szrj 				 contents + rel->r_offset - 2);
4705*a9fa9459Szrj 		      bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
4706*a9fa9459Szrj 				 contents + rel->r_offset - 1);
4707*a9fa9459Szrj 		    }
4708*a9fa9459Szrj 		  else
4709*a9fa9459Szrj 		    BFD_FAIL ();
4710*a9fa9459Szrj 		  if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
4711*a9fa9459Szrj 		    bfd_put_32 (output_bfd, -elf_i386_tpoff (info, relocation),
4712*a9fa9459Szrj 				contents + rel->r_offset);
4713*a9fa9459Szrj 		  else
4714*a9fa9459Szrj 		    bfd_put_32 (output_bfd, elf_i386_tpoff (info, relocation),
4715*a9fa9459Szrj 				contents + rel->r_offset);
4716*a9fa9459Szrj 		  continue;
4717*a9fa9459Szrj 		}
4718*a9fa9459Szrj 	    }
4719*a9fa9459Szrj 
4720*a9fa9459Szrj 	  if (htab->elf.sgot == NULL)
4721*a9fa9459Szrj 	    abort ();
4722*a9fa9459Szrj 
4723*a9fa9459Szrj 	  if (h != NULL)
4724*a9fa9459Szrj 	    {
4725*a9fa9459Szrj 	      off = h->got.offset;
4726*a9fa9459Szrj 	      offplt = elf_i386_hash_entry (h)->tlsdesc_got;
4727*a9fa9459Szrj 	    }
4728*a9fa9459Szrj 	  else
4729*a9fa9459Szrj 	    {
4730*a9fa9459Szrj 	      if (local_got_offsets == NULL)
4731*a9fa9459Szrj 		abort ();
4732*a9fa9459Szrj 
4733*a9fa9459Szrj 	      off = local_got_offsets[r_symndx];
4734*a9fa9459Szrj 	      offplt = local_tlsdesc_gotents[r_symndx];
4735*a9fa9459Szrj 	    }
4736*a9fa9459Szrj 
4737*a9fa9459Szrj 	  if ((off & 1) != 0)
4738*a9fa9459Szrj 	    off &= ~1;
4739*a9fa9459Szrj 	  else
4740*a9fa9459Szrj 	    {
4741*a9fa9459Szrj 	      Elf_Internal_Rela outrel;
4742*a9fa9459Szrj 	      int dr_type;
4743*a9fa9459Szrj 	      asection *sreloc;
4744*a9fa9459Szrj 
4745*a9fa9459Szrj 	      if (htab->elf.srelgot == NULL)
4746*a9fa9459Szrj 		abort ();
4747*a9fa9459Szrj 
4748*a9fa9459Szrj 	      indx = h && h->dynindx != -1 ? h->dynindx : 0;
4749*a9fa9459Szrj 
4750*a9fa9459Szrj 	      if (GOT_TLS_GDESC_P (tls_type))
4751*a9fa9459Szrj 		{
4752*a9fa9459Szrj 		  bfd_byte *loc;
4753*a9fa9459Szrj 		  outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
4754*a9fa9459Szrj 		  BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
4755*a9fa9459Szrj 			      <= htab->elf.sgotplt->size);
4756*a9fa9459Szrj 		  outrel.r_offset = (htab->elf.sgotplt->output_section->vma
4757*a9fa9459Szrj 				     + htab->elf.sgotplt->output_offset
4758*a9fa9459Szrj 				     + offplt
4759*a9fa9459Szrj 				     + htab->sgotplt_jump_table_size);
4760*a9fa9459Szrj 		  sreloc = htab->elf.srelplt;
4761*a9fa9459Szrj 		  loc = sreloc->contents;
4762*a9fa9459Szrj 		  loc += (htab->next_tls_desc_index++
4763*a9fa9459Szrj 			  * sizeof (Elf32_External_Rel));
4764*a9fa9459Szrj 		  BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
4765*a9fa9459Szrj 			      <= sreloc->contents + sreloc->size);
4766*a9fa9459Szrj 		  bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
4767*a9fa9459Szrj 		  if (indx == 0)
4768*a9fa9459Szrj 		    {
4769*a9fa9459Szrj 		      BFD_ASSERT (! unresolved_reloc);
4770*a9fa9459Szrj 		      bfd_put_32 (output_bfd,
4771*a9fa9459Szrj 				  relocation - elf_i386_dtpoff_base (info),
4772*a9fa9459Szrj 				  htab->elf.sgotplt->contents + offplt
4773*a9fa9459Szrj 				  + htab->sgotplt_jump_table_size + 4);
4774*a9fa9459Szrj 		    }
4775*a9fa9459Szrj 		  else
4776*a9fa9459Szrj 		    {
4777*a9fa9459Szrj 		      bfd_put_32 (output_bfd, 0,
4778*a9fa9459Szrj 				  htab->elf.sgotplt->contents + offplt
4779*a9fa9459Szrj 				  + htab->sgotplt_jump_table_size + 4);
4780*a9fa9459Szrj 		    }
4781*a9fa9459Szrj 		}
4782*a9fa9459Szrj 
4783*a9fa9459Szrj 	      sreloc = htab->elf.srelgot;
4784*a9fa9459Szrj 
4785*a9fa9459Szrj 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
4786*a9fa9459Szrj 				 + htab->elf.sgot->output_offset + off);
4787*a9fa9459Szrj 
4788*a9fa9459Szrj 	      if (GOT_TLS_GD_P (tls_type))
4789*a9fa9459Szrj 		dr_type = R_386_TLS_DTPMOD32;
4790*a9fa9459Szrj 	      else if (GOT_TLS_GDESC_P (tls_type))
4791*a9fa9459Szrj 		goto dr_done;
4792*a9fa9459Szrj 	      else if (tls_type == GOT_TLS_IE_POS)
4793*a9fa9459Szrj 		dr_type = R_386_TLS_TPOFF;
4794*a9fa9459Szrj 	      else
4795*a9fa9459Szrj 		dr_type = R_386_TLS_TPOFF32;
4796*a9fa9459Szrj 
4797*a9fa9459Szrj 	      if (dr_type == R_386_TLS_TPOFF && indx == 0)
4798*a9fa9459Szrj 		bfd_put_32 (output_bfd,
4799*a9fa9459Szrj 			    relocation - elf_i386_dtpoff_base (info),
4800*a9fa9459Szrj 			    htab->elf.sgot->contents + off);
4801*a9fa9459Szrj 	      else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
4802*a9fa9459Szrj 		bfd_put_32 (output_bfd,
4803*a9fa9459Szrj 			    elf_i386_dtpoff_base (info) - relocation,
4804*a9fa9459Szrj 			    htab->elf.sgot->contents + off);
4805*a9fa9459Szrj 	      else if (dr_type != R_386_TLS_DESC)
4806*a9fa9459Szrj 		bfd_put_32 (output_bfd, 0,
4807*a9fa9459Szrj 			    htab->elf.sgot->contents + off);
4808*a9fa9459Szrj 	      outrel.r_info = ELF32_R_INFO (indx, dr_type);
4809*a9fa9459Szrj 
4810*a9fa9459Szrj 	      elf_append_rel (output_bfd, sreloc, &outrel);
4811*a9fa9459Szrj 
4812*a9fa9459Szrj 	      if (GOT_TLS_GD_P (tls_type))
4813*a9fa9459Szrj 		{
4814*a9fa9459Szrj 		  if (indx == 0)
4815*a9fa9459Szrj 		    {
4816*a9fa9459Szrj 	    	      BFD_ASSERT (! unresolved_reloc);
4817*a9fa9459Szrj 		      bfd_put_32 (output_bfd,
4818*a9fa9459Szrj 				  relocation - elf_i386_dtpoff_base (info),
4819*a9fa9459Szrj 				  htab->elf.sgot->contents + off + 4);
4820*a9fa9459Szrj 		    }
4821*a9fa9459Szrj 		  else
4822*a9fa9459Szrj 		    {
4823*a9fa9459Szrj 		      bfd_put_32 (output_bfd, 0,
4824*a9fa9459Szrj 				  htab->elf.sgot->contents + off + 4);
4825*a9fa9459Szrj 		      outrel.r_info = ELF32_R_INFO (indx,
4826*a9fa9459Szrj 						    R_386_TLS_DTPOFF32);
4827*a9fa9459Szrj 		      outrel.r_offset += 4;
4828*a9fa9459Szrj 		      elf_append_rel (output_bfd, sreloc, &outrel);
4829*a9fa9459Szrj 		    }
4830*a9fa9459Szrj 		}
4831*a9fa9459Szrj 	      else if (tls_type == GOT_TLS_IE_BOTH)
4832*a9fa9459Szrj 		{
4833*a9fa9459Szrj 		  bfd_put_32 (output_bfd,
4834*a9fa9459Szrj 			      (indx == 0
4835*a9fa9459Szrj 			       ? relocation - elf_i386_dtpoff_base (info)
4836*a9fa9459Szrj 			       : 0),
4837*a9fa9459Szrj 			      htab->elf.sgot->contents + off + 4);
4838*a9fa9459Szrj 		  outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
4839*a9fa9459Szrj 		  outrel.r_offset += 4;
4840*a9fa9459Szrj 		  elf_append_rel (output_bfd, sreloc, &outrel);
4841*a9fa9459Szrj 		}
4842*a9fa9459Szrj 
4843*a9fa9459Szrj 	    dr_done:
4844*a9fa9459Szrj 	      if (h != NULL)
4845*a9fa9459Szrj 		h->got.offset |= 1;
4846*a9fa9459Szrj 	      else
4847*a9fa9459Szrj 		local_got_offsets[r_symndx] |= 1;
4848*a9fa9459Szrj 	    }
4849*a9fa9459Szrj 
4850*a9fa9459Szrj 	  if (off >= (bfd_vma) -2
4851*a9fa9459Szrj 	      && ! GOT_TLS_GDESC_P (tls_type))
4852*a9fa9459Szrj 	    abort ();
4853*a9fa9459Szrj 	  if (r_type == R_386_TLS_GOTDESC
4854*a9fa9459Szrj 	      || r_type == R_386_TLS_DESC_CALL)
4855*a9fa9459Szrj 	    {
4856*a9fa9459Szrj 	      relocation = htab->sgotplt_jump_table_size + offplt;
4857*a9fa9459Szrj 	      unresolved_reloc = FALSE;
4858*a9fa9459Szrj 	    }
4859*a9fa9459Szrj 	  else if (r_type == ELF32_R_TYPE (rel->r_info))
4860*a9fa9459Szrj 	    {
4861*a9fa9459Szrj 	      bfd_vma g_o_t = htab->elf.sgotplt->output_section->vma
4862*a9fa9459Szrj 			      + htab->elf.sgotplt->output_offset;
4863*a9fa9459Szrj 	      relocation = htab->elf.sgot->output_section->vma
4864*a9fa9459Szrj 		+ htab->elf.sgot->output_offset + off - g_o_t;
4865*a9fa9459Szrj 	      if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
4866*a9fa9459Szrj 		  && tls_type == GOT_TLS_IE_BOTH)
4867*a9fa9459Szrj 		relocation += 4;
4868*a9fa9459Szrj 	      if (r_type == R_386_TLS_IE)
4869*a9fa9459Szrj 		relocation += g_o_t;
4870*a9fa9459Szrj 	      unresolved_reloc = FALSE;
4871*a9fa9459Szrj 	    }
4872*a9fa9459Szrj 	  else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
4873*a9fa9459Szrj 	    {
4874*a9fa9459Szrj 	      unsigned int val, type;
4875*a9fa9459Szrj 	      bfd_vma roff;
4876*a9fa9459Szrj 
4877*a9fa9459Szrj 	      /* GD->IE transition.  */
4878*a9fa9459Szrj 	      type = *(contents + rel->r_offset - 2);
4879*a9fa9459Szrj 	      val = *(contents + rel->r_offset - 1);
4880*a9fa9459Szrj 	      if (type == 0x04)
4881*a9fa9459Szrj 		{
4882*a9fa9459Szrj 		  /* Change
4883*a9fa9459Szrj 			leal foo@tlsgd(,%ebx,1), %eax
4884*a9fa9459Szrj 			call ___tls_get_addr@PLT
4885*a9fa9459Szrj 		     into:
4886*a9fa9459Szrj 			movl %gs:0, %eax
4887*a9fa9459Szrj 			subl $foo@gottpoff(%ebx), %eax.  */
4888*a9fa9459Szrj 		  val >>= 3;
4889*a9fa9459Szrj 		  roff = rel->r_offset - 3;
4890*a9fa9459Szrj 		}
4891*a9fa9459Szrj 	      else
4892*a9fa9459Szrj 		{
4893*a9fa9459Szrj 		  /* Change
4894*a9fa9459Szrj 			leal foo@tlsgd(%ebx), %eax
4895*a9fa9459Szrj 			call ___tls_get_addr@PLT
4896*a9fa9459Szrj 			nop
4897*a9fa9459Szrj 		     or
4898*a9fa9459Szrj 			leal foo@tlsgd(%reg), %eax
4899*a9fa9459Szrj 			call *___tls_get_addr@GOT(%reg)
4900*a9fa9459Szrj 			which may be converted to
4901*a9fa9459Szrj 			addr32 call ___tls_get_addr
4902*a9fa9459Szrj 		     into:
4903*a9fa9459Szrj 			movl %gs:0, %eax;
4904*a9fa9459Szrj 			subl $foo@gottpoff(%reg), %eax.  */
4905*a9fa9459Szrj 		  roff = rel->r_offset - 2;
4906*a9fa9459Szrj 		}
4907*a9fa9459Szrj 	      memcpy (contents + roff,
4908*a9fa9459Szrj 		      "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
4909*a9fa9459Szrj 	      contents[roff + 7] = 0x80 | (val & 7);
4910*a9fa9459Szrj 	      /* If foo is used only with foo@gotntpoff(%reg) and
4911*a9fa9459Szrj 		 foo@indntpoff, but not with foo@gottpoff(%reg), change
4912*a9fa9459Szrj 		 subl $foo@gottpoff(%reg), %eax
4913*a9fa9459Szrj 		 into:
4914*a9fa9459Szrj 		 addl $foo@gotntpoff(%reg), %eax.  */
4915*a9fa9459Szrj 	      if (tls_type == GOT_TLS_IE_POS)
4916*a9fa9459Szrj 		contents[roff + 6] = 0x03;
4917*a9fa9459Szrj 	      bfd_put_32 (output_bfd,
4918*a9fa9459Szrj 			  htab->elf.sgot->output_section->vma
4919*a9fa9459Szrj 			  + htab->elf.sgot->output_offset + off
4920*a9fa9459Szrj 			  - htab->elf.sgotplt->output_section->vma
4921*a9fa9459Szrj 			  - htab->elf.sgotplt->output_offset,
4922*a9fa9459Szrj 			  contents + roff + 8);
4923*a9fa9459Szrj 	      /* Skip R_386_PLT32 and R_386_GOT32X.  */
4924*a9fa9459Szrj 	      rel++;
4925*a9fa9459Szrj 	      wrel++;
4926*a9fa9459Szrj 	      continue;
4927*a9fa9459Szrj 	    }
4928*a9fa9459Szrj 	  else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
4929*a9fa9459Szrj 	    {
4930*a9fa9459Szrj 	      /* GDesc -> IE transition.
4931*a9fa9459Szrj 		 It's originally something like:
4932*a9fa9459Szrj 		 leal x@tlsdesc(%ebx), %eax
4933*a9fa9459Szrj 
4934*a9fa9459Szrj 		 Change it to:
4935*a9fa9459Szrj 		 movl x@gotntpoff(%ebx), %eax # before xchg %ax,%ax
4936*a9fa9459Szrj 		 or:
4937*a9fa9459Szrj 		 movl x@gottpoff(%ebx), %eax # before negl %eax
4938*a9fa9459Szrj 
4939*a9fa9459Szrj 		 Registers other than %eax may be set up here.  */
4940*a9fa9459Szrj 
4941*a9fa9459Szrj 	      bfd_vma roff;
4942*a9fa9459Szrj 
4943*a9fa9459Szrj 	      /* First, make sure it's a leal adding ebx to a 32-bit
4944*a9fa9459Szrj 		 offset into any register, although it's probably
4945*a9fa9459Szrj 		 almost always going to be eax.  */
4946*a9fa9459Szrj 	      roff = rel->r_offset;
4947*a9fa9459Szrj 
4948*a9fa9459Szrj 	      /* Now modify the instruction as appropriate.  */
4949*a9fa9459Szrj 	      /* To turn a leal into a movl in the form we use it, it
4950*a9fa9459Szrj 		 suffices to change the first byte from 0x8d to 0x8b.
4951*a9fa9459Szrj 		 aoliva FIXME: should we decide to keep the leal, all
4952*a9fa9459Szrj 		 we have to do is remove the statement below, and
4953*a9fa9459Szrj 		 adjust the relaxation of R_386_TLS_DESC_CALL.  */
4954*a9fa9459Szrj 	      bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
4955*a9fa9459Szrj 
4956*a9fa9459Szrj 	      if (tls_type == GOT_TLS_IE_BOTH)
4957*a9fa9459Szrj 		off += 4;
4958*a9fa9459Szrj 
4959*a9fa9459Szrj 	      bfd_put_32 (output_bfd,
4960*a9fa9459Szrj 			  htab->elf.sgot->output_section->vma
4961*a9fa9459Szrj 			  + htab->elf.sgot->output_offset + off
4962*a9fa9459Szrj 			  - htab->elf.sgotplt->output_section->vma
4963*a9fa9459Szrj 			  - htab->elf.sgotplt->output_offset,
4964*a9fa9459Szrj 			  contents + roff);
4965*a9fa9459Szrj 	      continue;
4966*a9fa9459Szrj 	    }
4967*a9fa9459Szrj 	  else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
4968*a9fa9459Szrj 	    {
4969*a9fa9459Szrj 	      /* GDesc -> IE transition.
4970*a9fa9459Szrj 		 It's originally:
4971*a9fa9459Szrj 		 call *(%eax)
4972*a9fa9459Szrj 
4973*a9fa9459Szrj 		 Change it to:
4974*a9fa9459Szrj 		 xchg %ax,%ax
4975*a9fa9459Szrj 		 or
4976*a9fa9459Szrj 		 negl %eax
4977*a9fa9459Szrj 		 depending on how we transformed the TLS_GOTDESC above.
4978*a9fa9459Szrj 	      */
4979*a9fa9459Szrj 
4980*a9fa9459Szrj 	      bfd_vma roff;
4981*a9fa9459Szrj 
4982*a9fa9459Szrj 	      roff = rel->r_offset;
4983*a9fa9459Szrj 
4984*a9fa9459Szrj 	      /* Now modify the instruction as appropriate.  */
4985*a9fa9459Szrj 	      if (tls_type != GOT_TLS_IE_NEG)
4986*a9fa9459Szrj 		{
4987*a9fa9459Szrj 		  /* xchg %ax,%ax */
4988*a9fa9459Szrj 		  bfd_put_8 (output_bfd, 0x66, contents + roff);
4989*a9fa9459Szrj 		  bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
4990*a9fa9459Szrj 		}
4991*a9fa9459Szrj 	      else
4992*a9fa9459Szrj 		{
4993*a9fa9459Szrj 		  /* negl %eax */
4994*a9fa9459Szrj 		  bfd_put_8 (output_bfd, 0xf7, contents + roff);
4995*a9fa9459Szrj 		  bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
4996*a9fa9459Szrj 		}
4997*a9fa9459Szrj 
4998*a9fa9459Szrj 	      continue;
4999*a9fa9459Szrj 	    }
5000*a9fa9459Szrj 	  else
5001*a9fa9459Szrj 	    BFD_ASSERT (FALSE);
5002*a9fa9459Szrj 	  break;
5003*a9fa9459Szrj 
5004*a9fa9459Szrj 	case R_386_TLS_LDM:
5005*a9fa9459Szrj 	  if (! elf_i386_tls_transition (info, input_bfd,
5006*a9fa9459Szrj 					 input_section, contents,
5007*a9fa9459Szrj 					 symtab_hdr, sym_hashes,
5008*a9fa9459Szrj 					 &r_type, GOT_UNKNOWN, rel,
5009*a9fa9459Szrj 					 relend, h, r_symndx, TRUE))
5010*a9fa9459Szrj 	    return FALSE;
5011*a9fa9459Szrj 
5012*a9fa9459Szrj 	  if (r_type != R_386_TLS_LDM)
5013*a9fa9459Szrj 	    {
5014*a9fa9459Szrj 	      /* LD->LE transition.  Change
5015*a9fa9459Szrj 			leal foo@tlsldm(%ebx) %eax
5016*a9fa9459Szrj 			call ___tls_get_addr@PLT
5017*a9fa9459Szrj 		 into:
5018*a9fa9459Szrj 			movl %gs:0, %eax
5019*a9fa9459Szrj 			nop
5020*a9fa9459Szrj 			leal 0(%esi,1), %esi
5021*a9fa9459Szrj 		 or change
5022*a9fa9459Szrj 			leal foo@tlsldm(%reg) %eax
5023*a9fa9459Szrj 			call *___tls_get_addr@GOT(%reg)
5024*a9fa9459Szrj 			which may be converted to
5025*a9fa9459Szrj 			addr32 call ___tls_get_addr
5026*a9fa9459Szrj 		 into:
5027*a9fa9459Szrj 			movl %gs:0, %eax
5028*a9fa9459Szrj 			leal 0(%esi), %esi  */
5029*a9fa9459Szrj 	      BFD_ASSERT (r_type == R_386_TLS_LE_32);
5030*a9fa9459Szrj 	      if (*(contents + rel->r_offset + 4) == 0xff
5031*a9fa9459Szrj 		  || *(contents + rel->r_offset + 4) == 0x67)
5032*a9fa9459Szrj 		memcpy (contents + rel->r_offset - 2,
5033*a9fa9459Szrj 			"\x65\xa1\0\0\0\0\x8d\xb6\0\0\0", 12);
5034*a9fa9459Szrj 	      else
5035*a9fa9459Szrj 		memcpy (contents + rel->r_offset - 2,
5036*a9fa9459Szrj 			"\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
5037*a9fa9459Szrj 	      /* Skip R_386_PC32/R_386_PLT32.  */
5038*a9fa9459Szrj 	      rel++;
5039*a9fa9459Szrj 	      wrel++;
5040*a9fa9459Szrj 	      continue;
5041*a9fa9459Szrj 	    }
5042*a9fa9459Szrj 
5043*a9fa9459Szrj 	  if (htab->elf.sgot == NULL)
5044*a9fa9459Szrj 	    abort ();
5045*a9fa9459Szrj 
5046*a9fa9459Szrj 	  off = htab->tls_ldm_got.offset;
5047*a9fa9459Szrj 	  if (off & 1)
5048*a9fa9459Szrj 	    off &= ~1;
5049*a9fa9459Szrj 	  else
5050*a9fa9459Szrj 	    {
5051*a9fa9459Szrj 	      Elf_Internal_Rela outrel;
5052*a9fa9459Szrj 
5053*a9fa9459Szrj 	      if (htab->elf.srelgot == NULL)
5054*a9fa9459Szrj 		abort ();
5055*a9fa9459Szrj 
5056*a9fa9459Szrj 	      outrel.r_offset = (htab->elf.sgot->output_section->vma
5057*a9fa9459Szrj 				 + htab->elf.sgot->output_offset + off);
5058*a9fa9459Szrj 
5059*a9fa9459Szrj 	      bfd_put_32 (output_bfd, 0,
5060*a9fa9459Szrj 			  htab->elf.sgot->contents + off);
5061*a9fa9459Szrj 	      bfd_put_32 (output_bfd, 0,
5062*a9fa9459Szrj 			  htab->elf.sgot->contents + off + 4);
5063*a9fa9459Szrj 	      outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
5064*a9fa9459Szrj 	      elf_append_rel (output_bfd, htab->elf.srelgot, &outrel);
5065*a9fa9459Szrj 	      htab->tls_ldm_got.offset |= 1;
5066*a9fa9459Szrj 	    }
5067*a9fa9459Szrj 	  relocation = htab->elf.sgot->output_section->vma
5068*a9fa9459Szrj 		       + htab->elf.sgot->output_offset + off
5069*a9fa9459Szrj 		       - htab->elf.sgotplt->output_section->vma
5070*a9fa9459Szrj 		       - htab->elf.sgotplt->output_offset;
5071*a9fa9459Szrj 	  unresolved_reloc = FALSE;
5072*a9fa9459Szrj 	  break;
5073*a9fa9459Szrj 
5074*a9fa9459Szrj 	case R_386_TLS_LDO_32:
5075*a9fa9459Szrj 	  if (!bfd_link_executable (info)
5076*a9fa9459Szrj 	      || (input_section->flags & SEC_CODE) == 0)
5077*a9fa9459Szrj 	    relocation -= elf_i386_dtpoff_base (info);
5078*a9fa9459Szrj 	  else
5079*a9fa9459Szrj 	    /* When converting LDO to LE, we must negate.  */
5080*a9fa9459Szrj 	    relocation = -elf_i386_tpoff (info, relocation);
5081*a9fa9459Szrj 	  break;
5082*a9fa9459Szrj 
5083*a9fa9459Szrj 	case R_386_TLS_LE_32:
5084*a9fa9459Szrj 	case R_386_TLS_LE:
5085*a9fa9459Szrj 	  if (!bfd_link_executable (info))
5086*a9fa9459Szrj 	    {
5087*a9fa9459Szrj 	      Elf_Internal_Rela outrel;
5088*a9fa9459Szrj 	      asection *sreloc;
5089*a9fa9459Szrj 
5090*a9fa9459Szrj 	      outrel.r_offset = rel->r_offset
5091*a9fa9459Szrj 				+ input_section->output_section->vma
5092*a9fa9459Szrj 				+ input_section->output_offset;
5093*a9fa9459Szrj 	      if (h != NULL && h->dynindx != -1)
5094*a9fa9459Szrj 		indx = h->dynindx;
5095*a9fa9459Szrj 	      else
5096*a9fa9459Szrj 		indx = 0;
5097*a9fa9459Szrj 	      if (r_type == R_386_TLS_LE_32)
5098*a9fa9459Szrj 		outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
5099*a9fa9459Szrj 	      else
5100*a9fa9459Szrj 		outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
5101*a9fa9459Szrj 	      sreloc = elf_section_data (input_section)->sreloc;
5102*a9fa9459Szrj 	      if (sreloc == NULL)
5103*a9fa9459Szrj 		abort ();
5104*a9fa9459Szrj 	      elf_append_rel (output_bfd, sreloc, &outrel);
5105*a9fa9459Szrj 	      if (indx)
5106*a9fa9459Szrj 		continue;
5107*a9fa9459Szrj 	      else if (r_type == R_386_TLS_LE_32)
5108*a9fa9459Szrj 		relocation = elf_i386_dtpoff_base (info) - relocation;
5109*a9fa9459Szrj 	      else
5110*a9fa9459Szrj 		relocation -= elf_i386_dtpoff_base (info);
5111*a9fa9459Szrj 	    }
5112*a9fa9459Szrj 	  else if (r_type == R_386_TLS_LE_32)
5113*a9fa9459Szrj 	    relocation = elf_i386_tpoff (info, relocation);
5114*a9fa9459Szrj 	  else
5115*a9fa9459Szrj 	    relocation = -elf_i386_tpoff (info, relocation);
5116*a9fa9459Szrj 	  break;
5117*a9fa9459Szrj 
5118*a9fa9459Szrj 	default:
5119*a9fa9459Szrj 	  break;
5120*a9fa9459Szrj 	}
5121*a9fa9459Szrj 
5122*a9fa9459Szrj       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5123*a9fa9459Szrj 	 because such sections are not SEC_ALLOC and thus ld.so will
5124*a9fa9459Szrj 	 not process them.  */
5125*a9fa9459Szrj       if (unresolved_reloc
5126*a9fa9459Szrj 	  && !((input_section->flags & SEC_DEBUGGING) != 0
5127*a9fa9459Szrj 	       && h->def_dynamic)
5128*a9fa9459Szrj 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
5129*a9fa9459Szrj 				      rel->r_offset) != (bfd_vma) -1)
5130*a9fa9459Szrj 	{
5131*a9fa9459Szrj 	  (*_bfd_error_handler)
5132*a9fa9459Szrj 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5133*a9fa9459Szrj 	     input_bfd,
5134*a9fa9459Szrj 	     input_section,
5135*a9fa9459Szrj 	     (long) rel->r_offset,
5136*a9fa9459Szrj 	     howto->name,
5137*a9fa9459Szrj 	     h->root.root.string);
5138*a9fa9459Szrj 	  return FALSE;
5139*a9fa9459Szrj 	}
5140*a9fa9459Szrj 
5141*a9fa9459Szrj do_relocation:
5142*a9fa9459Szrj       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
5143*a9fa9459Szrj 				    contents, rel->r_offset,
5144*a9fa9459Szrj 				    relocation, 0);
5145*a9fa9459Szrj 
5146*a9fa9459Szrj check_relocation_error:
5147*a9fa9459Szrj       if (r != bfd_reloc_ok)
5148*a9fa9459Szrj 	{
5149*a9fa9459Szrj 	  const char *name;
5150*a9fa9459Szrj 
5151*a9fa9459Szrj 	  if (h != NULL)
5152*a9fa9459Szrj 	    name = h->root.root.string;
5153*a9fa9459Szrj 	  else
5154*a9fa9459Szrj 	    {
5155*a9fa9459Szrj 	      name = bfd_elf_string_from_elf_section (input_bfd,
5156*a9fa9459Szrj 						      symtab_hdr->sh_link,
5157*a9fa9459Szrj 						      sym->st_name);
5158*a9fa9459Szrj 	      if (name == NULL)
5159*a9fa9459Szrj 		return FALSE;
5160*a9fa9459Szrj 	      if (*name == '\0')
5161*a9fa9459Szrj 		name = bfd_section_name (input_bfd, sec);
5162*a9fa9459Szrj 	    }
5163*a9fa9459Szrj 
5164*a9fa9459Szrj 	  if (r == bfd_reloc_overflow)
5165*a9fa9459Szrj 	    (*info->callbacks->reloc_overflow)
5166*a9fa9459Szrj 	      (info, (h ? &h->root : NULL), name, howto->name,
5167*a9fa9459Szrj 	       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
5168*a9fa9459Szrj 	  else
5169*a9fa9459Szrj 	    {
5170*a9fa9459Szrj 	      (*_bfd_error_handler)
5171*a9fa9459Szrj 		(_("%B(%A+0x%lx): reloc against `%s': error %d"),
5172*a9fa9459Szrj 		 input_bfd, input_section,
5173*a9fa9459Szrj 		 (long) rel->r_offset, name, (int) r);
5174*a9fa9459Szrj 	      return FALSE;
5175*a9fa9459Szrj 	    }
5176*a9fa9459Szrj 	}
5177*a9fa9459Szrj 
5178*a9fa9459Szrj       if (wrel != rel)
5179*a9fa9459Szrj 	*wrel = *rel;
5180*a9fa9459Szrj     }
5181*a9fa9459Szrj 
5182*a9fa9459Szrj   if (wrel != rel)
5183*a9fa9459Szrj     {
5184*a9fa9459Szrj       Elf_Internal_Shdr *rel_hdr;
5185*a9fa9459Szrj       size_t deleted = rel - wrel;
5186*a9fa9459Szrj 
5187*a9fa9459Szrj       rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
5188*a9fa9459Szrj       rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5189*a9fa9459Szrj       if (rel_hdr->sh_size == 0)
5190*a9fa9459Szrj 	{
5191*a9fa9459Szrj 	  /* It is too late to remove an empty reloc section.  Leave
5192*a9fa9459Szrj 	     one NONE reloc.
5193*a9fa9459Szrj 	     ??? What is wrong with an empty section???  */
5194*a9fa9459Szrj 	  rel_hdr->sh_size = rel_hdr->sh_entsize;
5195*a9fa9459Szrj 	  deleted -= 1;
5196*a9fa9459Szrj 	}
5197*a9fa9459Szrj       rel_hdr = _bfd_elf_single_rel_hdr (input_section);
5198*a9fa9459Szrj       rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
5199*a9fa9459Szrj       input_section->reloc_count -= deleted;
5200*a9fa9459Szrj     }
5201*a9fa9459Szrj 
5202*a9fa9459Szrj   return TRUE;
5203*a9fa9459Szrj }
5204*a9fa9459Szrj 
5205*a9fa9459Szrj /* Finish up dynamic symbol handling.  We set the contents of various
5206*a9fa9459Szrj    dynamic sections here.  */
5207*a9fa9459Szrj 
5208*a9fa9459Szrj static bfd_boolean
elf_i386_finish_dynamic_symbol(bfd * output_bfd,struct bfd_link_info * info,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)5209*a9fa9459Szrj elf_i386_finish_dynamic_symbol (bfd *output_bfd,
5210*a9fa9459Szrj 				struct bfd_link_info *info,
5211*a9fa9459Szrj 				struct elf_link_hash_entry *h,
5212*a9fa9459Szrj 				Elf_Internal_Sym *sym)
5213*a9fa9459Szrj {
5214*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
5215*a9fa9459Szrj   unsigned plt_entry_size;
5216*a9fa9459Szrj   const struct elf_i386_backend_data *abed;
5217*a9fa9459Szrj   struct elf_i386_link_hash_entry *eh;
5218*a9fa9459Szrj   bfd_boolean local_undefweak;
5219*a9fa9459Szrj 
5220*a9fa9459Szrj   htab = elf_i386_hash_table (info);
5221*a9fa9459Szrj   if (htab == NULL)
5222*a9fa9459Szrj     return FALSE;
5223*a9fa9459Szrj 
5224*a9fa9459Szrj   abed = get_elf_i386_backend_data (output_bfd);
5225*a9fa9459Szrj   plt_entry_size = GET_PLT_ENTRY_SIZE (output_bfd);
5226*a9fa9459Szrj 
5227*a9fa9459Szrj   eh = (struct elf_i386_link_hash_entry *) h;
5228*a9fa9459Szrj 
5229*a9fa9459Szrj   /* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
5230*a9fa9459Szrj      resolved undefined weak symbols in executable so that their
5231*a9fa9459Szrj      references have value 0 at run-time.  */
5232*a9fa9459Szrj   local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
5233*a9fa9459Szrj 						     eh->has_got_reloc,
5234*a9fa9459Szrj 						     eh);
5235*a9fa9459Szrj 
5236*a9fa9459Szrj   if (h->plt.offset != (bfd_vma) -1)
5237*a9fa9459Szrj     {
5238*a9fa9459Szrj       bfd_vma plt_index;
5239*a9fa9459Szrj       bfd_vma got_offset;
5240*a9fa9459Szrj       Elf_Internal_Rela rel;
5241*a9fa9459Szrj       bfd_byte *loc;
5242*a9fa9459Szrj       asection *plt, *gotplt, *relplt;
5243*a9fa9459Szrj 
5244*a9fa9459Szrj       /* When building a static executable, use .iplt, .igot.plt and
5245*a9fa9459Szrj 	 .rel.iplt sections for STT_GNU_IFUNC symbols.  */
5246*a9fa9459Szrj       if (htab->elf.splt != NULL)
5247*a9fa9459Szrj 	{
5248*a9fa9459Szrj 	  plt = htab->elf.splt;
5249*a9fa9459Szrj 	  gotplt = htab->elf.sgotplt;
5250*a9fa9459Szrj 	  relplt = htab->elf.srelplt;
5251*a9fa9459Szrj 	}
5252*a9fa9459Szrj       else
5253*a9fa9459Szrj 	{
5254*a9fa9459Szrj 	  plt = htab->elf.iplt;
5255*a9fa9459Szrj 	  gotplt = htab->elf.igotplt;
5256*a9fa9459Szrj 	  relplt = htab->elf.irelplt;
5257*a9fa9459Szrj 	}
5258*a9fa9459Szrj 
5259*a9fa9459Szrj       /* This symbol has an entry in the procedure linkage table.  Set
5260*a9fa9459Szrj 	 it up.  */
5261*a9fa9459Szrj 
5262*a9fa9459Szrj       if ((h->dynindx == -1
5263*a9fa9459Szrj 	   && !local_undefweak
5264*a9fa9459Szrj 	   && !((h->forced_local || bfd_link_executable (info))
5265*a9fa9459Szrj 		&& h->def_regular
5266*a9fa9459Szrj 		&& h->type == STT_GNU_IFUNC))
5267*a9fa9459Szrj 	  || plt == NULL
5268*a9fa9459Szrj 	  || gotplt == NULL
5269*a9fa9459Szrj 	  || relplt == NULL)
5270*a9fa9459Szrj 	abort ();
5271*a9fa9459Szrj 
5272*a9fa9459Szrj       /* Get the index in the procedure linkage table which
5273*a9fa9459Szrj 	 corresponds to this symbol.  This is the index of this symbol
5274*a9fa9459Szrj 	 in all the symbols for which we are making plt entries.  The
5275*a9fa9459Szrj 	 first entry in the procedure linkage table is reserved.
5276*a9fa9459Szrj 
5277*a9fa9459Szrj 	 Get the offset into the .got table of the entry that
5278*a9fa9459Szrj 	 corresponds to this function.  Each .got entry is 4 bytes.
5279*a9fa9459Szrj 	 The first three are reserved.
5280*a9fa9459Szrj 
5281*a9fa9459Szrj 	 For static executables, we don't reserve anything.  */
5282*a9fa9459Szrj 
5283*a9fa9459Szrj       if (plt == htab->elf.splt)
5284*a9fa9459Szrj 	{
5285*a9fa9459Szrj 	  got_offset = h->plt.offset / plt_entry_size - 1;
5286*a9fa9459Szrj 	  got_offset = (got_offset + 3) * 4;
5287*a9fa9459Szrj 	}
5288*a9fa9459Szrj       else
5289*a9fa9459Szrj 	{
5290*a9fa9459Szrj 	  got_offset = h->plt.offset / plt_entry_size;
5291*a9fa9459Szrj 	  got_offset = got_offset * 4;
5292*a9fa9459Szrj 	}
5293*a9fa9459Szrj 
5294*a9fa9459Szrj       /* Fill in the entry in the procedure linkage table.  */
5295*a9fa9459Szrj       if (! bfd_link_pic (info))
5296*a9fa9459Szrj 	{
5297*a9fa9459Szrj 	  memcpy (plt->contents + h->plt.offset, abed->plt->plt_entry,
5298*a9fa9459Szrj 		  abed->plt->plt_entry_size);
5299*a9fa9459Szrj 	  bfd_put_32 (output_bfd,
5300*a9fa9459Szrj 		      (gotplt->output_section->vma
5301*a9fa9459Szrj 		       + gotplt->output_offset
5302*a9fa9459Szrj 		       + got_offset),
5303*a9fa9459Szrj 		      plt->contents + h->plt.offset
5304*a9fa9459Szrj                       + abed->plt->plt_got_offset);
5305*a9fa9459Szrj 
5306*a9fa9459Szrj 	  if (abed->is_vxworks)
5307*a9fa9459Szrj 	    {
5308*a9fa9459Szrj 	      int s, k, reloc_index;
5309*a9fa9459Szrj 
5310*a9fa9459Szrj 	      /* Create the R_386_32 relocation referencing the GOT
5311*a9fa9459Szrj 		 for this PLT entry.  */
5312*a9fa9459Szrj 
5313*a9fa9459Szrj 	      /* S: Current slot number (zero-based).  */
5314*a9fa9459Szrj 	      s = ((h->plt.offset - abed->plt->plt_entry_size)
5315*a9fa9459Szrj                    / abed->plt->plt_entry_size);
5316*a9fa9459Szrj 	      /* K: Number of relocations for PLTResolve. */
5317*a9fa9459Szrj 	      if (bfd_link_pic (info))
5318*a9fa9459Szrj 		k = PLTRESOLVE_RELOCS_SHLIB;
5319*a9fa9459Szrj 	      else
5320*a9fa9459Szrj 		k = PLTRESOLVE_RELOCS;
5321*a9fa9459Szrj 	      /* Skip the PLTresolve relocations, and the relocations for
5322*a9fa9459Szrj 		 the other PLT slots. */
5323*a9fa9459Szrj 	      reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
5324*a9fa9459Szrj 	      loc = (htab->srelplt2->contents + reloc_index
5325*a9fa9459Szrj 		     * sizeof (Elf32_External_Rel));
5326*a9fa9459Szrj 
5327*a9fa9459Szrj 	      rel.r_offset = (htab->elf.splt->output_section->vma
5328*a9fa9459Szrj 			      + htab->elf.splt->output_offset
5329*a9fa9459Szrj 			      + h->plt.offset + 2),
5330*a9fa9459Szrj 	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5331*a9fa9459Szrj 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5332*a9fa9459Szrj 
5333*a9fa9459Szrj 	      /* Create the R_386_32 relocation referencing the beginning of
5334*a9fa9459Szrj 		 the PLT for this GOT entry.  */
5335*a9fa9459Szrj 	      rel.r_offset = (htab->elf.sgotplt->output_section->vma
5336*a9fa9459Szrj 			      + htab->elf.sgotplt->output_offset
5337*a9fa9459Szrj 			      + got_offset);
5338*a9fa9459Szrj 	      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5339*a9fa9459Szrj 	      bfd_elf32_swap_reloc_out (output_bfd, &rel,
5340*a9fa9459Szrj 					loc + sizeof (Elf32_External_Rel));
5341*a9fa9459Szrj 	    }
5342*a9fa9459Szrj 	}
5343*a9fa9459Szrj       else
5344*a9fa9459Szrj 	{
5345*a9fa9459Szrj 	  memcpy (plt->contents + h->plt.offset, abed->plt->pic_plt_entry,
5346*a9fa9459Szrj 		  abed->plt->plt_entry_size);
5347*a9fa9459Szrj 	  bfd_put_32 (output_bfd, got_offset,
5348*a9fa9459Szrj 		      plt->contents + h->plt.offset
5349*a9fa9459Szrj                       + abed->plt->plt_got_offset);
5350*a9fa9459Szrj 	}
5351*a9fa9459Szrj 
5352*a9fa9459Szrj       /* Fill in the entry in the global offset table.  Leave the entry
5353*a9fa9459Szrj 	 as zero for undefined weak symbol in PIE.  No PLT relocation
5354*a9fa9459Szrj 	 against undefined weak symbol in PIE.  */
5355*a9fa9459Szrj       if (!local_undefweak)
5356*a9fa9459Szrj 	{
5357*a9fa9459Szrj 	  bfd_put_32 (output_bfd,
5358*a9fa9459Szrj 		      (plt->output_section->vma
5359*a9fa9459Szrj 		       + plt->output_offset
5360*a9fa9459Szrj 		       + h->plt.offset
5361*a9fa9459Szrj 		       + abed->plt->plt_lazy_offset),
5362*a9fa9459Szrj 		      gotplt->contents + got_offset);
5363*a9fa9459Szrj 
5364*a9fa9459Szrj 	  /* Fill in the entry in the .rel.plt section.  */
5365*a9fa9459Szrj 	  rel.r_offset = (gotplt->output_section->vma
5366*a9fa9459Szrj 			  + gotplt->output_offset
5367*a9fa9459Szrj 			  + got_offset);
5368*a9fa9459Szrj 	  if (h->dynindx == -1
5369*a9fa9459Szrj 	      || ((bfd_link_executable (info)
5370*a9fa9459Szrj 		   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5371*a9fa9459Szrj 		  && h->def_regular
5372*a9fa9459Szrj 		  && h->type == STT_GNU_IFUNC))
5373*a9fa9459Szrj 	    {
5374*a9fa9459Szrj 	      /* If an STT_GNU_IFUNC symbol is locally defined, generate
5375*a9fa9459Szrj 		 R_386_IRELATIVE instead of R_386_JUMP_SLOT.  Store addend
5376*a9fa9459Szrj 		 in the .got.plt section.  */
5377*a9fa9459Szrj 	      bfd_put_32 (output_bfd,
5378*a9fa9459Szrj 			  (h->root.u.def.value
5379*a9fa9459Szrj 			   + h->root.u.def.section->output_section->vma
5380*a9fa9459Szrj 			   + h->root.u.def.section->output_offset),
5381*a9fa9459Szrj 			  gotplt->contents + got_offset);
5382*a9fa9459Szrj 	      rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
5383*a9fa9459Szrj 	      /* R_386_IRELATIVE comes last.  */
5384*a9fa9459Szrj 	      plt_index = htab->next_irelative_index--;
5385*a9fa9459Szrj 	    }
5386*a9fa9459Szrj 	  else
5387*a9fa9459Szrj 	    {
5388*a9fa9459Szrj 	      rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
5389*a9fa9459Szrj 	      plt_index = htab->next_jump_slot_index++;
5390*a9fa9459Szrj 	    }
5391*a9fa9459Szrj 
5392*a9fa9459Szrj 	  loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
5393*a9fa9459Szrj 	  bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
5394*a9fa9459Szrj 
5395*a9fa9459Szrj 	  /* Don't fill PLT entry for static executables.  */
5396*a9fa9459Szrj 	  if (plt == htab->elf.splt)
5397*a9fa9459Szrj 	    {
5398*a9fa9459Szrj 	      bfd_put_32 (output_bfd,
5399*a9fa9459Szrj 			  plt_index * sizeof (Elf32_External_Rel),
5400*a9fa9459Szrj 			  plt->contents + h->plt.offset
5401*a9fa9459Szrj 			  + abed->plt->plt_reloc_offset);
5402*a9fa9459Szrj 	      bfd_put_32 (output_bfd, - (h->plt.offset
5403*a9fa9459Szrj 					 + abed->plt->plt_plt_offset + 4),
5404*a9fa9459Szrj 			  plt->contents + h->plt.offset
5405*a9fa9459Szrj 			  + abed->plt->plt_plt_offset);
5406*a9fa9459Szrj 	    }
5407*a9fa9459Szrj 	}
5408*a9fa9459Szrj     }
5409*a9fa9459Szrj   else if (eh->plt_got.offset != (bfd_vma) -1)
5410*a9fa9459Szrj     {
5411*a9fa9459Szrj       bfd_vma got_offset, plt_offset;
5412*a9fa9459Szrj       asection *plt, *got, *gotplt;
5413*a9fa9459Szrj       const bfd_byte *got_plt_entry;
5414*a9fa9459Szrj 
5415*a9fa9459Szrj       /* Offset of displacement of the indirect jump.  */
5416*a9fa9459Szrj       bfd_vma plt_got_offset = 2;
5417*a9fa9459Szrj 
5418*a9fa9459Szrj       /* Set the entry in the GOT procedure linkage table.  */
5419*a9fa9459Szrj       plt = htab->plt_got;
5420*a9fa9459Szrj       got = htab->elf.sgot;
5421*a9fa9459Szrj       gotplt = htab->elf.sgotplt;
5422*a9fa9459Szrj       got_offset = h->got.offset;
5423*a9fa9459Szrj 
5424*a9fa9459Szrj       if (got_offset == (bfd_vma) -1
5425*a9fa9459Szrj 	  || plt == NULL
5426*a9fa9459Szrj 	  || got == NULL
5427*a9fa9459Szrj 	  || gotplt == NULL)
5428*a9fa9459Szrj 	abort ();
5429*a9fa9459Szrj 
5430*a9fa9459Szrj       /* Fill in the entry in the GOT procedure linkage table.  */
5431*a9fa9459Szrj       if (! bfd_link_pic (info))
5432*a9fa9459Szrj 	{
5433*a9fa9459Szrj 	  got_plt_entry = elf_i386_got_plt_entry;
5434*a9fa9459Szrj 	  got_offset += got->output_section->vma + got->output_offset;
5435*a9fa9459Szrj 	}
5436*a9fa9459Szrj       else
5437*a9fa9459Szrj 	{
5438*a9fa9459Szrj 	  got_plt_entry = elf_i386_pic_got_plt_entry;
5439*a9fa9459Szrj 	  got_offset += (got->output_section->vma
5440*a9fa9459Szrj 			 + got->output_offset
5441*a9fa9459Szrj 			 - gotplt->output_section->vma
5442*a9fa9459Szrj 			 - gotplt->output_offset);
5443*a9fa9459Szrj 	}
5444*a9fa9459Szrj 
5445*a9fa9459Szrj       plt_offset = eh->plt_got.offset;
5446*a9fa9459Szrj       memcpy (plt->contents + plt_offset, got_plt_entry,
5447*a9fa9459Szrj 	      sizeof (elf_i386_got_plt_entry));
5448*a9fa9459Szrj       bfd_put_32 (output_bfd, got_offset,
5449*a9fa9459Szrj 		  plt->contents + plt_offset + plt_got_offset);
5450*a9fa9459Szrj     }
5451*a9fa9459Szrj 
5452*a9fa9459Szrj   if (!local_undefweak
5453*a9fa9459Szrj       && !h->def_regular
5454*a9fa9459Szrj       && (h->plt.offset != (bfd_vma) -1
5455*a9fa9459Szrj 	  || eh->plt_got.offset != (bfd_vma) -1))
5456*a9fa9459Szrj     {
5457*a9fa9459Szrj       /* Mark the symbol as undefined, rather than as defined in
5458*a9fa9459Szrj 	 the .plt section.  Leave the value if there were any
5459*a9fa9459Szrj 	 relocations where pointer equality matters (this is a clue
5460*a9fa9459Szrj 	 for the dynamic linker, to make function pointer
5461*a9fa9459Szrj 	 comparisons work between an application and shared
5462*a9fa9459Szrj 	 library), otherwise set it to zero.  If a function is only
5463*a9fa9459Szrj 	 called from a binary, there is no need to slow down
5464*a9fa9459Szrj 	 shared libraries because of that.  */
5465*a9fa9459Szrj       sym->st_shndx = SHN_UNDEF;
5466*a9fa9459Szrj       if (!h->pointer_equality_needed)
5467*a9fa9459Szrj 	sym->st_value = 0;
5468*a9fa9459Szrj     }
5469*a9fa9459Szrj 
5470*a9fa9459Szrj   /* Don't generate dynamic GOT relocation against undefined weak
5471*a9fa9459Szrj      symbol in executable.  */
5472*a9fa9459Szrj   if (h->got.offset != (bfd_vma) -1
5473*a9fa9459Szrj       && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
5474*a9fa9459Szrj       && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0
5475*a9fa9459Szrj       && !local_undefweak)
5476*a9fa9459Szrj     {
5477*a9fa9459Szrj       Elf_Internal_Rela rel;
5478*a9fa9459Szrj       asection *relgot = htab->elf.srelgot;
5479*a9fa9459Szrj 
5480*a9fa9459Szrj       /* This symbol has an entry in the global offset table.  Set it
5481*a9fa9459Szrj 	 up.  */
5482*a9fa9459Szrj 
5483*a9fa9459Szrj       if (htab->elf.sgot == NULL || htab->elf.srelgot == NULL)
5484*a9fa9459Szrj 	abort ();
5485*a9fa9459Szrj 
5486*a9fa9459Szrj       rel.r_offset = (htab->elf.sgot->output_section->vma
5487*a9fa9459Szrj 		      + htab->elf.sgot->output_offset
5488*a9fa9459Szrj 		      + (h->got.offset & ~(bfd_vma) 1));
5489*a9fa9459Szrj 
5490*a9fa9459Szrj       /* If this is a static link, or it is a -Bsymbolic link and the
5491*a9fa9459Szrj 	 symbol is defined locally or was forced to be local because
5492*a9fa9459Szrj 	 of a version file, we just want to emit a RELATIVE reloc.
5493*a9fa9459Szrj 	 The entry in the global offset table will already have been
5494*a9fa9459Szrj 	 initialized in the relocate_section function.  */
5495*a9fa9459Szrj       if (h->def_regular
5496*a9fa9459Szrj 	  && h->type == STT_GNU_IFUNC)
5497*a9fa9459Szrj 	{
5498*a9fa9459Szrj 	  if (h->plt.offset == (bfd_vma) -1)
5499*a9fa9459Szrj 	    {
5500*a9fa9459Szrj 	      /* STT_GNU_IFUNC is referenced without PLT.  */
5501*a9fa9459Szrj 	      if (htab->elf.splt == NULL)
5502*a9fa9459Szrj 		{
5503*a9fa9459Szrj 		  /* use .rel[a].iplt section to store .got relocations
5504*a9fa9459Szrj 		     in static executable.  */
5505*a9fa9459Szrj 		  relgot = htab->elf.irelplt;
5506*a9fa9459Szrj 		}
5507*a9fa9459Szrj 	      if (SYMBOL_REFERENCES_LOCAL (info, h))
5508*a9fa9459Szrj 		{
5509*a9fa9459Szrj 		  bfd_put_32 (output_bfd,
5510*a9fa9459Szrj 			      (h->root.u.def.value
5511*a9fa9459Szrj 			       + h->root.u.def.section->output_section->vma
5512*a9fa9459Szrj 			       + h->root.u.def.section->output_offset),
5513*a9fa9459Szrj 			      htab->elf.sgot->contents + h->got.offset);
5514*a9fa9459Szrj 		  rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
5515*a9fa9459Szrj 		}
5516*a9fa9459Szrj 	      else
5517*a9fa9459Szrj 		goto do_glob_dat;
5518*a9fa9459Szrj 	    }
5519*a9fa9459Szrj 	  else if (bfd_link_pic (info))
5520*a9fa9459Szrj 	    {
5521*a9fa9459Szrj 	      /* Generate R_386_GLOB_DAT.  */
5522*a9fa9459Szrj 	      goto do_glob_dat;
5523*a9fa9459Szrj 	    }
5524*a9fa9459Szrj 	  else
5525*a9fa9459Szrj 	    {
5526*a9fa9459Szrj 	      asection *plt;
5527*a9fa9459Szrj 
5528*a9fa9459Szrj 	      if (!h->pointer_equality_needed)
5529*a9fa9459Szrj 		abort ();
5530*a9fa9459Szrj 
5531*a9fa9459Szrj 	      /* For non-shared object, we can't use .got.plt, which
5532*a9fa9459Szrj 		 contains the real function addres if we need pointer
5533*a9fa9459Szrj 		 equality.  We load the GOT entry with the PLT entry.  */
5534*a9fa9459Szrj 	      plt = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
5535*a9fa9459Szrj 	      bfd_put_32 (output_bfd,
5536*a9fa9459Szrj 			  (plt->output_section->vma
5537*a9fa9459Szrj 			   + plt->output_offset + h->plt.offset),
5538*a9fa9459Szrj 			  htab->elf.sgot->contents + h->got.offset);
5539*a9fa9459Szrj 	      return TRUE;
5540*a9fa9459Szrj 	    }
5541*a9fa9459Szrj 	}
5542*a9fa9459Szrj       else if (bfd_link_pic (info)
5543*a9fa9459Szrj 	       && SYMBOL_REFERENCES_LOCAL (info, h))
5544*a9fa9459Szrj 	{
5545*a9fa9459Szrj 	  BFD_ASSERT((h->got.offset & 1) != 0);
5546*a9fa9459Szrj 	  rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
5547*a9fa9459Szrj 	}
5548*a9fa9459Szrj       else
5549*a9fa9459Szrj 	{
5550*a9fa9459Szrj 	  BFD_ASSERT((h->got.offset & 1) == 0);
5551*a9fa9459Szrj do_glob_dat:
5552*a9fa9459Szrj 	  bfd_put_32 (output_bfd, (bfd_vma) 0,
5553*a9fa9459Szrj 		      htab->elf.sgot->contents + h->got.offset);
5554*a9fa9459Szrj 	  rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
5555*a9fa9459Szrj 	}
5556*a9fa9459Szrj 
5557*a9fa9459Szrj       elf_append_rel (output_bfd, relgot, &rel);
5558*a9fa9459Szrj     }
5559*a9fa9459Szrj 
5560*a9fa9459Szrj   if (h->needs_copy)
5561*a9fa9459Szrj     {
5562*a9fa9459Szrj       Elf_Internal_Rela rel;
5563*a9fa9459Szrj 
5564*a9fa9459Szrj       /* This symbol needs a copy reloc.  Set it up.  */
5565*a9fa9459Szrj 
5566*a9fa9459Szrj       if (h->dynindx == -1
5567*a9fa9459Szrj 	  || (h->root.type != bfd_link_hash_defined
5568*a9fa9459Szrj 	      && h->root.type != bfd_link_hash_defweak)
5569*a9fa9459Szrj 	  || htab->srelbss == NULL)
5570*a9fa9459Szrj 	abort ();
5571*a9fa9459Szrj 
5572*a9fa9459Szrj       rel.r_offset = (h->root.u.def.value
5573*a9fa9459Szrj 		      + h->root.u.def.section->output_section->vma
5574*a9fa9459Szrj 		      + h->root.u.def.section->output_offset);
5575*a9fa9459Szrj       rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
5576*a9fa9459Szrj       elf_append_rel (output_bfd, htab->srelbss, &rel);
5577*a9fa9459Szrj     }
5578*a9fa9459Szrj 
5579*a9fa9459Szrj   return TRUE;
5580*a9fa9459Szrj }
5581*a9fa9459Szrj 
5582*a9fa9459Szrj /* Finish up local dynamic symbol handling.  We set the contents of
5583*a9fa9459Szrj    various dynamic sections here.  */
5584*a9fa9459Szrj 
5585*a9fa9459Szrj static bfd_boolean
elf_i386_finish_local_dynamic_symbol(void ** slot,void * inf)5586*a9fa9459Szrj elf_i386_finish_local_dynamic_symbol (void **slot, void *inf)
5587*a9fa9459Szrj {
5588*a9fa9459Szrj   struct elf_link_hash_entry *h
5589*a9fa9459Szrj     = (struct elf_link_hash_entry *) *slot;
5590*a9fa9459Szrj   struct bfd_link_info *info
5591*a9fa9459Szrj     = (struct bfd_link_info *) inf;
5592*a9fa9459Szrj 
5593*a9fa9459Szrj   return elf_i386_finish_dynamic_symbol (info->output_bfd, info,
5594*a9fa9459Szrj 					 h, NULL);
5595*a9fa9459Szrj }
5596*a9fa9459Szrj 
5597*a9fa9459Szrj /* Finish up undefined weak symbol handling in PIE.  Fill its PLT entry
5598*a9fa9459Szrj    here since undefined weak symbol may not be dynamic and may not be
5599*a9fa9459Szrj    called for elf_i386_finish_dynamic_symbol.  */
5600*a9fa9459Szrj 
5601*a9fa9459Szrj static bfd_boolean
elf_i386_pie_finish_undefweak_symbol(struct bfd_hash_entry * bh,void * inf)5602*a9fa9459Szrj elf_i386_pie_finish_undefweak_symbol (struct bfd_hash_entry *bh,
5603*a9fa9459Szrj 				      void *inf)
5604*a9fa9459Szrj {
5605*a9fa9459Szrj   struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) bh;
5606*a9fa9459Szrj   struct bfd_link_info *info = (struct bfd_link_info *) inf;
5607*a9fa9459Szrj 
5608*a9fa9459Szrj   if (h->root.type != bfd_link_hash_undefweak
5609*a9fa9459Szrj       || h->dynindx != -1)
5610*a9fa9459Szrj     return TRUE;
5611*a9fa9459Szrj 
5612*a9fa9459Szrj   return elf_i386_finish_dynamic_symbol (info->output_bfd,
5613*a9fa9459Szrj 					     info, h, NULL);
5614*a9fa9459Szrj }
5615*a9fa9459Szrj 
5616*a9fa9459Szrj /* Used to decide how to sort relocs in an optimal manner for the
5617*a9fa9459Szrj    dynamic linker, before writing them out.  */
5618*a9fa9459Szrj 
5619*a9fa9459Szrj static enum elf_reloc_type_class
elf_i386_reloc_type_class(const struct bfd_link_info * info,const asection * rel_sec ATTRIBUTE_UNUSED,const Elf_Internal_Rela * rela)5620*a9fa9459Szrj elf_i386_reloc_type_class (const struct bfd_link_info *info,
5621*a9fa9459Szrj 			   const asection *rel_sec ATTRIBUTE_UNUSED,
5622*a9fa9459Szrj 			   const Elf_Internal_Rela *rela)
5623*a9fa9459Szrj {
5624*a9fa9459Szrj   bfd *abfd = info->output_bfd;
5625*a9fa9459Szrj   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
5626*a9fa9459Szrj   struct elf_link_hash_table *htab = elf_hash_table (info);
5627*a9fa9459Szrj 
5628*a9fa9459Szrj   if (htab->dynsym != NULL
5629*a9fa9459Szrj       && htab->dynsym->contents != NULL)
5630*a9fa9459Szrj     {
5631*a9fa9459Szrj       /* Check relocation against STT_GNU_IFUNC symbol if there are
5632*a9fa9459Szrj          dynamic symbols.  */
5633*a9fa9459Szrj       unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
5634*a9fa9459Szrj       if (r_symndx != STN_UNDEF)
5635*a9fa9459Szrj 	{
5636*a9fa9459Szrj 	  Elf_Internal_Sym sym;
5637*a9fa9459Szrj 	  if (!bed->s->swap_symbol_in (abfd,
5638*a9fa9459Szrj 				       (htab->dynsym->contents
5639*a9fa9459Szrj 					+ r_symndx * sizeof (Elf32_External_Sym)),
5640*a9fa9459Szrj 				       0, &sym))
5641*a9fa9459Szrj 	    abort ();
5642*a9fa9459Szrj 
5643*a9fa9459Szrj 	  if (ELF32_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
5644*a9fa9459Szrj 	    return reloc_class_ifunc;
5645*a9fa9459Szrj 	}
5646*a9fa9459Szrj     }
5647*a9fa9459Szrj 
5648*a9fa9459Szrj   switch (ELF32_R_TYPE (rela->r_info))
5649*a9fa9459Szrj     {
5650*a9fa9459Szrj     case R_386_IRELATIVE:
5651*a9fa9459Szrj       return reloc_class_ifunc;
5652*a9fa9459Szrj     case R_386_RELATIVE:
5653*a9fa9459Szrj       return reloc_class_relative;
5654*a9fa9459Szrj     case R_386_JUMP_SLOT:
5655*a9fa9459Szrj       return reloc_class_plt;
5656*a9fa9459Szrj     case R_386_COPY:
5657*a9fa9459Szrj       return reloc_class_copy;
5658*a9fa9459Szrj     default:
5659*a9fa9459Szrj       return reloc_class_normal;
5660*a9fa9459Szrj     }
5661*a9fa9459Szrj }
5662*a9fa9459Szrj 
5663*a9fa9459Szrj /* Finish up the dynamic sections.  */
5664*a9fa9459Szrj 
5665*a9fa9459Szrj static bfd_boolean
elf_i386_finish_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)5666*a9fa9459Szrj elf_i386_finish_dynamic_sections (bfd *output_bfd,
5667*a9fa9459Szrj 				  struct bfd_link_info *info)
5668*a9fa9459Szrj {
5669*a9fa9459Szrj   struct elf_i386_link_hash_table *htab;
5670*a9fa9459Szrj   bfd *dynobj;
5671*a9fa9459Szrj   asection *sdyn;
5672*a9fa9459Szrj   const struct elf_i386_backend_data *abed;
5673*a9fa9459Szrj 
5674*a9fa9459Szrj   htab = elf_i386_hash_table (info);
5675*a9fa9459Szrj   if (htab == NULL)
5676*a9fa9459Szrj     return FALSE;
5677*a9fa9459Szrj 
5678*a9fa9459Szrj   dynobj = htab->elf.dynobj;
5679*a9fa9459Szrj   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
5680*a9fa9459Szrj   abed = get_elf_i386_backend_data (output_bfd);
5681*a9fa9459Szrj 
5682*a9fa9459Szrj   if (htab->elf.dynamic_sections_created)
5683*a9fa9459Szrj     {
5684*a9fa9459Szrj       Elf32_External_Dyn *dyncon, *dynconend;
5685*a9fa9459Szrj 
5686*a9fa9459Szrj       if (sdyn == NULL || htab->elf.sgot == NULL)
5687*a9fa9459Szrj 	abort ();
5688*a9fa9459Szrj 
5689*a9fa9459Szrj       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5690*a9fa9459Szrj       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
5691*a9fa9459Szrj       for (; dyncon < dynconend; dyncon++)
5692*a9fa9459Szrj 	{
5693*a9fa9459Szrj 	  Elf_Internal_Dyn dyn;
5694*a9fa9459Szrj 	  asection *s;
5695*a9fa9459Szrj 
5696*a9fa9459Szrj 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5697*a9fa9459Szrj 
5698*a9fa9459Szrj 	  switch (dyn.d_tag)
5699*a9fa9459Szrj 	    {
5700*a9fa9459Szrj 	    default:
5701*a9fa9459Szrj 	      if (abed->is_vxworks
5702*a9fa9459Szrj                   && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
5703*a9fa9459Szrj 		break;
5704*a9fa9459Szrj 	      continue;
5705*a9fa9459Szrj 
5706*a9fa9459Szrj 	    case DT_PLTGOT:
5707*a9fa9459Szrj 	      s = htab->elf.sgotplt;
5708*a9fa9459Szrj 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5709*a9fa9459Szrj 	      break;
5710*a9fa9459Szrj 
5711*a9fa9459Szrj 	    case DT_JMPREL:
5712*a9fa9459Szrj 	      s = htab->elf.srelplt;
5713*a9fa9459Szrj 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
5714*a9fa9459Szrj 	      break;
5715*a9fa9459Szrj 
5716*a9fa9459Szrj 	    case DT_PLTRELSZ:
5717*a9fa9459Szrj 	      s = htab->elf.srelplt;
5718*a9fa9459Szrj 	      dyn.d_un.d_val = s->size;
5719*a9fa9459Szrj 	      break;
5720*a9fa9459Szrj 
5721*a9fa9459Szrj 	    case DT_RELSZ:
5722*a9fa9459Szrj 	      /* My reading of the SVR4 ABI indicates that the
5723*a9fa9459Szrj 		 procedure linkage table relocs (DT_JMPREL) should be
5724*a9fa9459Szrj 		 included in the overall relocs (DT_REL).  This is
5725*a9fa9459Szrj 		 what Solaris does.  However, UnixWare can not handle
5726*a9fa9459Szrj 		 that case.  Therefore, we override the DT_RELSZ entry
5727*a9fa9459Szrj 		 here to make it not include the JMPREL relocs.  */
5728*a9fa9459Szrj 	      s = htab->elf.srelplt;
5729*a9fa9459Szrj 	      if (s == NULL)
5730*a9fa9459Szrj 		continue;
5731*a9fa9459Szrj 	      dyn.d_un.d_val -= s->size;
5732*a9fa9459Szrj 	      break;
5733*a9fa9459Szrj 
5734*a9fa9459Szrj 	    case DT_REL:
5735*a9fa9459Szrj 	      /* We may not be using the standard ELF linker script.
5736*a9fa9459Szrj 		 If .rel.plt is the first .rel section, we adjust
5737*a9fa9459Szrj 		 DT_REL to not include it.  */
5738*a9fa9459Szrj 	      s = htab->elf.srelplt;
5739*a9fa9459Szrj 	      if (s == NULL)
5740*a9fa9459Szrj 		continue;
5741*a9fa9459Szrj 	      if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
5742*a9fa9459Szrj 		continue;
5743*a9fa9459Szrj 	      dyn.d_un.d_ptr += s->size;
5744*a9fa9459Szrj 	      break;
5745*a9fa9459Szrj 	    }
5746*a9fa9459Szrj 
5747*a9fa9459Szrj 	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5748*a9fa9459Szrj 	}
5749*a9fa9459Szrj 
5750*a9fa9459Szrj       /* Fill in the first entry in the procedure linkage table.  */
5751*a9fa9459Szrj       if (htab->elf.splt && htab->elf.splt->size > 0)
5752*a9fa9459Szrj 	{
5753*a9fa9459Szrj 	  if (bfd_link_pic (info))
5754*a9fa9459Szrj 	    {
5755*a9fa9459Szrj 	      memcpy (htab->elf.splt->contents, abed->plt->pic_plt0_entry,
5756*a9fa9459Szrj 		      abed->plt->plt0_entry_size);
5757*a9fa9459Szrj 	      memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5758*a9fa9459Szrj 		      abed->plt0_pad_byte,
5759*a9fa9459Szrj 		      abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5760*a9fa9459Szrj 	    }
5761*a9fa9459Szrj 	  else
5762*a9fa9459Szrj 	    {
5763*a9fa9459Szrj 	      memcpy (htab->elf.splt->contents, abed->plt->plt0_entry,
5764*a9fa9459Szrj 		      abed->plt->plt0_entry_size);
5765*a9fa9459Szrj 	      memset (htab->elf.splt->contents + abed->plt->plt0_entry_size,
5766*a9fa9459Szrj 		      abed->plt0_pad_byte,
5767*a9fa9459Szrj 		      abed->plt->plt_entry_size - abed->plt->plt0_entry_size);
5768*a9fa9459Szrj 	      bfd_put_32 (output_bfd,
5769*a9fa9459Szrj 			  (htab->elf.sgotplt->output_section->vma
5770*a9fa9459Szrj 			   + htab->elf.sgotplt->output_offset
5771*a9fa9459Szrj 			   + 4),
5772*a9fa9459Szrj 			  htab->elf.splt->contents
5773*a9fa9459Szrj                           + abed->plt->plt0_got1_offset);
5774*a9fa9459Szrj 	      bfd_put_32 (output_bfd,
5775*a9fa9459Szrj 			  (htab->elf.sgotplt->output_section->vma
5776*a9fa9459Szrj 			   + htab->elf.sgotplt->output_offset
5777*a9fa9459Szrj 			   + 8),
5778*a9fa9459Szrj 			  htab->elf.splt->contents
5779*a9fa9459Szrj                           + abed->plt->plt0_got2_offset);
5780*a9fa9459Szrj 
5781*a9fa9459Szrj 	      if (abed->is_vxworks)
5782*a9fa9459Szrj 		{
5783*a9fa9459Szrj 		  Elf_Internal_Rela rel;
5784*a9fa9459Szrj 
5785*a9fa9459Szrj 		  /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
5786*a9fa9459Szrj 		     On IA32 we use REL relocations so the addend goes in
5787*a9fa9459Szrj 		     the PLT directly.  */
5788*a9fa9459Szrj 		  rel.r_offset = (htab->elf.splt->output_section->vma
5789*a9fa9459Szrj 				  + htab->elf.splt->output_offset
5790*a9fa9459Szrj 				  + abed->plt->plt0_got1_offset);
5791*a9fa9459Szrj 		  rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5792*a9fa9459Szrj 		  bfd_elf32_swap_reloc_out (output_bfd, &rel,
5793*a9fa9459Szrj 					    htab->srelplt2->contents);
5794*a9fa9459Szrj 		  /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8.  */
5795*a9fa9459Szrj 		  rel.r_offset = (htab->elf.splt->output_section->vma
5796*a9fa9459Szrj 				  + htab->elf.splt->output_offset
5797*a9fa9459Szrj 				  + abed->plt->plt0_got2_offset);
5798*a9fa9459Szrj 		  rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5799*a9fa9459Szrj 		  bfd_elf32_swap_reloc_out (output_bfd, &rel,
5800*a9fa9459Szrj 					    htab->srelplt2->contents +
5801*a9fa9459Szrj 					    sizeof (Elf32_External_Rel));
5802*a9fa9459Szrj 		}
5803*a9fa9459Szrj 	    }
5804*a9fa9459Szrj 
5805*a9fa9459Szrj 	  /* UnixWare sets the entsize of .plt to 4, although that doesn't
5806*a9fa9459Szrj 	     really seem like the right value.  */
5807*a9fa9459Szrj 	  elf_section_data (htab->elf.splt->output_section)
5808*a9fa9459Szrj 	    ->this_hdr.sh_entsize = 4;
5809*a9fa9459Szrj 
5810*a9fa9459Szrj 	  /* Correct the .rel.plt.unloaded relocations.  */
5811*a9fa9459Szrj 	  if (abed->is_vxworks && !bfd_link_pic (info))
5812*a9fa9459Szrj 	    {
5813*a9fa9459Szrj 	      int num_plts = (htab->elf.splt->size
5814*a9fa9459Szrj                               / abed->plt->plt_entry_size) - 1;
5815*a9fa9459Szrj 	      unsigned char *p;
5816*a9fa9459Szrj 
5817*a9fa9459Szrj 	      p = htab->srelplt2->contents;
5818*a9fa9459Szrj 	      if (bfd_link_pic (info))
5819*a9fa9459Szrj 		p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
5820*a9fa9459Szrj 	      else
5821*a9fa9459Szrj 		p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
5822*a9fa9459Szrj 
5823*a9fa9459Szrj 	      for (; num_plts; num_plts--)
5824*a9fa9459Szrj 		{
5825*a9fa9459Szrj 		  Elf_Internal_Rela rel;
5826*a9fa9459Szrj 		  bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5827*a9fa9459Szrj 		  rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
5828*a9fa9459Szrj 		  bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5829*a9fa9459Szrj 		  p += sizeof (Elf32_External_Rel);
5830*a9fa9459Szrj 
5831*a9fa9459Szrj 		  bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
5832*a9fa9459Szrj 		  rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
5833*a9fa9459Szrj 		  bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
5834*a9fa9459Szrj 		  p += sizeof (Elf32_External_Rel);
5835*a9fa9459Szrj 		}
5836*a9fa9459Szrj 	    }
5837*a9fa9459Szrj 	}
5838*a9fa9459Szrj     }
5839*a9fa9459Szrj 
5840*a9fa9459Szrj   if (htab->elf.sgotplt)
5841*a9fa9459Szrj     {
5842*a9fa9459Szrj       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
5843*a9fa9459Szrj 	{
5844*a9fa9459Szrj 	  (*_bfd_error_handler)
5845*a9fa9459Szrj 	    (_("discarded output section: `%A'"), htab->elf.sgotplt);
5846*a9fa9459Szrj 	  return FALSE;
5847*a9fa9459Szrj 	}
5848*a9fa9459Szrj 
5849*a9fa9459Szrj       /* Fill in the first three entries in the global offset table.  */
5850*a9fa9459Szrj       if (htab->elf.sgotplt->size > 0)
5851*a9fa9459Szrj 	{
5852*a9fa9459Szrj 	  bfd_put_32 (output_bfd,
5853*a9fa9459Szrj 		      (sdyn == NULL ? 0
5854*a9fa9459Szrj 		       : sdyn->output_section->vma + sdyn->output_offset),
5855*a9fa9459Szrj 		      htab->elf.sgotplt->contents);
5856*a9fa9459Szrj 	  bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
5857*a9fa9459Szrj 	  bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
5858*a9fa9459Szrj 	}
5859*a9fa9459Szrj 
5860*a9fa9459Szrj       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
5861*a9fa9459Szrj     }
5862*a9fa9459Szrj 
5863*a9fa9459Szrj   /* Adjust .eh_frame for .plt section.  */
5864*a9fa9459Szrj   if (htab->plt_eh_frame != NULL
5865*a9fa9459Szrj       && htab->plt_eh_frame->contents != NULL)
5866*a9fa9459Szrj     {
5867*a9fa9459Szrj       if (htab->elf.splt != NULL
5868*a9fa9459Szrj 	  && htab->elf.splt->size != 0
5869*a9fa9459Szrj 	  && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
5870*a9fa9459Szrj 	  && htab->elf.splt->output_section != NULL
5871*a9fa9459Szrj 	  && htab->plt_eh_frame->output_section != NULL)
5872*a9fa9459Szrj 	{
5873*a9fa9459Szrj 	  bfd_vma plt_start = htab->elf.splt->output_section->vma;
5874*a9fa9459Szrj 	  bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
5875*a9fa9459Szrj 				   + htab->plt_eh_frame->output_offset
5876*a9fa9459Szrj 				   + PLT_FDE_START_OFFSET;
5877*a9fa9459Szrj 	  bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
5878*a9fa9459Szrj 			     htab->plt_eh_frame->contents
5879*a9fa9459Szrj 			     + PLT_FDE_START_OFFSET);
5880*a9fa9459Szrj 	}
5881*a9fa9459Szrj       if (htab->plt_eh_frame->sec_info_type
5882*a9fa9459Szrj 	  == SEC_INFO_TYPE_EH_FRAME)
5883*a9fa9459Szrj 	{
5884*a9fa9459Szrj 	  if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
5885*a9fa9459Szrj 						 htab->plt_eh_frame,
5886*a9fa9459Szrj 						 htab->plt_eh_frame->contents))
5887*a9fa9459Szrj 	    return FALSE;
5888*a9fa9459Szrj 	}
5889*a9fa9459Szrj     }
5890*a9fa9459Szrj 
5891*a9fa9459Szrj   if (htab->elf.sgot && htab->elf.sgot->size > 0)
5892*a9fa9459Szrj     elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
5893*a9fa9459Szrj 
5894*a9fa9459Szrj   /* Fill PLT entries for undefined weak symbols in PIE.  */
5895*a9fa9459Szrj   if (bfd_link_pie (info))
5896*a9fa9459Szrj     bfd_hash_traverse (&info->hash->table,
5897*a9fa9459Szrj 		       elf_i386_pie_finish_undefweak_symbol,
5898*a9fa9459Szrj 		       info);
5899*a9fa9459Szrj 
5900*a9fa9459Szrj   return TRUE;
5901*a9fa9459Szrj }
5902*a9fa9459Szrj 
5903*a9fa9459Szrj /* Fill PLT/GOT entries and allocate dynamic relocations for local
5904*a9fa9459Szrj    STT_GNU_IFUNC symbols, which aren't in the ELF linker hash table.
5905*a9fa9459Szrj    It has to be done before elf_link_sort_relocs is called so that
5906*a9fa9459Szrj    dynamic relocations are properly sorted.  */
5907*a9fa9459Szrj 
5908*a9fa9459Szrj static bfd_boolean
elf_i386_output_arch_local_syms(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info,void * flaginfo ATTRIBUTE_UNUSED,int (* func)(void *,const char *,Elf_Internal_Sym *,asection *,struct elf_link_hash_entry *)ATTRIBUTE_UNUSED)5909*a9fa9459Szrj elf_i386_output_arch_local_syms
5910*a9fa9459Szrj   (bfd *output_bfd ATTRIBUTE_UNUSED,
5911*a9fa9459Szrj    struct bfd_link_info *info,
5912*a9fa9459Szrj    void *flaginfo ATTRIBUTE_UNUSED,
5913*a9fa9459Szrj    int (*func) (void *, const char *,
5914*a9fa9459Szrj 		Elf_Internal_Sym *,
5915*a9fa9459Szrj 		asection *,
5916*a9fa9459Szrj 		struct elf_link_hash_entry *) ATTRIBUTE_UNUSED)
5917*a9fa9459Szrj {
5918*a9fa9459Szrj   struct elf_i386_link_hash_table *htab = elf_i386_hash_table (info);
5919*a9fa9459Szrj   if (htab == NULL)
5920*a9fa9459Szrj     return FALSE;
5921*a9fa9459Szrj 
5922*a9fa9459Szrj   /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
5923*a9fa9459Szrj   htab_traverse (htab->loc_hash_table,
5924*a9fa9459Szrj 		 elf_i386_finish_local_dynamic_symbol,
5925*a9fa9459Szrj 		 info);
5926*a9fa9459Szrj 
5927*a9fa9459Szrj   return TRUE;
5928*a9fa9459Szrj }
5929*a9fa9459Szrj 
5930*a9fa9459Szrj /* Return an array of PLT entry symbol values.  */
5931*a9fa9459Szrj 
5932*a9fa9459Szrj static bfd_vma *
elf_i386_get_plt_sym_val(bfd * abfd,asymbol ** dynsyms,asection * plt,asection * relplt)5933*a9fa9459Szrj elf_i386_get_plt_sym_val (bfd *abfd, asymbol **dynsyms, asection *plt,
5934*a9fa9459Szrj 			  asection *relplt)
5935*a9fa9459Szrj {
5936*a9fa9459Szrj   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
5937*a9fa9459Szrj   arelent *p;
5938*a9fa9459Szrj   long count, i;
5939*a9fa9459Szrj   bfd_vma *plt_sym_val;
5940*a9fa9459Szrj   bfd_vma plt_offset;
5941*a9fa9459Szrj   bfd_byte *plt_contents;
5942*a9fa9459Szrj   const struct elf_i386_backend_data *bed
5943*a9fa9459Szrj     = get_elf_i386_backend_data (abfd);
5944*a9fa9459Szrj   Elf_Internal_Shdr *hdr;
5945*a9fa9459Szrj 
5946*a9fa9459Szrj   /* Get the .plt section contents.  */
5947*a9fa9459Szrj   plt_contents = (bfd_byte *) bfd_malloc (plt->size);
5948*a9fa9459Szrj   if (plt_contents == NULL)
5949*a9fa9459Szrj     return NULL;
5950*a9fa9459Szrj   if (!bfd_get_section_contents (abfd, (asection *) plt,
5951*a9fa9459Szrj 				 plt_contents, 0, plt->size))
5952*a9fa9459Szrj     {
5953*a9fa9459Szrj bad_return:
5954*a9fa9459Szrj       free (plt_contents);
5955*a9fa9459Szrj       return NULL;
5956*a9fa9459Szrj     }
5957*a9fa9459Szrj 
5958*a9fa9459Szrj   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
5959*a9fa9459Szrj   if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
5960*a9fa9459Szrj     goto bad_return;
5961*a9fa9459Szrj 
5962*a9fa9459Szrj   hdr = &elf_section_data (relplt)->this_hdr;
5963*a9fa9459Szrj   count = relplt->size / hdr->sh_entsize;
5964*a9fa9459Szrj 
5965*a9fa9459Szrj   plt_sym_val = (bfd_vma *) bfd_malloc (sizeof (bfd_vma) * count);
5966*a9fa9459Szrj   if (plt_sym_val == NULL)
5967*a9fa9459Szrj     goto bad_return;
5968*a9fa9459Szrj 
5969*a9fa9459Szrj   for (i = 0; i < count; i++)
5970*a9fa9459Szrj     plt_sym_val[i] = -1;
5971*a9fa9459Szrj 
5972*a9fa9459Szrj   plt_offset = bed->plt->plt_entry_size;
5973*a9fa9459Szrj   p = relplt->relocation;
5974*a9fa9459Szrj   for (i = 0; i < count; i++, p++)
5975*a9fa9459Szrj     {
5976*a9fa9459Szrj       long reloc_index;
5977*a9fa9459Szrj 
5978*a9fa9459Szrj       /* Skip unknown relocation.  PR 17512: file: bc9d6cf5.  */
5979*a9fa9459Szrj       if (p->howto == NULL)
5980*a9fa9459Szrj 	continue;
5981*a9fa9459Szrj 
5982*a9fa9459Szrj       if (p->howto->type != R_386_JUMP_SLOT
5983*a9fa9459Szrj 	  && p->howto->type != R_386_IRELATIVE)
5984*a9fa9459Szrj 	continue;
5985*a9fa9459Szrj 
5986*a9fa9459Szrj       reloc_index = H_GET_32 (abfd, (plt_contents + plt_offset
5987*a9fa9459Szrj 				     + bed->plt->plt_reloc_offset));
5988*a9fa9459Szrj       reloc_index /= sizeof (Elf32_External_Rel);
5989*a9fa9459Szrj       if (reloc_index < count)
5990*a9fa9459Szrj 	plt_sym_val[reloc_index] = plt->vma + plt_offset;
5991*a9fa9459Szrj 
5992*a9fa9459Szrj       plt_offset += bed->plt->plt_entry_size;
5993*a9fa9459Szrj 
5994*a9fa9459Szrj       /* PR binutils/18437: Skip extra relocations in the .rel.plt
5995*a9fa9459Szrj 	 section.  */
5996*a9fa9459Szrj       if (plt_offset >= plt->size)
5997*a9fa9459Szrj 	break;
5998*a9fa9459Szrj     }
5999*a9fa9459Szrj 
6000*a9fa9459Szrj   free (plt_contents);
6001*a9fa9459Szrj 
6002*a9fa9459Szrj   return plt_sym_val;
6003*a9fa9459Szrj }
6004*a9fa9459Szrj 
6005*a9fa9459Szrj /* Similar to _bfd_elf_get_synthetic_symtab.  */
6006*a9fa9459Szrj 
6007*a9fa9459Szrj static long
elf_i386_get_synthetic_symtab(bfd * abfd,long symcount,asymbol ** syms,long dynsymcount,asymbol ** dynsyms,asymbol ** ret)6008*a9fa9459Szrj elf_i386_get_synthetic_symtab (bfd *abfd,
6009*a9fa9459Szrj 			       long symcount,
6010*a9fa9459Szrj 			       asymbol **syms,
6011*a9fa9459Szrj 			       long dynsymcount,
6012*a9fa9459Szrj 			       asymbol **dynsyms,
6013*a9fa9459Szrj 			       asymbol **ret)
6014*a9fa9459Szrj {
6015*a9fa9459Szrj   asection *plt = bfd_get_section_by_name (abfd, ".plt");
6016*a9fa9459Szrj   return _bfd_elf_ifunc_get_synthetic_symtab (abfd, symcount, syms,
6017*a9fa9459Szrj 					      dynsymcount, dynsyms, ret,
6018*a9fa9459Szrj 					      plt,
6019*a9fa9459Szrj 					      elf_i386_get_plt_sym_val);
6020*a9fa9459Szrj }
6021*a9fa9459Szrj 
6022*a9fa9459Szrj /* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
6023*a9fa9459Szrj 
6024*a9fa9459Szrj static bfd_boolean
elf_i386_hash_symbol(struct elf_link_hash_entry * h)6025*a9fa9459Szrj elf_i386_hash_symbol (struct elf_link_hash_entry *h)
6026*a9fa9459Szrj {
6027*a9fa9459Szrj   if (h->plt.offset != (bfd_vma) -1
6028*a9fa9459Szrj       && !h->def_regular
6029*a9fa9459Szrj       && !h->pointer_equality_needed)
6030*a9fa9459Szrj     return FALSE;
6031*a9fa9459Szrj 
6032*a9fa9459Szrj   return _bfd_elf_hash_symbol (h);
6033*a9fa9459Szrj }
6034*a9fa9459Szrj 
6035*a9fa9459Szrj #define TARGET_LITTLE_SYM		i386_elf32_vec
6036*a9fa9459Szrj #define TARGET_LITTLE_NAME		"elf32-i386"
6037*a9fa9459Szrj #define ELF_ARCH			bfd_arch_i386
6038*a9fa9459Szrj #define ELF_TARGET_ID			I386_ELF_DATA
6039*a9fa9459Szrj #define ELF_MACHINE_CODE		EM_386
6040*a9fa9459Szrj #define ELF_MAXPAGESIZE			0x1000
6041*a9fa9459Szrj 
6042*a9fa9459Szrj #define elf_backend_can_gc_sections	1
6043*a9fa9459Szrj #define elf_backend_can_refcount	1
6044*a9fa9459Szrj #define elf_backend_want_got_plt	1
6045*a9fa9459Szrj #define elf_backend_plt_readonly	1
6046*a9fa9459Szrj #define elf_backend_want_plt_sym	0
6047*a9fa9459Szrj #define elf_backend_got_header_size	12
6048*a9fa9459Szrj #define elf_backend_plt_alignment	4
6049*a9fa9459Szrj #define elf_backend_extern_protected_data 1
6050*a9fa9459Szrj #define elf_backend_caches_rawsize	1
6051*a9fa9459Szrj 
6052*a9fa9459Szrj /* Support RELA for objdump of prelink objects.  */
6053*a9fa9459Szrj #define elf_info_to_howto		      elf_i386_info_to_howto_rel
6054*a9fa9459Szrj #define elf_info_to_howto_rel		      elf_i386_info_to_howto_rel
6055*a9fa9459Szrj 
6056*a9fa9459Szrj #define bfd_elf32_mkobject		      elf_i386_mkobject
6057*a9fa9459Szrj 
6058*a9fa9459Szrj #define bfd_elf32_bfd_is_local_label_name     elf_i386_is_local_label_name
6059*a9fa9459Szrj #define bfd_elf32_bfd_link_hash_table_create  elf_i386_link_hash_table_create
6060*a9fa9459Szrj #define bfd_elf32_bfd_reloc_type_lookup	      elf_i386_reloc_type_lookup
6061*a9fa9459Szrj #define bfd_elf32_bfd_reloc_name_lookup	      elf_i386_reloc_name_lookup
6062*a9fa9459Szrj #define bfd_elf32_get_synthetic_symtab	      elf_i386_get_synthetic_symtab
6063*a9fa9459Szrj 
6064*a9fa9459Szrj #define elf_backend_adjust_dynamic_symbol     elf_i386_adjust_dynamic_symbol
6065*a9fa9459Szrj #define elf_backend_relocs_compatible	      _bfd_elf_relocs_compatible
6066*a9fa9459Szrj #define elf_backend_check_relocs	      elf_i386_check_relocs
6067*a9fa9459Szrj #define elf_backend_copy_indirect_symbol      elf_i386_copy_indirect_symbol
6068*a9fa9459Szrj #define elf_backend_create_dynamic_sections   elf_i386_create_dynamic_sections
6069*a9fa9459Szrj #define elf_backend_fake_sections	      elf_i386_fake_sections
6070*a9fa9459Szrj #define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
6071*a9fa9459Szrj #define elf_backend_finish_dynamic_symbol     elf_i386_finish_dynamic_symbol
6072*a9fa9459Szrj #define elf_backend_output_arch_local_syms     elf_i386_output_arch_local_syms
6073*a9fa9459Szrj #define elf_backend_gc_mark_hook	      elf_i386_gc_mark_hook
6074*a9fa9459Szrj #define elf_backend_grok_prstatus	      elf_i386_grok_prstatus
6075*a9fa9459Szrj #define elf_backend_grok_psinfo		      elf_i386_grok_psinfo
6076*a9fa9459Szrj #define elf_backend_reloc_type_class	      elf_i386_reloc_type_class
6077*a9fa9459Szrj #define elf_backend_relocate_section	      elf_i386_relocate_section
6078*a9fa9459Szrj #define elf_backend_size_dynamic_sections     elf_i386_size_dynamic_sections
6079*a9fa9459Szrj #define elf_backend_always_size_sections      elf_i386_always_size_sections
6080*a9fa9459Szrj #define elf_backend_omit_section_dynsym \
6081*a9fa9459Szrj   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
6082*a9fa9459Szrj #define elf_backend_hash_symbol		      elf_i386_hash_symbol
6083*a9fa9459Szrj #define elf_backend_fixup_symbol	      elf_i386_fixup_symbol
6084*a9fa9459Szrj 
6085*a9fa9459Szrj #include "elf32-target.h"
6086*a9fa9459Szrj 
6087*a9fa9459Szrj /* FreeBSD support.  */
6088*a9fa9459Szrj 
6089*a9fa9459Szrj #undef	TARGET_LITTLE_SYM
6090*a9fa9459Szrj #define	TARGET_LITTLE_SYM		i386_elf32_fbsd_vec
6091*a9fa9459Szrj #undef	TARGET_LITTLE_NAME
6092*a9fa9459Szrj #define	TARGET_LITTLE_NAME		"elf32-i386-freebsd"
6093*a9fa9459Szrj #undef	ELF_OSABI
6094*a9fa9459Szrj #define	ELF_OSABI			ELFOSABI_FREEBSD
6095*a9fa9459Szrj 
6096*a9fa9459Szrj /* The kernel recognizes executables as valid only if they carry a
6097*a9fa9459Szrj    "FreeBSD" label in the ELF header.  So we put this label on all
6098*a9fa9459Szrj    executables and (for simplicity) also all other object files.  */
6099*a9fa9459Szrj 
6100*a9fa9459Szrj static void
elf_i386_fbsd_post_process_headers(bfd * abfd,struct bfd_link_info * info)6101*a9fa9459Szrj elf_i386_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
6102*a9fa9459Szrj {
6103*a9fa9459Szrj   _bfd_elf_post_process_headers (abfd, info);
6104*a9fa9459Szrj 
6105*a9fa9459Szrj #ifdef OLD_FREEBSD_ABI_LABEL
6106*a9fa9459Szrj   {
6107*a9fa9459Szrj     /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
6108*a9fa9459Szrj     Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
6109*a9fa9459Szrj     memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
6110*a9fa9459Szrj   }
6111*a9fa9459Szrj #endif
6112*a9fa9459Szrj }
6113*a9fa9459Szrj 
6114*a9fa9459Szrj #undef	elf_backend_post_process_headers
6115*a9fa9459Szrj #define	elf_backend_post_process_headers	elf_i386_fbsd_post_process_headers
6116*a9fa9459Szrj #undef	elf32_bed
6117*a9fa9459Szrj #define	elf32_bed				elf32_i386_fbsd_bed
6118*a9fa9459Szrj 
6119*a9fa9459Szrj #undef elf_backend_add_symbol_hook
6120*a9fa9459Szrj 
6121*a9fa9459Szrj #include "elf32-target.h"
6122*a9fa9459Szrj 
6123*a9fa9459Szrj /* Solaris 2.  */
6124*a9fa9459Szrj 
6125*a9fa9459Szrj #undef	TARGET_LITTLE_SYM
6126*a9fa9459Szrj #define	TARGET_LITTLE_SYM		i386_elf32_sol2_vec
6127*a9fa9459Szrj #undef	TARGET_LITTLE_NAME
6128*a9fa9459Szrj #define	TARGET_LITTLE_NAME		"elf32-i386-sol2"
6129*a9fa9459Szrj 
6130*a9fa9459Szrj #undef elf_backend_post_process_headers
6131*a9fa9459Szrj 
6132*a9fa9459Szrj /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
6133*a9fa9459Szrj    objects won't be recognized.  */
6134*a9fa9459Szrj #undef ELF_OSABI
6135*a9fa9459Szrj 
6136*a9fa9459Szrj #undef	elf32_bed
6137*a9fa9459Szrj #define	elf32_bed			elf32_i386_sol2_bed
6138*a9fa9459Szrj 
6139*a9fa9459Szrj /* The 32-bit static TLS arena size is rounded to the nearest 8-byte
6140*a9fa9459Szrj    boundary.  */
6141*a9fa9459Szrj #undef  elf_backend_static_tls_alignment
6142*a9fa9459Szrj #define elf_backend_static_tls_alignment 8
6143*a9fa9459Szrj 
6144*a9fa9459Szrj /* The Solaris 2 ABI requires a plt symbol on all platforms.
6145*a9fa9459Szrj 
6146*a9fa9459Szrj    Cf. Linker and Libraries Guide, Ch. 2, Link-Editor, Generating the Output
6147*a9fa9459Szrj    File, p.63.  */
6148*a9fa9459Szrj #undef  elf_backend_want_plt_sym
6149*a9fa9459Szrj #define elf_backend_want_plt_sym	1
6150*a9fa9459Szrj 
6151*a9fa9459Szrj #undef  elf_backend_strtab_flags
6152*a9fa9459Szrj #define elf_backend_strtab_flags	SHF_STRINGS
6153*a9fa9459Szrj 
6154*a9fa9459Szrj /* Called to set the sh_flags, sh_link and sh_info fields of OSECTION which
6155*a9fa9459Szrj    has a type >= SHT_LOOS.  Returns TRUE if these fields were initialised
6156*a9fa9459Szrj    FALSE otherwise.  ISECTION is the best guess matching section from the
6157*a9fa9459Szrj    input bfd IBFD, but it might be NULL.  */
6158*a9fa9459Szrj 
6159*a9fa9459Szrj static bfd_boolean
elf32_i386_copy_solaris_special_section_fields(const bfd * ibfd ATTRIBUTE_UNUSED,bfd * obfd ATTRIBUTE_UNUSED,const Elf_Internal_Shdr * isection ATTRIBUTE_UNUSED,Elf_Internal_Shdr * osection ATTRIBUTE_UNUSED)6160*a9fa9459Szrj elf32_i386_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSED,
6161*a9fa9459Szrj 						bfd *obfd ATTRIBUTE_UNUSED,
6162*a9fa9459Szrj 						const Elf_Internal_Shdr *isection ATTRIBUTE_UNUSED,
6163*a9fa9459Szrj 						Elf_Internal_Shdr *osection ATTRIBUTE_UNUSED)
6164*a9fa9459Szrj {
6165*a9fa9459Szrj   /* PR 19938: FIXME: Need to add code for setting the sh_info
6166*a9fa9459Szrj      and sh_link fields of Solaris specific section types.  */
6167*a9fa9459Szrj   return FALSE;
6168*a9fa9459Szrj 
6169*a9fa9459Szrj   /* Based upon Oracle Solaris 11.3 Linkers and Libraries Guide, Ch. 13,
6170*a9fa9459Szrj      Object File Format, Table 13-9  ELF sh_link and sh_info Interpretation:
6171*a9fa9459Szrj 
6172*a9fa9459Szrj http://docs.oracle.com/cd/E53394_01/html/E54813/chapter6-94076.html#scrolltoc
6173*a9fa9459Szrj 
6174*a9fa9459Szrj      The following values should be set:
6175*a9fa9459Szrj 
6176*a9fa9459Szrj Type                 Link                           Info
6177*a9fa9459Szrj -----------------------------------------------------------------------------
6178*a9fa9459Szrj SHT_SUNW_ancillary   The section header index of    0
6179*a9fa9459Szrj  [0x6fffffee]        the associated string table.
6180*a9fa9459Szrj 
6181*a9fa9459Szrj SHT_SUNW_capinfo     The section header index of    For a dynamic object, the
6182*a9fa9459Szrj  [0x6ffffff0]        the associated symbol table.   section header index of
6183*a9fa9459Szrj                                                     the associated
6184*a9fa9459Szrj 						    SHT_SUNW_capchain table,
6185*a9fa9459Szrj 						    otherwise 0.
6186*a9fa9459Szrj 
6187*a9fa9459Szrj SHT_SUNW_symsort     The section header index of    0
6188*a9fa9459Szrj  [0x6ffffff1]        the associated symbol table.
6189*a9fa9459Szrj 
6190*a9fa9459Szrj SHT_SUNW_tlssort     The section header index of    0
6191*a9fa9459Szrj  [0x6ffffff2]        the associated symbol table.
6192*a9fa9459Szrj 
6193*a9fa9459Szrj SHT_SUNW_LDYNSYM     The section header index of    One greater than the
6194*a9fa9459Szrj  [0x6ffffff3]        the associated string table.   symbol table index of the
6195*a9fa9459Szrj 		     This index is the same string  last local symbol,
6196*a9fa9459Szrj 		     table used by the SHT_DYNSYM   STB_LOCAL. Since
6197*a9fa9459Szrj 		     section.                       SHT_SUNW_LDYNSYM only
6198*a9fa9459Szrj 		                                    contains local symbols,
6199*a9fa9459Szrj 						    sh_info is equivalent to
6200*a9fa9459Szrj 						    the number of symbols in
6201*a9fa9459Szrj 						    the table.
6202*a9fa9459Szrj 
6203*a9fa9459Szrj SHT_SUNW_cap         If symbol capabilities exist,  If any capabilities refer
6204*a9fa9459Szrj  [0x6ffffff5]        the section header index of    to named strings, the
6205*a9fa9459Szrj                      the associated                 section header index of
6206*a9fa9459Szrj 		     SHT_SUNW_capinfo table,        the associated string
6207*a9fa9459Szrj 			  otherwise 0.              table, otherwise 0.
6208*a9fa9459Szrj 
6209*a9fa9459Szrj SHT_SUNW_move        The section header index of    0
6210*a9fa9459Szrj  [0x6ffffffa]        the associated symbol table.
6211*a9fa9459Szrj 
6212*a9fa9459Szrj SHT_SUNW_COMDAT      0                              0
6213*a9fa9459Szrj  [0x6ffffffb]
6214*a9fa9459Szrj 
6215*a9fa9459Szrj SHT_SUNW_syminfo     The section header index of    The section header index
6216*a9fa9459Szrj  [0x6ffffffc]        the associated symbol table.   of the associated
6217*a9fa9459Szrj 		                                    .dynamic section.
6218*a9fa9459Szrj 
6219*a9fa9459Szrj SHT_SUNW_verdef      The section header index of    The number of version
6220*a9fa9459Szrj  [0x6ffffffd]        the associated string table.   definitions within the
6221*a9fa9459Szrj 		                                    section.
6222*a9fa9459Szrj 
6223*a9fa9459Szrj SHT_SUNW_verneed     The section header index of    The number of version
6224*a9fa9459Szrj  [0x6ffffffe]        the associated string table.   dependencies within the
6225*a9fa9459Szrj                                                     section.
6226*a9fa9459Szrj 
6227*a9fa9459Szrj SHT_SUNW_versym      The section header index of    0
6228*a9fa9459Szrj  [0x6fffffff]        the associated symbol table.  */
6229*a9fa9459Szrj }
6230*a9fa9459Szrj 
6231*a9fa9459Szrj #undef  elf_backend_copy_special_section_fields
6232*a9fa9459Szrj #define elf_backend_copy_special_section_fields elf32_i386_copy_solaris_special_section_fields
6233*a9fa9459Szrj 
6234*a9fa9459Szrj #include "elf32-target.h"
6235*a9fa9459Szrj 
6236*a9fa9459Szrj /* Intel MCU support.  */
6237*a9fa9459Szrj 
6238*a9fa9459Szrj static bfd_boolean
elf32_iamcu_elf_object_p(bfd * abfd)6239*a9fa9459Szrj elf32_iamcu_elf_object_p (bfd *abfd)
6240*a9fa9459Szrj {
6241*a9fa9459Szrj   /* Set the right machine number for an IAMCU elf32 file.  */
6242*a9fa9459Szrj   bfd_default_set_arch_mach (abfd, bfd_arch_iamcu, bfd_mach_i386_iamcu);
6243*a9fa9459Szrj   return TRUE;
6244*a9fa9459Szrj }
6245*a9fa9459Szrj 
6246*a9fa9459Szrj #undef  TARGET_LITTLE_SYM
6247*a9fa9459Szrj #define TARGET_LITTLE_SYM		iamcu_elf32_vec
6248*a9fa9459Szrj #undef  TARGET_LITTLE_NAME
6249*a9fa9459Szrj #define TARGET_LITTLE_NAME		"elf32-iamcu"
6250*a9fa9459Szrj #undef  ELF_ARCH
6251*a9fa9459Szrj #define ELF_ARCH			bfd_arch_iamcu
6252*a9fa9459Szrj 
6253*a9fa9459Szrj #undef	ELF_MACHINE_CODE
6254*a9fa9459Szrj #define	ELF_MACHINE_CODE		EM_IAMCU
6255*a9fa9459Szrj 
6256*a9fa9459Szrj #undef	ELF_OSABI
6257*a9fa9459Szrj 
6258*a9fa9459Szrj #undef  elf32_bed
6259*a9fa9459Szrj #define elf32_bed			elf32_iamcu_bed
6260*a9fa9459Szrj 
6261*a9fa9459Szrj #undef	elf_backend_object_p
6262*a9fa9459Szrj #define elf_backend_object_p		elf32_iamcu_elf_object_p
6263*a9fa9459Szrj 
6264*a9fa9459Szrj #undef	elf_backend_static_tls_alignment
6265*a9fa9459Szrj 
6266*a9fa9459Szrj #undef	elf_backend_want_plt_sym
6267*a9fa9459Szrj #define elf_backend_want_plt_sym	    0
6268*a9fa9459Szrj 
6269*a9fa9459Szrj #undef  elf_backend_strtab_flags
6270*a9fa9459Szrj #undef  elf_backend_copy_special_section_fields
6271*a9fa9459Szrj 
6272*a9fa9459Szrj #include "elf32-target.h"
6273*a9fa9459Szrj 
6274*a9fa9459Szrj /* Restore defaults.  */
6275*a9fa9459Szrj #undef	ELF_ARCH
6276*a9fa9459Szrj #define ELF_ARCH			bfd_arch_i386
6277*a9fa9459Szrj #undef	ELF_MACHINE_CODE
6278*a9fa9459Szrj #define ELF_MACHINE_CODE		EM_386
6279*a9fa9459Szrj 
6280*a9fa9459Szrj /* Native Client support.  */
6281*a9fa9459Szrj 
6282*a9fa9459Szrj #undef	TARGET_LITTLE_SYM
6283*a9fa9459Szrj #define	TARGET_LITTLE_SYM		i386_elf32_nacl_vec
6284*a9fa9459Szrj #undef	TARGET_LITTLE_NAME
6285*a9fa9459Szrj #define	TARGET_LITTLE_NAME		"elf32-i386-nacl"
6286*a9fa9459Szrj #undef	elf32_bed
6287*a9fa9459Szrj #define	elf32_bed			elf32_i386_nacl_bed
6288*a9fa9459Szrj 
6289*a9fa9459Szrj #undef	ELF_MAXPAGESIZE
6290*a9fa9459Szrj #define	ELF_MAXPAGESIZE			0x10000
6291*a9fa9459Szrj 
6292*a9fa9459Szrj /* Restore defaults.  */
6293*a9fa9459Szrj #undef	ELF_OSABI
6294*a9fa9459Szrj #undef	elf_backend_want_plt_sym
6295*a9fa9459Szrj #define elf_backend_want_plt_sym	0
6296*a9fa9459Szrj #undef	elf_backend_post_process_headers
6297*a9fa9459Szrj #undef	elf_backend_static_tls_alignment
6298*a9fa9459Szrj 
6299*a9fa9459Szrj /* NaCl uses substantially different PLT entries for the same effects.  */
6300*a9fa9459Szrj 
6301*a9fa9459Szrj #undef	elf_backend_plt_alignment
6302*a9fa9459Szrj #define elf_backend_plt_alignment	5
6303*a9fa9459Szrj #define NACL_PLT_ENTRY_SIZE		64
6304*a9fa9459Szrj #define	NACLMASK			0xe0 /* 32-byte alignment mask.  */
6305*a9fa9459Szrj 
6306*a9fa9459Szrj static const bfd_byte elf_i386_nacl_plt0_entry[] =
6307*a9fa9459Szrj   {
6308*a9fa9459Szrj     0xff, 0x35,			  /* pushl contents of address */
6309*a9fa9459Szrj     0, 0, 0, 0,			  /* replaced with address of .got + 4.	 */
6310*a9fa9459Szrj     0x8b, 0x0d,                   /* movl contents of address, %ecx */
6311*a9fa9459Szrj     0, 0, 0, 0,			  /* replaced with address of .got + 8.	 */
6312*a9fa9459Szrj     0x83, 0xe1, NACLMASK,	  /* andl $NACLMASK, %ecx */
6313*a9fa9459Szrj     0xff, 0xe1			  /* jmp *%ecx */
6314*a9fa9459Szrj   };
6315*a9fa9459Szrj 
6316*a9fa9459Szrj static const bfd_byte elf_i386_nacl_plt_entry[NACL_PLT_ENTRY_SIZE] =
6317*a9fa9459Szrj   {
6318*a9fa9459Szrj     0x8b, 0x0d,				/* movl contents of address, %ecx */
6319*a9fa9459Szrj     0, 0, 0, 0,				/* replaced with GOT slot address.  */
6320*a9fa9459Szrj     0x83, 0xe1, NACLMASK,		/* andl $NACLMASK, %ecx */
6321*a9fa9459Szrj     0xff, 0xe1,				/* jmp *%ecx */
6322*a9fa9459Szrj 
6323*a9fa9459Szrj     /* Pad to the next 32-byte boundary with nop instructions.	*/
6324*a9fa9459Szrj     0x90,
6325*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6326*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6327*a9fa9459Szrj 
6328*a9fa9459Szrj     /* Lazy GOT entries point here (32-byte aligned).  */
6329*a9fa9459Szrj     0x68,			       /* pushl immediate */
6330*a9fa9459Szrj     0, 0, 0, 0,			       /* replaced with reloc offset.  */
6331*a9fa9459Szrj     0xe9,			       /* jmp relative */
6332*a9fa9459Szrj     0, 0, 0, 0,			       /* replaced with offset to .plt.	 */
6333*a9fa9459Szrj 
6334*a9fa9459Szrj     /* Pad to the next 32-byte boundary with nop instructions.	*/
6335*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6336*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6337*a9fa9459Szrj     0x90, 0x90
6338*a9fa9459Szrj   };
6339*a9fa9459Szrj 
6340*a9fa9459Szrj static const bfd_byte
6341*a9fa9459Szrj elf_i386_nacl_pic_plt0_entry[sizeof (elf_i386_nacl_plt0_entry)] =
6342*a9fa9459Szrj   {
6343*a9fa9459Szrj     0xff, 0x73, 0x04,		/* pushl 4(%ebx) */
6344*a9fa9459Szrj     0x8b, 0x4b, 0x08,		/* mov 0x8(%ebx), %ecx */
6345*a9fa9459Szrj     0x83, 0xe1, 0xe0,		/* and $NACLMASK, %ecx */
6346*a9fa9459Szrj     0xff, 0xe1,			/* jmp *%ecx */
6347*a9fa9459Szrj 
6348*a9fa9459Szrj     /* This is expected to be the same size as elf_i386_nacl_plt0_entry,
6349*a9fa9459Szrj        so pad to that size with nop instructions.  */
6350*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90
6351*a9fa9459Szrj   };
6352*a9fa9459Szrj 
6353*a9fa9459Szrj static const bfd_byte elf_i386_nacl_pic_plt_entry[NACL_PLT_ENTRY_SIZE] =
6354*a9fa9459Szrj   {
6355*a9fa9459Szrj     0x8b, 0x8b,          /* movl offset(%ebx), %ecx */
6356*a9fa9459Szrj     0, 0, 0, 0,          /* replaced with offset of this symbol in .got.  */
6357*a9fa9459Szrj     0x83, 0xe1, 0xe0,    /* andl $NACLMASK, %ecx */
6358*a9fa9459Szrj     0xff, 0xe1,          /* jmp *%ecx */
6359*a9fa9459Szrj 
6360*a9fa9459Szrj     /* Pad to the next 32-byte boundary with nop instructions.	*/
6361*a9fa9459Szrj     0x90,
6362*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6363*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6364*a9fa9459Szrj 
6365*a9fa9459Szrj     /* Lazy GOT entries point here (32-byte aligned).  */
6366*a9fa9459Szrj     0x68,                /* pushl immediate */
6367*a9fa9459Szrj     0, 0, 0, 0,          /* replaced with offset into relocation table.  */
6368*a9fa9459Szrj     0xe9,                /* jmp relative */
6369*a9fa9459Szrj     0, 0, 0, 0,          /* replaced with offset to start of .plt.  */
6370*a9fa9459Szrj 
6371*a9fa9459Szrj     /* Pad to the next 32-byte boundary with nop instructions.	*/
6372*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6373*a9fa9459Szrj     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
6374*a9fa9459Szrj     0x90, 0x90
6375*a9fa9459Szrj   };
6376*a9fa9459Szrj 
6377*a9fa9459Szrj static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
6378*a9fa9459Szrj   {
6379*a9fa9459Szrj #if (PLT_CIE_LENGTH != 20                               \
6380*a9fa9459Szrj      || PLT_FDE_LENGTH != 36                            \
6381*a9fa9459Szrj      || PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8  \
6382*a9fa9459Szrj      || PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
6383*a9fa9459Szrj # error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
6384*a9fa9459Szrj #endif
6385*a9fa9459Szrj     PLT_CIE_LENGTH, 0, 0, 0,		/* CIE length */
6386*a9fa9459Szrj     0, 0, 0, 0,                         /* CIE ID */
6387*a9fa9459Szrj     1,                                  /* CIE version */
6388*a9fa9459Szrj     'z', 'R', 0,                        /* Augmentation string */
6389*a9fa9459Szrj     1,                                  /* Code alignment factor */
6390*a9fa9459Szrj     0x7c,                               /* Data alignment factor: -4 */
6391*a9fa9459Szrj     8,                                  /* Return address column */
6392*a9fa9459Szrj     1,					/* Augmentation size */
6393*a9fa9459Szrj     DW_EH_PE_pcrel | DW_EH_PE_sdata4,	/* FDE encoding */
6394*a9fa9459Szrj     DW_CFA_def_cfa, 4, 4,		/* DW_CFA_def_cfa: r4 (esp) ofs 4 */
6395*a9fa9459Szrj     DW_CFA_offset + 8, 1,		/* DW_CFA_offset: r8 (eip) at cfa-4 */
6396*a9fa9459Szrj     DW_CFA_nop, DW_CFA_nop,
6397*a9fa9459Szrj 
6398*a9fa9459Szrj     PLT_FDE_LENGTH, 0, 0, 0,     /* FDE length */
6399*a9fa9459Szrj     PLT_CIE_LENGTH + 8, 0, 0, 0, /* CIE pointer */
6400*a9fa9459Szrj     0, 0, 0, 0,                  /* R_386_PC32 .plt goes here */
6401*a9fa9459Szrj     0, 0, 0, 0,                  /* .plt size goes here */
6402*a9fa9459Szrj     0,                           /* Augmentation size */
6403*a9fa9459Szrj     DW_CFA_def_cfa_offset, 8,    /* DW_CFA_def_cfa_offset: 8 */
6404*a9fa9459Szrj     DW_CFA_advance_loc + 6,      /* DW_CFA_advance_loc: 6 to __PLT__+6 */
6405*a9fa9459Szrj     DW_CFA_def_cfa_offset, 12,   /* DW_CFA_def_cfa_offset: 12 */
6406*a9fa9459Szrj     DW_CFA_advance_loc + 58,     /* DW_CFA_advance_loc: 58 to __PLT__+64 */
6407*a9fa9459Szrj     DW_CFA_def_cfa_expression,   /* DW_CFA_def_cfa_expression */
6408*a9fa9459Szrj     13,                          /* Block length */
6409*a9fa9459Szrj     DW_OP_breg4, 4,              /* DW_OP_breg4 (esp): 4 */
6410*a9fa9459Szrj     DW_OP_breg8, 0,              /* DW_OP_breg8 (eip): 0 */
6411*a9fa9459Szrj     DW_OP_const1u, 63, DW_OP_and, DW_OP_const1u, 37, DW_OP_ge,
6412*a9fa9459Szrj     DW_OP_lit2, DW_OP_shl, DW_OP_plus,
6413*a9fa9459Szrj     DW_CFA_nop, DW_CFA_nop
6414*a9fa9459Szrj   };
6415*a9fa9459Szrj 
6416*a9fa9459Szrj static const struct elf_i386_plt_layout elf_i386_nacl_plt =
6417*a9fa9459Szrj   {
6418*a9fa9459Szrj     elf_i386_nacl_plt0_entry,		/* plt0_entry */
6419*a9fa9459Szrj     sizeof (elf_i386_nacl_plt0_entry),	/* plt0_entry_size */
6420*a9fa9459Szrj     2,					/* plt0_got1_offset */
6421*a9fa9459Szrj     8,					/* plt0_got2_offset */
6422*a9fa9459Szrj     elf_i386_nacl_plt_entry,		/* plt_entry */
6423*a9fa9459Szrj     NACL_PLT_ENTRY_SIZE,		/* plt_entry_size */
6424*a9fa9459Szrj     2,					/* plt_got_offset */
6425*a9fa9459Szrj     33,					/* plt_reloc_offset */
6426*a9fa9459Szrj     38,					/* plt_plt_offset */
6427*a9fa9459Szrj     32,					/* plt_lazy_offset */
6428*a9fa9459Szrj     elf_i386_nacl_pic_plt0_entry,	/* pic_plt0_entry */
6429*a9fa9459Szrj     elf_i386_nacl_pic_plt_entry,	/* pic_plt_entry */
6430*a9fa9459Szrj     elf_i386_nacl_eh_frame_plt,		/* eh_frame_plt */
6431*a9fa9459Szrj     sizeof (elf_i386_nacl_eh_frame_plt),/* eh_frame_plt_size */
6432*a9fa9459Szrj   };
6433*a9fa9459Szrj 
6434*a9fa9459Szrj static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
6435*a9fa9459Szrj   {
6436*a9fa9459Szrj     &elf_i386_nacl_plt,                      /* plt */
6437*a9fa9459Szrj     0x90,				/* plt0_pad_byte: nop insn */
6438*a9fa9459Szrj     0,                                  /* is_vxworks */
6439*a9fa9459Szrj   };
6440*a9fa9459Szrj 
6441*a9fa9459Szrj static bfd_boolean
elf32_i386_nacl_elf_object_p(bfd * abfd)6442*a9fa9459Szrj elf32_i386_nacl_elf_object_p (bfd *abfd)
6443*a9fa9459Szrj {
6444*a9fa9459Szrj   /* Set the right machine number for a NaCl i386 ELF32 file.  */
6445*a9fa9459Szrj   bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i386_nacl);
6446*a9fa9459Szrj   return TRUE;
6447*a9fa9459Szrj }
6448*a9fa9459Szrj 
6449*a9fa9459Szrj #undef	elf_backend_arch_data
6450*a9fa9459Szrj #define elf_backend_arch_data	&elf_i386_nacl_arch_bed
6451*a9fa9459Szrj 
6452*a9fa9459Szrj #undef	elf_backend_object_p
6453*a9fa9459Szrj #define elf_backend_object_p			elf32_i386_nacl_elf_object_p
6454*a9fa9459Szrj #undef	elf_backend_modify_segment_map
6455*a9fa9459Szrj #define	elf_backend_modify_segment_map		nacl_modify_segment_map
6456*a9fa9459Szrj #undef	elf_backend_modify_program_headers
6457*a9fa9459Szrj #define	elf_backend_modify_program_headers	nacl_modify_program_headers
6458*a9fa9459Szrj #undef	elf_backend_final_write_processing
6459*a9fa9459Szrj #define elf_backend_final_write_processing	nacl_final_write_processing
6460*a9fa9459Szrj 
6461*a9fa9459Szrj #include "elf32-target.h"
6462*a9fa9459Szrj 
6463*a9fa9459Szrj /* Restore defaults.  */
6464*a9fa9459Szrj #undef	elf_backend_object_p
6465*a9fa9459Szrj #undef	elf_backend_modify_segment_map
6466*a9fa9459Szrj #undef	elf_backend_modify_program_headers
6467*a9fa9459Szrj #undef	elf_backend_final_write_processing
6468*a9fa9459Szrj 
6469*a9fa9459Szrj /* VxWorks support.  */
6470*a9fa9459Szrj 
6471*a9fa9459Szrj #undef	TARGET_LITTLE_SYM
6472*a9fa9459Szrj #define TARGET_LITTLE_SYM		i386_elf32_vxworks_vec
6473*a9fa9459Szrj #undef	TARGET_LITTLE_NAME
6474*a9fa9459Szrj #define TARGET_LITTLE_NAME		"elf32-i386-vxworks"
6475*a9fa9459Szrj #undef	ELF_OSABI
6476*a9fa9459Szrj #undef	elf_backend_plt_alignment
6477*a9fa9459Szrj #define elf_backend_plt_alignment	4
6478*a9fa9459Szrj 
6479*a9fa9459Szrj static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
6480*a9fa9459Szrj   {
6481*a9fa9459Szrj     &elf_i386_plt,                      /* plt */
6482*a9fa9459Szrj     0x90,                               /* plt0_pad_byte */
6483*a9fa9459Szrj     1,                                  /* is_vxworks */
6484*a9fa9459Szrj   };
6485*a9fa9459Szrj 
6486*a9fa9459Szrj #undef	elf_backend_arch_data
6487*a9fa9459Szrj #define	elf_backend_arch_data	&elf_i386_vxworks_arch_bed
6488*a9fa9459Szrj 
6489*a9fa9459Szrj #undef elf_backend_relocs_compatible
6490*a9fa9459Szrj #undef elf_backend_add_symbol_hook
6491*a9fa9459Szrj #define elf_backend_add_symbol_hook \
6492*a9fa9459Szrj   elf_vxworks_add_symbol_hook
6493*a9fa9459Szrj #undef elf_backend_link_output_symbol_hook
6494*a9fa9459Szrj #define elf_backend_link_output_symbol_hook \
6495*a9fa9459Szrj   elf_vxworks_link_output_symbol_hook
6496*a9fa9459Szrj #undef elf_backend_emit_relocs
6497*a9fa9459Szrj #define elf_backend_emit_relocs			elf_vxworks_emit_relocs
6498*a9fa9459Szrj #undef elf_backend_final_write_processing
6499*a9fa9459Szrj #define elf_backend_final_write_processing \
6500*a9fa9459Szrj   elf_vxworks_final_write_processing
6501*a9fa9459Szrj #undef elf_backend_static_tls_alignment
6502*a9fa9459Szrj 
6503*a9fa9459Szrj /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
6504*a9fa9459Szrj    define it.  */
6505*a9fa9459Szrj #undef elf_backend_want_plt_sym
6506*a9fa9459Szrj #define elf_backend_want_plt_sym	1
6507*a9fa9459Szrj 
6508*a9fa9459Szrj #undef	elf32_bed
6509*a9fa9459Szrj #define elf32_bed				elf32_i386_vxworks_bed
6510*a9fa9459Szrj 
6511*a9fa9459Szrj #include "elf32-target.h"
6512