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