2006-02-26 David S. Miller <davem@sunset.davemloft.net>
[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,
67a4f2b7 3 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
252b5132 4
571fe01f 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
571fe01f
NC
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
252b5132 11
571fe01f
NC
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
252b5132 16
571fe01f
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
3e110533 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132
RH
20
21#include "bfd.h"
22#include "sysdep.h"
23#include "bfdlink.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
eac338cf 26#include "elf-vxworks.h"
252b5132 27
55fd94b0
AM
28/* 386 uses REL relocations instead of RELA. */
29#define USE_REL 1
252b5132
RH
30
31#include "elf/i386.h"
32
33static reloc_howto_type elf_howto_table[]=
34{
b34976b6 35 HOWTO(R_386_NONE, 0, 0, 0, FALSE, 0, complain_overflow_bitfield,
1b452ec6 36 bfd_elf_generic_reloc, "R_386_NONE",
b34976b6
AM
37 TRUE, 0x00000000, 0x00000000, FALSE),
38 HOWTO(R_386_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 39 bfd_elf_generic_reloc, "R_386_32",
b34976b6
AM
40 TRUE, 0xffffffff, 0xffffffff, FALSE),
41 HOWTO(R_386_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
1b452ec6 42 bfd_elf_generic_reloc, "R_386_PC32",
b34976b6
AM
43 TRUE, 0xffffffff, 0xffffffff, TRUE),
44 HOWTO(R_386_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 45 bfd_elf_generic_reloc, "R_386_GOT32",
b34976b6
AM
46 TRUE, 0xffffffff, 0xffffffff, FALSE),
47 HOWTO(R_386_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
1b452ec6 48 bfd_elf_generic_reloc, "R_386_PLT32",
b34976b6
AM
49 TRUE, 0xffffffff, 0xffffffff, TRUE),
50 HOWTO(R_386_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 51 bfd_elf_generic_reloc, "R_386_COPY",
b34976b6
AM
52 TRUE, 0xffffffff, 0xffffffff, FALSE),
53 HOWTO(R_386_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 54 bfd_elf_generic_reloc, "R_386_GLOB_DAT",
b34976b6
AM
55 TRUE, 0xffffffff, 0xffffffff, FALSE),
56 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 57 bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
b34976b6
AM
58 TRUE, 0xffffffff, 0xffffffff, FALSE),
59 HOWTO(R_386_RELATIVE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 60 bfd_elf_generic_reloc, "R_386_RELATIVE",
b34976b6
AM
61 TRUE, 0xffffffff, 0xffffffff, FALSE),
62 HOWTO(R_386_GOTOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
1b452ec6 63 bfd_elf_generic_reloc, "R_386_GOTOFF",
b34976b6
AM
64 TRUE, 0xffffffff, 0xffffffff, FALSE),
65 HOWTO(R_386_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield,
1b452ec6 66 bfd_elf_generic_reloc, "R_386_GOTPC",
b34976b6 67 TRUE, 0xffffffff, 0xffffffff, TRUE),
1b452ec6 68
dc47f327
AM
69 /* We have a gap in the reloc numbers here.
70 R_386_standard counts the number up to this point, and
71 R_386_ext_offset is the value to subtract from a reloc type of
72 R_386_16 thru R_386_PC8 to form an index into this table. */
55fd94b0
AM
73#define R_386_standard (R_386_GOTPC + 1)
74#define R_386_ext_offset (R_386_TLS_TPOFF - R_386_standard)
1b452ec6 75
37e55690 76 /* These relocs are a GNU extension. */
b34976b6 77 HOWTO(R_386_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
37e55690 78 bfd_elf_generic_reloc, "R_386_TLS_TPOFF",
b34976b6
AM
79 TRUE, 0xffffffff, 0xffffffff, FALSE),
80 HOWTO(R_386_TLS_IE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
37e55690 81 bfd_elf_generic_reloc, "R_386_TLS_IE",
b34976b6
AM
82 TRUE, 0xffffffff, 0xffffffff, FALSE),
83 HOWTO(R_386_TLS_GOTIE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
37e55690 84 bfd_elf_generic_reloc, "R_386_TLS_GOTIE",
b34976b6
AM
85 TRUE, 0xffffffff, 0xffffffff, FALSE),
86 HOWTO(R_386_TLS_LE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 87 bfd_elf_generic_reloc, "R_386_TLS_LE",
b34976b6
AM
88 TRUE, 0xffffffff, 0xffffffff, FALSE),
89 HOWTO(R_386_TLS_GD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 90 bfd_elf_generic_reloc, "R_386_TLS_GD",
b34976b6
AM
91 TRUE, 0xffffffff, 0xffffffff, FALSE),
92 HOWTO(R_386_TLS_LDM, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 93 bfd_elf_generic_reloc, "R_386_TLS_LDM",
b34976b6
AM
94 TRUE, 0xffffffff, 0xffffffff, FALSE),
95 HOWTO(R_386_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield,
1b452ec6 96 bfd_elf_generic_reloc, "R_386_16",
b34976b6 97 TRUE, 0xffff, 0xffff, FALSE),
b0360d8c 98 HOWTO(R_386_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield,
1b452ec6 99 bfd_elf_generic_reloc, "R_386_PC16",
b34976b6
AM
100 TRUE, 0xffff, 0xffff, TRUE),
101 HOWTO(R_386_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield,
1b452ec6 102 bfd_elf_generic_reloc, "R_386_8",
b34976b6
AM
103 TRUE, 0xff, 0xff, FALSE),
104 HOWTO(R_386_PC8, 0, 0, 8, TRUE, 0, complain_overflow_signed,
1b452ec6 105 bfd_elf_generic_reloc, "R_386_PC8",
b34976b6 106 TRUE, 0xff, 0xff, TRUE),
dc47f327 107
55fd94b0
AM
108#define R_386_ext (R_386_PC8 + 1 - R_386_ext_offset)
109#define R_386_tls_offset (R_386_TLS_LDO_32 - R_386_ext)
13ae64f3 110 /* These are common with Solaris TLS implementation. */
b34976b6 111 HOWTO(R_386_TLS_LDO_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 112 bfd_elf_generic_reloc, "R_386_TLS_LDO_32",
b34976b6
AM
113 TRUE, 0xffffffff, 0xffffffff, FALSE),
114 HOWTO(R_386_TLS_IE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 115 bfd_elf_generic_reloc, "R_386_TLS_IE_32",
b34976b6
AM
116 TRUE, 0xffffffff, 0xffffffff, FALSE),
117 HOWTO(R_386_TLS_LE_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 118 bfd_elf_generic_reloc, "R_386_TLS_LE_32",
b34976b6
AM
119 TRUE, 0xffffffff, 0xffffffff, FALSE),
120 HOWTO(R_386_TLS_DTPMOD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 121 bfd_elf_generic_reloc, "R_386_TLS_DTPMOD32",
b34976b6
AM
122 TRUE, 0xffffffff, 0xffffffff, FALSE),
123 HOWTO(R_386_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 124 bfd_elf_generic_reloc, "R_386_TLS_DTPOFF32",
b34976b6
AM
125 TRUE, 0xffffffff, 0xffffffff, FALSE),
126 HOWTO(R_386_TLS_TPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
13ae64f3 127 bfd_elf_generic_reloc, "R_386_TLS_TPOFF32",
b34976b6 128 TRUE, 0xffffffff, 0xffffffff, FALSE),
67a4f2b7
AO
129 EMPTY_HOWTO (38),
130 HOWTO(R_386_TLS_GOTDESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
131 bfd_elf_generic_reloc, "R_386_TLS_GOTDESC",
132 TRUE, 0xffffffff, 0xffffffff, FALSE),
133 HOWTO(R_386_TLS_DESC_CALL, 0, 0, 0, FALSE, 0, complain_overflow_dont,
134 bfd_elf_generic_reloc, "R_386_TLS_DESC_CALL",
135 FALSE, 0, 0, FALSE),
136 HOWTO(R_386_TLS_DESC, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
137 bfd_elf_generic_reloc, "R_386_TLS_DESC",
138 TRUE, 0xffffffff, 0xffffffff, FALSE),
13ae64f3
JJ
139
140 /* Another gap. */
67a4f2b7 141#define R_386_tls (R_386_TLS_DESC + 1 - R_386_tls_offset)
55fd94b0 142#define R_386_vt_offset (R_386_GNU_VTINHERIT - R_386_tls)
252b5132
RH
143
144/* GNU extension to record C++ vtable hierarchy. */
252b5132
RH
145 HOWTO (R_386_GNU_VTINHERIT, /* type */
146 0, /* rightshift */
147 2, /* size (0 = byte, 1 = short, 2 = long) */
148 0, /* bitsize */
b34976b6 149 FALSE, /* pc_relative */
252b5132
RH
150 0, /* bitpos */
151 complain_overflow_dont, /* complain_on_overflow */
152 NULL, /* special_function */
153 "R_386_GNU_VTINHERIT", /* name */
b34976b6 154 FALSE, /* partial_inplace */
252b5132
RH
155 0, /* src_mask */
156 0, /* dst_mask */
b34976b6 157 FALSE), /* pcrel_offset */
252b5132
RH
158
159/* GNU extension to record C++ vtable member usage. */
252b5132
RH
160 HOWTO (R_386_GNU_VTENTRY, /* type */
161 0, /* rightshift */
162 2, /* size (0 = byte, 1 = short, 2 = long) */
163 0, /* bitsize */
b34976b6 164 FALSE, /* pc_relative */
252b5132
RH
165 0, /* bitpos */
166 complain_overflow_dont, /* complain_on_overflow */
167 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
168 "R_386_GNU_VTENTRY", /* name */
b34976b6 169 FALSE, /* partial_inplace */
252b5132
RH
170 0, /* src_mask */
171 0, /* dst_mask */
b34976b6 172 FALSE) /* pcrel_offset */
dc47f327 173
55fd94b0 174#define R_386_vt (R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
dc47f327
AM
175
176};
177
252b5132 178#ifdef DEBUG_GEN_RELOC
55fd94b0
AM
179#define TRACE(str) \
180 fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
252b5132
RH
181#else
182#define TRACE(str)
183#endif
184
185static reloc_howto_type *
55fd94b0
AM
186elf_i386_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
187 bfd_reloc_code_real_type code)
252b5132
RH
188{
189 switch (code)
190 {
191 case BFD_RELOC_NONE:
192 TRACE ("BFD_RELOC_NONE");
55fd94b0 193 return &elf_howto_table[R_386_NONE];
252b5132
RH
194
195 case BFD_RELOC_32:
196 TRACE ("BFD_RELOC_32");
55fd94b0 197 return &elf_howto_table[R_386_32];
252b5132
RH
198
199 case BFD_RELOC_CTOR:
200 TRACE ("BFD_RELOC_CTOR");
55fd94b0 201 return &elf_howto_table[R_386_32];
252b5132
RH
202
203 case BFD_RELOC_32_PCREL:
204 TRACE ("BFD_RELOC_PC32");
55fd94b0 205 return &elf_howto_table[R_386_PC32];
252b5132
RH
206
207 case BFD_RELOC_386_GOT32:
208 TRACE ("BFD_RELOC_386_GOT32");
55fd94b0 209 return &elf_howto_table[R_386_GOT32];
252b5132
RH
210
211 case BFD_RELOC_386_PLT32:
212 TRACE ("BFD_RELOC_386_PLT32");
55fd94b0 213 return &elf_howto_table[R_386_PLT32];
252b5132
RH
214
215 case BFD_RELOC_386_COPY:
216 TRACE ("BFD_RELOC_386_COPY");
55fd94b0 217 return &elf_howto_table[R_386_COPY];
252b5132
RH
218
219 case BFD_RELOC_386_GLOB_DAT:
220 TRACE ("BFD_RELOC_386_GLOB_DAT");
55fd94b0 221 return &elf_howto_table[R_386_GLOB_DAT];
252b5132
RH
222
223 case BFD_RELOC_386_JUMP_SLOT:
224 TRACE ("BFD_RELOC_386_JUMP_SLOT");
55fd94b0 225 return &elf_howto_table[R_386_JUMP_SLOT];
252b5132
RH
226
227 case BFD_RELOC_386_RELATIVE:
228 TRACE ("BFD_RELOC_386_RELATIVE");
55fd94b0 229 return &elf_howto_table[R_386_RELATIVE];
252b5132
RH
230
231 case BFD_RELOC_386_GOTOFF:
232 TRACE ("BFD_RELOC_386_GOTOFF");
55fd94b0 233 return &elf_howto_table[R_386_GOTOFF];
252b5132
RH
234
235 case BFD_RELOC_386_GOTPC:
236 TRACE ("BFD_RELOC_386_GOTPC");
55fd94b0 237 return &elf_howto_table[R_386_GOTPC];
252b5132 238
37e55690
JJ
239 /* These relocs are a GNU extension. */
240 case BFD_RELOC_386_TLS_TPOFF:
241 TRACE ("BFD_RELOC_386_TLS_TPOFF");
55fd94b0 242 return &elf_howto_table[R_386_TLS_TPOFF - R_386_ext_offset];
37e55690
JJ
243
244 case BFD_RELOC_386_TLS_IE:
245 TRACE ("BFD_RELOC_386_TLS_IE");
55fd94b0 246 return &elf_howto_table[R_386_TLS_IE - R_386_ext_offset];
37e55690
JJ
247
248 case BFD_RELOC_386_TLS_GOTIE:
249 TRACE ("BFD_RELOC_386_TLS_GOTIE");
55fd94b0 250 return &elf_howto_table[R_386_TLS_GOTIE - R_386_ext_offset];
37e55690 251
13ae64f3
JJ
252 case BFD_RELOC_386_TLS_LE:
253 TRACE ("BFD_RELOC_386_TLS_LE");
55fd94b0 254 return &elf_howto_table[R_386_TLS_LE - R_386_ext_offset];
13ae64f3
JJ
255
256 case BFD_RELOC_386_TLS_GD:
257 TRACE ("BFD_RELOC_386_TLS_GD");
55fd94b0 258 return &elf_howto_table[R_386_TLS_GD - R_386_ext_offset];
13ae64f3
JJ
259
260 case BFD_RELOC_386_TLS_LDM:
261 TRACE ("BFD_RELOC_386_TLS_LDM");
55fd94b0 262 return &elf_howto_table[R_386_TLS_LDM - R_386_ext_offset];
13ae64f3 263
252b5132
RH
264 case BFD_RELOC_16:
265 TRACE ("BFD_RELOC_16");
55fd94b0 266 return &elf_howto_table[R_386_16 - R_386_ext_offset];
252b5132
RH
267
268 case BFD_RELOC_16_PCREL:
269 TRACE ("BFD_RELOC_16_PCREL");
55fd94b0 270 return &elf_howto_table[R_386_PC16 - R_386_ext_offset];
252b5132
RH
271
272 case BFD_RELOC_8:
273 TRACE ("BFD_RELOC_8");
55fd94b0 274 return &elf_howto_table[R_386_8 - R_386_ext_offset];
252b5132
RH
275
276 case BFD_RELOC_8_PCREL:
277 TRACE ("BFD_RELOC_8_PCREL");
55fd94b0 278 return &elf_howto_table[R_386_PC8 - R_386_ext_offset];
252b5132 279
13ae64f3
JJ
280 /* Common with Sun TLS implementation. */
281 case BFD_RELOC_386_TLS_LDO_32:
282 TRACE ("BFD_RELOC_386_TLS_LDO_32");
55fd94b0 283 return &elf_howto_table[R_386_TLS_LDO_32 - R_386_tls_offset];
13ae64f3
JJ
284
285 case BFD_RELOC_386_TLS_IE_32:
286 TRACE ("BFD_RELOC_386_TLS_IE_32");
55fd94b0 287 return &elf_howto_table[R_386_TLS_IE_32 - R_386_tls_offset];
13ae64f3
JJ
288
289 case BFD_RELOC_386_TLS_LE_32:
290 TRACE ("BFD_RELOC_386_TLS_LE_32");
55fd94b0 291 return &elf_howto_table[R_386_TLS_LE_32 - R_386_tls_offset];
13ae64f3
JJ
292
293 case BFD_RELOC_386_TLS_DTPMOD32:
294 TRACE ("BFD_RELOC_386_TLS_DTPMOD32");
55fd94b0 295 return &elf_howto_table[R_386_TLS_DTPMOD32 - R_386_tls_offset];
13ae64f3
JJ
296
297 case BFD_RELOC_386_TLS_DTPOFF32:
298 TRACE ("BFD_RELOC_386_TLS_DTPOFF32");
55fd94b0 299 return &elf_howto_table[R_386_TLS_DTPOFF32 - R_386_tls_offset];
13ae64f3
JJ
300
301 case BFD_RELOC_386_TLS_TPOFF32:
302 TRACE ("BFD_RELOC_386_TLS_TPOFF32");
55fd94b0 303 return &elf_howto_table[R_386_TLS_TPOFF32 - R_386_tls_offset];
13ae64f3 304
67a4f2b7
AO
305 case BFD_RELOC_386_TLS_GOTDESC:
306 TRACE ("BFD_RELOC_386_TLS_GOTDESC");
307 return &elf_howto_table[R_386_TLS_GOTDESC - R_386_tls_offset];
308
309 case BFD_RELOC_386_TLS_DESC_CALL:
310 TRACE ("BFD_RELOC_386_TLS_DESC_CALL");
311 return &elf_howto_table[R_386_TLS_DESC_CALL - R_386_tls_offset];
312
313 case BFD_RELOC_386_TLS_DESC:
314 TRACE ("BFD_RELOC_386_TLS_DESC");
315 return &elf_howto_table[R_386_TLS_DESC - R_386_tls_offset];
316
252b5132
RH
317 case BFD_RELOC_VTABLE_INHERIT:
318 TRACE ("BFD_RELOC_VTABLE_INHERIT");
55fd94b0 319 return &elf_howto_table[R_386_GNU_VTINHERIT - R_386_vt_offset];
252b5132
RH
320
321 case BFD_RELOC_VTABLE_ENTRY:
322 TRACE ("BFD_RELOC_VTABLE_ENTRY");
55fd94b0 323 return &elf_howto_table[R_386_GNU_VTENTRY - R_386_vt_offset];
252b5132
RH
324
325 default:
326 break;
327 }
328
329 TRACE ("Unknown");
330 return 0;
331}
332
252b5132 333static void
55fd94b0
AM
334elf_i386_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
335 arelent *cache_ptr,
336 Elf_Internal_Rela *dst)
252b5132 337{
dc47f327
AM
338 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
339 unsigned int indx;
340
341 if ((indx = r_type) >= R_386_standard
342 && ((indx = r_type - R_386_ext_offset) - R_386_standard
343 >= R_386_ext - R_386_standard)
13ae64f3
JJ
344 && ((indx = r_type - R_386_tls_offset) - R_386_ext
345 >= R_386_tls - R_386_ext)
346 && ((indx = r_type - R_386_vt_offset) - R_386_tls
347 >= R_386_vt - R_386_tls))
252b5132 348 {
d003868e
AM
349 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
350 abfd, (int) r_type);
55fd94b0 351 indx = R_386_NONE;
252b5132 352 }
dc47f327 353 cache_ptr->howto = &elf_howto_table[indx];
252b5132
RH
354}
355
356/* Return whether a symbol name implies a local label. The UnixWare
357 2.1 cc generates temporary symbols that start with .X, so we
358 recognize them here. FIXME: do other SVR4 compilers also use .X?.
359 If so, we should move the .X recognition into
360 _bfd_elf_is_local_label_name. */
361
b34976b6 362static bfd_boolean
55fd94b0 363elf_i386_is_local_label_name (bfd *abfd, const char *name)
252b5132
RH
364{
365 if (name[0] == '.' && name[1] == 'X')
b34976b6 366 return TRUE;
252b5132
RH
367
368 return _bfd_elf_is_local_label_name (abfd, name);
369}
370\f
38701953 371/* Support for core dump NOTE sections. */
61adc1a4 372
b34976b6 373static bfd_boolean
55fd94b0 374elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
38701953
AM
375{
376 int offset;
eea6121a 377 size_t size;
38701953 378
61adc1a4 379 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
38701953 380 {
61adc1a4
NC
381 int pr_version = bfd_get_32 (abfd, note->descdata);
382
383 if (pr_version != 1)
384 return FALSE;
385
386 /* pr_cursig */
387 elf_tdata (abfd)->core_signal = bfd_get_32 (abfd, note->descdata + 20);
388
389 /* pr_pid */
390 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
391
392 /* pr_reg */
393 offset = 28;
eea6121a 394 size = bfd_get_32 (abfd, note->descdata + 8);
61adc1a4
NC
395 }
396 else
397 {
398 switch (note->descsz)
399 {
400 default:
401 return FALSE;
38701953 402
61adc1a4
NC
403 case 144: /* Linux/i386 */
404 /* pr_cursig */
405 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
38701953 406
61adc1a4
NC
407 /* pr_pid */
408 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
38701953 409
61adc1a4
NC
410 /* pr_reg */
411 offset = 72;
eea6121a 412 size = 68;
38701953 413
61adc1a4
NC
414 break;
415 }
38701953
AM
416 }
417
418 /* Make a ".reg/999" section. */
419 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 420 size, note->descpos + offset);
38701953
AM
421}
422
b34976b6 423static bfd_boolean
55fd94b0 424elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
38701953 425{
61adc1a4 426 if (note->namesz == 8 && strcmp (note->namedata, "FreeBSD") == 0)
38701953 427 {
61adc1a4
NC
428 int pr_version = bfd_get_32 (abfd, note->descdata);
429
430 if (pr_version != 1)
b34976b6 431 return FALSE;
38701953 432
61adc1a4
NC
433 elf_tdata (abfd)->core_program
434 = _bfd_elfcore_strndup (abfd, note->descdata + 8, 17);
435 elf_tdata (abfd)->core_command
436 = _bfd_elfcore_strndup (abfd, note->descdata + 25, 81);
437 }
438 else
439 {
440 switch (note->descsz)
441 {
442 default:
443 return FALSE;
444
445 case 124: /* Linux/i386 elf_prpsinfo. */
446 elf_tdata (abfd)->core_program
447 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
448 elf_tdata (abfd)->core_command
449 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
450 }
38701953
AM
451 }
452
453 /* Note that for some reason, a spurious space is tacked
454 onto the end of the args in some (at least one anyway)
455 implementations, so strip it off if it exists. */
38701953
AM
456 {
457 char *command = elf_tdata (abfd)->core_command;
458 int n = strlen (command);
459
460 if (0 < n && command[n - 1] == ' ')
461 command[n - 1] = '\0';
462 }
463
b34976b6 464 return TRUE;
38701953
AM
465}
466\f
467/* Functions for the i386 ELF linker.
468
469 In order to gain some understanding of code in this file without
470 knowing all the intricate details of the linker, note the
471 following:
472
473 Functions named elf_i386_* are called by external routines, other
474 functions are only called locally. elf_i386_* functions appear
475 in this file more or less in the order in which they are called
476 from external routines. eg. elf_i386_check_relocs is called
477 early in the link process, elf_i386_finish_dynamic_sections is
478 one of the last functions. */
479
252b5132
RH
480
481/* The name of the dynamic interpreter. This is put in the .interp
482 section. */
483
484#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
485
a23b6845
AM
486/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
487 copying dynamic variables from a shared lib into an app's dynbss
488 section, and instead use a dynamic relocation to point into the
489 shared lib. */
490#define ELIMINATE_COPY_RELOCS 1
491
252b5132
RH
492/* The size in bytes of an entry in the procedure linkage table. */
493
494#define PLT_ENTRY_SIZE 16
495
496/* The first entry in an absolute procedure linkage table looks like
eac338cf
PB
497 this. See the SVR4 ABI i386 supplement to see how this works.
498 Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte. */
252b5132 499
eac338cf 500static const bfd_byte elf_i386_plt0_entry[12] =
252b5132
RH
501{
502 0xff, 0x35, /* pushl contents of address */
503 0, 0, 0, 0, /* replaced with address of .got + 4. */
504 0xff, 0x25, /* jmp indirect */
eac338cf 505 0, 0, 0, 0 /* replaced with address of .got + 8. */
252b5132
RH
506};
507
508/* Subsequent entries in an absolute procedure linkage table look like
509 this. */
510
511static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
512{
513 0xff, 0x25, /* jmp indirect */
514 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
515 0x68, /* pushl immediate */
516 0, 0, 0, 0, /* replaced with offset into relocation table. */
517 0xe9, /* jmp relative */
518 0, 0, 0, 0 /* replaced with offset to start of .plt. */
519};
520
eac338cf
PB
521/* The first entry in a PIC procedure linkage table look like this.
522 Will be padded to PLT_ENTRY_SIZE with htab->plt0_pad_byte. */
252b5132 523
eac338cf 524static const bfd_byte elf_i386_pic_plt0_entry[12] =
252b5132
RH
525{
526 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
eac338cf 527 0xff, 0xa3, 8, 0, 0, 0 /* jmp *8(%ebx) */
252b5132
RH
528};
529
530/* Subsequent entries in a PIC procedure linkage table look like this. */
531
532static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
533{
534 0xff, 0xa3, /* jmp *offset(%ebx) */
535 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
536 0x68, /* pushl immediate */
537 0, 0, 0, 0, /* replaced with offset into relocation table. */
538 0xe9, /* jmp relative */
539 0, 0, 0, 0 /* replaced with offset to start of .plt. */
540};
541
eac338cf
PB
542/* On VxWorks, the .rel.plt.unloaded section has absolute relocations
543 for the PLTResolve stub and then for each PLT entry. */
544#define PLTRESOLVE_RELOCS_SHLIB 0
545#define PLTRESOLVE_RELOCS 2
546#define PLT_NON_JUMP_SLOT_RELOCS 2
547
252b5132 548/* The i386 linker needs to keep track of the number of relocs that it
ffb2e45b
AM
549 decides to copy as dynamic relocs in check_relocs for each symbol.
550 This is so that it can later discard them if they are found to be
551 unnecessary. We store the information in a field extending the
552 regular ELF linker hash table. */
252b5132 553
ffb2e45b 554struct elf_i386_dyn_relocs
252b5132 555{
ffb2e45b 556 struct elf_i386_dyn_relocs *next;
0c715baa
AM
557
558 /* The input section of the reloc. */
559 asection *sec;
560
561 /* Total number of relocs copied for the input section. */
252b5132 562 bfd_size_type count;
0c715baa
AM
563
564 /* Number of pc-relative relocs copied for the input section. */
565 bfd_size_type pc_count;
252b5132
RH
566};
567
568/* i386 ELF linker hash entry. */
569
570struct elf_i386_link_hash_entry
571{
ebe50bae 572 struct elf_link_hash_entry elf;
252b5132 573
0c715baa 574 /* Track dynamic relocs copied for this symbol. */
ffb2e45b 575 struct elf_i386_dyn_relocs *dyn_relocs;
13ae64f3 576
37e55690
JJ
577#define GOT_UNKNOWN 0
578#define GOT_NORMAL 1
579#define GOT_TLS_GD 2
580#define GOT_TLS_IE 4
581#define GOT_TLS_IE_POS 5
582#define GOT_TLS_IE_NEG 6
583#define GOT_TLS_IE_BOTH 7
67a4f2b7
AO
584#define GOT_TLS_GDESC 8
585#define GOT_TLS_GD_BOTH_P(type) \
586 ((type) == (GOT_TLS_GD | GOT_TLS_GDESC))
587#define GOT_TLS_GD_P(type) \
588 ((type) == GOT_TLS_GD || GOT_TLS_GD_BOTH_P (type))
589#define GOT_TLS_GDESC_P(type) \
590 ((type) == GOT_TLS_GDESC || GOT_TLS_GD_BOTH_P (type))
591#define GOT_TLS_GD_ANY_P(type) \
592 (GOT_TLS_GD_P (type) || GOT_TLS_GDESC_P (type))
37e55690 593 unsigned char tls_type;
67a4f2b7
AO
594
595 /* Offset of the GOTPLT entry reserved for the TLS descriptor,
596 starting at the end of the jump table. */
597 bfd_vma tlsdesc_got;
13ae64f3
JJ
598};
599
600#define elf_i386_hash_entry(ent) ((struct elf_i386_link_hash_entry *)(ent))
601
602struct elf_i386_obj_tdata
603{
604 struct elf_obj_tdata root;
605
606 /* tls_type for each local got entry. */
607 char *local_got_tls_type;
67a4f2b7
AO
608
609 /* GOTPLT entries for TLS descriptors. */
610 bfd_vma *local_tlsdesc_gotent;
252b5132
RH
611};
612
13ae64f3
JJ
613#define elf_i386_tdata(abfd) \
614 ((struct elf_i386_obj_tdata *) (abfd)->tdata.any)
615
616#define elf_i386_local_got_tls_type(abfd) \
617 (elf_i386_tdata (abfd)->local_got_tls_type)
618
67a4f2b7
AO
619#define elf_i386_local_tlsdesc_gotent(abfd) \
620 (elf_i386_tdata (abfd)->local_tlsdesc_gotent)
621
b34976b6 622static bfd_boolean
55fd94b0 623elf_i386_mkobject (bfd *abfd)
13ae64f3
JJ
624{
625 bfd_size_type amt = sizeof (struct elf_i386_obj_tdata);
626 abfd->tdata.any = bfd_zalloc (abfd, amt);
627 if (abfd->tdata.any == NULL)
b34976b6
AM
628 return FALSE;
629 return TRUE;
13ae64f3 630}
cedb70c5 631
252b5132
RH
632/* i386 ELF linker hash table. */
633
634struct elf_i386_link_hash_table
635{
ebe50bae 636 struct elf_link_hash_table elf;
252b5132 637
6725bdbf
AM
638 /* Short-cuts to get to dynamic linker sections. */
639 asection *sgot;
640 asection *sgotplt;
641 asection *srelgot;
642 asection *splt;
643 asection *srelplt;
644 asection *sdynbss;
645 asection *srelbss;
9635fe29 646
eac338cf
PB
647 /* The (unloaded but important) .rel.plt.unloaded section on VxWorks. */
648 asection *srelplt2;
649
eac338cf
PB
650 /* True if the target system is VxWorks. */
651 int is_vxworks;
ec338859 652
eac338cf
PB
653 /* Value used to fill the last word of the first plt entry. */
654 bfd_byte plt0_pad_byte;
9635fe29 655
13ae64f3
JJ
656 union {
657 bfd_signed_vma refcount;
658 bfd_vma offset;
659 } tls_ldm_got;
660
67a4f2b7
AO
661 /* The amount of space used by the reserved portion of the sgotplt
662 section, plus whatever space is used by the jump slots. */
663 bfd_vma sgotplt_jump_table_size;
664
ec338859
AM
665 /* Small local sym to section mapping cache. */
666 struct sym_sec_cache sym_sec;
6725bdbf 667};
252b5132
RH
668
669/* Get the i386 ELF linker hash table from a link_info structure. */
670
671#define elf_i386_hash_table(p) \
672 ((struct elf_i386_link_hash_table *) ((p)->hash))
673
67a4f2b7
AO
674#define elf_i386_compute_jump_table_size(htab) \
675 ((htab)->srelplt->reloc_count * 4)
676
252b5132
RH
677/* Create an entry in an i386 ELF linker hash table. */
678
679static struct bfd_hash_entry *
55fd94b0
AM
680link_hash_newfunc (struct bfd_hash_entry *entry,
681 struct bfd_hash_table *table,
682 const char *string)
252b5132 683{
252b5132
RH
684 /* Allocate the structure if it has not already been allocated by a
685 subclass. */
ebe50bae
AM
686 if (entry == NULL)
687 {
688 entry = bfd_hash_allocate (table,
689 sizeof (struct elf_i386_link_hash_entry));
690 if (entry == NULL)
691 return entry;
692 }
252b5132
RH
693
694 /* Call the allocation method of the superclass. */
ebe50bae
AM
695 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
696 if (entry != NULL)
252b5132 697 {
ebe50bae
AM
698 struct elf_i386_link_hash_entry *eh;
699
700 eh = (struct elf_i386_link_hash_entry *) entry;
701 eh->dyn_relocs = NULL;
13ae64f3 702 eh->tls_type = GOT_UNKNOWN;
67a4f2b7 703 eh->tlsdesc_got = (bfd_vma) -1;
252b5132
RH
704 }
705
ebe50bae 706 return entry;
252b5132
RH
707}
708
709/* Create an i386 ELF linker hash table. */
710
711static struct bfd_link_hash_table *
55fd94b0 712elf_i386_link_hash_table_create (bfd *abfd)
252b5132
RH
713{
714 struct elf_i386_link_hash_table *ret;
dc810e39 715 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
252b5132 716
55fd94b0 717 ret = bfd_malloc (amt);
ebe50bae 718 if (ret == NULL)
252b5132
RH
719 return NULL;
720
ebe50bae 721 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc))
252b5132 722 {
e2d34d7d 723 free (ret);
252b5132
RH
724 return NULL;
725 }
726
6725bdbf
AM
727 ret->sgot = NULL;
728 ret->sgotplt = NULL;
729 ret->srelgot = NULL;
730 ret->splt = NULL;
731 ret->srelplt = NULL;
732 ret->sdynbss = NULL;
733 ret->srelbss = NULL;
7a624474 734 ret->tls_ldm_got.refcount = 0;
67a4f2b7 735 ret->sgotplt_jump_table_size = 0;
ec338859 736 ret->sym_sec.abfd = NULL;
eac338cf
PB
737 ret->is_vxworks = 0;
738 ret->srelplt2 = NULL;
eac338cf 739 ret->plt0_pad_byte = 0;
6725bdbf 740
ebe50bae 741 return &ret->elf.root;
252b5132
RH
742}
743
6725bdbf
AM
744/* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
745 shortcuts to them in our hash table. */
746
b34976b6 747static bfd_boolean
55fd94b0 748create_got_section (bfd *dynobj, struct bfd_link_info *info)
6725bdbf
AM
749{
750 struct elf_i386_link_hash_table *htab;
751
752 if (! _bfd_elf_create_got_section (dynobj, info))
b34976b6 753 return FALSE;
6725bdbf
AM
754
755 htab = elf_i386_hash_table (info);
756 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
757 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
758 if (!htab->sgot || !htab->sgotplt)
759 abort ();
760
3496cb2a
L
761 htab->srelgot = bfd_make_section_with_flags (dynobj, ".rel.got",
762 (SEC_ALLOC | SEC_LOAD
763 | SEC_HAS_CONTENTS
764 | SEC_IN_MEMORY
765 | SEC_LINKER_CREATED
766 | SEC_READONLY));
6725bdbf 767 if (htab->srelgot == NULL
6725bdbf 768 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
b34976b6
AM
769 return FALSE;
770 return TRUE;
6725bdbf
AM
771}
772
773/* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
774 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
775 hash table. */
776
b34976b6 777static bfd_boolean
55fd94b0 778elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
6725bdbf
AM
779{
780 struct elf_i386_link_hash_table *htab;
eac338cf
PB
781 asection * s;
782 int flags;
783 const struct elf_backend_data *bed = get_elf_backend_data (dynobj);
6725bdbf
AM
784
785 htab = elf_i386_hash_table (info);
786 if (!htab->sgot && !create_got_section (dynobj, info))
b34976b6 787 return FALSE;
6725bdbf
AM
788
789 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
b34976b6 790 return FALSE;
6725bdbf
AM
791
792 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
793 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
794 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
795 if (!info->shared)
796 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
797
798 if (!htab->splt || !htab->srelplt || !htab->sdynbss
799 || (!info->shared && !htab->srelbss))
800 abort ();
801
eac338cf
PB
802 if (htab->is_vxworks && !info->shared)
803 {
804 s = bfd_make_section (dynobj, ".rel.plt.unloaded");
805 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY
806 | SEC_LINKER_CREATED);
807 if (s == NULL
808 || ! bfd_set_section_flags (dynobj, s, flags)
809 || ! bfd_set_section_alignment (dynobj, s, bed->s->log_file_align))
810 return FALSE;
811 htab->srelplt2 = s;
812 }
813
b34976b6 814 return TRUE;
6725bdbf
AM
815}
816
ebe50bae
AM
817/* Copy the extra info we tack onto an elf_link_hash_entry. */
818
51b64d56 819static void
fcfa13d2 820elf_i386_copy_indirect_symbol (struct bfd_link_info *info,
55fd94b0
AM
821 struct elf_link_hash_entry *dir,
822 struct elf_link_hash_entry *ind)
ebe50bae
AM
823{
824 struct elf_i386_link_hash_entry *edir, *eind;
825
826 edir = (struct elf_i386_link_hash_entry *) dir;
827 eind = (struct elf_i386_link_hash_entry *) ind;
828
bbd7ec4a 829 if (eind->dyn_relocs != NULL)
ebe50bae 830 {
bbd7ec4a
AM
831 if (edir->dyn_relocs != NULL)
832 {
833 struct elf_i386_dyn_relocs **pp;
834 struct elf_i386_dyn_relocs *p;
835
fcfa13d2 836 /* Add reloc counts against the indirect sym to the direct sym
bbd7ec4a
AM
837 list. Merge any entries against the same section. */
838 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
839 {
840 struct elf_i386_dyn_relocs *q;
841
842 for (q = edir->dyn_relocs; q != NULL; q = q->next)
843 if (q->sec == p->sec)
844 {
845 q->pc_count += p->pc_count;
846 q->count += p->count;
847 *pp = p->next;
848 break;
849 }
850 if (q == NULL)
851 pp = &p->next;
852 }
853 *pp = edir->dyn_relocs;
854 }
855
ebe50bae
AM
856 edir->dyn_relocs = eind->dyn_relocs;
857 eind->dyn_relocs = NULL;
858 }
ebe50bae 859
cd67d266
JJ
860 if (ind->root.type == bfd_link_hash_indirect
861 && dir->got.refcount <= 0)
862 {
863 edir->tls_type = eind->tls_type;
864 eind->tls_type = GOT_UNKNOWN;
865 }
81848ca0
AM
866
867 if (ELIMINATE_COPY_RELOCS
868 && ind->root.type != bfd_link_hash_indirect
f5385ebf
AM
869 && dir->dynamic_adjusted)
870 {
871 /* If called to transfer flags for a weakdef during processing
872 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
873 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
874 dir->ref_dynamic |= ind->ref_dynamic;
875 dir->ref_regular |= ind->ref_regular;
876 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
877 dir->needs_plt |= ind->needs_plt;
878 dir->pointer_equality_needed |= ind->pointer_equality_needed;
879 }
81848ca0 880 else
fcfa13d2 881 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
ebe50bae
AM
882}
883
13ae64f3 884static int
55fd94b0 885elf_i386_tls_transition (struct bfd_link_info *info, int r_type, int is_local)
13ae64f3
JJ
886{
887 if (info->shared)
888 return r_type;
889
890 switch (r_type)
891 {
892 case R_386_TLS_GD:
67a4f2b7
AO
893 case R_386_TLS_GOTDESC:
894 case R_386_TLS_DESC_CALL:
13ae64f3
JJ
895 case R_386_TLS_IE_32:
896 if (is_local)
897 return R_386_TLS_LE_32;
898 return R_386_TLS_IE_32;
37e55690
JJ
899 case R_386_TLS_IE:
900 case R_386_TLS_GOTIE:
901 if (is_local)
902 return R_386_TLS_LE_32;
903 return r_type;
13ae64f3
JJ
904 case R_386_TLS_LDM:
905 return R_386_TLS_LE_32;
906 }
907
908 return r_type;
909}
910
252b5132 911/* Look through the relocs for a section during the first phase, and
0ac8d2ca
AM
912 calculate needed space in the global offset table, procedure linkage
913 table, and dynamic reloc sections. */
252b5132 914
b34976b6 915static bfd_boolean
55fd94b0
AM
916elf_i386_check_relocs (bfd *abfd,
917 struct bfd_link_info *info,
918 asection *sec,
919 const Elf_Internal_Rela *relocs)
252b5132 920{
6725bdbf 921 struct elf_i386_link_hash_table *htab;
252b5132
RH
922 Elf_Internal_Shdr *symtab_hdr;
923 struct elf_link_hash_entry **sym_hashes;
252b5132
RH
924 const Elf_Internal_Rela *rel;
925 const Elf_Internal_Rela *rel_end;
252b5132
RH
926 asection *sreloc;
927
1049f94e 928 if (info->relocatable)
b34976b6 929 return TRUE;
252b5132 930
6725bdbf 931 htab = elf_i386_hash_table (info);
252b5132
RH
932 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
933 sym_hashes = elf_sym_hashes (abfd);
252b5132 934
252b5132
RH
935 sreloc = NULL;
936
937 rel_end = relocs + sec->reloc_count;
938 for (rel = relocs; rel < rel_end; rel++)
939 {
13ae64f3 940 unsigned int r_type;
252b5132
RH
941 unsigned long r_symndx;
942 struct elf_link_hash_entry *h;
943
944 r_symndx = ELF32_R_SYM (rel->r_info);
13ae64f3 945 r_type = ELF32_R_TYPE (rel->r_info);
252b5132 946
d9bc7a44 947 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
f5f31454 948 {
d003868e
AM
949 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
950 abfd,
8f615d07 951 r_symndx);
b34976b6 952 return FALSE;
f5f31454
L
953 }
954
252b5132
RH
955 if (r_symndx < symtab_hdr->sh_info)
956 h = NULL;
957 else
71cb9464
L
958 {
959 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
960 while (h->root.type == bfd_link_hash_indirect
961 || h->root.type == bfd_link_hash_warning)
962 h = (struct elf_link_hash_entry *) h->root.u.i.link;
963 }
252b5132 964
13ae64f3
JJ
965 r_type = elf_i386_tls_transition (info, r_type, h == NULL);
966
967 switch (r_type)
252b5132 968 {
37e55690
JJ
969 case R_386_TLS_LDM:
970 htab->tls_ldm_got.refcount += 1;
971 goto create_got;
972
973 case R_386_PLT32:
974 /* This symbol requires a procedure linkage table entry. We
975 actually build the entry in adjust_dynamic_symbol,
976 because this might be a case of linking PIC code which is
977 never referenced by a dynamic object, in which case we
978 don't need to generate a procedure linkage table entry
979 after all. */
980
981 /* If this is a local symbol, we resolve it directly without
982 creating a procedure linkage table entry. */
983 if (h == NULL)
984 continue;
985
f5385ebf 986 h->needs_plt = 1;
37e55690
JJ
987 h->plt.refcount += 1;
988 break;
989
13ae64f3 990 case R_386_TLS_IE_32:
37e55690
JJ
991 case R_386_TLS_IE:
992 case R_386_TLS_GOTIE:
13ae64f3
JJ
993 if (info->shared)
994 info->flags |= DF_STATIC_TLS;
37e55690
JJ
995 /* Fall through */
996
252b5132 997 case R_386_GOT32:
13ae64f3 998 case R_386_TLS_GD:
67a4f2b7
AO
999 case R_386_TLS_GOTDESC:
1000 case R_386_TLS_DESC_CALL:
252b5132 1001 /* This symbol requires a global offset table entry. */
13ae64f3
JJ
1002 {
1003 int tls_type, old_tls_type;
1004
1005 switch (r_type)
1006 {
1007 default:
1008 case R_386_GOT32: tls_type = GOT_NORMAL; break;
1009 case R_386_TLS_GD: tls_type = GOT_TLS_GD; break;
67a4f2b7
AO
1010 case R_386_TLS_GOTDESC:
1011 case R_386_TLS_DESC_CALL:
1012 tls_type = GOT_TLS_GDESC; break;
37e55690
JJ
1013 case R_386_TLS_IE_32:
1014 if (ELF32_R_TYPE (rel->r_info) == r_type)
1015 tls_type = GOT_TLS_IE_NEG;
1016 else
1017 /* If this is a GD->IE transition, we may use either of
1018 R_386_TLS_TPOFF and R_386_TLS_TPOFF32. */
1019 tls_type = GOT_TLS_IE;
1020 break;
1021 case R_386_TLS_IE:
1022 case R_386_TLS_GOTIE:
1023 tls_type = GOT_TLS_IE_POS; break;
13ae64f3
JJ
1024 }
1025
1026 if (h != NULL)
1027 {
1028 h->got.refcount += 1;
1029 old_tls_type = elf_i386_hash_entry(h)->tls_type;
1030 }
1031 else
1032 {
1033 bfd_signed_vma *local_got_refcounts;
1034
1035 /* This is a global offset table entry for a local symbol. */
1036 local_got_refcounts = elf_local_got_refcounts (abfd);
1037 if (local_got_refcounts == NULL)
1038 {
1039 bfd_size_type size;
1040
1041 size = symtab_hdr->sh_info;
67a4f2b7
AO
1042 size *= (sizeof (bfd_signed_vma)
1043 + sizeof (bfd_vma) + sizeof(char));
55fd94b0 1044 local_got_refcounts = bfd_zalloc (abfd, size);
13ae64f3 1045 if (local_got_refcounts == NULL)
b34976b6 1046 return FALSE;
13ae64f3 1047 elf_local_got_refcounts (abfd) = local_got_refcounts;
67a4f2b7
AO
1048 elf_i386_local_tlsdesc_gotent (abfd)
1049 = (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
13ae64f3 1050 elf_i386_local_got_tls_type (abfd)
67a4f2b7 1051 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
13ae64f3
JJ
1052 }
1053 local_got_refcounts[r_symndx] += 1;
1054 old_tls_type = elf_i386_local_got_tls_type (abfd) [r_symndx];
1055 }
1056
37e55690
JJ
1057 if ((old_tls_type & GOT_TLS_IE) && (tls_type & GOT_TLS_IE))
1058 tls_type |= old_tls_type;
13ae64f3
JJ
1059 /* If a TLS symbol is accessed using IE at least once,
1060 there is no point to use dynamic model for it. */
37e55690 1061 else if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
67a4f2b7 1062 && (! GOT_TLS_GD_ANY_P (old_tls_type)
37e55690 1063 || (tls_type & GOT_TLS_IE) == 0))
13ae64f3 1064 {
67a4f2b7 1065 if ((old_tls_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (tls_type))
37e55690 1066 tls_type = old_tls_type;
67a4f2b7
AO
1067 else if (GOT_TLS_GD_ANY_P (old_tls_type)
1068 && GOT_TLS_GD_ANY_P (tls_type))
1069 tls_type |= old_tls_type;
13ae64f3
JJ
1070 else
1071 {
1072 (*_bfd_error_handler)
d003868e 1073 (_("%B: `%s' accessed both as normal and "
55fd94b0 1074 "thread local symbol"),
d003868e 1075 abfd,
37e55690 1076 h ? h->root.root.string : "<local>");
b34976b6 1077 return FALSE;
13ae64f3
JJ
1078 }
1079 }
1080
1081 if (old_tls_type != tls_type)
1082 {
1083 if (h != NULL)
1084 elf_i386_hash_entry (h)->tls_type = tls_type;
1085 else
1086 elf_i386_local_got_tls_type (abfd) [r_symndx] = tls_type;
1087 }
1088 }
0ac8d2ca
AM
1089 /* Fall through */
1090
1091 case R_386_GOTOFF:
1092 case R_386_GOTPC:
13ae64f3 1093 create_got:
0ac8d2ca
AM
1094 if (htab->sgot == NULL)
1095 {
1096 if (htab->elf.dynobj == NULL)
1097 htab->elf.dynobj = abfd;
1098 if (!create_got_section (htab->elf.dynobj, info))
b34976b6 1099 return FALSE;
0ac8d2ca 1100 }
37e55690
JJ
1101 if (r_type != R_386_TLS_IE)
1102 break;
1103 /* Fall through */
252b5132 1104
37e55690
JJ
1105 case R_386_TLS_LE_32:
1106 case R_386_TLS_LE:
1107 if (!info->shared)
1108 break;
bffbf940 1109 info->flags |= DF_STATIC_TLS;
b34976b6 1110 /* Fall through */
252b5132
RH
1111
1112 case R_386_32:
1113 case R_386_PC32:
12d0ee4a 1114 if (h != NULL && !info->shared)
6725bdbf 1115 {
12d0ee4a 1116 /* If this reloc is in a read-only section, we might
ebe50bae
AM
1117 need a copy reloc. We can't check reliably at this
1118 stage whether the section is read-only, as input
1119 sections have not yet been mapped to output sections.
1120 Tentatively set the flag for now, and correct in
1121 adjust_dynamic_symbol. */
f5385ebf 1122 h->non_got_ref = 1;
12d0ee4a
AM
1123
1124 /* We may need a .plt entry if the function this reloc
1125 refers to is in a shared lib. */
51b64d56 1126 h->plt.refcount += 1;
c6585bbb 1127 if (r_type != R_386_PC32)
f5385ebf 1128 h->pointer_equality_needed = 1;
6725bdbf 1129 }
7843f00e 1130
252b5132 1131 /* If we are creating a shared library, and this is a reloc
f69da49f
AM
1132 against a global symbol, or a non PC relative reloc
1133 against a local symbol, then we need to copy the reloc
1134 into the shared library. However, if we are linking with
1135 -Bsymbolic, we do not need to copy a reloc against a
1136 global symbol which is defined in an object we are
1137 including in the link (i.e., DEF_REGULAR is set). At
1138 this point we have not seen all the input files, so it is
1139 possible that DEF_REGULAR is not set now but will be set
1f655a09
L
1140 later (it is never cleared). In case of a weak definition,
1141 DEF_REGULAR may be cleared later by a strong definition in
ebe50bae 1142 a shared library. We account for that possibility below by
1f655a09
L
1143 storing information in the relocs_copied field of the hash
1144 table entry. A similar situation occurs when creating
1145 shared libraries and symbol visibility changes render the
12d0ee4a 1146 symbol local.
56882138 1147
12d0ee4a
AM
1148 If on the other hand, we are creating an executable, we
1149 may need to keep relocations for symbols satisfied by a
1150 dynamic library if we manage to avoid copy relocs for the
1151 symbol. */
1152 if ((info->shared
1153 && (sec->flags & SEC_ALLOC) != 0
13ae64f3 1154 && (r_type != R_386_PC32
12d0ee4a
AM
1155 || (h != NULL
1156 && (! info->symbolic
1157 || h->root.type == bfd_link_hash_defweak
f5385ebf 1158 || !h->def_regular))))
a23b6845
AM
1159 || (ELIMINATE_COPY_RELOCS
1160 && !info->shared
12d0ee4a
AM
1161 && (sec->flags & SEC_ALLOC) != 0
1162 && h != NULL
12d0ee4a 1163 && (h->root.type == bfd_link_hash_defweak
f5385ebf 1164 || !h->def_regular)))
252b5132 1165 {
ec338859
AM
1166 struct elf_i386_dyn_relocs *p;
1167 struct elf_i386_dyn_relocs **head;
1168
12d0ee4a
AM
1169 /* We must copy these reloc types into the output file.
1170 Create a reloc section in dynobj and make room for
1171 this reloc. */
252b5132
RH
1172 if (sreloc == NULL)
1173 {
1174 const char *name;
0ac8d2ca 1175 bfd *dynobj;
e92d460e
AM
1176 unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
1177 unsigned int shnam = elf_section_data (sec)->rel_hdr.sh_name;
252b5132 1178
e92d460e 1179 name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
252b5132 1180 if (name == NULL)
b34976b6 1181 return FALSE;
252b5132 1182
c8492176
L
1183 if (strncmp (name, ".rel", 4) != 0
1184 || strcmp (bfd_get_section_name (abfd, sec),
1185 name + 4) != 0)
1186 {
0c715baa 1187 (*_bfd_error_handler)
d003868e
AM
1188 (_("%B: bad relocation section name `%s\'"),
1189 abfd, name);
f5f31454 1190 }
252b5132 1191
0ac8d2ca
AM
1192 if (htab->elf.dynobj == NULL)
1193 htab->elf.dynobj = abfd;
1194
1195 dynobj = htab->elf.dynobj;
252b5132
RH
1196 sreloc = bfd_get_section_by_name (dynobj, name);
1197 if (sreloc == NULL)
1198 {
1199 flagword flags;
1200
252b5132
RH
1201 flags = (SEC_HAS_CONTENTS | SEC_READONLY
1202 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1203 if ((sec->flags & SEC_ALLOC) != 0)
1204 flags |= SEC_ALLOC | SEC_LOAD;
3496cb2a
L
1205 sreloc = bfd_make_section_with_flags (dynobj,
1206 name,
1207 flags);
252b5132 1208 if (sreloc == NULL
252b5132 1209 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
b34976b6 1210 return FALSE;
252b5132 1211 }
0c715baa 1212 elf_section_data (sec)->sreloc = sreloc;
252b5132
RH
1213 }
1214
0c715baa
AM
1215 /* If this is a global symbol, we count the number of
1216 relocations we need for this symbol. */
1217 if (h != NULL)
252b5132 1218 {
ec338859 1219 head = &((struct elf_i386_link_hash_entry *) h)->dyn_relocs;
0c715baa
AM
1220 }
1221 else
1222 {
e81d3500 1223 void **vpp;
ec338859
AM
1224 /* Track dynamic relocs needed for local syms too.
1225 We really need local syms available to do this
1226 easily. Oh well. */
1227
1228 asection *s;
1229 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
1230 sec, r_symndx);
1231 if (s == NULL)
b34976b6 1232 return FALSE;
ec338859 1233
e81d3500
DD
1234 vpp = &elf_section_data (s)->local_dynrel;
1235 head = (struct elf_i386_dyn_relocs **)vpp;
ec338859
AM
1236 }
1237
1238 p = *head;
1239 if (p == NULL || p->sec != sec)
1240 {
1241 bfd_size_type amt = sizeof *p;
55fd94b0 1242 p = bfd_alloc (htab->elf.dynobj, amt);
ec338859 1243 if (p == NULL)
b34976b6 1244 return FALSE;
ec338859
AM
1245 p->next = *head;
1246 *head = p;
1247 p->sec = sec;
1248 p->count = 0;
1249 p->pc_count = 0;
252b5132 1250 }
ec338859
AM
1251
1252 p->count += 1;
13ae64f3 1253 if (r_type == R_386_PC32)
ec338859 1254 p->pc_count += 1;
252b5132 1255 }
252b5132
RH
1256 break;
1257
1258 /* This relocation describes the C++ object vtable hierarchy.
1259 Reconstruct it for later use during GC. */
1260 case R_386_GNU_VTINHERIT:
c152c796 1261 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 1262 return FALSE;
252b5132
RH
1263 break;
1264
1265 /* This relocation describes which C++ vtable entries are actually
1266 used. Record for later use during GC. */
1267 case R_386_GNU_VTENTRY:
c152c796 1268 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 1269 return FALSE;
252b5132
RH
1270 break;
1271
1272 default:
1273 break;
1274 }
1275 }
1276
b34976b6 1277 return TRUE;
252b5132
RH
1278}
1279
1280/* Return the section that should be marked against GC for a given
1281 relocation. */
1282
1283static asection *
55fd94b0
AM
1284elf_i386_gc_mark_hook (asection *sec,
1285 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1286 Elf_Internal_Rela *rel,
1287 struct elf_link_hash_entry *h,
1288 Elf_Internal_Sym *sym)
252b5132
RH
1289{
1290 if (h != NULL)
1291 {
1292 switch (ELF32_R_TYPE (rel->r_info))
1293 {
1294 case R_386_GNU_VTINHERIT:
1295 case R_386_GNU_VTENTRY:
1296 break;
1297
1298 default:
1299 switch (h->root.type)
1300 {
1301 case bfd_link_hash_defined:
1302 case bfd_link_hash_defweak:
1303 return h->root.u.def.section;
1304
1305 case bfd_link_hash_common:
1306 return h->root.u.c.p->section;
1307
1308 default:
1309 break;
1310 }
1311 }
1312 }
1313 else
1e2f5b6e 1314 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
252b5132
RH
1315
1316 return NULL;
1317}
1318
1319/* Update the got entry reference counts for the section being removed. */
1320
b34976b6 1321static bfd_boolean
55fd94b0
AM
1322elf_i386_gc_sweep_hook (bfd *abfd,
1323 struct bfd_link_info *info,
1324 asection *sec,
1325 const Elf_Internal_Rela *relocs)
252b5132 1326{
dd5724d5
AM
1327 Elf_Internal_Shdr *symtab_hdr;
1328 struct elf_link_hash_entry **sym_hashes;
1329 bfd_signed_vma *local_got_refcounts;
1330 const Elf_Internal_Rela *rel, *relend;
dd5724d5 1331
ec338859 1332 elf_section_data (sec)->local_dynrel = NULL;
dd5724d5 1333
6725bdbf
AM
1334 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1335 sym_hashes = elf_sym_hashes (abfd);
1336 local_got_refcounts = elf_local_got_refcounts (abfd);
dd5724d5
AM
1337
1338 relend = relocs + sec->reloc_count;
1339 for (rel = relocs; rel < relend; rel++)
26e41594
AM
1340 {
1341 unsigned long r_symndx;
1342 unsigned int r_type;
1343 struct elf_link_hash_entry *h = NULL;
37e55690 1344
26e41594
AM
1345 r_symndx = ELF32_R_SYM (rel->r_info);
1346 if (r_symndx >= symtab_hdr->sh_info)
1347 {
1348 struct elf_i386_link_hash_entry *eh;
1349 struct elf_i386_dyn_relocs **pp;
1350 struct elf_i386_dyn_relocs *p;
dd5724d5 1351
26e41594 1352 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3eb128b2
AM
1353 while (h->root.type == bfd_link_hash_indirect
1354 || h->root.type == bfd_link_hash_warning)
1355 h = (struct elf_link_hash_entry *) h->root.u.i.link;
26e41594 1356 eh = (struct elf_i386_link_hash_entry *) h;
0c715baa 1357
26e41594
AM
1358 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1359 if (p->sec == sec)
1360 {
1361 /* Everything must go for SEC. */
1362 *pp = p->next;
1363 break;
1364 }
1365 }
0c715baa 1366
26e41594
AM
1367 r_type = ELF32_R_TYPE (rel->r_info);
1368 r_type = elf_i386_tls_transition (info, r_type, h != NULL);
1369 switch (r_type)
1370 {
1371 case R_386_TLS_LDM:
1372 if (elf_i386_hash_table (info)->tls_ldm_got.refcount > 0)
1373 elf_i386_hash_table (info)->tls_ldm_got.refcount -= 1;
1374 break;
0c715baa 1375
26e41594 1376 case R_386_TLS_GD:
67a4f2b7
AO
1377 case R_386_TLS_GOTDESC:
1378 case R_386_TLS_DESC_CALL:
26e41594
AM
1379 case R_386_TLS_IE_32:
1380 case R_386_TLS_IE:
1381 case R_386_TLS_GOTIE:
1382 case R_386_GOT32:
1383 if (h != NULL)
1384 {
1385 if (h->got.refcount > 0)
1386 h->got.refcount -= 1;
1387 }
1388 else if (local_got_refcounts != NULL)
1389 {
1390 if (local_got_refcounts[r_symndx] > 0)
1391 local_got_refcounts[r_symndx] -= 1;
1392 }
1393 break;
0c715baa 1394
26e41594
AM
1395 case R_386_32:
1396 case R_386_PC32:
1397 if (info->shared)
1398 break;
1399 /* Fall through */
6725bdbf 1400
26e41594
AM
1401 case R_386_PLT32:
1402 if (h != NULL)
1403 {
1404 if (h->plt.refcount > 0)
1405 h->plt.refcount -= 1;
1406 }
1407 break;
dd5724d5 1408
26e41594
AM
1409 default:
1410 break;
1411 }
1412 }
252b5132 1413
b34976b6 1414 return TRUE;
252b5132
RH
1415}
1416
1417/* Adjust a symbol defined by a dynamic object and referenced by a
1418 regular object. The current definition is in some section of the
1419 dynamic object, but we're not including those sections. We have to
1420 change the definition to something the rest of the link can
1421 understand. */
1422
b34976b6 1423static bfd_boolean
55fd94b0
AM
1424elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
1425 struct elf_link_hash_entry *h)
252b5132 1426{
6725bdbf 1427 struct elf_i386_link_hash_table *htab;
252b5132
RH
1428 asection *s;
1429 unsigned int power_of_two;
1430
252b5132
RH
1431 /* If this is a function, put it in the procedure linkage table. We
1432 will fill in the contents of the procedure linkage table later,
1433 when we know the address of the .got section. */
1434 if (h->type == STT_FUNC
f5385ebf 1435 || h->needs_plt)
252b5132 1436 {
6725bdbf 1437 if (h->plt.refcount <= 0
9c7a29a3
AM
1438 || SYMBOL_CALLS_LOCAL (info, h)
1439 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1440 && h->root.type == bfd_link_hash_undefweak))
252b5132
RH
1441 {
1442 /* This case can occur if we saw a PLT32 reloc in an input
dd5724d5
AM
1443 file, but the symbol was never referred to by a dynamic
1444 object, or if all references were garbage collected. In
1445 such a case, we don't actually need to build a procedure
1446 linkage table, and we can just do a PC32 reloc instead. */
bbd7ec4a 1447 h->plt.offset = (bfd_vma) -1;
f5385ebf 1448 h->needs_plt = 0;
252b5132
RH
1449 }
1450
b34976b6 1451 return TRUE;
252b5132 1452 }
6725bdbf
AM
1453 else
1454 /* It's possible that we incorrectly decided a .plt reloc was
1455 needed for an R_386_PC32 reloc to a non-function sym in
1456 check_relocs. We can't decide accurately between function and
1457 non-function syms in check-relocs; Objects loaded later in
1458 the link may change h->type. So fix it now. */
bbd7ec4a 1459 h->plt.offset = (bfd_vma) -1;
252b5132
RH
1460
1461 /* If this is a weak symbol, and there is a real definition, the
1462 processor independent code will have arranged for us to see the
1463 real definition first, and we can just use the same value. */
f6e332e6 1464 if (h->u.weakdef != NULL)
252b5132 1465 {
f6e332e6
AM
1466 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1467 || h->u.weakdef->root.type == bfd_link_hash_defweak);
1468 h->root.u.def.section = h->u.weakdef->root.u.def.section;
1469 h->root.u.def.value = h->u.weakdef->root.u.def.value;
a23b6845 1470 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
f6e332e6 1471 h->non_got_ref = h->u.weakdef->non_got_ref;
b34976b6 1472 return TRUE;
252b5132
RH
1473 }
1474
1475 /* This is a reference to a symbol defined by a dynamic object which
1476 is not a function. */
1477
1478 /* If we are creating a shared library, we must presume that the
1479 only references to the symbol are via the global offset table.
1480 For such cases we need not do anything here; the relocations will
1481 be handled correctly by relocate_section. */
1482 if (info->shared)
b34976b6 1483 return TRUE;
252b5132 1484
7843f00e
ILT
1485 /* If there are no references to this symbol that do not use the
1486 GOT, we don't need to generate a copy reloc. */
f5385ebf 1487 if (!h->non_got_ref)
b34976b6 1488 return TRUE;
7843f00e 1489
8bd621d8
AM
1490 /* If -z nocopyreloc was given, we won't generate them either. */
1491 if (info->nocopyreloc)
1492 {
f5385ebf 1493 h->non_got_ref = 0;
b34976b6 1494 return TRUE;
8bd621d8
AM
1495 }
1496
643796e3
DJ
1497 htab = elf_i386_hash_table (info);
1498
1499 /* If there aren't any dynamic relocs in read-only sections, then
1500 we can keep the dynamic relocs and avoid the copy reloc. This
1501 doesn't work on VxWorks, where we can not have dynamic relocations
1502 (other than copy and jump slot relocations) in an executable. */
1503 if (ELIMINATE_COPY_RELOCS && !htab->is_vxworks)
ebe50bae 1504 {
a23b6845
AM
1505 struct elf_i386_link_hash_entry * eh;
1506 struct elf_i386_dyn_relocs *p;
ebe50bae 1507
a23b6845
AM
1508 eh = (struct elf_i386_link_hash_entry *) h;
1509 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1510 {
1511 s = p->sec->output_section;
1512 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1513 break;
1514 }
1515
a23b6845
AM
1516 if (p == NULL)
1517 {
f5385ebf 1518 h->non_got_ref = 0;
a23b6845
AM
1519 return TRUE;
1520 }
ebe50bae
AM
1521 }
1522
909272ee
AM
1523 if (h->size == 0)
1524 {
1525 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1526 h->root.root.string);
1527 return TRUE;
1528 }
1529
252b5132
RH
1530 /* We must allocate the symbol in our .dynbss section, which will
1531 become part of the .bss section of the executable. There will be
1532 an entry for this symbol in the .dynsym section. The dynamic
1533 object will contain position independent code, so all references
1534 from the dynamic object to this symbol will go through the global
1535 offset table. The dynamic linker will use the .dynsym entry to
1536 determine the address it must put in the global offset table, so
1537 both the dynamic object and the regular object will refer to the
1538 same memory location for the variable. */
1539
252b5132
RH
1540 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1541 copy the initial value out of the dynamic object and into the
0ac8d2ca 1542 runtime process image. */
252b5132
RH
1543 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1544 {
eea6121a 1545 htab->srelbss->size += sizeof (Elf32_External_Rel);
f5385ebf 1546 h->needs_copy = 1;
252b5132
RH
1547 }
1548
1549 /* We need to figure out the alignment required for this symbol. I
1550 have no idea how ELF linkers handle this. */
1551 power_of_two = bfd_log2 (h->size);
1552 if (power_of_two > 3)
1553 power_of_two = 3;
1554
1555 /* Apply the required alignment. */
0ac8d2ca 1556 s = htab->sdynbss;
eea6121a 1557 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
0ac8d2ca 1558 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
252b5132 1559 {
0ac8d2ca 1560 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
b34976b6 1561 return FALSE;
252b5132
RH
1562 }
1563
1564 /* Define the symbol as being at this point in the section. */
1565 h->root.u.def.section = s;
eea6121a 1566 h->root.u.def.value = s->size;
252b5132
RH
1567
1568 /* Increment the section size to make room for the symbol. */
eea6121a 1569 s->size += h->size;
252b5132 1570
b34976b6 1571 return TRUE;
252b5132
RH
1572}
1573
6725bdbf 1574/* Allocate space in .plt, .got and associated reloc sections for
0c715baa 1575 dynamic relocs. */
6725bdbf 1576
b34976b6 1577static bfd_boolean
55fd94b0 1578allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
6725bdbf
AM
1579{
1580 struct bfd_link_info *info;
1581 struct elf_i386_link_hash_table *htab;
5a15f56f 1582 struct elf_i386_link_hash_entry *eh;
0c715baa 1583 struct elf_i386_dyn_relocs *p;
6725bdbf 1584
e92d460e 1585 if (h->root.type == bfd_link_hash_indirect)
b34976b6 1586 return TRUE;
6725bdbf 1587
e92d460e
AM
1588 if (h->root.type == bfd_link_hash_warning)
1589 /* When warning symbols are created, they **replace** the "real"
1590 entry in the hash table, thus we never get to see the real
1591 symbol in a hash traversal. So look at it now. */
1592 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1593
6725bdbf
AM
1594 info = (struct bfd_link_info *) inf;
1595 htab = elf_i386_hash_table (info);
1596
ebe50bae 1597 if (htab->elf.dynamic_sections_created
9c7a29a3 1598 && h->plt.refcount > 0)
6725bdbf 1599 {
5a15f56f
AM
1600 /* Make sure this symbol is output as a dynamic symbol.
1601 Undefined weak syms won't yet be marked as dynamic. */
1602 if (h->dynindx == -1
f5385ebf 1603 && !h->forced_local)
5a15f56f 1604 {
c152c796 1605 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 1606 return FALSE;
5a15f56f
AM
1607 }
1608
4e795f50
AM
1609 if (info->shared
1610 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
ced53ee5 1611 {
0ac8d2ca 1612 asection *s = htab->splt;
6725bdbf 1613
ced53ee5
AM
1614 /* If this is the first .plt entry, make room for the special
1615 first entry. */
eea6121a
AM
1616 if (s->size == 0)
1617 s->size += PLT_ENTRY_SIZE;
6725bdbf 1618
eea6121a 1619 h->plt.offset = s->size;
6725bdbf 1620
ced53ee5
AM
1621 /* If this symbol is not defined in a regular file, and we are
1622 not generating a shared library, then set the symbol to this
1623 location in the .plt. This is required to make function
1624 pointers compare as equal between the normal executable and
1625 the shared library. */
1626 if (! info->shared
f5385ebf 1627 && !h->def_regular)
ced53ee5
AM
1628 {
1629 h->root.u.def.section = s;
1630 h->root.u.def.value = h->plt.offset;
1631 }
6725bdbf 1632
ced53ee5 1633 /* Make room for this entry. */
eea6121a 1634 s->size += PLT_ENTRY_SIZE;
6725bdbf 1635
ced53ee5
AM
1636 /* We also need to make an entry in the .got.plt section, which
1637 will be placed in the .got section by the linker script. */
eea6121a 1638 htab->sgotplt->size += 4;
6725bdbf 1639
6725bdbf 1640 /* We also need to make an entry in the .rel.plt section. */
eea6121a 1641 htab->srelplt->size += sizeof (Elf32_External_Rel);
67a4f2b7 1642 htab->srelplt->reloc_count++;
eac338cf
PB
1643
1644 if (htab->is_vxworks && !info->shared)
1645 {
1646 /* VxWorks has a second set of relocations for each PLT entry
1647 in executables. They go in a separate relocation section,
1648 which is processed by the kernel loader. */
1649
1650 /* There are two relocations for the initial PLT entry: an
1651 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 4 and an
1652 R_386_32 relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
1653
1654 if (h->plt.offset == PLT_ENTRY_SIZE)
1655 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
1656
1657 /* There are two extra relocations for each subsequent PLT entry:
1658 an R_386_32 relocation for the GOT entry, and an R_386_32
1659 relocation for the PLT entry. */
1660
1661 htab->srelplt2->size += (sizeof (Elf32_External_Rel) * 2);
1662 }
6725bdbf 1663 }
ced53ee5
AM
1664 else
1665 {
51b64d56 1666 h->plt.offset = (bfd_vma) -1;
f5385ebf 1667 h->needs_plt = 0;
ced53ee5 1668 }
6725bdbf
AM
1669 }
1670 else
1671 {
51b64d56 1672 h->plt.offset = (bfd_vma) -1;
f5385ebf 1673 h->needs_plt = 0;
6725bdbf
AM
1674 }
1675
67a4f2b7
AO
1676 eh = (struct elf_i386_link_hash_entry *) h;
1677 eh->tlsdesc_got = (bfd_vma) -1;
1678
37e55690 1679 /* If R_386_TLS_{IE_32,IE,GOTIE} symbol is now local to the binary,
13ae64f3
JJ
1680 make it a R_386_TLS_LE_32 requiring no TLS entry. */
1681 if (h->got.refcount > 0
1682 && !info->shared
1683 && h->dynindx == -1
37e55690 1684 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE))
cedb70c5 1685 h->got.offset = (bfd_vma) -1;
13ae64f3 1686 else if (h->got.refcount > 0)
6725bdbf 1687 {
0ac8d2ca 1688 asection *s;
b34976b6 1689 bfd_boolean dyn;
13ae64f3 1690 int tls_type = elf_i386_hash_entry(h)->tls_type;
6725bdbf 1691
5a15f56f
AM
1692 /* Make sure this symbol is output as a dynamic symbol.
1693 Undefined weak syms won't yet be marked as dynamic. */
1694 if (h->dynindx == -1
f5385ebf 1695 && !h->forced_local)
5a15f56f 1696 {
c152c796 1697 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 1698 return FALSE;
5a15f56f
AM
1699 }
1700
6725bdbf 1701 s = htab->sgot;
67a4f2b7
AO
1702 if (GOT_TLS_GDESC_P (tls_type))
1703 {
1704 eh->tlsdesc_got = htab->sgotplt->size
1705 - elf_i386_compute_jump_table_size (htab);
1706 htab->sgotplt->size += 8;
1707 h->got.offset = (bfd_vma) -2;
1708 }
1709 if (! GOT_TLS_GDESC_P (tls_type)
1710 || GOT_TLS_GD_P (tls_type))
1711 {
1712 h->got.offset = s->size;
1713 s->size += 4;
1714 /* R_386_TLS_GD needs 2 consecutive GOT slots. */
1715 if (GOT_TLS_GD_P (tls_type) || tls_type == GOT_TLS_IE_BOTH)
1716 s->size += 4;
1717 }
ebe50bae 1718 dyn = htab->elf.dynamic_sections_created;
13ae64f3 1719 /* R_386_TLS_IE_32 needs one dynamic relocation,
37e55690
JJ
1720 R_386_TLS_IE resp. R_386_TLS_GOTIE needs one dynamic relocation,
1721 (but if both R_386_TLS_IE_32 and R_386_TLS_IE is present, we
1722 need two), R_386_TLS_GD needs one if local symbol and two if
1723 global. */
1724 if (tls_type == GOT_TLS_IE_BOTH)
eea6121a 1725 htab->srelgot->size += 2 * sizeof (Elf32_External_Rel);
67a4f2b7 1726 else if ((GOT_TLS_GD_P (tls_type) && h->dynindx == -1)
37e55690 1727 || (tls_type & GOT_TLS_IE))
eea6121a 1728 htab->srelgot->size += sizeof (Elf32_External_Rel);
67a4f2b7 1729 else if (GOT_TLS_GD_P (tls_type))
eea6121a 1730 htab->srelgot->size += 2 * sizeof (Elf32_External_Rel);
67a4f2b7
AO
1731 else if (! GOT_TLS_GDESC_P (tls_type)
1732 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1733 || h->root.type != bfd_link_hash_undefweak)
ef5aade5
L
1734 && (info->shared
1735 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
eea6121a 1736 htab->srelgot->size += sizeof (Elf32_External_Rel);
67a4f2b7
AO
1737 if (GOT_TLS_GDESC_P (tls_type))
1738 htab->srelplt->size += sizeof (Elf32_External_Rel);
6725bdbf
AM
1739 }
1740 else
51b64d56 1741 h->got.offset = (bfd_vma) -1;
6725bdbf 1742
5a15f56f 1743 if (eh->dyn_relocs == NULL)
b34976b6 1744 return TRUE;
5a15f56f 1745
0c715baa
AM
1746 /* In the shared -Bsymbolic case, discard space allocated for
1747 dynamic pc-relative relocs against symbols which turn out to be
1748 defined in regular objects. For the normal shared case, discard
0ac8d2ca
AM
1749 space for pc-relative relocs that have become local due to symbol
1750 visibility changes. */
0c715baa
AM
1751
1752 if (info->shared)
5a15f56f 1753 {
09695f56
AM
1754 /* The only reloc that uses pc_count is R_386_PC32, which will
1755 appear on a call or on something like ".long foo - .". We
1756 want calls to protected symbols to resolve directly to the
1757 function rather than going via the plt. If people want
1758 function pointer comparisons to work as expected then they
1759 should avoid writing assembly like ".long foo - .". */
1760 if (SYMBOL_CALLS_LOCAL (info, h))
5a15f56f 1761 {
0c715baa
AM
1762 struct elf_i386_dyn_relocs **pp;
1763
1764 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1765 {
1766 p->count -= p->pc_count;
1767 p->pc_count = 0;
1768 if (p->count == 0)
1769 *pp = p->next;
1770 else
1771 pp = &p->next;
1772 }
5a15f56f 1773 }
4e795f50
AM
1774
1775 /* Also discard relocs on undefined weak syms with non-default
1776 visibility. */
22d606e9 1777 if (eh->dyn_relocs != NULL
4e795f50 1778 && h->root.type == bfd_link_hash_undefweak)
22d606e9
AM
1779 {
1780 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
1781 eh->dyn_relocs = NULL;
1782
1783 /* Make sure undefined weak symbols are output as a dynamic
1784 symbol in PIEs. */
1785 else if (h->dynindx == -1
1786 && !h->forced_local)
1787 {
1788 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1789 return FALSE;
1790 }
1791 }
0c715baa 1792 }
a23b6845 1793 else if (ELIMINATE_COPY_RELOCS)
0c715baa
AM
1794 {
1795 /* For the non-shared case, discard space for relocs against
1796 symbols which turn out to need copy relocs or are not
1797 dynamic. */
1798
f5385ebf
AM
1799 if (!h->non_got_ref
1800 && ((h->def_dynamic
1801 && !h->def_regular)
ebe50bae 1802 || (htab->elf.dynamic_sections_created
0c715baa
AM
1803 && (h->root.type == bfd_link_hash_undefweak
1804 || h->root.type == bfd_link_hash_undefined))))
1805 {
1806 /* Make sure this symbol is output as a dynamic symbol.
1807 Undefined weak syms won't yet be marked as dynamic. */
1808 if (h->dynindx == -1
f5385ebf 1809 && !h->forced_local)
0c715baa 1810 {
c152c796 1811 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 1812 return FALSE;
0c715baa 1813 }
5a15f56f 1814
0c715baa
AM
1815 /* If that succeeded, we know we'll be keeping all the
1816 relocs. */
1817 if (h->dynindx != -1)
1818 goto keep;
1819 }
1820
1821 eh->dyn_relocs = NULL;
1822
ec338859 1823 keep: ;
5a15f56f
AM
1824 }
1825
0c715baa
AM
1826 /* Finally, allocate space. */
1827 for (p = eh->dyn_relocs; p != NULL; p = p->next)
12d0ee4a 1828 {
0c715baa 1829 asection *sreloc = elf_section_data (p->sec)->sreloc;
eea6121a 1830 sreloc->size += p->count * sizeof (Elf32_External_Rel);
12d0ee4a
AM
1831 }
1832
b34976b6 1833 return TRUE;
6725bdbf
AM
1834}
1835
0c715baa
AM
1836/* Find any dynamic relocs that apply to read-only sections. */
1837
b34976b6 1838static bfd_boolean
55fd94b0 1839readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
0c715baa
AM
1840{
1841 struct elf_i386_link_hash_entry *eh;
1842 struct elf_i386_dyn_relocs *p;
1843
e92d460e
AM
1844 if (h->root.type == bfd_link_hash_warning)
1845 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1846
0c715baa
AM
1847 eh = (struct elf_i386_link_hash_entry *) h;
1848 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1849 {
1850 asection *s = p->sec->output_section;
1851
1852 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1853 {
1854 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1855
1856 info->flags |= DF_TEXTREL;
1857
1858 /* Not an error, just cut short the traversal. */
b34976b6 1859 return FALSE;
0c715baa
AM
1860 }
1861 }
b34976b6 1862 return TRUE;
0c715baa
AM
1863}
1864
252b5132
RH
1865/* Set the sizes of the dynamic sections. */
1866
b34976b6 1867static bfd_boolean
55fd94b0
AM
1868elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
1869 struct bfd_link_info *info)
252b5132 1870{
6725bdbf 1871 struct elf_i386_link_hash_table *htab;
252b5132
RH
1872 bfd *dynobj;
1873 asection *s;
b34976b6 1874 bfd_boolean relocs;
0c715baa 1875 bfd *ibfd;
252b5132 1876
6725bdbf 1877 htab = elf_i386_hash_table (info);
ebe50bae 1878 dynobj = htab->elf.dynobj;
ffb2e45b
AM
1879 if (dynobj == NULL)
1880 abort ();
252b5132 1881
ebe50bae 1882 if (htab->elf.dynamic_sections_created)
252b5132
RH
1883 {
1884 /* Set the contents of the .interp section to the interpreter. */
36af4a4e 1885 if (info->executable)
252b5132
RH
1886 {
1887 s = bfd_get_section_by_name (dynobj, ".interp");
ffb2e45b
AM
1888 if (s == NULL)
1889 abort ();
eea6121a 1890 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
252b5132
RH
1891 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1892 }
161d71a6 1893 }
6725bdbf 1894
0c715baa
AM
1895 /* Set up .got offsets for local syms, and space for local dynamic
1896 relocs. */
1897 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
161d71a6
L
1898 {
1899 bfd_signed_vma *local_got;
1900 bfd_signed_vma *end_local_got;
13ae64f3 1901 char *local_tls_type;
67a4f2b7 1902 bfd_vma *local_tlsdesc_gotent;
161d71a6
L
1903 bfd_size_type locsymcount;
1904 Elf_Internal_Shdr *symtab_hdr;
1905 asection *srel;
6725bdbf 1906
0c715baa 1907 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
161d71a6 1908 continue;
6725bdbf 1909
0c715baa
AM
1910 for (s = ibfd->sections; s != NULL; s = s->next)
1911 {
ec338859 1912 struct elf_i386_dyn_relocs *p;
0c715baa 1913
e81d3500
DD
1914 for (p = ((struct elf_i386_dyn_relocs *)
1915 elf_section_data (s)->local_dynrel);
ec338859
AM
1916 p != NULL;
1917 p = p->next)
0c715baa 1918 {
ec338859
AM
1919 if (!bfd_is_abs_section (p->sec)
1920 && bfd_is_abs_section (p->sec->output_section))
1921 {
1922 /* Input section has been discarded, either because
1923 it is a copy of a linkonce section or due to
1924 linker script /DISCARD/, so we'll be discarding
1925 the relocs too. */
1926 }
248866a8 1927 else if (p->count != 0)
ec338859
AM
1928 {
1929 srel = elf_section_data (p->sec)->sreloc;
eea6121a 1930 srel->size += p->count * sizeof (Elf32_External_Rel);
248866a8
AM
1931 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
1932 info->flags |= DF_TEXTREL;
ec338859 1933 }
0c715baa
AM
1934 }
1935 }
1936
1937 local_got = elf_local_got_refcounts (ibfd);
161d71a6
L
1938 if (!local_got)
1939 continue;
6725bdbf 1940
0c715baa 1941 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
161d71a6
L
1942 locsymcount = symtab_hdr->sh_info;
1943 end_local_got = local_got + locsymcount;
13ae64f3 1944 local_tls_type = elf_i386_local_got_tls_type (ibfd);
67a4f2b7 1945 local_tlsdesc_gotent = elf_i386_local_tlsdesc_gotent (ibfd);
161d71a6
L
1946 s = htab->sgot;
1947 srel = htab->srelgot;
67a4f2b7
AO
1948 for (; local_got < end_local_got;
1949 ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
161d71a6 1950 {
67a4f2b7 1951 *local_tlsdesc_gotent = (bfd_vma) -1;
161d71a6 1952 if (*local_got > 0)
6725bdbf 1953 {
67a4f2b7
AO
1954 if (GOT_TLS_GDESC_P (*local_tls_type))
1955 {
1956 *local_tlsdesc_gotent = htab->sgotplt->size
1957 - elf_i386_compute_jump_table_size (htab);
1958 htab->sgotplt->size += 8;
1959 *local_got = (bfd_vma) -2;
1960 }
1961 if (! GOT_TLS_GDESC_P (*local_tls_type)
1962 || GOT_TLS_GD_P (*local_tls_type))
1963 {
1964 *local_got = s->size;
1965 s->size += 4;
1966 if (GOT_TLS_GD_P (*local_tls_type)
1967 || *local_tls_type == GOT_TLS_IE_BOTH)
1968 s->size += 4;
1969 }
13ae64f3 1970 if (info->shared
67a4f2b7 1971 || GOT_TLS_GD_ANY_P (*local_tls_type)
37e55690
JJ
1972 || (*local_tls_type & GOT_TLS_IE))
1973 {
1974 if (*local_tls_type == GOT_TLS_IE_BOTH)
eea6121a 1975 srel->size += 2 * sizeof (Elf32_External_Rel);
67a4f2b7
AO
1976 else if (GOT_TLS_GD_P (*local_tls_type)
1977 || ! GOT_TLS_GDESC_P (*local_tls_type))
eea6121a 1978 srel->size += sizeof (Elf32_External_Rel);
67a4f2b7
AO
1979 if (GOT_TLS_GDESC_P (*local_tls_type))
1980 htab->srelplt->size += sizeof (Elf32_External_Rel);
37e55690 1981 }
6725bdbf 1982 }
161d71a6
L
1983 else
1984 *local_got = (bfd_vma) -1;
6725bdbf 1985 }
252b5132 1986 }
6725bdbf 1987
13ae64f3
JJ
1988 if (htab->tls_ldm_got.refcount > 0)
1989 {
1990 /* Allocate 2 got entries and 1 dynamic reloc for R_386_TLS_LDM
1991 relocs. */
eea6121a
AM
1992 htab->tls_ldm_got.offset = htab->sgot->size;
1993 htab->sgot->size += 8;
1994 htab->srelgot->size += sizeof (Elf32_External_Rel);
13ae64f3
JJ
1995 }
1996 else
1997 htab->tls_ldm_got.offset = -1;
1998
eac338cf
PB
1999 if (htab->is_vxworks)
2000 {
7325306f
RS
2001 /* Mark the GOT and PLT symbols as having relocations; they might
2002 not, but we won't know for sure until we build the GOT in
2003 finish_dynamic_symbol. */
2004 if (htab->elf.hgot)
2005 htab->elf.hgot->indx = -2;
2006 if (htab->elf.hplt)
2007 {
2008 htab->elf.hplt->indx = -2;
2009 if (htab->splt->flags & SEC_CODE)
2010 htab->elf.hplt->type = STT_FUNC;
2011 }
eac338cf
PB
2012 }
2013
0c715baa
AM
2014 /* Allocate global sym .plt and .got entries, and space for global
2015 sym dynamic relocs. */
ebe50bae 2016 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
252b5132 2017
67a4f2b7
AO
2018 /* For every jump slot reserved in the sgotplt, reloc_count is
2019 incremented. However, when we reserve space for TLS descriptors,
2020 it's not incremented, so in order to compute the space reserved
2021 for them, it suffices to multiply the reloc count by the jump
2022 slot size. */
2023 if (htab->srelplt)
2024 htab->sgotplt_jump_table_size = htab->srelplt->reloc_count * 4;
2025
5a15f56f
AM
2026 /* We now have determined the sizes of the various dynamic sections.
2027 Allocate memory for them. */
b34976b6 2028 relocs = FALSE;
252b5132
RH
2029 for (s = dynobj->sections; s != NULL; s = s->next)
2030 {
eac338cf
PB
2031 bfd_boolean strip_section = TRUE;
2032
252b5132
RH
2033 if ((s->flags & SEC_LINKER_CREATED) == 0)
2034 continue;
2035
6725bdbf
AM
2036 if (s == htab->splt
2037 || s == htab->sgot
75ff4589
L
2038 || s == htab->sgotplt
2039 || s == htab->sdynbss)
252b5132 2040 {
6725bdbf
AM
2041 /* Strip this section if we don't need it; see the
2042 comment below. */
eac338cf
PB
2043 /* We'd like to strip these sections if they aren't needed, but if
2044 we've exported dynamic symbols from them we must leave them.
2045 It's too late to tell BFD to get rid of the symbols. */
2046
7325306f 2047 if (htab->elf.hplt != NULL)
eac338cf 2048 strip_section = FALSE;
252b5132 2049 }
6725bdbf 2050 else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
252b5132 2051 {
eac338cf 2052 if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2)
b34976b6 2053 relocs = TRUE;
252b5132 2054
0ac8d2ca
AM
2055 /* We use the reloc_count field as a counter if we need
2056 to copy relocs into the output file. */
67a4f2b7
AO
2057 if (s != htab->srelplt)
2058 s->reloc_count = 0;
252b5132 2059 }
6725bdbf 2060 else
252b5132
RH
2061 {
2062 /* It's not one of our sections, so don't allocate space. */
2063 continue;
2064 }
2065
c456f082 2066 if (s->size == 0)
252b5132 2067 {
0ac8d2ca
AM
2068 /* If we don't need this section, strip it from the
2069 output file. This is mostly to handle .rel.bss and
2070 .rel.plt. We must create both sections in
2071 create_dynamic_sections, because they must be created
2072 before the linker maps input sections to output
2073 sections. The linker does that before
2074 adjust_dynamic_symbol is called, and it is that
2075 function which decides whether anything needs to go
2076 into these sections. */
c456f082
AM
2077 if (strip_section)
2078 s->flags |= SEC_EXCLUDE;
252b5132
RH
2079 continue;
2080 }
2081
c456f082
AM
2082 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2083 continue;
2084
f69da49f
AM
2085 /* Allocate memory for the section contents. We use bfd_zalloc
2086 here in case unused entries are not reclaimed before the
2087 section's contents are written out. This should not happen,
2088 but this way if it does, we get a R_386_NONE reloc instead
2089 of garbage. */
eea6121a 2090 s->contents = bfd_zalloc (dynobj, s->size);
6725bdbf 2091 if (s->contents == NULL)
b34976b6 2092 return FALSE;
252b5132
RH
2093 }
2094
ebe50bae 2095 if (htab->elf.dynamic_sections_created)
252b5132
RH
2096 {
2097 /* Add some entries to the .dynamic section. We fill in the
2098 values later, in elf_i386_finish_dynamic_sections, but we
2099 must add the entries now so that we get the correct size for
2100 the .dynamic section. The DT_DEBUG entry is filled in by the
2101 dynamic linker and used by the debugger. */
dc810e39 2102#define add_dynamic_entry(TAG, VAL) \
5a580b3a 2103 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 2104
36af4a4e 2105 if (info->executable)
252b5132 2106 {
dc810e39 2107 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 2108 return FALSE;
252b5132
RH
2109 }
2110
eea6121a 2111 if (htab->splt->size != 0)
252b5132 2112 {
dc810e39
AM
2113 if (!add_dynamic_entry (DT_PLTGOT, 0)
2114 || !add_dynamic_entry (DT_PLTRELSZ, 0)
2115 || !add_dynamic_entry (DT_PLTREL, DT_REL)
2116 || !add_dynamic_entry (DT_JMPREL, 0))
b34976b6 2117 return FALSE;
252b5132
RH
2118 }
2119
2120 if (relocs)
2121 {
dc810e39
AM
2122 if (!add_dynamic_entry (DT_REL, 0)
2123 || !add_dynamic_entry (DT_RELSZ, 0)
2124 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
b34976b6 2125 return FALSE;
252b5132 2126
0c715baa
AM
2127 /* If any dynamic relocs apply to a read-only section,
2128 then we need a DT_TEXTREL entry. */
248866a8
AM
2129 if ((info->flags & DF_TEXTREL) == 0)
2130 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
2131 (PTR) info);
0c715baa
AM
2132
2133 if ((info->flags & DF_TEXTREL) != 0)
2134 {
2135 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 2136 return FALSE;
0c715baa 2137 }
252b5132
RH
2138 }
2139 }
dc810e39 2140#undef add_dynamic_entry
252b5132 2141
b34976b6 2142 return TRUE;
252b5132
RH
2143}
2144
67a4f2b7
AO
2145static bfd_boolean
2146elf_i386_always_size_sections (bfd *output_bfd,
2147 struct bfd_link_info *info)
2148{
2149 asection *tls_sec = elf_hash_table (info)->tls_sec;
2150
2151 if (tls_sec)
2152 {
2153 struct elf_link_hash_entry *tlsbase;
2154
2155 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
2156 "_TLS_MODULE_BASE_",
2157 FALSE, FALSE, FALSE);
2158
2159 if (tlsbase && tlsbase->type == STT_TLS)
2160 {
2161 struct bfd_link_hash_entry *bh = NULL;
2162 const struct elf_backend_data *bed
2163 = get_elf_backend_data (output_bfd);
2164
2165 if (!(_bfd_generic_link_add_one_symbol
2166 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
2167 tls_sec, 0, NULL, FALSE,
2168 bed->collect, &bh)))
2169 return FALSE;
2170 tlsbase = (struct elf_link_hash_entry *)bh;
2171 tlsbase->def_regular = 1;
2172 tlsbase->other = STV_HIDDEN;
2173 (*bed->elf_backend_hide_symbol) (info, tlsbase, TRUE);
2174 }
2175 }
2176
2177 return TRUE;
2178}
2179
38701953
AM
2180/* Set the correct type for an x86 ELF section. We do this by the
2181 section name, which is a hack, but ought to work. */
2182
b34976b6 2183static bfd_boolean
55fd94b0
AM
2184elf_i386_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2185 Elf_Internal_Shdr *hdr,
2186 asection *sec)
38701953
AM
2187{
2188 register const char *name;
2189
2190 name = bfd_get_section_name (abfd, sec);
2191
2192 /* This is an ugly, but unfortunately necessary hack that is
2193 needed when producing EFI binaries on x86. It tells
2194 elf.c:elf_fake_sections() not to consider ".reloc" as a section
2195 containing ELF relocation info. We need this hack in order to
2196 be able to generate ELF binaries that can be translated into
2197 EFI applications (which are essentially COFF objects). Those
2198 files contain a COFF ".reloc" section inside an ELFNN object,
2199 which would normally cause BFD to segfault because it would
2200 attempt to interpret this section as containing relocation
2201 entries for section "oc". With this hack enabled, ".reloc"
2202 will be treated as a normal data section, which will avoid the
2203 segfault. However, you won't be able to create an ELFNN binary
2204 with a section named "oc" that needs relocations, but that's
2205 the kind of ugly side-effects you get when detecting section
2206 types based on their names... In practice, this limitation is
2207 unlikely to bite. */
2208 if (strcmp (name, ".reloc") == 0)
2209 hdr->sh_type = SHT_PROGBITS;
2210
b34976b6 2211 return TRUE;
38701953
AM
2212}
2213
13ae64f3
JJ
2214/* Return the base VMA address which should be subtracted from real addresses
2215 when resolving @dtpoff relocation.
2216 This is PT_TLS segment p_vaddr. */
2217
2218static bfd_vma
55fd94b0 2219dtpoff_base (struct bfd_link_info *info)
13ae64f3 2220{
e1918d23
AM
2221 /* If tls_sec is NULL, we should have signalled an error already. */
2222 if (elf_hash_table (info)->tls_sec == NULL)
6a30718d 2223 return 0;
e1918d23 2224 return elf_hash_table (info)->tls_sec->vma;
13ae64f3
JJ
2225}
2226
2227/* Return the relocation value for @tpoff relocation
2228 if STT_TLS virtual address is ADDRESS. */
2229
2230static bfd_vma
55fd94b0 2231tpoff (struct bfd_link_info *info, bfd_vma address)
13ae64f3 2232{
e1918d23 2233 struct elf_link_hash_table *htab = elf_hash_table (info);
13ae64f3 2234
e1918d23
AM
2235 /* If tls_sec is NULL, we should have signalled an error already. */
2236 if (htab->tls_sec == NULL)
6a30718d 2237 return 0;
e1918d23 2238 return htab->tls_size + htab->tls_sec->vma - address;
13ae64f3
JJ
2239}
2240
252b5132
RH
2241/* Relocate an i386 ELF section. */
2242
b34976b6 2243static bfd_boolean
55fd94b0
AM
2244elf_i386_relocate_section (bfd *output_bfd,
2245 struct bfd_link_info *info,
2246 bfd *input_bfd,
2247 asection *input_section,
2248 bfd_byte *contents,
2249 Elf_Internal_Rela *relocs,
2250 Elf_Internal_Sym *local_syms,
2251 asection **local_sections)
252b5132 2252{
6725bdbf 2253 struct elf_i386_link_hash_table *htab;
252b5132
RH
2254 Elf_Internal_Shdr *symtab_hdr;
2255 struct elf_link_hash_entry **sym_hashes;
2256 bfd_vma *local_got_offsets;
67a4f2b7 2257 bfd_vma *local_tlsdesc_gotents;
252b5132
RH
2258 Elf_Internal_Rela *rel;
2259 Elf_Internal_Rela *relend;
2260
6725bdbf 2261 htab = elf_i386_hash_table (info);
252b5132
RH
2262 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2263 sym_hashes = elf_sym_hashes (input_bfd);
2264 local_got_offsets = elf_local_got_offsets (input_bfd);
67a4f2b7 2265 local_tlsdesc_gotents = elf_i386_local_tlsdesc_gotent (input_bfd);
252b5132 2266
252b5132
RH
2267 rel = relocs;
2268 relend = relocs + input_section->reloc_count;
2269 for (; rel < relend; rel++)
2270 {
13ae64f3 2271 unsigned int r_type;
252b5132
RH
2272 reloc_howto_type *howto;
2273 unsigned long r_symndx;
2274 struct elf_link_hash_entry *h;
2275 Elf_Internal_Sym *sym;
2276 asection *sec;
67a4f2b7 2277 bfd_vma off, offplt;
252b5132 2278 bfd_vma relocation;
b34976b6 2279 bfd_boolean unresolved_reloc;
252b5132 2280 bfd_reloc_status_type r;
1b452ec6 2281 unsigned int indx;
13ae64f3 2282 int tls_type;
252b5132
RH
2283
2284 r_type = ELF32_R_TYPE (rel->r_info);
55fd94b0
AM
2285 if (r_type == R_386_GNU_VTINHERIT
2286 || r_type == R_386_GNU_VTENTRY)
252b5132 2287 continue;
dc47f327 2288
55fd94b0 2289 if ((indx = r_type) >= R_386_standard
13ae64f3
JJ
2290 && ((indx = r_type - R_386_ext_offset) - R_386_standard
2291 >= R_386_ext - R_386_standard)
2292 && ((indx = r_type - R_386_tls_offset) - R_386_ext
2293 >= R_386_tls - R_386_ext))
252b5132 2294 {
6ba842b6 2295 (*_bfd_error_handler)
d003868e
AM
2296 (_("%B: unrecognized relocation (0x%x) in section `%A'"),
2297 input_bfd, input_section, r_type);
252b5132 2298 bfd_set_error (bfd_error_bad_value);
b34976b6 2299 return FALSE;
252b5132 2300 }
1b452ec6 2301 howto = elf_howto_table + indx;
252b5132
RH
2302
2303 r_symndx = ELF32_R_SYM (rel->r_info);
2304
1049f94e 2305 if (info->relocatable)
252b5132 2306 {
4a335f3d 2307 bfd_vma val;
4a335f3d
AM
2308 bfd_byte *where;
2309
0ac8d2ca 2310 /* This is a relocatable link. We don't have to change
252b5132
RH
2311 anything, unless the reloc is against a section symbol,
2312 in which case we have to adjust according to where the
2313 section symbol winds up in the output section. */
4a335f3d
AM
2314 if (r_symndx >= symtab_hdr->sh_info)
2315 continue;
2316
2317 sym = local_syms + r_symndx;
2318 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2319 continue;
2320
2321 sec = local_sections[r_symndx];
2322 val = sec->output_offset;
2323 if (val == 0)
2324 continue;
2325
2326 where = contents + rel->r_offset;
2327 switch (howto->size)
252b5132 2328 {
16a10388 2329 /* FIXME: overflow checks. */
4a335f3d 2330 case 0:
16a10388 2331 val += bfd_get_8 (input_bfd, where);
4a335f3d 2332 bfd_put_8 (input_bfd, val, where);
4a335f3d
AM
2333 break;
2334 case 1:
16a10388 2335 val += bfd_get_16 (input_bfd, where);
4a335f3d 2336 bfd_put_16 (input_bfd, val, where);
4a335f3d
AM
2337 break;
2338 case 2:
2339 val += bfd_get_32 (input_bfd, where);
2340 bfd_put_32 (input_bfd, val, where);
2341 break;
2342 default:
2343 abort ();
252b5132 2344 }
252b5132
RH
2345 continue;
2346 }
2347
2348 /* This is a final link. */
2349 h = NULL;
2350 sym = NULL;
2351 sec = NULL;
b34976b6 2352 unresolved_reloc = FALSE;
252b5132
RH
2353 if (r_symndx < symtab_hdr->sh_info)
2354 {
2355 sym = local_syms + r_symndx;
2356 sec = local_sections[r_symndx];
2357 relocation = (sec->output_section->vma
2358 + sec->output_offset
2359 + sym->st_value);
f8df10f4
JJ
2360 if ((sec->flags & SEC_MERGE)
2361 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2362 {
2363 asection *msec;
2364 bfd_vma addend;
4a335f3d 2365 bfd_byte *where = contents + rel->r_offset;
f8df10f4 2366
4a335f3d 2367 switch (howto->size)
f8df10f4 2368 {
4a335f3d
AM
2369 case 0:
2370 addend = bfd_get_8 (input_bfd, where);
2371 if (howto->pc_relative)
2372 {
2373 addend = (addend ^ 0x80) - 0x80;
2374 addend += 1;
2375 }
2376 break;
2377 case 1:
2378 addend = bfd_get_16 (input_bfd, where);
2379 if (howto->pc_relative)
2380 {
2381 addend = (addend ^ 0x8000) - 0x8000;
2382 addend += 2;
2383 }
2384 break;
2385 case 2:
2386 addend = bfd_get_32 (input_bfd, where);
2387 if (howto->pc_relative)
2388 {
2389 addend = (addend ^ 0x80000000) - 0x80000000;
2390 addend += 4;
2391 }
2392 break;
2393 default:
2394 abort ();
f8df10f4
JJ
2395 }
2396
f8df10f4 2397 msec = sec;
4a335f3d
AM
2398 addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend);
2399 addend -= relocation;
f8df10f4 2400 addend += msec->output_section->vma + msec->output_offset;
4a335f3d
AM
2401
2402 switch (howto->size)
2403 {
2404 case 0:
16a10388 2405 /* FIXME: overflow checks. */
4a335f3d
AM
2406 if (howto->pc_relative)
2407 addend -= 1;
2408 bfd_put_8 (input_bfd, addend, where);
4a335f3d
AM
2409 break;
2410 case 1:
2411 if (howto->pc_relative)
2412 addend -= 2;
2413 bfd_put_16 (input_bfd, addend, where);
4a335f3d
AM
2414 break;
2415 case 2:
2416 if (howto->pc_relative)
2417 addend -= 4;
2418 bfd_put_32 (input_bfd, addend, where);
2419 break;
2420 }
f8df10f4 2421 }
252b5132
RH
2422 }
2423 else
2424 {
560e09e9 2425 bfd_boolean warned;
ffb2e45b 2426
b2a8e766
AM
2427 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2428 r_symndx, symtab_hdr, sym_hashes,
2429 h, sec, relocation,
2430 unresolved_reloc, warned);
252b5132
RH
2431 }
2432
9635fe29
AM
2433 if (r_symndx == 0)
2434 {
2435 /* r_symndx will be zero only for relocs against symbols from
2436 removed linkonce sections, or sections discarded by a linker
2437 script. For these relocs, we just want the section contents
2438 zeroed. Avoid any special processing in the switch below. */
2439 r_type = R_386_NONE;
2440
2441 relocation = 0;
2442 if (howto->pc_relative)
2443 relocation = (input_section->output_section->vma
2444 + input_section->output_offset
2445 + rel->r_offset);
2446 }
2447
252b5132
RH
2448 switch (r_type)
2449 {
2450 case R_386_GOT32:
2451 /* Relocation is to the entry for this symbol in the global
2452 offset table. */
ffb2e45b
AM
2453 if (htab->sgot == NULL)
2454 abort ();
252b5132
RH
2455
2456 if (h != NULL)
2457 {
b34976b6 2458 bfd_boolean dyn;
252b5132
RH
2459
2460 off = h->got.offset;
ebe50bae 2461 dyn = htab->elf.dynamic_sections_created;
26e41594 2462 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
252b5132 2463 || (info->shared
586119b3 2464 && SYMBOL_REFERENCES_LOCAL (info, h))
ef5aade5
L
2465 || (ELF_ST_VISIBILITY (h->other)
2466 && h->root.type == bfd_link_hash_undefweak))
252b5132
RH
2467 {
2468 /* This is actually a static link, or it is a
2469 -Bsymbolic link and the symbol is defined
2470 locally, or the symbol was forced to be local
2471 because of a version file. We must initialize
2472 this entry in the global offset table. Since the
2473 offset must always be a multiple of 4, we use the
2474 least significant bit to record whether we have
2475 initialized it already.
2476
2477 When doing a dynamic link, we create a .rel.got
2478 relocation entry to initialize the value. This
2479 is done in the finish_dynamic_symbol routine. */
2480 if ((off & 1) != 0)
2481 off &= ~1;
2482 else
2483 {
2484 bfd_put_32 (output_bfd, relocation,
6725bdbf 2485 htab->sgot->contents + off);
252b5132
RH
2486 h->got.offset |= 1;
2487 }
2488 }
8c694914 2489 else
b34976b6 2490 unresolved_reloc = FALSE;
252b5132
RH
2491 }
2492 else
2493 {
ffb2e45b
AM
2494 if (local_got_offsets == NULL)
2495 abort ();
252b5132
RH
2496
2497 off = local_got_offsets[r_symndx];
2498
2499 /* The offset must always be a multiple of 4. We use
83be169b
AM
2500 the least significant bit to record whether we have
2501 already generated the necessary reloc. */
252b5132
RH
2502 if ((off & 1) != 0)
2503 off &= ~1;
2504 else
2505 {
6725bdbf
AM
2506 bfd_put_32 (output_bfd, relocation,
2507 htab->sgot->contents + off);
252b5132
RH
2508
2509 if (info->shared)
2510 {
947216bf
AM
2511 asection *s;
2512 Elf_Internal_Rela outrel;
2513 bfd_byte *loc;
252b5132 2514
947216bf
AM
2515 s = htab->srelgot;
2516 if (s == NULL)
ffb2e45b 2517 abort ();
252b5132 2518
6725bdbf
AM
2519 outrel.r_offset = (htab->sgot->output_section->vma
2520 + htab->sgot->output_offset
252b5132
RH
2521 + off);
2522 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
947216bf
AM
2523 loc = s->contents;
2524 loc += s->reloc_count++ * sizeof (Elf32_External_Rel);
0ac8d2ca 2525 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
252b5132
RH
2526 }
2527
2528 local_got_offsets[r_symndx] |= 1;
2529 }
252b5132
RH
2530 }
2531
ffb2e45b
AM
2532 if (off >= (bfd_vma) -2)
2533 abort ();
2534
8c37241b
JJ
2535 relocation = htab->sgot->output_section->vma
2536 + htab->sgot->output_offset + off
2537 - htab->sgotplt->output_section->vma
2538 - htab->sgotplt->output_offset;
252b5132
RH
2539 break;
2540
2541 case R_386_GOTOFF:
2542 /* Relocation is relative to the start of the global offset
2543 table. */
2544
90f487df
L
2545 /* Check to make sure it isn't a protected function symbol
2546 for shared library since it may not be local when used
2547 as function address. */
2548 if (info->shared
8fe76924 2549 && !info->executable
90f487df
L
2550 && h
2551 && h->def_regular
2552 && h->type == STT_FUNC
2553 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
2554 {
2555 (*_bfd_error_handler)
2556 (_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
2557 input_bfd, h->root.root.string);
2558 bfd_set_error (bfd_error_bad_value);
2559 return FALSE;
2560 }
2561
8c37241b
JJ
2562 /* Note that sgot is not involved in this
2563 calculation. We always want the start of .got.plt. If we
2564 defined _GLOBAL_OFFSET_TABLE_ in a different way, as is
252b5132
RH
2565 permitted by the ABI, we might have to change this
2566 calculation. */
8c37241b
JJ
2567 relocation -= htab->sgotplt->output_section->vma
2568 + htab->sgotplt->output_offset;
252b5132
RH
2569 break;
2570
2571 case R_386_GOTPC:
2572 /* Use global offset table as symbol value. */
8c37241b
JJ
2573 relocation = htab->sgotplt->output_section->vma
2574 + htab->sgotplt->output_offset;
b34976b6 2575 unresolved_reloc = FALSE;
252b5132
RH
2576 break;
2577
2578 case R_386_PLT32:
2579 /* Relocation is to the entry for this symbol in the
2580 procedure linkage table. */
2581
dd5724d5 2582 /* Resolve a PLT32 reloc against a local symbol directly,
83be169b 2583 without using the procedure linkage table. */
252b5132
RH
2584 if (h == NULL)
2585 break;
2586
dd5724d5 2587 if (h->plt.offset == (bfd_vma) -1
6725bdbf 2588 || htab->splt == NULL)
252b5132
RH
2589 {
2590 /* We didn't make a PLT entry for this symbol. This
83be169b
AM
2591 happens when statically linking PIC code, or when
2592 using -Bsymbolic. */
252b5132
RH
2593 break;
2594 }
2595
6725bdbf
AM
2596 relocation = (htab->splt->output_section->vma
2597 + htab->splt->output_offset
252b5132 2598 + h->plt.offset);
b34976b6 2599 unresolved_reloc = FALSE;
252b5132
RH
2600 break;
2601
2602 case R_386_32:
2603 case R_386_PC32:
f855931b 2604 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
2605 break;
2606
12d0ee4a 2607 if ((info->shared
ef5aade5
L
2608 && (h == NULL
2609 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2610 || h->root.type != bfd_link_hash_undefweak)
12d0ee4a 2611 && (r_type != R_386_PC32
f6c52c13 2612 || !SYMBOL_CALLS_LOCAL (info, h)))
a23b6845
AM
2613 || (ELIMINATE_COPY_RELOCS
2614 && !info->shared
12d0ee4a
AM
2615 && h != NULL
2616 && h->dynindx != -1
f5385ebf
AM
2617 && !h->non_got_ref
2618 && ((h->def_dynamic
2619 && !h->def_regular)
28d0b90e
AM
2620 || h->root.type == bfd_link_hash_undefweak
2621 || h->root.type == bfd_link_hash_undefined)))
252b5132 2622 {
947216bf
AM
2623 Elf_Internal_Rela outrel;
2624 bfd_byte *loc;
b34976b6 2625 bfd_boolean skip, relocate;
0c715baa 2626 asection *sreloc;
252b5132
RH
2627
2628 /* When generating a shared object, these relocations
2629 are copied into the output file to be resolved at run
2630 time. */
2631
b34976b6
AM
2632 skip = FALSE;
2633 relocate = FALSE;
252b5132 2634
c629eae0
JJ
2635 outrel.r_offset =
2636 _bfd_elf_section_offset (output_bfd, info, input_section,
2637 rel->r_offset);
2638 if (outrel.r_offset == (bfd_vma) -1)
b34976b6 2639 skip = TRUE;
0bb2d96a 2640 else if (outrel.r_offset == (bfd_vma) -2)
b34976b6 2641 skip = TRUE, relocate = TRUE;
252b5132
RH
2642 outrel.r_offset += (input_section->output_section->vma
2643 + input_section->output_offset);
2644
2645 if (skip)
0bb2d96a 2646 memset (&outrel, 0, sizeof outrel);
5a15f56f
AM
2647 else if (h != NULL
2648 && h->dynindx != -1
2649 && (r_type == R_386_PC32
2650 || !info->shared
2651 || !info->symbolic
f5385ebf 2652 || !h->def_regular))
0bb2d96a 2653 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
252b5132
RH
2654 else
2655 {
5a15f56f 2656 /* This symbol is local, or marked to become local. */
b34976b6 2657 relocate = TRUE;
5a15f56f 2658 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
252b5132
RH
2659 }
2660
0c715baa
AM
2661 sreloc = elf_section_data (input_section)->sreloc;
2662 if (sreloc == NULL)
2663 abort ();
2664
947216bf
AM
2665 loc = sreloc->contents;
2666 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
0c715baa 2667 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
252b5132
RH
2668
2669 /* If this reloc is against an external symbol, we do
2670 not want to fiddle with the addend. Otherwise, we
2671 need to include the symbol value so that it becomes
2672 an addend for the dynamic reloc. */
2673 if (! relocate)
2674 continue;
2675 }
252b5132
RH
2676 break;
2677
37e55690
JJ
2678 case R_386_TLS_IE:
2679 if (info->shared)
2680 {
947216bf
AM
2681 Elf_Internal_Rela outrel;
2682 bfd_byte *loc;
37e55690 2683 asection *sreloc;
37e55690
JJ
2684
2685 outrel.r_offset = rel->r_offset
2686 + input_section->output_section->vma
2687 + input_section->output_offset;
2688 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2689 sreloc = elf_section_data (input_section)->sreloc;
2690 if (sreloc == NULL)
2691 abort ();
947216bf
AM
2692 loc = sreloc->contents;
2693 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
37e55690
JJ
2694 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
2695 }
2696 /* Fall through */
2697
13ae64f3 2698 case R_386_TLS_GD:
67a4f2b7
AO
2699 case R_386_TLS_GOTDESC:
2700 case R_386_TLS_DESC_CALL:
13ae64f3 2701 case R_386_TLS_IE_32:
37e55690 2702 case R_386_TLS_GOTIE:
13ae64f3
JJ
2703 r_type = elf_i386_tls_transition (info, r_type, h == NULL);
2704 tls_type = GOT_UNKNOWN;
2705 if (h == NULL && local_got_offsets)
2706 tls_type = elf_i386_local_got_tls_type (input_bfd) [r_symndx];
2707 else if (h != NULL)
2708 {
2709 tls_type = elf_i386_hash_entry(h)->tls_type;
37e55690 2710 if (!info->shared && h->dynindx == -1 && (tls_type & GOT_TLS_IE))
13ae64f3
JJ
2711 r_type = R_386_TLS_LE_32;
2712 }
37e55690
JJ
2713 if (tls_type == GOT_TLS_IE)
2714 tls_type = GOT_TLS_IE_NEG;
67a4f2b7
AO
2715 if (r_type == R_386_TLS_GD
2716 || r_type == R_386_TLS_GOTDESC
2717 || r_type == R_386_TLS_DESC_CALL)
37e55690
JJ
2718 {
2719 if (tls_type == GOT_TLS_IE_POS)
2720 r_type = R_386_TLS_GOTIE;
2721 else if (tls_type & GOT_TLS_IE)
2722 r_type = R_386_TLS_IE_32;
2723 }
13ae64f3
JJ
2724
2725 if (r_type == R_386_TLS_LE_32)
2726 {
82e51918 2727 BFD_ASSERT (! unresolved_reloc);
13ae64f3
JJ
2728 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
2729 {
2730 unsigned int val, type;
2731 bfd_vma roff;
2732
2733 /* GD->LE transition. */
2734 BFD_ASSERT (rel->r_offset >= 2);
2735 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2736 BFD_ASSERT (type == 0x8d || type == 0x04);
eea6121a 2737 BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
13ae64f3
JJ
2738 BFD_ASSERT (bfd_get_8 (input_bfd,
2739 contents + rel->r_offset + 4)
2740 == 0xe8);
2741 BFD_ASSERT (rel + 1 < relend);
2742 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
2743 roff = rel->r_offset + 5;
2744 val = bfd_get_8 (input_bfd,
2745 contents + rel->r_offset - 1);
2746 if (type == 0x04)
2747 {
2748 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
2749 Change it into:
2750 movl %gs:0, %eax; subl $foo@tpoff, %eax
2751 (6 byte form of subl). */
2752 BFD_ASSERT (rel->r_offset >= 3);
2753 BFD_ASSERT (bfd_get_8 (input_bfd,
2754 contents + rel->r_offset - 3)
2755 == 0x8d);
2756 BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
2757 memcpy (contents + rel->r_offset - 3,
2758 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
2759 }
2760 else
2761 {
2762 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
eea6121a 2763 if (rel->r_offset + 10 <= input_section->size
13ae64f3
JJ
2764 && bfd_get_8 (input_bfd,
2765 contents + rel->r_offset + 9) == 0x90)
2766 {
2767 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
2768 Change it into:
2769 movl %gs:0, %eax; subl $foo@tpoff, %eax
2770 (6 byte form of subl). */
2771 memcpy (contents + rel->r_offset - 2,
2772 "\x65\xa1\0\0\0\0\x81\xe8\0\0\0", 12);
2773 roff = rel->r_offset + 6;
2774 }
2775 else
2776 {
2777 /* leal foo(%reg), %eax; call ___tls_get_addr
2778 Change it into:
2779 movl %gs:0, %eax; subl $foo@tpoff, %eax
2780 (5 byte form of subl). */
2781 memcpy (contents + rel->r_offset - 2,
2782 "\x65\xa1\0\0\0\0\x2d\0\0\0", 11);
2783 }
2784 }
2785 bfd_put_32 (output_bfd, tpoff (info, relocation),
2786 contents + roff);
2787 /* Skip R_386_PLT32. */
2788 rel++;
2789 continue;
2790 }
67a4f2b7
AO
2791 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
2792 {
2793 /* GDesc -> LE transition.
2794 It's originally something like:
2795 leal x@tlsdesc(%ebx), %eax
2796
2797 leal x@ntpoff, %eax
2798
2799 Registers other than %eax may be set up here. */
2800
2801 unsigned int val, type;
2802 bfd_vma roff;
2803
2804 /* First, make sure it's a leal adding ebx to a
2805 32-bit offset into any register, although it's
2806 probably almost always going to be eax. */
2807 roff = rel->r_offset;
2808 BFD_ASSERT (roff >= 2);
2809 type = bfd_get_8 (input_bfd, contents + roff - 2);
2810 BFD_ASSERT (type == 0x8d);
2811 val = bfd_get_8 (input_bfd, contents + roff - 1);
2812 BFD_ASSERT ((val & 0xc7) == 0x83);
2813 BFD_ASSERT (roff + 4 <= input_section->size);
2814
2815 /* Now modify the instruction as appropriate. */
2816 /* aoliva FIXME: remove the above and xor the byte
2817 below with 0x86. */
2818 bfd_put_8 (output_bfd, val ^ 0x86,
2819 contents + roff - 1);
2820 bfd_put_32 (output_bfd, -tpoff (info, relocation),
2821 contents + roff);
2822 continue;
2823 }
2824 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
2825 {
2826 /* GDesc -> LE transition.
2827 It's originally:
2828 call *(%eax)
2829 Turn it into:
2830 nop; nop */
2831
2832 unsigned int val, type;
2833 bfd_vma roff;
2834
2835 /* First, make sure it's a call *(%eax). */
2836 roff = rel->r_offset;
2837 BFD_ASSERT (roff + 2 <= input_section->size);
2838 type = bfd_get_8 (input_bfd, contents + roff);
2839 BFD_ASSERT (type == 0xff);
2840 val = bfd_get_8 (input_bfd, contents + roff + 1);
2841 BFD_ASSERT (val == 0x10);
2842
2843 /* Now modify the instruction as appropriate. */
2844 bfd_put_8 (output_bfd, 0x90, contents + roff);
2845 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
2846 continue;
2847 }
37e55690 2848 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_IE)
13ae64f3
JJ
2849 {
2850 unsigned int val, type;
2851
2852 /* IE->LE transition:
37e55690
JJ
2853 Originally it can be one of:
2854 movl foo, %eax
2855 movl foo, %reg
2856 addl foo, %reg
2857 We change it into:
2858 movl $foo, %eax
2859 movl $foo, %reg
2860 addl $foo, %reg. */
2861 BFD_ASSERT (rel->r_offset >= 1);
2862 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
eea6121a 2863 BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
37e55690
JJ
2864 if (val == 0xa1)
2865 {
2866 /* movl foo, %eax. */
55fd94b0
AM
2867 bfd_put_8 (output_bfd, 0xb8,
2868 contents + rel->r_offset - 1);
37e55690 2869 }
299bf759 2870 else
37e55690 2871 {
299bf759 2872 BFD_ASSERT (rel->r_offset >= 2);
55fd94b0
AM
2873 type = bfd_get_8 (input_bfd,
2874 contents + rel->r_offset - 2);
299bf759 2875 switch (type)
26e41594 2876 {
299bf759
L
2877 case 0x8b:
2878 /* movl */
2879 BFD_ASSERT ((val & 0xc7) == 0x05);
2880 bfd_put_8 (output_bfd, 0xc7,
2881 contents + rel->r_offset - 2);
2882 bfd_put_8 (output_bfd,
2883 0xc0 | ((val >> 3) & 7),
2884 contents + rel->r_offset - 1);
2885 break;
2886 case 0x03:
2887 /* addl */
2888 BFD_ASSERT ((val & 0xc7) == 0x05);
2889 bfd_put_8 (output_bfd, 0x81,
2890 contents + rel->r_offset - 2);
2891 bfd_put_8 (output_bfd,
2892 0xc0 | ((val >> 3) & 7),
2893 contents + rel->r_offset - 1);
2894 break;
2895 default:
2896 BFD_FAIL ();
2897 break;
26e41594 2898 }
37e55690 2899 }
37e55690
JJ
2900 bfd_put_32 (output_bfd, -tpoff (info, relocation),
2901 contents + rel->r_offset);
2902 continue;
2903 }
2904 else
2905 {
2906 unsigned int val, type;
2907
2908 /* {IE_32,GOTIE}->LE transition:
2909 Originally it can be one of:
13ae64f3 2910 subl foo(%reg1), %reg2
13ae64f3 2911 movl foo(%reg1), %reg2
37e55690 2912 addl foo(%reg1), %reg2
13ae64f3
JJ
2913 We change it into:
2914 subl $foo, %reg2
37e55690
JJ
2915 movl $foo, %reg2 (6 byte form)
2916 addl $foo, %reg2. */
13ae64f3
JJ
2917 BFD_ASSERT (rel->r_offset >= 2);
2918 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
2919 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
eea6121a 2920 BFD_ASSERT (rel->r_offset + 4 <= input_section->size);
37e55690 2921 BFD_ASSERT ((val & 0xc0) == 0x80 && (val & 7) != 4);
13ae64f3
JJ
2922 if (type == 0x8b)
2923 {
2924 /* movl */
13ae64f3
JJ
2925 bfd_put_8 (output_bfd, 0xc7,
2926 contents + rel->r_offset - 2);
2927 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2928 contents + rel->r_offset - 1);
2929 }
2930 else if (type == 0x2b)
2931 {
2932 /* subl */
13ae64f3
JJ
2933 bfd_put_8 (output_bfd, 0x81,
2934 contents + rel->r_offset - 2);
2935 bfd_put_8 (output_bfd, 0xe8 | ((val >> 3) & 7),
2936 contents + rel->r_offset - 1);
2937 }
37e55690
JJ
2938 else if (type == 0x03)
2939 {
2940 /* addl */
2941 bfd_put_8 (output_bfd, 0x81,
2942 contents + rel->r_offset - 2);
2943 bfd_put_8 (output_bfd, 0xc0 | ((val >> 3) & 7),
2944 contents + rel->r_offset - 1);
2945 }
13ae64f3
JJ
2946 else
2947 BFD_FAIL ();
37e55690
JJ
2948 if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTIE)
2949 bfd_put_32 (output_bfd, -tpoff (info, relocation),
2950 contents + rel->r_offset);
2951 else
2952 bfd_put_32 (output_bfd, tpoff (info, relocation),
2953 contents + rel->r_offset);
13ae64f3
JJ
2954 continue;
2955 }
2956 }
2957
2958 if (htab->sgot == NULL)
2959 abort ();
2960
2961 if (h != NULL)
67a4f2b7
AO
2962 {
2963 off = h->got.offset;
2964 offplt = elf_i386_hash_entry (h)->tlsdesc_got;
2965 }
13ae64f3
JJ
2966 else
2967 {
2968 if (local_got_offsets == NULL)
2969 abort ();
2970
2971 off = local_got_offsets[r_symndx];
67a4f2b7 2972 offplt = local_tlsdesc_gotents[r_symndx];
13ae64f3
JJ
2973 }
2974
2975 if ((off & 1) != 0)
2976 off &= ~1;
26e41594 2977 else
13ae64f3 2978 {
947216bf
AM
2979 Elf_Internal_Rela outrel;
2980 bfd_byte *loc;
13ae64f3 2981 int dr_type, indx;
67a4f2b7 2982 asection *sreloc;
13ae64f3
JJ
2983
2984 if (htab->srelgot == NULL)
2985 abort ();
2986
67a4f2b7
AO
2987 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2988
2989 if (GOT_TLS_GDESC_P (tls_type))
2990 {
2991 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_DESC);
2992 BFD_ASSERT (htab->sgotplt_jump_table_size + offplt + 8
2993 <= htab->sgotplt->size);
2994 outrel.r_offset = (htab->sgotplt->output_section->vma
2995 + htab->sgotplt->output_offset
2996 + offplt
2997 + htab->sgotplt_jump_table_size);
2998 sreloc = htab->srelplt;
2999 loc = sreloc->contents;
3000 loc += sreloc->reloc_count++
3001 * sizeof (Elf32_External_Rel);
3002 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
3003 <= sreloc->contents + sreloc->size);
3004 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3005 if (indx == 0)
3006 {
3007 BFD_ASSERT (! unresolved_reloc);
3008 bfd_put_32 (output_bfd,
3009 relocation - dtpoff_base (info),
3010 htab->sgotplt->contents + offplt
3011 + htab->sgotplt_jump_table_size + 4);
3012 }
3013 else
3014 {
3015 bfd_put_32 (output_bfd, 0,
3016 htab->sgotplt->contents + offplt
3017 + htab->sgotplt_jump_table_size + 4);
3018 }
3019 }
3020
3021 sreloc = htab->srelgot;
3022
13ae64f3
JJ
3023 outrel.r_offset = (htab->sgot->output_section->vma
3024 + htab->sgot->output_offset + off);
3025
67a4f2b7 3026 if (GOT_TLS_GD_P (tls_type))
13ae64f3 3027 dr_type = R_386_TLS_DTPMOD32;
67a4f2b7
AO
3028 else if (GOT_TLS_GDESC_P (tls_type))
3029 goto dr_done;
37e55690
JJ
3030 else if (tls_type == GOT_TLS_IE_POS)
3031 dr_type = R_386_TLS_TPOFF;
13ae64f3
JJ
3032 else
3033 dr_type = R_386_TLS_TPOFF32;
67a4f2b7 3034
37e55690
JJ
3035 if (dr_type == R_386_TLS_TPOFF && indx == 0)
3036 bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
3037 htab->sgot->contents + off);
3038 else if (dr_type == R_386_TLS_TPOFF32 && indx == 0)
c5c1f40c 3039 bfd_put_32 (output_bfd, dtpoff_base (info) - relocation,
c366c25e 3040 htab->sgot->contents + off);
67a4f2b7 3041 else if (dr_type != R_386_TLS_DESC)
c366c25e
JJ
3042 bfd_put_32 (output_bfd, 0,
3043 htab->sgot->contents + off);
13ae64f3 3044 outrel.r_info = ELF32_R_INFO (indx, dr_type);
67a4f2b7
AO
3045
3046 loc = sreloc->contents;
3047 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
3048 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
3049 <= sreloc->contents + sreloc->size);
13ae64f3
JJ
3050 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3051
67a4f2b7 3052 if (GOT_TLS_GD_P (tls_type))
13ae64f3
JJ
3053 {
3054 if (indx == 0)
3055 {
82e51918 3056 BFD_ASSERT (! unresolved_reloc);
13ae64f3
JJ
3057 bfd_put_32 (output_bfd,
3058 relocation - dtpoff_base (info),
3059 htab->sgot->contents + off + 4);
3060 }
3061 else
3062 {
3063 bfd_put_32 (output_bfd, 0,
3064 htab->sgot->contents + off + 4);
3065 outrel.r_info = ELF32_R_INFO (indx,
3066 R_386_TLS_DTPOFF32);
3067 outrel.r_offset += 4;
67a4f2b7 3068 sreloc->reloc_count++;
947216bf 3069 loc += sizeof (Elf32_External_Rel);
67a4f2b7
AO
3070 BFD_ASSERT (loc + sizeof (Elf32_External_Rel)
3071 <= sreloc->contents + sreloc->size);
947216bf 3072 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
13ae64f3
JJ
3073 }
3074 }
37e55690
JJ
3075 else if (tls_type == GOT_TLS_IE_BOTH)
3076 {
3077 bfd_put_32 (output_bfd,
3078 indx == 0 ? relocation - dtpoff_base (info) : 0,
3079 htab->sgot->contents + off + 4);
3080 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
3081 outrel.r_offset += 4;
67a4f2b7 3082 sreloc->reloc_count++;
947216bf 3083 loc += sizeof (Elf32_External_Rel);
37e55690
JJ
3084 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3085 }
13ae64f3 3086
67a4f2b7 3087 dr_done:
13ae64f3
JJ
3088 if (h != NULL)
3089 h->got.offset |= 1;
3090 else
3091 local_got_offsets[r_symndx] |= 1;
3092 }
3093
67a4f2b7
AO
3094 if (off >= (bfd_vma) -2
3095 && ! GOT_TLS_GDESC_P (tls_type))
13ae64f3 3096 abort ();
67a4f2b7
AO
3097 if (r_type == R_386_TLS_GOTDESC
3098 || r_type == R_386_TLS_DESC_CALL)
3099 {
3100 relocation = htab->sgotplt_jump_table_size + offplt;
3101 unresolved_reloc = FALSE;
3102 }
3103 else if (r_type == ELF32_R_TYPE (rel->r_info))
13ae64f3 3104 {
8c37241b
JJ
3105 bfd_vma g_o_t = htab->sgotplt->output_section->vma
3106 + htab->sgotplt->output_offset;
3107 relocation = htab->sgot->output_section->vma
67a4f2b7 3108 + htab->sgot->output_offset + off - g_o_t;
37e55690
JJ
3109 if ((r_type == R_386_TLS_IE || r_type == R_386_TLS_GOTIE)
3110 && tls_type == GOT_TLS_IE_BOTH)
3111 relocation += 4;
3112 if (r_type == R_386_TLS_IE)
8c37241b 3113 relocation += g_o_t;
b34976b6 3114 unresolved_reloc = FALSE;
13ae64f3 3115 }
67a4f2b7 3116 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GD)
13ae64f3
JJ
3117 {
3118 unsigned int val, type;
3119 bfd_vma roff;
3120
3121 /* GD->IE transition. */
3122 BFD_ASSERT (rel->r_offset >= 2);
3123 type = bfd_get_8 (input_bfd, contents + rel->r_offset - 2);
3124 BFD_ASSERT (type == 0x8d || type == 0x04);
eea6121a 3125 BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
13ae64f3
JJ
3126 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
3127 == 0xe8);
3128 BFD_ASSERT (rel + 1 < relend);
3129 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
3130 roff = rel->r_offset - 3;
3131 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3132 if (type == 0x04)
3133 {
3134 /* leal foo(,%reg,1), %eax; call ___tls_get_addr
3135 Change it into:
3136 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
3137 BFD_ASSERT (rel->r_offset >= 3);
3138 BFD_ASSERT (bfd_get_8 (input_bfd,
3139 contents + rel->r_offset - 3)
3140 == 0x8d);
3141 BFD_ASSERT ((val & 0xc7) == 0x05 && val != (4 << 3));
3142 val >>= 3;
3143 }
3144 else
3145 {
3146 /* leal foo(%reg), %eax; call ___tls_get_addr; nop
3147 Change it into:
3148 movl %gs:0, %eax; subl $foo@gottpoff(%reg), %eax. */
eea6121a 3149 BFD_ASSERT (rel->r_offset + 10 <= input_section->size);
13ae64f3
JJ
3150 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
3151 BFD_ASSERT (bfd_get_8 (input_bfd,
3152 contents + rel->r_offset + 9)
3153 == 0x90);
3154 roff = rel->r_offset - 2;
3155 }
3156 memcpy (contents + roff,
3157 "\x65\xa1\0\0\0\0\x2b\x80\0\0\0", 12);
3158 contents[roff + 7] = 0x80 | (val & 7);
37e55690
JJ
3159 /* If foo is used only with foo@gotntpoff(%reg) and
3160 foo@indntpoff, but not with foo@gottpoff(%reg), change
3161 subl $foo@gottpoff(%reg), %eax
3162 into:
3163 addl $foo@gotntpoff(%reg), %eax. */
3164 if (r_type == R_386_TLS_GOTIE)
3165 {
3166 contents[roff + 6] = 0x03;
3167 if (tls_type == GOT_TLS_IE_BOTH)
3168 off += 4;
3169 }
8c37241b
JJ
3170 bfd_put_32 (output_bfd,
3171 htab->sgot->output_section->vma
3172 + htab->sgot->output_offset + off
3173 - htab->sgotplt->output_section->vma
3174 - htab->sgotplt->output_offset,
13ae64f3
JJ
3175 contents + roff + 8);
3176 /* Skip R_386_PLT32. */
3177 rel++;
3178 continue;
3179 }
67a4f2b7
AO
3180 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_GOTDESC)
3181 {
3182 /* GDesc -> IE transition.
3183 It's originally something like:
3184 leal x@tlsdesc(%ebx), %eax
3185
3186 Change it to:
3187 movl x@gotntpoff(%ebx), %eax # before nop; nop
3188 or:
3189 movl x@gottpoff(%ebx), %eax # before negl %eax
3190
3191 Registers other than %eax may be set up here. */
3192
3193 unsigned int val, type;
3194 bfd_vma roff;
3195
3196 /* First, make sure it's a leal adding ebx to a 32-bit
3197 offset into any register, although it's probably
3198 almost always going to be eax. */
3199 roff = rel->r_offset;
3200 BFD_ASSERT (roff >= 2);
3201 type = bfd_get_8 (input_bfd, contents + roff - 2);
3202 BFD_ASSERT (type == 0x8d);
3203 val = bfd_get_8 (input_bfd, contents + roff - 1);
3204 BFD_ASSERT ((val & 0xc7) == 0x83);
3205 BFD_ASSERT (roff + 4 <= input_section->size);
3206
3207 /* Now modify the instruction as appropriate. */
3208 /* To turn a leal into a movl in the form we use it, it
3209 suffices to change the first byte from 0x8d to 0x8b.
3210 aoliva FIXME: should we decide to keep the leal, all
3211 we have to do is remove the statement below, and
3212 adjust the relaxation of R_386_TLS_DESC_CALL. */
3213 bfd_put_8 (output_bfd, 0x8b, contents + roff - 2);
3214
3215 if (tls_type == GOT_TLS_IE_BOTH)
3216 off += 4;
3217
3218 bfd_put_32 (output_bfd,
3219 htab->sgot->output_section->vma
3220 + htab->sgot->output_offset + off
3221 - htab->sgotplt->output_section->vma
3222 - htab->sgotplt->output_offset,
3223 contents + roff);
3224 continue;
3225 }
3226 else if (ELF32_R_TYPE (rel->r_info) == R_386_TLS_DESC_CALL)
3227 {
3228 /* GDesc -> IE transition.
3229 It's originally:
3230 call *(%eax)
3231
3232 Change it to:
3233 nop; nop
3234 or
3235 negl %eax
3236 depending on how we transformed the TLS_GOTDESC above.
3237 */
3238
3239 unsigned int val, type;
3240 bfd_vma roff;
3241
3242 /* First, make sure it's a call *(%eax). */
3243 roff = rel->r_offset;
3244 BFD_ASSERT (roff + 2 <= input_section->size);
3245 type = bfd_get_8 (input_bfd, contents + roff);
3246 BFD_ASSERT (type == 0xff);
3247 val = bfd_get_8 (input_bfd, contents + roff + 1);
3248 BFD_ASSERT (val == 0x10);
3249
3250 /* Now modify the instruction as appropriate. */
3251 if (tls_type != GOT_TLS_IE_NEG)
3252 {
3253 /* nop; nop */
3254 bfd_put_8 (output_bfd, 0x90, contents + roff);
3255 bfd_put_8 (output_bfd, 0x90, contents + roff + 1);
3256 }
3257 else
3258 {
3259 /* negl %eax */
3260 bfd_put_8 (output_bfd, 0xf7, contents + roff);
3261 bfd_put_8 (output_bfd, 0xd8, contents + roff + 1);
3262 }
3263
3264 continue;
3265 }
3266 else
3267 BFD_ASSERT (FALSE);
13ae64f3
JJ
3268 break;
3269
3270 case R_386_TLS_LDM:
3271 if (! info->shared)
3272 {
3273 unsigned int val;
3274
3275 /* LD->LE transition:
3276 Ensure it is:
3277 leal foo(%reg), %eax; call ___tls_get_addr.
3278 We change it into:
3279 movl %gs:0, %eax; nop; leal 0(%esi,1), %esi. */
3280 BFD_ASSERT (rel->r_offset >= 2);
3281 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset - 2)
3282 == 0x8d);
3283 val = bfd_get_8 (input_bfd, contents + rel->r_offset - 1);
3284 BFD_ASSERT ((val & 0xf8) == 0x80 && (val & 7) != 4);
eea6121a 3285 BFD_ASSERT (rel->r_offset + 9 <= input_section->size);
13ae64f3
JJ
3286 BFD_ASSERT (bfd_get_8 (input_bfd, contents + rel->r_offset + 4)
3287 == 0xe8);
3288 BFD_ASSERT (rel + 1 < relend);
3289 BFD_ASSERT (ELF32_R_TYPE (rel[1].r_info) == R_386_PLT32);
3290 memcpy (contents + rel->r_offset - 2,
3291 "\x65\xa1\0\0\0\0\x90\x8d\x74\x26", 11);
3292 /* Skip R_386_PLT32. */
3293 rel++;
3294 continue;
3295 }
3296
3297 if (htab->sgot == NULL)
3298 abort ();
3299
3300 off = htab->tls_ldm_got.offset;
3301 if (off & 1)
3302 off &= ~1;
3303 else
3304 {
947216bf
AM
3305 Elf_Internal_Rela outrel;
3306 bfd_byte *loc;
13ae64f3
JJ
3307
3308 if (htab->srelgot == NULL)
3309 abort ();
3310
3311 outrel.r_offset = (htab->sgot->output_section->vma
3312 + htab->sgot->output_offset + off);
3313
3314 bfd_put_32 (output_bfd, 0,
3315 htab->sgot->contents + off);
3316 bfd_put_32 (output_bfd, 0,
3317 htab->sgot->contents + off + 4);
3318 outrel.r_info = ELF32_R_INFO (0, R_386_TLS_DTPMOD32);
947216bf
AM
3319 loc = htab->srelgot->contents;
3320 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
13ae64f3
JJ
3321 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3322 htab->tls_ldm_got.offset |= 1;
3323 }
8c37241b
JJ
3324 relocation = htab->sgot->output_section->vma
3325 + htab->sgot->output_offset + off
3326 - htab->sgotplt->output_section->vma
3327 - htab->sgotplt->output_offset;
b34976b6 3328 unresolved_reloc = FALSE;
13ae64f3
JJ
3329 break;
3330
3331 case R_386_TLS_LDO_32:
a45bb67d 3332 if (info->shared || (input_section->flags & SEC_CODE) == 0)
13ae64f3
JJ
3333 relocation -= dtpoff_base (info);
3334 else
3335 /* When converting LDO to LE, we must negate. */
3336 relocation = -tpoff (info, relocation);
3337 break;
3338
3339 case R_386_TLS_LE_32:
13ae64f3 3340 case R_386_TLS_LE:
37e55690
JJ
3341 if (info->shared)
3342 {
947216bf 3343 Elf_Internal_Rela outrel;
37e55690 3344 asection *sreloc;
947216bf 3345 bfd_byte *loc;
37e55690
JJ
3346 int indx;
3347
3348 outrel.r_offset = rel->r_offset
3349 + input_section->output_section->vma
3350 + input_section->output_offset;
3351 if (h != NULL && h->dynindx != -1)
3352 indx = h->dynindx;
3353 else
3354 indx = 0;
3355 if (r_type == R_386_TLS_LE_32)
3356 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF32);
3357 else
3358 outrel.r_info = ELF32_R_INFO (indx, R_386_TLS_TPOFF);
3359 sreloc = elf_section_data (input_section)->sreloc;
3360 if (sreloc == NULL)
3361 abort ();
947216bf
AM
3362 loc = sreloc->contents;
3363 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rel);
37e55690
JJ
3364 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
3365 if (indx)
3366 continue;
3367 else if (r_type == R_386_TLS_LE_32)
3368 relocation = dtpoff_base (info) - relocation;
3369 else
3370 relocation -= dtpoff_base (info);
3371 }
3372 else if (r_type == R_386_TLS_LE_32)
3373 relocation = tpoff (info, relocation);
3374 else
3375 relocation = -tpoff (info, relocation);
13ae64f3
JJ
3376 break;
3377
252b5132
RH
3378 default:
3379 break;
3380 }
3381
239e1f3a
AM
3382 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3383 because such sections are not SEC_ALLOC and thus ld.so will
3384 not process them. */
8c694914 3385 if (unresolved_reloc
239e1f3a 3386 && !((input_section->flags & SEC_DEBUGGING) != 0
f5385ebf 3387 && h->def_dynamic))
6a30718d
JJ
3388 {
3389 (*_bfd_error_handler)
843fe662 3390 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
d003868e
AM
3391 input_bfd,
3392 input_section,
6a30718d 3393 (long) rel->r_offset,
843fe662 3394 howto->name,
6a30718d 3395 h->root.root.string);
b34976b6 3396 return FALSE;
6a30718d 3397 }
83be169b 3398
252b5132
RH
3399 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3400 contents, rel->r_offset,
55fd94b0 3401 relocation, 0);
252b5132 3402
cf5c0c5b 3403 if (r != bfd_reloc_ok)
252b5132 3404 {
cf5c0c5b 3405 const char *name;
ffb2e45b 3406
cf5c0c5b
AM
3407 if (h != NULL)
3408 name = h->root.root.string;
3409 else
3410 {
3411 name = bfd_elf_string_from_elf_section (input_bfd,
3412 symtab_hdr->sh_link,
3413 sym->st_name);
3414 if (name == NULL)
b34976b6 3415 return FALSE;
cf5c0c5b
AM
3416 if (*name == '\0')
3417 name = bfd_section_name (input_bfd, sec);
3418 }
ffb2e45b 3419
cf5c0c5b
AM
3420 if (r == bfd_reloc_overflow)
3421 {
cf5c0c5b 3422 if (! ((*info->callbacks->reloc_overflow)
dfeffb9f
L
3423 (info, (h ? &h->root : NULL), name, howto->name,
3424 (bfd_vma) 0, input_bfd, input_section,
3425 rel->r_offset)))
b34976b6 3426 return FALSE;
cf5c0c5b
AM
3427 }
3428 else
3429 {
3430 (*_bfd_error_handler)
d003868e
AM
3431 (_("%B(%A+0x%lx): reloc against `%s': error %d"),
3432 input_bfd, input_section,
cf5c0c5b 3433 (long) rel->r_offset, name, (int) r);
b34976b6 3434 return FALSE;
cf5c0c5b 3435 }
252b5132
RH
3436 }
3437 }
3438
b34976b6 3439 return TRUE;
252b5132
RH
3440}
3441
3442/* Finish up dynamic symbol handling. We set the contents of various
3443 dynamic sections here. */
3444
b34976b6 3445static bfd_boolean
55fd94b0
AM
3446elf_i386_finish_dynamic_symbol (bfd *output_bfd,
3447 struct bfd_link_info *info,
3448 struct elf_link_hash_entry *h,
3449 Elf_Internal_Sym *sym)
252b5132 3450{
6725bdbf 3451 struct elf_i386_link_hash_table *htab;
252b5132 3452
6725bdbf 3453 htab = elf_i386_hash_table (info);
252b5132
RH
3454
3455 if (h->plt.offset != (bfd_vma) -1)
3456 {
252b5132
RH
3457 bfd_vma plt_index;
3458 bfd_vma got_offset;
947216bf
AM
3459 Elf_Internal_Rela rel;
3460 bfd_byte *loc;
252b5132
RH
3461
3462 /* This symbol has an entry in the procedure linkage table. Set
3463 it up. */
3464
ffb2e45b
AM
3465 if (h->dynindx == -1
3466 || htab->splt == NULL
3467 || htab->sgotplt == NULL
3468 || htab->srelplt == NULL)
3469 abort ();
252b5132
RH
3470
3471 /* Get the index in the procedure linkage table which
3472 corresponds to this symbol. This is the index of this symbol
3473 in all the symbols for which we are making plt entries. The
3474 first entry in the procedure linkage table is reserved. */
3475 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
3476
3477 /* Get the offset into the .got table of the entry that
3478 corresponds to this function. Each .got entry is 4 bytes.
3479 The first three are reserved. */
3480 got_offset = (plt_index + 3) * 4;
3481
3482 /* Fill in the entry in the procedure linkage table. */
3483 if (! info->shared)
3484 {
6725bdbf 3485 memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
252b5132
RH
3486 PLT_ENTRY_SIZE);
3487 bfd_put_32 (output_bfd,
6725bdbf
AM
3488 (htab->sgotplt->output_section->vma
3489 + htab->sgotplt->output_offset
252b5132 3490 + got_offset),
6725bdbf 3491 htab->splt->contents + h->plt.offset + 2);
eac338cf
PB
3492
3493 if (htab->is_vxworks)
3494 {
3495 int s, k, reloc_index;
3496
3497 /* Create the R_386_32 relocation referencing the GOT
3498 for this PLT entry. */
3499
3500 /* S: Current slot number (zero-based). */
3501 s = (h->plt.offset - PLT_ENTRY_SIZE) / PLT_ENTRY_SIZE;
3502 /* K: Number of relocations for PLTResolve. */
3503 if (info->shared)
3504 k = PLTRESOLVE_RELOCS_SHLIB;
3505 else
3506 k = PLTRESOLVE_RELOCS;
3507 /* Skip the PLTresolve relocations, and the relocations for
3508 the other PLT slots. */
3509 reloc_index = k + s * PLT_NON_JUMP_SLOT_RELOCS;
3510 loc = (htab->srelplt2->contents + reloc_index
3511 * sizeof (Elf32_External_Rel));
3512
3513 rel.r_offset = (htab->splt->output_section->vma
3514 + htab->splt->output_offset
3515 + h->plt.offset + 2),
7325306f 3516 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
eac338cf
PB
3517 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
3518
3519 /* Create the R_386_32 relocation referencing the beginning of
3520 the PLT for this GOT entry. */
3521 rel.r_offset = (htab->sgotplt->output_section->vma
3522 + htab->sgotplt->output_offset
3523 + got_offset);
7325306f 3524 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
eac338cf
PB
3525 bfd_elf32_swap_reloc_out (output_bfd, &rel,
3526 loc + sizeof (Elf32_External_Rel));
3527 }
252b5132
RH
3528 }
3529 else
3530 {
6725bdbf 3531 memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
252b5132
RH
3532 PLT_ENTRY_SIZE);
3533 bfd_put_32 (output_bfd, got_offset,
6725bdbf 3534 htab->splt->contents + h->plt.offset + 2);
252b5132
RH
3535 }
3536
3537 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
6725bdbf 3538 htab->splt->contents + h->plt.offset + 7);
252b5132 3539 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
6725bdbf 3540 htab->splt->contents + h->plt.offset + 12);
252b5132
RH
3541
3542 /* Fill in the entry in the global offset table. */
3543 bfd_put_32 (output_bfd,
6725bdbf
AM
3544 (htab->splt->output_section->vma
3545 + htab->splt->output_offset
252b5132
RH
3546 + h->plt.offset
3547 + 6),
6725bdbf 3548 htab->sgotplt->contents + got_offset);
252b5132
RH
3549
3550 /* Fill in the entry in the .rel.plt section. */
6725bdbf
AM
3551 rel.r_offset = (htab->sgotplt->output_section->vma
3552 + htab->sgotplt->output_offset
252b5132
RH
3553 + got_offset);
3554 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
947216bf 3555 loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rel);
0ac8d2ca 3556 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
252b5132 3557
f5385ebf 3558 if (!h->def_regular)
252b5132
RH
3559 {
3560 /* Mark the symbol as undefined, rather than as defined in
c6585bbb
JJ
3561 the .plt section. Leave the value if there were any
3562 relocations where pointer equality matters (this is a clue
51b64d56
AM
3563 for the dynamic linker, to make function pointer
3564 comparisons work between an application and shared
c6585bbb
JJ
3565 library), otherwise set it to zero. If a function is only
3566 called from a binary, there is no need to slow down
3567 shared libraries because of that. */
252b5132 3568 sym->st_shndx = SHN_UNDEF;
f5385ebf 3569 if (!h->pointer_equality_needed)
c6585bbb 3570 sym->st_value = 0;
252b5132
RH
3571 }
3572 }
3573
13ae64f3 3574 if (h->got.offset != (bfd_vma) -1
67a4f2b7 3575 && ! GOT_TLS_GD_ANY_P (elf_i386_hash_entry(h)->tls_type)
37e55690 3576 && (elf_i386_hash_entry(h)->tls_type & GOT_TLS_IE) == 0)
252b5132 3577 {
947216bf
AM
3578 Elf_Internal_Rela rel;
3579 bfd_byte *loc;
252b5132
RH
3580
3581 /* This symbol has an entry in the global offset table. Set it
3582 up. */
3583
ffb2e45b
AM
3584 if (htab->sgot == NULL || htab->srelgot == NULL)
3585 abort ();
252b5132 3586
6725bdbf
AM
3587 rel.r_offset = (htab->sgot->output_section->vma
3588 + htab->sgot->output_offset
dc810e39 3589 + (h->got.offset & ~(bfd_vma) 1));
252b5132 3590
dd5724d5
AM
3591 /* If this is a static link, or it is a -Bsymbolic link and the
3592 symbol is defined locally or was forced to be local because
3593 of a version file, we just want to emit a RELATIVE reloc.
252b5132
RH
3594 The entry in the global offset table will already have been
3595 initialized in the relocate_section function. */
6725bdbf 3596 if (info->shared
586119b3 3597 && SYMBOL_REFERENCES_LOCAL (info, h))
dd5724d5 3598 {
6725bdbf 3599 BFD_ASSERT((h->got.offset & 1) != 0);
dd5724d5
AM
3600 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
3601 }
252b5132
RH
3602 else
3603 {
dd5724d5 3604 BFD_ASSERT((h->got.offset & 1) == 0);
6725bdbf
AM
3605 bfd_put_32 (output_bfd, (bfd_vma) 0,
3606 htab->sgot->contents + h->got.offset);
252b5132
RH
3607 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
3608 }
3609
947216bf
AM
3610 loc = htab->srelgot->contents;
3611 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rel);
0ac8d2ca 3612 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
252b5132
RH
3613 }
3614
f5385ebf 3615 if (h->needs_copy)
252b5132 3616 {
947216bf
AM
3617 Elf_Internal_Rela rel;
3618 bfd_byte *loc;
252b5132
RH
3619
3620 /* This symbol needs a copy reloc. Set it up. */
3621
ffb2e45b
AM
3622 if (h->dynindx == -1
3623 || (h->root.type != bfd_link_hash_defined
3624 && h->root.type != bfd_link_hash_defweak)
3625 || htab->srelbss == NULL)
3626 abort ();
252b5132
RH
3627
3628 rel.r_offset = (h->root.u.def.value
3629 + h->root.u.def.section->output_section->vma
3630 + h->root.u.def.section->output_offset);
3631 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
947216bf
AM
3632 loc = htab->srelbss->contents;
3633 loc += htab->srelbss->reloc_count++ * sizeof (Elf32_External_Rel);
0ac8d2ca 3634 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
252b5132
RH
3635 }
3636
eac338cf
PB
3637 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.
3638 On VxWorks, the _GLOBAL_OFFSET_TABLE_ symbol is not absolute: it
3639 is relative to the ".got" section. */
252b5132 3640 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
eac338cf
PB
3641 || (strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3642 && !htab->is_vxworks))
252b5132
RH
3643 sym->st_shndx = SHN_ABS;
3644
b34976b6 3645 return TRUE;
252b5132
RH
3646}
3647
38701953
AM
3648/* Used to decide how to sort relocs in an optimal manner for the
3649 dynamic linker, before writing them out. */
3650
3651static enum elf_reloc_type_class
55fd94b0 3652elf_i386_reloc_type_class (const Elf_Internal_Rela *rela)
38701953 3653{
55fd94b0 3654 switch (ELF32_R_TYPE (rela->r_info))
38701953
AM
3655 {
3656 case R_386_RELATIVE:
3657 return reloc_class_relative;
3658 case R_386_JUMP_SLOT:
3659 return reloc_class_plt;
3660 case R_386_COPY:
3661 return reloc_class_copy;
3662 default:
3663 return reloc_class_normal;
3664 }
3665}
3666
252b5132
RH
3667/* Finish up the dynamic sections. */
3668
b34976b6 3669static bfd_boolean
55fd94b0
AM
3670elf_i386_finish_dynamic_sections (bfd *output_bfd,
3671 struct bfd_link_info *info)
252b5132 3672{
6725bdbf 3673 struct elf_i386_link_hash_table *htab;
252b5132 3674 bfd *dynobj;
252b5132
RH
3675 asection *sdyn;
3676
6725bdbf 3677 htab = elf_i386_hash_table (info);
ebe50bae 3678 dynobj = htab->elf.dynobj;
252b5132
RH
3679 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3680
ebe50bae 3681 if (htab->elf.dynamic_sections_created)
252b5132 3682 {
252b5132
RH
3683 Elf32_External_Dyn *dyncon, *dynconend;
3684
ffb2e45b
AM
3685 if (sdyn == NULL || htab->sgot == NULL)
3686 abort ();
252b5132
RH
3687
3688 dyncon = (Elf32_External_Dyn *) sdyn->contents;
eea6121a 3689 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
252b5132
RH
3690 for (; dyncon < dynconend; dyncon++)
3691 {
3692 Elf_Internal_Dyn dyn;
51b64d56 3693 asection *s;
252b5132
RH
3694
3695 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3696
3697 switch (dyn.d_tag)
3698 {
3699 default:
0ac8d2ca 3700 continue;
252b5132
RH
3701
3702 case DT_PLTGOT:
8c37241b
JJ
3703 s = htab->sgotplt;
3704 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6725bdbf
AM
3705 break;
3706
252b5132 3707 case DT_JMPREL:
6348e046
AM
3708 s = htab->srelplt;
3709 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
252b5132
RH
3710 break;
3711
3712 case DT_PLTRELSZ:
6348e046 3713 s = htab->srelplt;
eea6121a 3714 dyn.d_un.d_val = s->size;
252b5132
RH
3715 break;
3716
3717 case DT_RELSZ:
3718 /* My reading of the SVR4 ABI indicates that the
3719 procedure linkage table relocs (DT_JMPREL) should be
3720 included in the overall relocs (DT_REL). This is
3721 what Solaris does. However, UnixWare can not handle
3722 that case. Therefore, we override the DT_RELSZ entry
6348e046
AM
3723 here to make it not include the JMPREL relocs. */
3724 s = htab->srelplt;
3725 if (s == NULL)
3726 continue;
eea6121a 3727 dyn.d_un.d_val -= s->size;
6348e046
AM
3728 break;
3729
3730 case DT_REL:
3731 /* We may not be using the standard ELF linker script.
3732 If .rel.plt is the first .rel section, we adjust
3733 DT_REL to not include it. */
3734 s = htab->srelplt;
3735 if (s == NULL)
3736 continue;
3737 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
3738 continue;
eea6121a 3739 dyn.d_un.d_ptr += s->size;
252b5132
RH
3740 break;
3741 }
0ac8d2ca
AM
3742
3743 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
252b5132
RH
3744 }
3745
3746 /* Fill in the first entry in the procedure linkage table. */
eea6121a 3747 if (htab->splt && htab->splt->size > 0)
252b5132
RH
3748 {
3749 if (info->shared)
eac338cf
PB
3750 {
3751 memcpy (htab->splt->contents, elf_i386_pic_plt0_entry,
3752 sizeof (elf_i386_pic_plt0_entry));
3753 memset (htab->splt->contents + sizeof (elf_i386_pic_plt0_entry),
3754 htab->plt0_pad_byte,
3755 PLT_ENTRY_SIZE - sizeof (elf_i386_pic_plt0_entry));
3756 }
252b5132
RH
3757 else
3758 {
eac338cf
PB
3759 memcpy (htab->splt->contents, elf_i386_plt0_entry,
3760 sizeof(elf_i386_plt0_entry));
3761 memset (htab->splt->contents + sizeof (elf_i386_plt0_entry),
3762 htab->plt0_pad_byte,
3763 PLT_ENTRY_SIZE - sizeof (elf_i386_plt0_entry));
252b5132 3764 bfd_put_32 (output_bfd,
6725bdbf
AM
3765 (htab->sgotplt->output_section->vma
3766 + htab->sgotplt->output_offset
3767 + 4),
3768 htab->splt->contents + 2);
252b5132 3769 bfd_put_32 (output_bfd,
6725bdbf
AM
3770 (htab->sgotplt->output_section->vma
3771 + htab->sgotplt->output_offset
3772 + 8),
3773 htab->splt->contents + 8);
eac338cf
PB
3774
3775 if (htab->is_vxworks)
3776 {
3777 Elf_Internal_Rela rel;
7325306f 3778
eac338cf
PB
3779 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 4.
3780 On IA32 we use REL relocations so the addend goes in
3781 the PLT directly. */
3782 rel.r_offset = (htab->splt->output_section->vma
3783 + htab->splt->output_offset
3784 + 2);
7325306f 3785 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
eac338cf
PB
3786 bfd_elf32_swap_reloc_out (output_bfd, &rel,
3787 htab->srelplt2->contents);
3788 /* Generate a relocation for _GLOBAL_OFFSET_TABLE_ + 8. */
3789 rel.r_offset = (htab->splt->output_section->vma
3790 + htab->splt->output_offset
3791 + 8);
7325306f 3792 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
eac338cf
PB
3793 bfd_elf32_swap_reloc_out (output_bfd, &rel,
3794 htab->srelplt2->contents +
3795 sizeof (Elf32_External_Rel));
3796 }
252b5132
RH
3797 }
3798
3799 /* UnixWare sets the entsize of .plt to 4, although that doesn't
3800 really seem like the right value. */
6725bdbf
AM
3801 elf_section_data (htab->splt->output_section)
3802 ->this_hdr.sh_entsize = 4;
eac338cf
PB
3803
3804 /* Correct the .rel.plt.unloaded relocations. */
3805 if (htab->is_vxworks && !info->shared)
3806 {
3807 int num_plts = (htab->splt->size / PLT_ENTRY_SIZE) - 1;
4c9b0de6 3808 unsigned char *p;
eac338cf
PB
3809
3810 p = htab->srelplt2->contents;
3811 if (info->shared)
3812 p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
3813 else
3814 p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
3815
3816 for (; num_plts; num_plts--)
3817 {
3818 Elf_Internal_Rela rel;
3819 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
7325306f 3820 rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_386_32);
eac338cf
PB
3821 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
3822 p += sizeof (Elf32_External_Rel);
3823
3824 bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
7325306f 3825 rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_386_32);
eac338cf
PB
3826 bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
3827 p += sizeof (Elf32_External_Rel);
3828 }
3829 }
252b5132
RH
3830 }
3831 }
3832
12d0ee4a 3833 if (htab->sgotplt)
252b5132 3834 {
12d0ee4a 3835 /* Fill in the first three entries in the global offset table. */
eea6121a 3836 if (htab->sgotplt->size > 0)
12d0ee4a
AM
3837 {
3838 bfd_put_32 (output_bfd,
55fd94b0 3839 (sdyn == NULL ? 0
12d0ee4a
AM
3840 : sdyn->output_section->vma + sdyn->output_offset),
3841 htab->sgotplt->contents);
55fd94b0
AM
3842 bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 4);
3843 bfd_put_32 (output_bfd, 0, htab->sgotplt->contents + 8);
12d0ee4a 3844 }
252b5132 3845
12d0ee4a
AM
3846 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
3847 }
8c37241b 3848
eea6121a 3849 if (htab->sgot && htab->sgot->size > 0)
8c37241b
JJ
3850 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 4;
3851
b34976b6 3852 return TRUE;
252b5132
RH
3853}
3854
4c45e5c9
JJ
3855/* Return address for Ith PLT stub in section PLT, for relocation REL
3856 or (bfd_vma) -1 if it should not be included. */
3857
3858static bfd_vma
3859elf_i386_plt_sym_val (bfd_vma i, const asection *plt,
3860 const arelent *rel ATTRIBUTE_UNUSED)
3861{
3862 return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
3863}
3864
3865
252b5132
RH
3866#define TARGET_LITTLE_SYM bfd_elf32_i386_vec
3867#define TARGET_LITTLE_NAME "elf32-i386"
3868#define ELF_ARCH bfd_arch_i386
3869#define ELF_MACHINE_CODE EM_386
3870#define ELF_MAXPAGESIZE 0x1000
252b5132
RH
3871
3872#define elf_backend_can_gc_sections 1
51b64d56 3873#define elf_backend_can_refcount 1
252b5132
RH
3874#define elf_backend_want_got_plt 1
3875#define elf_backend_plt_readonly 1
3876#define elf_backend_want_plt_sym 0
3877#define elf_backend_got_header_size 12
252b5132 3878
8c29f035
AM
3879/* Support RELA for objdump of prelink objects. */
3880#define elf_info_to_howto elf_i386_info_to_howto_rel
dd5724d5
AM
3881#define elf_info_to_howto_rel elf_i386_info_to_howto_rel
3882
13ae64f3 3883#define bfd_elf32_mkobject elf_i386_mkobject
13ae64f3 3884
dd5724d5
AM
3885#define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
3886#define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
3887#define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
3888
3889#define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
3890#define elf_backend_check_relocs elf_i386_check_relocs
0ac8d2ca 3891#define elf_backend_copy_indirect_symbol elf_i386_copy_indirect_symbol
6725bdbf 3892#define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
0ac8d2ca 3893#define elf_backend_fake_sections elf_i386_fake_sections
dd5724d5
AM
3894#define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
3895#define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
3896#define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
3897#define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
c5fccbec
DJ
3898#define elf_backend_grok_prstatus elf_i386_grok_prstatus
3899#define elf_backend_grok_psinfo elf_i386_grok_psinfo
db6751f2 3900#define elf_backend_reloc_type_class elf_i386_reloc_type_class
0ac8d2ca
AM
3901#define elf_backend_relocate_section elf_i386_relocate_section
3902#define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
67a4f2b7 3903#define elf_backend_always_size_sections elf_i386_always_size_sections
4c45e5c9 3904#define elf_backend_plt_sym_val elf_i386_plt_sym_val
dd5724d5 3905
252b5132 3906#include "elf32-target.h"
2bc3c89a
AM
3907
3908/* FreeBSD support. */
3909
3910#undef TARGET_LITTLE_SYM
3911#define TARGET_LITTLE_SYM bfd_elf32_i386_freebsd_vec
3912#undef TARGET_LITTLE_NAME
3913#define TARGET_LITTLE_NAME "elf32-i386-freebsd"
3914
3915/* The kernel recognizes executables as valid only if they carry a
3916 "FreeBSD" label in the ELF header. So we put this label on all
3917 executables and (for simplicity) also all other object files. */
3918
2bc3c89a 3919static void
55fd94b0
AM
3920elf_i386_post_process_headers (bfd *abfd,
3921 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2bc3c89a
AM
3922{
3923 Elf_Internal_Ehdr *i_ehdrp;
3924
3925 i_ehdrp = elf_elfheader (abfd);
3926
3927 /* Put an ABI label supported by FreeBSD >= 4.1. */
3928 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
3929#ifdef OLD_FREEBSD_ABI_LABEL
3930 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */
3931 memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
caf47ea6 3932#endif
2bc3c89a
AM
3933}
3934
3935#undef elf_backend_post_process_headers
571fe01f
NC
3936#define elf_backend_post_process_headers elf_i386_post_process_headers
3937#undef elf32_bed
3938#define elf32_bed elf32_i386_fbsd_bed
2bc3c89a
AM
3939
3940#include "elf32-target.h"
eac338cf
PB
3941
3942/* VxWorks support. */
3943
3944#undef TARGET_LITTLE_SYM
3945#define TARGET_LITTLE_SYM bfd_elf32_i386_vxworks_vec
3946#undef TARGET_LITTLE_NAME
3947#define TARGET_LITTLE_NAME "elf32-i386-vxworks"
3948
3949
3950/* Like elf_i386_link_hash_table_create but with tweaks for VxWorks. */
3951
3952static struct bfd_link_hash_table *
3953elf_i386_vxworks_link_hash_table_create (bfd *abfd)
3954{
3955 struct bfd_link_hash_table *ret;
3956 struct elf_i386_link_hash_table *htab;
3957
3958 ret = elf_i386_link_hash_table_create (abfd);
3959 if (ret)
3960 {
3961 htab = (struct elf_i386_link_hash_table *) ret;
3962 htab->is_vxworks = 1;
3963 htab->plt0_pad_byte = 0x90;
3964 }
3965
3966 return ret;
3967}
3968
3969
3970/* Tweak magic VxWorks symbols as they are written to the output file. */
3971static bfd_boolean
3972elf_i386_vxworks_link_output_symbol_hook (struct bfd_link_info *info
3973 ATTRIBUTE_UNUSED,
3974 const char *name,
3975 Elf_Internal_Sym *sym,
3976 asection *input_sec ATTRIBUTE_UNUSED,
3977 struct elf_link_hash_entry *h
3978 ATTRIBUTE_UNUSED)
3979{
3980 /* Ignore the first dummy symbol. */
3981 if (!name)
3982 return TRUE;
3983
3984 return elf_vxworks_link_output_symbol_hook (name, sym);
3985}
3986
3987#undef elf_backend_post_process_headers
3988#undef bfd_elf32_bfd_link_hash_table_create
3989#define bfd_elf32_bfd_link_hash_table_create \
3990 elf_i386_vxworks_link_hash_table_create
3991#undef elf_backend_add_symbol_hook
3992#define elf_backend_add_symbol_hook \
3993 elf_vxworks_add_symbol_hook
3994#undef elf_backend_link_output_symbol_hook
3995#define elf_backend_link_output_symbol_hook \
3996 elf_i386_vxworks_link_output_symbol_hook
3997#undef elf_backend_emit_relocs
3998#define elf_backend_emit_relocs elf_vxworks_emit_relocs
3999#undef elf_backend_final_write_processing
4000#define elf_backend_final_write_processing \
4001 elf_vxworks_final_write_processing
4002
4003/* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
4004 define it. */
4005#undef elf_backend_want_plt_sym
4006#define elf_backend_want_plt_sym 1
4007
4008#undef elf32_bed
4009#define elf32_bed elf32_i386_vxworks_bed
4010
4011#include "elf32-target.h"
This page took 0.562896 seconds and 4 git commands to generate.