* config/tc-mn10300.c (tc_gen_reloc): Don't emit an *ABS*
[deliverable/binutils-gdb.git] / bfd / elf32-i386.c
CommitLineData
252b5132 1/* Intel 80386/80486-specific support for 32-bit ELF
7898deda 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
638632bd 3 Free Software Foundation, Inc.
252b5132
RH
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#include "bfd.h"
22#include "sysdep.h"
23#include "bfdlink.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
26
27static reloc_howto_type *elf_i386_reloc_type_lookup
28 PARAMS ((bfd *, bfd_reloc_code_real_type));
29static void elf_i386_info_to_howto
30 PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
31static void elf_i386_info_to_howto_rel
32 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
33static boolean elf_i386_is_local_label_name PARAMS ((bfd *, const char *));
34static struct bfd_hash_entry *elf_i386_link_hash_newfunc
35 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
36static struct bfd_link_hash_table *elf_i386_link_hash_table_create
37 PARAMS ((bfd *));
6725bdbf
AM
38static boolean create_got_section PARAMS((bfd *, struct bfd_link_info *));
39static boolean elf_i386_create_dynamic_sections
40 PARAMS((bfd *, struct bfd_link_info *));
252b5132
RH
41static boolean elf_i386_check_relocs
42 PARAMS ((bfd *, struct bfd_link_info *, asection *,
43 const Elf_Internal_Rela *));
a7b97311
AM
44static asection *elf_i386_gc_mark_hook
45 PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *,
46 struct elf_link_hash_entry *, Elf_Internal_Sym *));
47static boolean elf_i386_gc_sweep_hook
48 PARAMS ((bfd *, struct bfd_link_info *, asection *,
49 const Elf_Internal_Rela *));
252b5132
RH
50static boolean elf_i386_adjust_dynamic_symbol
51 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
0c715baa
AM
52static boolean allocate_dynrelocs
53 PARAMS ((struct elf_link_hash_entry *, PTR));
54static boolean readonly_dynrelocs
6725bdbf 55 PARAMS ((struct elf_link_hash_entry *, PTR));
252b5132
RH
56static boolean elf_i386_size_dynamic_sections
57 PARAMS ((bfd *, struct bfd_link_info *));
58static boolean elf_i386_relocate_section
59 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
60 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
61static boolean elf_i386_finish_dynamic_symbol
62 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
63 Elf_Internal_Sym *));
64static boolean elf_i386_finish_dynamic_sections
65 PARAMS ((bfd *, struct bfd_link_info *));
a7b97311
AM
66static boolean elf_i386_fake_sections
67 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
f51e552e
AM
68static enum elf_reloc_type_class elf_i386_reloc_type_class
69 PARAMS ((const Elf_Internal_Rela *));
2e67030c
DJ
70static boolean elf_i386_grok_prstatus
71 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
72static boolean elf_i386_grok_psinfo
73 PARAMS ((bfd *abfd, Elf_Internal_Note *note));
252b5132
RH
74
75#define USE_REL 1 /* 386 uses REL relocations instead of RELA */
76
77#include "elf/i386.h"
78
79static reloc_howto_type elf_howto_table[]=
80{
1b452ec6
AM
81 HOWTO(R_386_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield,
82 bfd_elf_generic_reloc, "R_386_NONE",
83 true, 0x00000000, 0x00000000, false),
84 HOWTO(R_386_32, 0, 2, 32, false, 0, complain_overflow_bitfield,
85 bfd_elf_generic_reloc, "R_386_32",
86 true, 0xffffffff, 0xffffffff, false),
87 HOWTO(R_386_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield,
88 bfd_elf_generic_reloc, "R_386_PC32",
89 true, 0xffffffff, 0xffffffff, true),
90 HOWTO(R_386_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield,
91 bfd_elf_generic_reloc, "R_386_GOT32",
92 true, 0xffffffff, 0xffffffff, false),
93 HOWTO(R_386_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield,
94 bfd_elf_generic_reloc, "R_386_PLT32",
95 true, 0xffffffff, 0xffffffff, true),
96 HOWTO(R_386_COPY, 0, 2, 32, false, 0, complain_overflow_bitfield,
97 bfd_elf_generic_reloc, "R_386_COPY",
98 true, 0xffffffff, 0xffffffff, false),
99 HOWTO(R_386_GLOB_DAT, 0, 2, 32, false, 0, complain_overflow_bitfield,
100 bfd_elf_generic_reloc, "R_386_GLOB_DAT",
101 true, 0xffffffff, 0xffffffff, false),
102 HOWTO(R_386_JUMP_SLOT, 0, 2, 32, false, 0, complain_overflow_bitfield,
103 bfd_elf_generic_reloc, "R_386_JUMP_SLOT",
104 true, 0xffffffff, 0xffffffff, false),
105 HOWTO(R_386_RELATIVE, 0, 2, 32, false, 0, complain_overflow_bitfield,
106 bfd_elf_generic_reloc, "R_386_RELATIVE",
107 true, 0xffffffff, 0xffffffff, false),
108 HOWTO(R_386_GOTOFF, 0, 2, 32, false, 0, complain_overflow_bitfield,
109 bfd_elf_generic_reloc, "R_386_GOTOFF",
110 true, 0xffffffff, 0xffffffff, false),
111 HOWTO(R_386_GOTPC, 0, 2, 32, true, 0, complain_overflow_bitfield,
112 bfd_elf_generic_reloc, "R_386_GOTPC",
113 true, 0xffffffff, 0xffffffff, true),
114
dc47f327
AM
115 /* We have a gap in the reloc numbers here.
116 R_386_standard counts the number up to this point, and
117 R_386_ext_offset is the value to subtract from a reloc type of
118 R_386_16 thru R_386_PC8 to form an index into this table. */
1b452ec6
AM
119#define R_386_standard ((unsigned int) R_386_GOTPC + 1)
120#define R_386_ext_offset ((unsigned int) R_386_16 - R_386_standard)
121
252b5132 122 /* The remaining relocs are a GNU extension. */
1b452ec6
AM
123 HOWTO(R_386_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
124 bfd_elf_generic_reloc, "R_386_16",
125 true, 0xffff, 0xffff, false),
126 HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield,
127 bfd_elf_generic_reloc, "R_386_PC16",
128 true, 0xffff, 0xffff, true),
129 HOWTO(R_386_8, 0, 0, 8, false, 0, complain_overflow_bitfield,
130 bfd_elf_generic_reloc, "R_386_8",
131 true, 0xff, 0xff, false),
132 HOWTO(R_386_PC8, 0, 0, 8, true, 0, complain_overflow_signed,
133 bfd_elf_generic_reloc, "R_386_PC8",
dc47f327
AM
134 true, 0xff, 0xff, true),
135
136 /* Another gap. */
137#define R_386_ext ((unsigned int) R_386_PC8 + 1 - R_386_ext_offset)
138#define R_386_vt_offset ((unsigned int) R_386_GNU_VTINHERIT - R_386_ext)
252b5132
RH
139
140/* GNU extension to record C++ vtable hierarchy. */
252b5132
RH
141 HOWTO (R_386_GNU_VTINHERIT, /* type */
142 0, /* rightshift */
143 2, /* size (0 = byte, 1 = short, 2 = long) */
144 0, /* bitsize */
145 false, /* pc_relative */
146 0, /* bitpos */
147 complain_overflow_dont, /* complain_on_overflow */
148 NULL, /* special_function */
149 "R_386_GNU_VTINHERIT", /* name */
150 false, /* partial_inplace */
151 0, /* src_mask */
152 0, /* dst_mask */
dc47f327 153 false),
252b5132
RH
154
155/* GNU extension to record C++ vtable member usage. */
252b5132
RH
156 HOWTO (R_386_GNU_VTENTRY, /* type */
157 0, /* rightshift */
158 2, /* size (0 = byte, 1 = short, 2 = long) */
159 0, /* bitsize */
160 false, /* pc_relative */
161 0, /* bitpos */
162 complain_overflow_dont, /* complain_on_overflow */
163 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
164 "R_386_GNU_VTENTRY", /* name */
165 false, /* partial_inplace */
166 0, /* src_mask */
167 0, /* dst_mask */
dc47f327
AM
168 false)
169
170#define R_386_vt ((unsigned int) R_386_GNU_VTENTRY + 1 - R_386_vt_offset)
171
172};
173
252b5132
RH
174#ifdef DEBUG_GEN_RELOC
175#define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
176#else
177#define TRACE(str)
178#endif
179
180static reloc_howto_type *
181elf_i386_reloc_type_lookup (abfd, code)
7442e600 182 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
183 bfd_reloc_code_real_type code;
184{
185 switch (code)
186 {
187 case BFD_RELOC_NONE:
188 TRACE ("BFD_RELOC_NONE");
1b452ec6 189 return &elf_howto_table[(unsigned int) R_386_NONE ];
252b5132
RH
190
191 case BFD_RELOC_32:
192 TRACE ("BFD_RELOC_32");
1b452ec6 193 return &elf_howto_table[(unsigned int) R_386_32 ];
252b5132
RH
194
195 case BFD_RELOC_CTOR:
196 TRACE ("BFD_RELOC_CTOR");
1b452ec6 197 return &elf_howto_table[(unsigned int) R_386_32 ];
252b5132
RH
198
199 case BFD_RELOC_32_PCREL:
200 TRACE ("BFD_RELOC_PC32");
1b452ec6 201 return &elf_howto_table[(unsigned int) R_386_PC32 ];
252b5132
RH
202
203 case BFD_RELOC_386_GOT32:
204 TRACE ("BFD_RELOC_386_GOT32");
1b452ec6 205 return &elf_howto_table[(unsigned int) R_386_GOT32 ];
252b5132
RH
206
207 case BFD_RELOC_386_PLT32:
208 TRACE ("BFD_RELOC_386_PLT32");
1b452ec6 209 return &elf_howto_table[(unsigned int) R_386_PLT32 ];
252b5132
RH
210
211 case BFD_RELOC_386_COPY:
212 TRACE ("BFD_RELOC_386_COPY");
1b452ec6 213 return &elf_howto_table[(unsigned int) R_386_COPY ];
252b5132
RH
214
215 case BFD_RELOC_386_GLOB_DAT:
216 TRACE ("BFD_RELOC_386_GLOB_DAT");
1b452ec6 217 return &elf_howto_table[(unsigned int) R_386_GLOB_DAT ];
252b5132
RH
218
219 case BFD_RELOC_386_JUMP_SLOT:
220 TRACE ("BFD_RELOC_386_JUMP_SLOT");
1b452ec6 221 return &elf_howto_table[(unsigned int) R_386_JUMP_SLOT ];
252b5132
RH
222
223 case BFD_RELOC_386_RELATIVE:
224 TRACE ("BFD_RELOC_386_RELATIVE");
1b452ec6 225 return &elf_howto_table[(unsigned int) R_386_RELATIVE ];
252b5132
RH
226
227 case BFD_RELOC_386_GOTOFF:
228 TRACE ("BFD_RELOC_386_GOTOFF");
1b452ec6 229 return &elf_howto_table[(unsigned int) R_386_GOTOFF ];
252b5132
RH
230
231 case BFD_RELOC_386_GOTPC:
232 TRACE ("BFD_RELOC_386_GOTPC");
1b452ec6 233 return &elf_howto_table[(unsigned int) R_386_GOTPC ];
252b5132
RH
234
235 /* The remaining relocs are a GNU extension. */
236 case BFD_RELOC_16:
237 TRACE ("BFD_RELOC_16");
1b452ec6 238 return &elf_howto_table[(unsigned int) R_386_16 - R_386_ext_offset];
252b5132
RH
239
240 case BFD_RELOC_16_PCREL:
241 TRACE ("BFD_RELOC_16_PCREL");
1b452ec6 242 return &elf_howto_table[(unsigned int) R_386_PC16 - R_386_ext_offset];
252b5132
RH
243
244 case BFD_RELOC_8:
245 TRACE ("BFD_RELOC_8");
1b452ec6 246 return &elf_howto_table[(unsigned int) R_386_8 - R_386_ext_offset];
252b5132
RH
247
248 case BFD_RELOC_8_PCREL:
249 TRACE ("BFD_RELOC_8_PCREL");
1b452ec6 250 return &elf_howto_table[(unsigned int) R_386_PC8 - R_386_ext_offset];
252b5132
RH
251
252 case BFD_RELOC_VTABLE_INHERIT:
253 TRACE ("BFD_RELOC_VTABLE_INHERIT");
dc47f327
AM
254 return &elf_howto_table[(unsigned int) R_386_GNU_VTINHERIT
255 - R_386_vt_offset];
252b5132
RH
256
257 case BFD_RELOC_VTABLE_ENTRY:
258 TRACE ("BFD_RELOC_VTABLE_ENTRY");
dc47f327
AM
259 return &elf_howto_table[(unsigned int) R_386_GNU_VTENTRY
260 - R_386_vt_offset];
252b5132
RH
261
262 default:
263 break;
264 }
265
266 TRACE ("Unknown");
267 return 0;
268}
269
270static void
271elf_i386_info_to_howto (abfd, cache_ptr, dst)
7442e600
ILT
272 bfd *abfd ATTRIBUTE_UNUSED;
273 arelent *cache_ptr ATTRIBUTE_UNUSED;
274 Elf32_Internal_Rela *dst ATTRIBUTE_UNUSED;
252b5132
RH
275{
276 abort ();
277}
278
279static void
280elf_i386_info_to_howto_rel (abfd, cache_ptr, dst)
7442e600 281 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
282 arelent *cache_ptr;
283 Elf32_Internal_Rel *dst;
284{
dc47f327
AM
285 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
286 unsigned int indx;
287
288 if ((indx = r_type) >= R_386_standard
289 && ((indx = r_type - R_386_ext_offset) - R_386_standard
290 >= R_386_ext - R_386_standard)
291 && ((indx = r_type - R_386_vt_offset) - R_386_ext
292 >= R_386_vt - R_386_ext))
252b5132 293 {
dc47f327 294 (*_bfd_error_handler) (_("%s: invalid relocation type %d"),
8f615d07 295 bfd_archive_filename (abfd), (int) r_type);
dc47f327 296 indx = (unsigned int) R_386_NONE;
252b5132 297 }
dc47f327 298 cache_ptr->howto = &elf_howto_table[indx];
252b5132
RH
299}
300
301/* Return whether a symbol name implies a local label. The UnixWare
302 2.1 cc generates temporary symbols that start with .X, so we
303 recognize them here. FIXME: do other SVR4 compilers also use .X?.
304 If so, we should move the .X recognition into
305 _bfd_elf_is_local_label_name. */
306
307static boolean
308elf_i386_is_local_label_name (abfd, name)
309 bfd *abfd;
310 const char *name;
311{
312 if (name[0] == '.' && name[1] == 'X')
313 return true;
314
315 return _bfd_elf_is_local_label_name (abfd, name);
316}
317\f
318/* Functions for the i386 ELF linker. */
319
320/* The name of the dynamic interpreter. This is put in the .interp
321 section. */
322
323#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
324
325/* The size in bytes of an entry in the procedure linkage table. */
326
327#define PLT_ENTRY_SIZE 16
328
329/* The first entry in an absolute procedure linkage table looks like
330 this. See the SVR4 ABI i386 supplement to see how this works. */
331
332static const bfd_byte elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
333{
334 0xff, 0x35, /* pushl contents of address */
335 0, 0, 0, 0, /* replaced with address of .got + 4. */
336 0xff, 0x25, /* jmp indirect */
337 0, 0, 0, 0, /* replaced with address of .got + 8. */
338 0, 0, 0, 0 /* pad out to 16 bytes. */
339};
340
341/* Subsequent entries in an absolute procedure linkage table look like
342 this. */
343
344static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] =
345{
346 0xff, 0x25, /* jmp indirect */
347 0, 0, 0, 0, /* replaced with address of this symbol in .got. */
348 0x68, /* pushl immediate */
349 0, 0, 0, 0, /* replaced with offset into relocation table. */
350 0xe9, /* jmp relative */
351 0, 0, 0, 0 /* replaced with offset to start of .plt. */
352};
353
354/* The first entry in a PIC procedure linkage table look like this. */
355
356static const bfd_byte elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
357{
358 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
359 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
360 0, 0, 0, 0 /* pad out to 16 bytes. */
361};
362
363/* Subsequent entries in a PIC procedure linkage table look like this. */
364
365static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] =
366{
367 0xff, 0xa3, /* jmp *offset(%ebx) */
368 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */
369 0x68, /* pushl immediate */
370 0, 0, 0, 0, /* replaced with offset into relocation table. */
371 0xe9, /* jmp relative */
372 0, 0, 0, 0 /* replaced with offset to start of .plt. */
373};
374
375/* The i386 linker needs to keep track of the number of relocs that it
ffb2e45b
AM
376 decides to copy as dynamic relocs in check_relocs for each symbol.
377 This is so that it can later discard them if they are found to be
378 unnecessary. We store the information in a field extending the
379 regular ELF linker hash table. */
252b5132 380
ffb2e45b 381struct elf_i386_dyn_relocs
252b5132 382{
ffb2e45b 383 struct elf_i386_dyn_relocs *next;
0c715baa
AM
384
385 /* The input section of the reloc. */
386 asection *sec;
387
388 /* Total number of relocs copied for the input section. */
252b5132 389 bfd_size_type count;
0c715baa
AM
390
391 /* Number of pc-relative relocs copied for the input section. */
392 bfd_size_type pc_count;
252b5132
RH
393};
394
395/* i386 ELF linker hash entry. */
396
397struct elf_i386_link_hash_entry
398{
399 struct elf_link_hash_entry root;
400
0c715baa 401 /* Track dynamic relocs copied for this symbol. */
ffb2e45b 402 struct elf_i386_dyn_relocs *dyn_relocs;
252b5132
RH
403};
404
405/* i386 ELF linker hash table. */
406
407struct elf_i386_link_hash_table
408{
409 struct elf_link_hash_table root;
252b5132 410
6725bdbf
AM
411 /* Short-cuts to get to dynamic linker sections. */
412 asection *sgot;
413 asection *sgotplt;
414 asection *srelgot;
415 asection *splt;
416 asection *srelplt;
417 asection *sdynbss;
418 asection *srelbss;
419};
252b5132
RH
420
421/* Get the i386 ELF linker hash table from a link_info structure. */
422
423#define elf_i386_hash_table(p) \
424 ((struct elf_i386_link_hash_table *) ((p)->hash))
425
426/* Create an entry in an i386 ELF linker hash table. */
427
428static struct bfd_hash_entry *
429elf_i386_link_hash_newfunc (entry, table, string)
430 struct bfd_hash_entry *entry;
431 struct bfd_hash_table *table;
432 const char *string;
433{
434 struct elf_i386_link_hash_entry *ret =
435 (struct elf_i386_link_hash_entry *) entry;
436
437 /* Allocate the structure if it has not already been allocated by a
438 subclass. */
439 if (ret == (struct elf_i386_link_hash_entry *) NULL)
440 ret = ((struct elf_i386_link_hash_entry *)
441 bfd_hash_allocate (table,
442 sizeof (struct elf_i386_link_hash_entry)));
443 if (ret == (struct elf_i386_link_hash_entry *) NULL)
444 return (struct bfd_hash_entry *) ret;
445
446 /* Call the allocation method of the superclass. */
447 ret = ((struct elf_i386_link_hash_entry *)
448 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
449 table, string));
450 if (ret != (struct elf_i386_link_hash_entry *) NULL)
451 {
ffb2e45b 452 ret->dyn_relocs = NULL;
252b5132
RH
453 }
454
455 return (struct bfd_hash_entry *) ret;
456}
457
458/* Create an i386 ELF linker hash table. */
459
460static struct bfd_link_hash_table *
461elf_i386_link_hash_table_create (abfd)
462 bfd *abfd;
463{
464 struct elf_i386_link_hash_table *ret;
dc810e39 465 bfd_size_type amt = sizeof (struct elf_i386_link_hash_table);
252b5132 466
dc810e39 467 ret = (struct elf_i386_link_hash_table *) bfd_alloc (abfd, amt);
252b5132
RH
468 if (ret == (struct elf_i386_link_hash_table *) NULL)
469 return NULL;
470
471 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
472 elf_i386_link_hash_newfunc))
473 {
474 bfd_release (abfd, ret);
475 return NULL;
476 }
477
6725bdbf
AM
478 ret->sgot = NULL;
479 ret->sgotplt = NULL;
480 ret->srelgot = NULL;
481 ret->splt = NULL;
482 ret->srelplt = NULL;
483 ret->sdynbss = NULL;
484 ret->srelbss = NULL;
485
252b5132
RH
486 return &ret->root.root;
487}
488
6725bdbf
AM
489/* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up
490 shortcuts to them in our hash table. */
491
492static boolean
493create_got_section (dynobj, info)
494 bfd *dynobj;
495 struct bfd_link_info *info;
496{
497 struct elf_i386_link_hash_table *htab;
498
499 if (! _bfd_elf_create_got_section (dynobj, info))
500 return false;
501
502 htab = elf_i386_hash_table (info);
503 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
504 htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
505 if (!htab->sgot || !htab->sgotplt)
506 abort ();
507
508 htab->srelgot = bfd_make_section (dynobj, ".rel.got");
509 if (htab->srelgot == NULL
510 || ! bfd_set_section_flags (dynobj, htab->srelgot,
511 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
512 | SEC_IN_MEMORY | SEC_LINKER_CREATED
513 | SEC_READONLY))
514 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
515 return false;
516 return true;
517}
518
519/* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and
520 .rel.bss sections in DYNOBJ, and set up shortcuts to them in our
521 hash table. */
522
523static boolean
524elf_i386_create_dynamic_sections (dynobj, info)
525 bfd *dynobj;
526 struct bfd_link_info *info;
527{
528 struct elf_i386_link_hash_table *htab;
529
530 htab = elf_i386_hash_table (info);
531 if (!htab->sgot && !create_got_section (dynobj, info))
532 return false;
533
534 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
535 return false;
536
537 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
538 htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt");
539 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
540 if (!info->shared)
541 htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss");
542
543 if (!htab->splt || !htab->srelplt || !htab->sdynbss
544 || (!info->shared && !htab->srelbss))
545 abort ();
546
547 return true;
548}
549
252b5132
RH
550/* Look through the relocs for a section during the first phase, and
551 allocate space in the global offset table or procedure linkage
552 table. */
553
554static boolean
555elf_i386_check_relocs (abfd, info, sec, relocs)
556 bfd *abfd;
557 struct bfd_link_info *info;
558 asection *sec;
559 const Elf_Internal_Rela *relocs;
560{
6725bdbf 561 struct elf_i386_link_hash_table *htab;
252b5132
RH
562 bfd *dynobj;
563 Elf_Internal_Shdr *symtab_hdr;
564 struct elf_link_hash_entry **sym_hashes;
dd5724d5 565 bfd_signed_vma *local_got_refcounts;
252b5132
RH
566 const Elf_Internal_Rela *rel;
567 const Elf_Internal_Rela *rel_end;
252b5132
RH
568 asection *sreloc;
569
570 if (info->relocateable)
571 return true;
572
6725bdbf
AM
573 htab = elf_i386_hash_table (info);
574 dynobj = htab->root.dynobj;
252b5132
RH
575 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
576 sym_hashes = elf_sym_hashes (abfd);
dd5724d5 577 local_got_refcounts = elf_local_got_refcounts (abfd);
252b5132 578
252b5132
RH
579 sreloc = NULL;
580
581 rel_end = relocs + sec->reloc_count;
582 for (rel = relocs; rel < rel_end; rel++)
583 {
584 unsigned long r_symndx;
585 struct elf_link_hash_entry *h;
586
587 r_symndx = ELF32_R_SYM (rel->r_info);
588
d9bc7a44 589 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
f5f31454 590 {
8f615d07
AM
591 (*_bfd_error_handler) (_("%s: bad symbol index: %d"),
592 bfd_archive_filename (abfd),
593 r_symndx);
f5f31454
L
594 return false;
595 }
596
252b5132
RH
597 if (r_symndx < symtab_hdr->sh_info)
598 h = NULL;
599 else
600 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
601
602 /* Some relocs require a global offset table. */
12d0ee4a 603 if (htab->sgot == NULL)
252b5132
RH
604 {
605 switch (ELF32_R_TYPE (rel->r_info))
606 {
607 case R_386_GOT32:
608 case R_386_GOTOFF:
609 case R_386_GOTPC:
12d0ee4a
AM
610 if (dynobj == NULL)
611 htab->root.dynobj = dynobj = abfd;
6725bdbf 612 if (!create_got_section (dynobj, info))
252b5132
RH
613 return false;
614 break;
615
616 default:
617 break;
618 }
619 }
620
621 switch (ELF32_R_TYPE (rel->r_info))
622 {
623 case R_386_GOT32:
624 /* This symbol requires a global offset table entry. */
252b5132
RH
625 if (h != NULL)
626 {
dd5724d5 627 if (h->got.refcount == -1)
5a15f56f 628 h->got.refcount = 1;
dd5724d5
AM
629 else
630 h->got.refcount += 1;
252b5132
RH
631 }
632 else
633 {
83be169b 634 /* This is a global offset table entry for a local symbol. */
dd5724d5 635 if (local_got_refcounts == NULL)
252b5132 636 {
dc810e39 637 bfd_size_type size;
252b5132 638
dc810e39
AM
639 size = symtab_hdr->sh_info;
640 size *= sizeof (bfd_signed_vma);
dd5724d5
AM
641 local_got_refcounts = ((bfd_signed_vma *)
642 bfd_alloc (abfd, size));
643 if (local_got_refcounts == NULL)
252b5132 644 return false;
dd5724d5 645 elf_local_got_refcounts (abfd) = local_got_refcounts;
dc810e39 646 memset (local_got_refcounts, -1, (size_t) size);
252b5132 647 }
dd5724d5 648 if (local_got_refcounts[r_symndx] == -1)
6725bdbf 649 local_got_refcounts[r_symndx] = 1;
dd5724d5
AM
650 else
651 local_got_refcounts[r_symndx] += 1;
252b5132 652 }
252b5132
RH
653 break;
654
655 case R_386_PLT32:
656 /* This symbol requires a procedure linkage table entry. We
83be169b
AM
657 actually build the entry in adjust_dynamic_symbol,
658 because this might be a case of linking PIC code which is
659 never referenced by a dynamic object, in which case we
660 don't need to generate a procedure linkage table entry
661 after all. */
252b5132
RH
662
663 /* If this is a local symbol, we resolve it directly without
83be169b 664 creating a procedure linkage table entry. */
252b5132
RH
665 if (h == NULL)
666 continue;
667
dd5724d5
AM
668 if (h->plt.refcount == -1)
669 {
dd5724d5 670 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
6725bdbf 671 h->plt.refcount = 1;
dd5724d5
AM
672 }
673 else
674 h->plt.refcount += 1;
252b5132
RH
675 break;
676
677 case R_386_32:
678 case R_386_PC32:
12d0ee4a 679 if (h != NULL && !info->shared)
6725bdbf 680 {
12d0ee4a
AM
681 /* If this reloc is in a read-only section, we might
682 need a copy reloc. */
683 if ((sec->flags & SEC_READONLY) != 0)
684 h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
685
686 /* We may need a .plt entry if the function this reloc
687 refers to is in a shared lib. */
688 if (h->plt.refcount == -1)
689 h->plt.refcount = 1;
690 else
691 h->plt.refcount += 1;
6725bdbf 692 }
7843f00e 693
252b5132 694 /* If we are creating a shared library, and this is a reloc
f69da49f
AM
695 against a global symbol, or a non PC relative reloc
696 against a local symbol, then we need to copy the reloc
697 into the shared library. However, if we are linking with
698 -Bsymbolic, we do not need to copy a reloc against a
699 global symbol which is defined in an object we are
700 including in the link (i.e., DEF_REGULAR is set). At
701 this point we have not seen all the input files, so it is
702 possible that DEF_REGULAR is not set now but will be set
1f655a09
L
703 later (it is never cleared). In case of a weak definition,
704 DEF_REGULAR may be cleared later by a strong definition in
705 a shared library. We account for that possibility below by
706 storing information in the relocs_copied field of the hash
707 table entry. A similar situation occurs when creating
708 shared libraries and symbol visibility changes render the
12d0ee4a 709 symbol local.
56882138 710
12d0ee4a
AM
711 If on the other hand, we are creating an executable, we
712 may need to keep relocations for symbols satisfied by a
713 dynamic library if we manage to avoid copy relocs for the
714 symbol. */
715 if ((info->shared
716 && (sec->flags & SEC_ALLOC) != 0
717 && (ELF32_R_TYPE (rel->r_info) != R_386_PC32
718 || (h != NULL
719 && (! info->symbolic
720 || h->root.type == bfd_link_hash_defweak
721 || (h->elf_link_hash_flags
722 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
723 || (!info->shared
724 && (sec->flags & SEC_ALLOC) != 0
725 && h != NULL
726 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
727 && (h->root.type == bfd_link_hash_defweak
728 || (h->elf_link_hash_flags
729 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
252b5132 730 {
12d0ee4a
AM
731 /* We must copy these reloc types into the output file.
732 Create a reloc section in dynobj and make room for
733 this reloc. */
734 if (dynobj == NULL)
735 htab->root.dynobj = dynobj = abfd;
28d0b90e 736
252b5132
RH
737 if (sreloc == NULL)
738 {
739 const char *name;
740
741 name = (bfd_elf_string_from_elf_section
742 (abfd,
743 elf_elfheader (abfd)->e_shstrndx,
744 elf_section_data (sec)->rel_hdr.sh_name));
745 if (name == NULL)
746 return false;
747
c8492176
L
748 if (strncmp (name, ".rel", 4) != 0
749 || strcmp (bfd_get_section_name (abfd, sec),
750 name + 4) != 0)
751 {
0c715baa
AM
752 (*_bfd_error_handler)
753 (_("%s: bad relocation section name `%s\'"),
754 bfd_archive_filename (abfd), name);
f5f31454 755 }
252b5132
RH
756
757 sreloc = bfd_get_section_by_name (dynobj, name);
758 if (sreloc == NULL)
759 {
760 flagword flags;
761
762 sreloc = bfd_make_section (dynobj, name);
763 flags = (SEC_HAS_CONTENTS | SEC_READONLY
764 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
765 if ((sec->flags & SEC_ALLOC) != 0)
766 flags |= SEC_ALLOC | SEC_LOAD;
767 if (sreloc == NULL
768 || ! bfd_set_section_flags (dynobj, sreloc, flags)
769 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
770 return false;
771 }
0c715baa 772 elf_section_data (sec)->sreloc = sreloc;
252b5132
RH
773 }
774
0c715baa
AM
775 /* If this is a global symbol, we count the number of
776 relocations we need for this symbol. */
777 if (h != NULL)
252b5132
RH
778 {
779 struct elf_i386_link_hash_entry *eh;
ffb2e45b 780 struct elf_i386_dyn_relocs *p;
252b5132
RH
781
782 eh = (struct elf_i386_link_hash_entry *) h;
0c715baa 783 p = eh->dyn_relocs;
252b5132 784
0c715baa 785 if (p == NULL || p->sec != sec)
252b5132 786 {
ffb2e45b 787 p = ((struct elf_i386_dyn_relocs *)
dc810e39 788 bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
252b5132
RH
789 if (p == NULL)
790 return false;
ffb2e45b
AM
791 p->next = eh->dyn_relocs;
792 eh->dyn_relocs = p;
0c715baa 793 p->sec = sec;
252b5132 794 p->count = 0;
0c715baa 795 p->pc_count = 0;
252b5132
RH
796 }
797
0c715baa
AM
798 p->count += 1;
799 if (ELF32_R_TYPE (rel->r_info) == R_386_PC32)
800 p->pc_count += 1;
801 }
802 else
803 {
804 /* Track dynamic relocs needed for local syms too. */
805 elf_section_data (sec)->local_dynrel += 1;
252b5132
RH
806 }
807 }
808
809 break;
810
811 /* This relocation describes the C++ object vtable hierarchy.
812 Reconstruct it for later use during GC. */
813 case R_386_GNU_VTINHERIT:
814 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
815 return false;
816 break;
817
818 /* This relocation describes which C++ vtable entries are actually
819 used. Record for later use during GC. */
820 case R_386_GNU_VTENTRY:
821 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
822 return false;
823 break;
824
825 default:
826 break;
827 }
828 }
829
830 return true;
831}
832
833/* Return the section that should be marked against GC for a given
834 relocation. */
835
836static asection *
837elf_i386_gc_mark_hook (abfd, info, rel, h, sym)
838 bfd *abfd;
7442e600 839 struct bfd_link_info *info ATTRIBUTE_UNUSED;
252b5132
RH
840 Elf_Internal_Rela *rel;
841 struct elf_link_hash_entry *h;
842 Elf_Internal_Sym *sym;
843{
844 if (h != NULL)
845 {
846 switch (ELF32_R_TYPE (rel->r_info))
847 {
848 case R_386_GNU_VTINHERIT:
849 case R_386_GNU_VTENTRY:
850 break;
851
852 default:
853 switch (h->root.type)
854 {
855 case bfd_link_hash_defined:
856 case bfd_link_hash_defweak:
857 return h->root.u.def.section;
858
859 case bfd_link_hash_common:
860 return h->root.u.c.p->section;
861
862 default:
863 break;
864 }
865 }
866 }
867 else
868 {
869 if (!(elf_bad_symtab (abfd)
870 && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
871 && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
872 && sym->st_shndx != SHN_COMMON))
873 {
874 return bfd_section_from_elf_index (abfd, sym->st_shndx);
875 }
876 }
877
878 return NULL;
879}
880
881/* Update the got entry reference counts for the section being removed. */
882
883static boolean
884elf_i386_gc_sweep_hook (abfd, info, sec, relocs)
dd5724d5 885 bfd *abfd;
6725bdbf 886 struct bfd_link_info *info;
dd5724d5
AM
887 asection *sec;
888 const Elf_Internal_Rela *relocs;
252b5132 889{
dd5724d5
AM
890 Elf_Internal_Shdr *symtab_hdr;
891 struct elf_link_hash_entry **sym_hashes;
892 bfd_signed_vma *local_got_refcounts;
893 const Elf_Internal_Rela *rel, *relend;
894 unsigned long r_symndx;
895 struct elf_link_hash_entry *h;
896 bfd *dynobj;
dd5724d5 897
0c715baa
AM
898 elf_section_data (sec)->local_dynrel = 0;
899
dd5724d5
AM
900 dynobj = elf_hash_table (info)->dynobj;
901 if (dynobj == NULL)
902 return true;
903
6725bdbf
AM
904 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
905 sym_hashes = elf_sym_hashes (abfd);
906 local_got_refcounts = elf_local_got_refcounts (abfd);
dd5724d5
AM
907
908 relend = relocs + sec->reloc_count;
909 for (rel = relocs; rel < relend; rel++)
910 switch (ELF32_R_TYPE (rel->r_info))
911 {
912 case R_386_GOT32:
913 case R_386_GOTOFF:
914 case R_386_GOTPC:
915 r_symndx = ELF32_R_SYM (rel->r_info);
916 if (r_symndx >= symtab_hdr->sh_info)
917 {
918 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
919 if (h->got.refcount > 0)
6725bdbf 920 h->got.refcount -= 1;
dd5724d5
AM
921 }
922 else if (local_got_refcounts != NULL)
923 {
924 if (local_got_refcounts[r_symndx] > 0)
6725bdbf 925 local_got_refcounts[r_symndx] -= 1;
dd5724d5
AM
926 }
927 break;
928
6725bdbf
AM
929 case R_386_32:
930 case R_386_PC32:
0c715baa
AM
931 r_symndx = ELF32_R_SYM (rel->r_info);
932 if (r_symndx >= symtab_hdr->sh_info)
933 {
934 struct elf_i386_link_hash_entry *eh;
935 struct elf_i386_dyn_relocs **pp;
936 struct elf_i386_dyn_relocs *p;
937
938 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
939
940 if (!info->shared && h->plt.refcount > 0)
941 h->plt.refcount -= 1;
942
943 eh = (struct elf_i386_link_hash_entry *) h;
944
945 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
946 if (p->sec == sec)
947 {
948 if (ELF32_R_TYPE (rel->r_info) == R_386_PC32)
949 p->pc_count -= 1;
950 p->count -= 1;
951 if (p->count == 0)
952 *pp = p->next;
953 break;
954 }
955 }
956 break;
6725bdbf 957
dd5724d5
AM
958 case R_386_PLT32:
959 r_symndx = ELF32_R_SYM (rel->r_info);
960 if (r_symndx >= symtab_hdr->sh_info)
961 {
962 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
963 if (h->plt.refcount > 0)
964 h->plt.refcount -= 1;
965 }
966 break;
967
968 default:
969 break;
970 }
252b5132
RH
971
972 return true;
973}
974
975/* Adjust a symbol defined by a dynamic object and referenced by a
976 regular object. The current definition is in some section of the
977 dynamic object, but we're not including those sections. We have to
978 change the definition to something the rest of the link can
979 understand. */
980
981static boolean
982elf_i386_adjust_dynamic_symbol (info, h)
983 struct bfd_link_info *info;
984 struct elf_link_hash_entry *h;
985{
6725bdbf 986 struct elf_i386_link_hash_table *htab;
252b5132
RH
987 bfd *dynobj;
988 asection *s;
989 unsigned int power_of_two;
990
6725bdbf
AM
991 htab = elf_i386_hash_table (info);
992 dynobj = htab->root.dynobj;
252b5132 993
252b5132
RH
994 /* If this is a function, put it in the procedure linkage table. We
995 will fill in the contents of the procedure linkage table later,
996 when we know the address of the .got section. */
997 if (h->type == STT_FUNC
998 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
999 {
6725bdbf
AM
1000 if (h->plt.refcount <= 0
1001 || (! info->shared
1002 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
1003 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0))
252b5132
RH
1004 {
1005 /* This case can occur if we saw a PLT32 reloc in an input
dd5724d5
AM
1006 file, but the symbol was never referred to by a dynamic
1007 object, or if all references were garbage collected. In
1008 such a case, we don't actually need to build a procedure
1009 linkage table, and we can just do a PC32 reloc instead. */
6725bdbf 1010 h->plt.refcount = (bfd_vma) -1;
dd5724d5 1011 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
252b5132
RH
1012 }
1013
252b5132
RH
1014 return true;
1015 }
6725bdbf
AM
1016 else
1017 /* It's possible that we incorrectly decided a .plt reloc was
1018 needed for an R_386_PC32 reloc to a non-function sym in
1019 check_relocs. We can't decide accurately between function and
1020 non-function syms in check-relocs; Objects loaded later in
1021 the link may change h->type. So fix it now. */
1022 h->plt.refcount = (bfd_vma) -1;
252b5132
RH
1023
1024 /* If this is a weak symbol, and there is a real definition, the
1025 processor independent code will have arranged for us to see the
1026 real definition first, and we can just use the same value. */
1027 if (h->weakdef != NULL)
1028 {
1029 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
1030 || h->weakdef->root.type == bfd_link_hash_defweak);
1031 h->root.u.def.section = h->weakdef->root.u.def.section;
1032 h->root.u.def.value = h->weakdef->root.u.def.value;
1033 return true;
1034 }
1035
1036 /* This is a reference to a symbol defined by a dynamic object which
1037 is not a function. */
1038
1039 /* If we are creating a shared library, we must presume that the
1040 only references to the symbol are via the global offset table.
1041 For such cases we need not do anything here; the relocations will
1042 be handled correctly by relocate_section. */
1043 if (info->shared)
1044 return true;
1045
7843f00e
ILT
1046 /* If there are no references to this symbol that do not use the
1047 GOT, we don't need to generate a copy reloc. */
1048 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
1049 return true;
1050
252b5132
RH
1051 /* We must allocate the symbol in our .dynbss section, which will
1052 become part of the .bss section of the executable. There will be
1053 an entry for this symbol in the .dynsym section. The dynamic
1054 object will contain position independent code, so all references
1055 from the dynamic object to this symbol will go through the global
1056 offset table. The dynamic linker will use the .dynsym entry to
1057 determine the address it must put in the global offset table, so
1058 both the dynamic object and the regular object will refer to the
1059 same memory location for the variable. */
1060
6725bdbf 1061 s = htab->sdynbss;
ffb2e45b
AM
1062 if (s == NULL)
1063 abort ();
252b5132
RH
1064
1065 /* We must generate a R_386_COPY reloc to tell the dynamic linker to
1066 copy the initial value out of the dynamic object and into the
1067 runtime process image. We need to remember the offset into the
1068 .rel.bss section we are going to use. */
1069 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1070 {
1071 asection *srel;
1072
6725bdbf 1073 srel = htab->srelbss;
ffb2e45b
AM
1074 if (srel == NULL)
1075 abort ();
252b5132
RH
1076 srel->_raw_size += sizeof (Elf32_External_Rel);
1077 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
1078 }
1079
1080 /* We need to figure out the alignment required for this symbol. I
1081 have no idea how ELF linkers handle this. */
1082 power_of_two = bfd_log2 (h->size);
1083 if (power_of_two > 3)
1084 power_of_two = 3;
1085
1086 /* Apply the required alignment. */
1087 s->_raw_size = BFD_ALIGN (s->_raw_size,
1088 (bfd_size_type) (1 << power_of_two));
1089 if (power_of_two > bfd_get_section_alignment (dynobj, s))
1090 {
1091 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
1092 return false;
1093 }
1094
1095 /* Define the symbol as being at this point in the section. */
1096 h->root.u.def.section = s;
1097 h->root.u.def.value = s->_raw_size;
1098
1099 /* Increment the section size to make room for the symbol. */
1100 s->_raw_size += h->size;
1101
1102 return true;
1103}
1104
6725bdbf
AM
1105/* This is the condition under which elf_i386_finish_dynamic_symbol
1106 will be called from elflink.h. If elflink.h doesn't call our
1107 finish_dynamic_symbol routine, we'll need to do something about
1108 initializing any .plt and .got entries in elf_i386_relocate_section. */
1109#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
1110 ((DYN) \
1111 && ((INFO)->shared \
1112 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
1113 && ((H)->dynindx != -1 \
1114 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
1115
1116/* Allocate space in .plt, .got and associated reloc sections for
0c715baa 1117 dynamic relocs. */
6725bdbf
AM
1118
1119static boolean
0c715baa 1120allocate_dynrelocs (h, inf)
6725bdbf
AM
1121 struct elf_link_hash_entry *h;
1122 PTR inf;
1123{
1124 struct bfd_link_info *info;
1125 struct elf_i386_link_hash_table *htab;
1126 asection *s;
5a15f56f 1127 struct elf_i386_link_hash_entry *eh;
0c715baa 1128 struct elf_i386_dyn_relocs *p;
6725bdbf
AM
1129
1130 if (h->root.type == bfd_link_hash_indirect
1131 || h->root.type == bfd_link_hash_warning)
1132 return true;
1133
1134 info = (struct bfd_link_info *) inf;
1135 htab = elf_i386_hash_table (info);
1136
1137 if (htab->root.dynamic_sections_created
1138 && h->plt.refcount > 0)
1139 {
5a15f56f
AM
1140 /* Make sure this symbol is output as a dynamic symbol.
1141 Undefined weak syms won't yet be marked as dynamic. */
1142 if (h->dynindx == -1
1143 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1144 {
1145 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1146 return false;
1147 }
1148
6725bdbf 1149 s = htab->splt;
ffb2e45b
AM
1150 if (s == NULL)
1151 abort ();
6725bdbf
AM
1152
1153 /* If this is the first .plt entry, make room for the special
1154 first entry. */
1155 if (s->_raw_size == 0)
1156 s->_raw_size += PLT_ENTRY_SIZE;
1157
1158 h->plt.offset = s->_raw_size;
1159
1160 /* If this symbol is not defined in a regular file, and we are
1161 not generating a shared library, then set the symbol to this
1162 location in the .plt. This is required to make function
1163 pointers compare as equal between the normal executable and
1164 the shared library. */
1165 if (! info->shared
1166 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1167 {
1168 h->root.u.def.section = s;
1169 h->root.u.def.value = h->plt.offset;
1170 }
1171
1172 /* Make room for this entry. */
1173 s->_raw_size += PLT_ENTRY_SIZE;
1174
1175 /* We also need to make an entry in the .got.plt section, which
1176 will be placed in the .got section by the linker script. */
1177 s = htab->sgotplt;
ffb2e45b
AM
1178 if (s == NULL)
1179 abort ();
6725bdbf
AM
1180 s->_raw_size += 4;
1181
1182 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
1183 {
1184 /* We also need to make an entry in the .rel.plt section. */
1185 s = htab->srelplt;
ffb2e45b
AM
1186 if (s == NULL)
1187 abort ();
6725bdbf
AM
1188 s->_raw_size += sizeof (Elf32_External_Rel);
1189 }
1190 }
1191 else
1192 {
1193 h->plt.offset = (bfd_vma) -1;
1194 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
1195 }
1196
1197 if (h->got.refcount > 0)
1198 {
1199 boolean dyn;
1200
5a15f56f
AM
1201 /* Make sure this symbol is output as a dynamic symbol.
1202 Undefined weak syms won't yet be marked as dynamic. */
1203 if (h->dynindx == -1
1204 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1205 {
1206 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1207 return false;
1208 }
1209
6725bdbf
AM
1210 s = htab->sgot;
1211 h->got.offset = s->_raw_size;
1212 s->_raw_size += 4;
1213 dyn = htab->root.dynamic_sections_created;
1214 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
1215 htab->srelgot->_raw_size += sizeof (Elf32_External_Rel);
1216 }
1217 else
1218 h->got.offset = (bfd_vma) -1;
1219
5a15f56f
AM
1220 eh = (struct elf_i386_link_hash_entry *) h;
1221 if (eh->dyn_relocs == NULL)
1222 return true;
1223
0c715baa
AM
1224 /* In the shared -Bsymbolic case, discard space allocated for
1225 dynamic pc-relative relocs against symbols which turn out to be
1226 defined in regular objects. For the normal shared case, discard
1227 space for relocs that have become local due to symbol visibility
1228 changes. */
1229
1230 if (info->shared)
5a15f56f 1231 {
0c715baa
AM
1232 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
1233 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
1234 || info->symbolic))
5a15f56f 1235 {
0c715baa
AM
1236 struct elf_i386_dyn_relocs **pp;
1237
1238 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
1239 {
1240 p->count -= p->pc_count;
1241 p->pc_count = 0;
1242 if (p->count == 0)
1243 *pp = p->next;
1244 else
1245 pp = &p->next;
1246 }
5a15f56f 1247 }
0c715baa
AM
1248 }
1249 else
1250 {
1251 /* For the non-shared case, discard space for relocs against
1252 symbols which turn out to need copy relocs or are not
1253 dynamic. */
1254
1255 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
1256 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1257 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
1258 || (htab->root.dynamic_sections_created
1259 && (h->root.type == bfd_link_hash_undefweak
1260 || h->root.type == bfd_link_hash_undefined))))
1261 {
1262 /* Make sure this symbol is output as a dynamic symbol.
1263 Undefined weak syms won't yet be marked as dynamic. */
1264 if (h->dynindx == -1
1265 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
1266 {
1267 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
1268 return false;
1269 }
5a15f56f 1270
0c715baa
AM
1271 /* If that succeeded, we know we'll be keeping all the
1272 relocs. */
1273 if (h->dynindx != -1)
1274 goto keep;
1275 }
1276
1277 eh->dyn_relocs = NULL;
1278
1279 keep:
5a15f56f
AM
1280 }
1281
0c715baa
AM
1282 /* Finally, allocate space. */
1283 for (p = eh->dyn_relocs; p != NULL; p = p->next)
12d0ee4a 1284 {
0c715baa
AM
1285 asection *sreloc = elf_section_data (p->sec)->sreloc;
1286 sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel);
12d0ee4a
AM
1287 }
1288
6725bdbf
AM
1289 return true;
1290}
1291
0c715baa
AM
1292/* Find any dynamic relocs that apply to read-only sections. */
1293
1294static boolean
1295readonly_dynrelocs (h, inf)
1296 struct elf_link_hash_entry *h;
1297 PTR inf;
1298{
1299 struct elf_i386_link_hash_entry *eh;
1300 struct elf_i386_dyn_relocs *p;
1301
1302 eh = (struct elf_i386_link_hash_entry *) h;
1303 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1304 {
1305 asection *s = p->sec->output_section;
1306
1307 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1308 {
1309 struct bfd_link_info *info = (struct bfd_link_info *) inf;
1310
1311 info->flags |= DF_TEXTREL;
1312
1313 /* Not an error, just cut short the traversal. */
1314 return false;
1315 }
1316 }
1317 return true;
1318}
1319
252b5132
RH
1320/* Set the sizes of the dynamic sections. */
1321
1322static boolean
1323elf_i386_size_dynamic_sections (output_bfd, info)
db6751f2 1324 bfd *output_bfd ATTRIBUTE_UNUSED;
252b5132
RH
1325 struct bfd_link_info *info;
1326{
6725bdbf 1327 struct elf_i386_link_hash_table *htab;
252b5132
RH
1328 bfd *dynobj;
1329 asection *s;
252b5132 1330 boolean relocs;
0c715baa 1331 bfd *ibfd;
252b5132 1332
6725bdbf
AM
1333 htab = elf_i386_hash_table (info);
1334 dynobj = htab->root.dynobj;
ffb2e45b
AM
1335 if (dynobj == NULL)
1336 abort ();
252b5132 1337
6725bdbf 1338 if (htab->root.dynamic_sections_created)
252b5132
RH
1339 {
1340 /* Set the contents of the .interp section to the interpreter. */
1341 if (! info->shared)
1342 {
1343 s = bfd_get_section_by_name (dynobj, ".interp");
ffb2e45b
AM
1344 if (s == NULL)
1345 abort ();
252b5132
RH
1346 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
1347 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1348 }
161d71a6 1349 }
6725bdbf 1350
0c715baa
AM
1351 /* Set up .got offsets for local syms, and space for local dynamic
1352 relocs. */
1353 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
161d71a6
L
1354 {
1355 bfd_signed_vma *local_got;
1356 bfd_signed_vma *end_local_got;
1357 bfd_size_type locsymcount;
1358 Elf_Internal_Shdr *symtab_hdr;
1359 asection *srel;
6725bdbf 1360
0c715baa 1361 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
161d71a6 1362 continue;
6725bdbf 1363
0c715baa
AM
1364 for (s = ibfd->sections; s != NULL; s = s->next)
1365 {
1366 bfd_size_type count = elf_section_data (s)->local_dynrel;
1367
1368 if (count != 0)
1369 {
1370 srel = elf_section_data (s)->sreloc;
1371 srel->_raw_size += count * sizeof (Elf32_External_Rel);
1372 }
1373 }
1374
1375 local_got = elf_local_got_refcounts (ibfd);
161d71a6
L
1376 if (!local_got)
1377 continue;
6725bdbf 1378
0c715baa 1379 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
161d71a6
L
1380 locsymcount = symtab_hdr->sh_info;
1381 end_local_got = local_got + locsymcount;
1382 s = htab->sgot;
1383 srel = htab->srelgot;
1384 for (; local_got < end_local_got; ++local_got)
1385 {
1386 if (*local_got > 0)
6725bdbf 1387 {
161d71a6
L
1388 *local_got = s->_raw_size;
1389 s->_raw_size += 4;
1390 if (info->shared)
1391 srel->_raw_size += sizeof (Elf32_External_Rel);
6725bdbf 1392 }
161d71a6
L
1393 else
1394 *local_got = (bfd_vma) -1;
6725bdbf 1395 }
252b5132 1396 }
6725bdbf 1397
0c715baa
AM
1398 /* Allocate global sym .plt and .got entries, and space for global
1399 sym dynamic relocs. */
1400 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info);
252b5132 1401
5a15f56f
AM
1402 /* We now have determined the sizes of the various dynamic sections.
1403 Allocate memory for them. */
252b5132 1404 relocs = false;
252b5132
RH
1405 for (s = dynobj->sections; s != NULL; s = s->next)
1406 {
252b5132
RH
1407 if ((s->flags & SEC_LINKER_CREATED) == 0)
1408 continue;
1409
6725bdbf
AM
1410 if (s == htab->splt
1411 || s == htab->sgot
1412 || s == htab->sgotplt)
252b5132 1413 {
6725bdbf
AM
1414 /* Strip this section if we don't need it; see the
1415 comment below. */
252b5132 1416 }
6725bdbf 1417 else if (strncmp (bfd_get_section_name (dynobj, s), ".rel", 4) == 0)
252b5132
RH
1418 {
1419 if (s->_raw_size == 0)
1420 {
1421 /* If we don't need this section, strip it from the
1422 output file. This is mostly to handle .rel.bss and
1423 .rel.plt. We must create both sections in
1424 create_dynamic_sections, because they must be created
1425 before the linker maps input sections to output
1426 sections. The linker does that before
1427 adjust_dynamic_symbol is called, and it is that
1428 function which decides whether anything needs to go
1429 into these sections. */
252b5132
RH
1430 }
1431 else
1432 {
6725bdbf 1433 if (s != htab->srelplt)
db6751f2 1434 relocs = true;
252b5132
RH
1435
1436 /* We use the reloc_count field as a counter if we need
1437 to copy relocs into the output file. */
1438 s->reloc_count = 0;
1439 }
1440 }
6725bdbf 1441 else
252b5132
RH
1442 {
1443 /* It's not one of our sections, so don't allocate space. */
1444 continue;
1445 }
1446
6725bdbf 1447 if (s->_raw_size == 0)
252b5132 1448 {
7f8d5fc9 1449 _bfd_strip_section_from_output (info, s);
252b5132
RH
1450 continue;
1451 }
1452
f69da49f
AM
1453 /* Allocate memory for the section contents. We use bfd_zalloc
1454 here in case unused entries are not reclaimed before the
1455 section's contents are written out. This should not happen,
1456 but this way if it does, we get a R_386_NONE reloc instead
1457 of garbage. */
7a9af8c4 1458 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
6725bdbf 1459 if (s->contents == NULL)
252b5132
RH
1460 return false;
1461 }
1462
6725bdbf 1463 if (htab->root.dynamic_sections_created)
252b5132
RH
1464 {
1465 /* Add some entries to the .dynamic section. We fill in the
1466 values later, in elf_i386_finish_dynamic_sections, but we
1467 must add the entries now so that we get the correct size for
1468 the .dynamic section. The DT_DEBUG entry is filled in by the
1469 dynamic linker and used by the debugger. */
dc810e39
AM
1470#define add_dynamic_entry(TAG, VAL) \
1471 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
1472
252b5132
RH
1473 if (! info->shared)
1474 {
dc810e39 1475 if (!add_dynamic_entry (DT_DEBUG, 0))
252b5132
RH
1476 return false;
1477 }
1478
6725bdbf 1479 if (htab->splt->_raw_size != 0)
252b5132 1480 {
dc810e39
AM
1481 if (!add_dynamic_entry (DT_PLTGOT, 0)
1482 || !add_dynamic_entry (DT_PLTRELSZ, 0)
1483 || !add_dynamic_entry (DT_PLTREL, DT_REL)
1484 || !add_dynamic_entry (DT_JMPREL, 0))
252b5132
RH
1485 return false;
1486 }
1487
1488 if (relocs)
1489 {
dc810e39
AM
1490 if (!add_dynamic_entry (DT_REL, 0)
1491 || !add_dynamic_entry (DT_RELSZ, 0)
1492 || !add_dynamic_entry (DT_RELENT, sizeof (Elf32_External_Rel)))
252b5132 1493 return false;
252b5132 1494
0c715baa
AM
1495 /* If any dynamic relocs apply to a read-only section,
1496 then we need a DT_TEXTREL entry. */
1497 elf_link_hash_traverse (&htab->root, readonly_dynrelocs, (PTR) info);
1498
1499 if ((info->flags & DF_TEXTREL) != 0)
1500 {
1501 if (!add_dynamic_entry (DT_TEXTREL, 0))
1502 return false;
1503 }
252b5132
RH
1504 }
1505 }
dc810e39 1506#undef add_dynamic_entry
252b5132
RH
1507
1508 return true;
1509}
1510
252b5132
RH
1511/* Relocate an i386 ELF section. */
1512
1513static boolean
1514elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
1515 contents, relocs, local_syms, local_sections)
1516 bfd *output_bfd;
1517 struct bfd_link_info *info;
1518 bfd *input_bfd;
1519 asection *input_section;
1520 bfd_byte *contents;
1521 Elf_Internal_Rela *relocs;
1522 Elf_Internal_Sym *local_syms;
1523 asection **local_sections;
1524{
6725bdbf 1525 struct elf_i386_link_hash_table *htab;
252b5132
RH
1526 bfd *dynobj;
1527 Elf_Internal_Shdr *symtab_hdr;
1528 struct elf_link_hash_entry **sym_hashes;
1529 bfd_vma *local_got_offsets;
252b5132
RH
1530 Elf_Internal_Rela *rel;
1531 Elf_Internal_Rela *relend;
1532
6725bdbf
AM
1533 htab = elf_i386_hash_table (info);
1534 dynobj = htab->root.dynobj;
252b5132
RH
1535 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1536 sym_hashes = elf_sym_hashes (input_bfd);
1537 local_got_offsets = elf_local_got_offsets (input_bfd);
1538
252b5132
RH
1539 rel = relocs;
1540 relend = relocs + input_section->reloc_count;
1541 for (; rel < relend; rel++)
1542 {
1543 int r_type;
1544 reloc_howto_type *howto;
1545 unsigned long r_symndx;
1546 struct elf_link_hash_entry *h;
1547 Elf_Internal_Sym *sym;
1548 asection *sec;
ffb2e45b 1549 bfd_vma off;
252b5132 1550 bfd_vma relocation;
83be169b 1551 boolean unresolved_reloc;
252b5132 1552 bfd_reloc_status_type r;
1b452ec6 1553 unsigned int indx;
252b5132
RH
1554
1555 r_type = ELF32_R_TYPE (rel->r_info);
dc47f327
AM
1556 if (r_type == (int) R_386_GNU_VTINHERIT
1557 || r_type == (int) R_386_GNU_VTENTRY)
252b5132 1558 continue;
dc47f327 1559
1b452ec6 1560 if ((indx = (unsigned) r_type) >= R_386_standard
dc47f327
AM
1561 && ((indx = (unsigned) r_type - R_386_ext_offset) - R_386_standard
1562 >= R_386_ext - R_386_standard))
252b5132
RH
1563 {
1564 bfd_set_error (bfd_error_bad_value);
1565 return false;
1566 }
1b452ec6 1567 howto = elf_howto_table + indx;
252b5132
RH
1568
1569 r_symndx = ELF32_R_SYM (rel->r_info);
1570
1571 if (info->relocateable)
1572 {
1573 /* This is a relocateable link. We don't have to change
1574 anything, unless the reloc is against a section symbol,
1575 in which case we have to adjust according to where the
1576 section symbol winds up in the output section. */
1577 if (r_symndx < symtab_hdr->sh_info)
1578 {
1579 sym = local_syms + r_symndx;
1580 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1581 {
1582 bfd_vma val;
1583
1584 sec = local_sections[r_symndx];
1585 val = bfd_get_32 (input_bfd, contents + rel->r_offset);
1586 val += sec->output_offset + sym->st_value;
1587 bfd_put_32 (input_bfd, val, contents + rel->r_offset);
1588 }
1589 }
1590
1591 continue;
1592 }
1593
1594 /* This is a final link. */
1595 h = NULL;
1596 sym = NULL;
1597 sec = NULL;
83be169b 1598 unresolved_reloc = false;
252b5132
RH
1599 if (r_symndx < symtab_hdr->sh_info)
1600 {
1601 sym = local_syms + r_symndx;
1602 sec = local_sections[r_symndx];
1603 relocation = (sec->output_section->vma
1604 + sec->output_offset
1605 + sym->st_value);
1606 }
1607 else
1608 {
1609 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1610 while (h->root.type == bfd_link_hash_indirect
1611 || h->root.type == bfd_link_hash_warning)
1612 h = (struct elf_link_hash_entry *) h->root.u.i.link;
ffb2e45b 1613
6725bdbf 1614 relocation = 0;
252b5132
RH
1615 if (h->root.type == bfd_link_hash_defined
1616 || h->root.type == bfd_link_hash_defweak)
1617 {
1618 sec = h->root.u.def.section;
83be169b
AM
1619 if (sec->output_section == NULL)
1620 /* Set a flag that will be cleared later if we find a
1621 relocation value for this symbol. output_section
1622 is typically NULL for symbols satisfied by a shared
1623 library. */
1624 unresolved_reloc = true;
252b5132
RH
1625 else
1626 relocation = (h->root.u.def.value
1627 + sec->output_section->vma
1628 + sec->output_offset);
1629 }
1630 else if (h->root.type == bfd_link_hash_undefweak)
6725bdbf 1631 ;
671bae9c
NC
1632 else if (info->shared
1633 && (!info->symbolic || info->allow_shlib_undefined)
3a27a730
L
1634 && !info->no_undefined
1635 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
6725bdbf 1636 ;
252b5132
RH
1637 else
1638 {
1639 if (! ((*info->callbacks->undefined_symbol)
1640 (info, h->root.root.string, input_bfd,
5cc7c785 1641 input_section, rel->r_offset,
3a27a730
L
1642 (!info->shared || info->no_undefined
1643 || ELF_ST_VISIBILITY (h->other)))))
252b5132 1644 return false;
252b5132
RH
1645 }
1646 }
1647
1648 switch (r_type)
1649 {
1650 case R_386_GOT32:
1651 /* Relocation is to the entry for this symbol in the global
1652 offset table. */
ffb2e45b
AM
1653 if (htab->sgot == NULL)
1654 abort ();
252b5132
RH
1655
1656 if (h != NULL)
1657 {
6725bdbf 1658 boolean dyn;
252b5132
RH
1659
1660 off = h->got.offset;
6725bdbf
AM
1661 dyn = htab->root.dynamic_sections_created;
1662 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
252b5132 1663 || (info->shared
6725bdbf
AM
1664 && (info->symbolic
1665 || h->dynindx == -1
1666 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
252b5132
RH
1667 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
1668 {
1669 /* This is actually a static link, or it is a
1670 -Bsymbolic link and the symbol is defined
1671 locally, or the symbol was forced to be local
1672 because of a version file. We must initialize
1673 this entry in the global offset table. Since the
1674 offset must always be a multiple of 4, we use the
1675 least significant bit to record whether we have
1676 initialized it already.
1677
1678 When doing a dynamic link, we create a .rel.got
1679 relocation entry to initialize the value. This
1680 is done in the finish_dynamic_symbol routine. */
1681 if ((off & 1) != 0)
1682 off &= ~1;
1683 else
1684 {
1685 bfd_put_32 (output_bfd, relocation,
6725bdbf 1686 htab->sgot->contents + off);
252b5132
RH
1687 h->got.offset |= 1;
1688 }
1689 }
8c694914
AM
1690 else
1691 unresolved_reloc = false;
252b5132
RH
1692 }
1693 else
1694 {
ffb2e45b
AM
1695 if (local_got_offsets == NULL)
1696 abort ();
252b5132
RH
1697
1698 off = local_got_offsets[r_symndx];
1699
1700 /* The offset must always be a multiple of 4. We use
83be169b
AM
1701 the least significant bit to record whether we have
1702 already generated the necessary reloc. */
252b5132
RH
1703 if ((off & 1) != 0)
1704 off &= ~1;
1705 else
1706 {
6725bdbf
AM
1707 bfd_put_32 (output_bfd, relocation,
1708 htab->sgot->contents + off);
252b5132
RH
1709
1710 if (info->shared)
1711 {
1712 asection *srelgot;
1713 Elf_Internal_Rel outrel;
1714
6725bdbf 1715 srelgot = htab->srelgot;
ffb2e45b
AM
1716 if (srelgot == NULL)
1717 abort ();
252b5132 1718
6725bdbf
AM
1719 outrel.r_offset = (htab->sgot->output_section->vma
1720 + htab->sgot->output_offset
252b5132
RH
1721 + off);
1722 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
1723 bfd_elf32_swap_reloc_out (output_bfd, &outrel,
1724 (((Elf32_External_Rel *)
1725 srelgot->contents)
1726 + srelgot->reloc_count));
1727 ++srelgot->reloc_count;
1728 }
1729
1730 local_got_offsets[r_symndx] |= 1;
1731 }
252b5132
RH
1732 }
1733
ffb2e45b
AM
1734 if (off >= (bfd_vma) -2)
1735 abort ();
1736
1737 relocation = htab->sgot->output_offset + off;
252b5132
RH
1738 break;
1739
1740 case R_386_GOTOFF:
1741 /* Relocation is relative to the start of the global offset
1742 table. */
1743
252b5132
RH
1744 /* Note that sgot->output_offset is not involved in this
1745 calculation. We always want the start of .got. If we
1746 defined _GLOBAL_OFFSET_TABLE in a different way, as is
1747 permitted by the ABI, we might have to change this
1748 calculation. */
6725bdbf 1749 relocation -= htab->sgot->output_section->vma;
252b5132
RH
1750 break;
1751
1752 case R_386_GOTPC:
1753 /* Use global offset table as symbol value. */
6725bdbf 1754 relocation = htab->sgot->output_section->vma;
83be169b 1755 unresolved_reloc = false;
252b5132
RH
1756 break;
1757
1758 case R_386_PLT32:
1759 /* Relocation is to the entry for this symbol in the
1760 procedure linkage table. */
1761
dd5724d5 1762 /* Resolve a PLT32 reloc against a local symbol directly,
83be169b 1763 without using the procedure linkage table. */
252b5132
RH
1764 if (h == NULL)
1765 break;
1766
dd5724d5 1767 if (h->plt.offset == (bfd_vma) -1
6725bdbf 1768 || htab->splt == NULL)
252b5132
RH
1769 {
1770 /* We didn't make a PLT entry for this symbol. This
83be169b
AM
1771 happens when statically linking PIC code, or when
1772 using -Bsymbolic. */
252b5132
RH
1773 break;
1774 }
1775
6725bdbf
AM
1776 relocation = (htab->splt->output_section->vma
1777 + htab->splt->output_offset
252b5132 1778 + h->plt.offset);
83be169b 1779 unresolved_reloc = false;
252b5132
RH
1780 break;
1781
1782 case R_386_32:
1783 case R_386_PC32:
12d0ee4a
AM
1784 if ((info->shared
1785 && (input_section->flags & SEC_ALLOC) != 0
1786 && (r_type != R_386_PC32
1787 || (h != NULL
1788 && h->dynindx != -1
1789 && (! info->symbolic
1790 || (h->elf_link_hash_flags
1791 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
1792 || (!info->shared
1793 && (input_section->flags & SEC_ALLOC) != 0
1794 && h != NULL
1795 && h->dynindx != -1
1796 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
56882138
AM
1797 && (((h->elf_link_hash_flags
1798 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1799 && (h->elf_link_hash_flags
1800 & ELF_LINK_HASH_DEF_REGULAR) == 0)
28d0b90e
AM
1801 || h->root.type == bfd_link_hash_undefweak
1802 || h->root.type == bfd_link_hash_undefined)))
252b5132
RH
1803 {
1804 Elf_Internal_Rel outrel;
1805 boolean skip, relocate;
0c715baa
AM
1806 asection *sreloc;
1807 Elf32_External_Rel *loc;
252b5132
RH
1808
1809 /* When generating a shared object, these relocations
1810 are copied into the output file to be resolved at run
1811 time. */
1812
252b5132
RH
1813 skip = false;
1814
1815 if (elf_section_data (input_section)->stab_info == NULL)
1816 outrel.r_offset = rel->r_offset;
1817 else
1818 {
252b5132 1819 off = (_bfd_stab_section_offset
12d0ee4a 1820 (output_bfd, htab->root.stab_info, input_section,
252b5132
RH
1821 &elf_section_data (input_section)->stab_info,
1822 rel->r_offset));
1823 if (off == (bfd_vma) -1)
1824 skip = true;
1825 outrel.r_offset = off;
1826 }
1827
1828 outrel.r_offset += (input_section->output_section->vma
1829 + input_section->output_offset);
1830
1831 if (skip)
1832 {
1833 memset (&outrel, 0, sizeof outrel);
1834 relocate = false;
1835 }
5a15f56f
AM
1836 else if (h != NULL
1837 && h->dynindx != -1
1838 && (r_type == R_386_PC32
1839 || !info->shared
1840 || !info->symbolic
1841 || (h->elf_link_hash_flags
1842 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1843
252b5132 1844 {
252b5132 1845 relocate = false;
5a15f56f 1846 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
252b5132
RH
1847 }
1848 else
1849 {
5a15f56f
AM
1850 /* This symbol is local, or marked to become local. */
1851 relocate = true;
1852 outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
252b5132
RH
1853 }
1854
0c715baa
AM
1855 sreloc = elf_section_data (input_section)->sreloc;
1856 if (sreloc == NULL)
1857 abort ();
1858
1859 loc = ((Elf32_External_Rel *) sreloc->contents
1860 + sreloc->reloc_count);
1861 sreloc->reloc_count += 1;
1862 bfd_elf32_swap_reloc_out (output_bfd, &outrel, loc);
252b5132
RH
1863
1864 /* If this reloc is against an external symbol, we do
1865 not want to fiddle with the addend. Otherwise, we
1866 need to include the symbol value so that it becomes
1867 an addend for the dynamic reloc. */
1868 if (! relocate)
1869 continue;
1870 }
1871
1872 break;
1873
1874 default:
1875 break;
1876 }
1877
8c694914
AM
1878 /* FIXME: Why do we allow debugging sections to escape this error?
1879 More importantly, why do we not emit dynamic relocs for
1880 R_386_32 above in debugging sections (which are ! SEC_ALLOC)?
1881 If we had emitted the dynamic reloc, we could remove the
1882 fudge here. */
1883 if (unresolved_reloc
1884 && !(info->shared
1885 && (input_section->flags & SEC_DEBUGGING) != 0
1886 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
83be169b
AM
1887 (*_bfd_error_handler)
1888 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
8f615d07 1889 bfd_archive_filename (input_bfd),
83be169b
AM
1890 bfd_get_section_name (input_bfd, input_section),
1891 (long) rel->r_offset,
1892 h->root.root.string);
1893
252b5132
RH
1894 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1895 contents, rel->r_offset,
1896 relocation, (bfd_vma) 0);
1897
ffb2e45b 1898 switch (r)
252b5132 1899 {
ffb2e45b
AM
1900 case bfd_reloc_ok:
1901 break;
1902
1903 case bfd_reloc_overflow:
1904 {
1905 const char *name;
1906
1907 if (h != NULL)
1908 name = h->root.root.string;
1909 else
252b5132 1910 {
ffb2e45b
AM
1911 name = bfd_elf_string_from_elf_section (input_bfd,
1912 symtab_hdr->sh_link,
1913 sym->st_name);
1914 if (name == NULL)
252b5132 1915 return false;
ffb2e45b
AM
1916 if (*name == '\0')
1917 name = bfd_section_name (input_bfd, sec);
252b5132 1918 }
ffb2e45b
AM
1919 if (! ((*info->callbacks->reloc_overflow)
1920 (info, name, howto->name, (bfd_vma) 0,
1921 input_bfd, input_section, rel->r_offset)))
1922 return false;
1923 }
1924 break;
1925
1926 default:
1927 case bfd_reloc_outofrange:
1928 abort ();
1929 break;
252b5132
RH
1930 }
1931 }
1932
1933 return true;
1934}
1935
1936/* Finish up dynamic symbol handling. We set the contents of various
1937 dynamic sections here. */
1938
1939static boolean
1940elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
1941 bfd *output_bfd;
1942 struct bfd_link_info *info;
1943 struct elf_link_hash_entry *h;
1944 Elf_Internal_Sym *sym;
1945{
6725bdbf 1946 struct elf_i386_link_hash_table *htab;
252b5132
RH
1947 bfd *dynobj;
1948
6725bdbf
AM
1949 htab = elf_i386_hash_table (info);
1950 dynobj = htab->root.dynobj;
252b5132
RH
1951
1952 if (h->plt.offset != (bfd_vma) -1)
1953 {
252b5132
RH
1954 bfd_vma plt_index;
1955 bfd_vma got_offset;
1956 Elf_Internal_Rel rel;
1957
1958 /* This symbol has an entry in the procedure linkage table. Set
1959 it up. */
1960
ffb2e45b
AM
1961 if (h->dynindx == -1
1962 || htab->splt == NULL
1963 || htab->sgotplt == NULL
1964 || htab->srelplt == NULL)
1965 abort ();
252b5132
RH
1966
1967 /* Get the index in the procedure linkage table which
1968 corresponds to this symbol. This is the index of this symbol
1969 in all the symbols for which we are making plt entries. The
1970 first entry in the procedure linkage table is reserved. */
1971 plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1972
1973 /* Get the offset into the .got table of the entry that
1974 corresponds to this function. Each .got entry is 4 bytes.
1975 The first three are reserved. */
1976 got_offset = (plt_index + 3) * 4;
1977
1978 /* Fill in the entry in the procedure linkage table. */
1979 if (! info->shared)
1980 {
6725bdbf 1981 memcpy (htab->splt->contents + h->plt.offset, elf_i386_plt_entry,
252b5132
RH
1982 PLT_ENTRY_SIZE);
1983 bfd_put_32 (output_bfd,
6725bdbf
AM
1984 (htab->sgotplt->output_section->vma
1985 + htab->sgotplt->output_offset
252b5132 1986 + got_offset),
6725bdbf 1987 htab->splt->contents + h->plt.offset + 2);
252b5132
RH
1988 }
1989 else
1990 {
6725bdbf 1991 memcpy (htab->splt->contents + h->plt.offset, elf_i386_pic_plt_entry,
252b5132
RH
1992 PLT_ENTRY_SIZE);
1993 bfd_put_32 (output_bfd, got_offset,
6725bdbf 1994 htab->splt->contents + h->plt.offset + 2);
252b5132
RH
1995 }
1996
1997 bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
6725bdbf 1998 htab->splt->contents + h->plt.offset + 7);
252b5132 1999 bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
6725bdbf 2000 htab->splt->contents + h->plt.offset + 12);
252b5132
RH
2001
2002 /* Fill in the entry in the global offset table. */
2003 bfd_put_32 (output_bfd,
6725bdbf
AM
2004 (htab->splt->output_section->vma
2005 + htab->splt->output_offset
252b5132
RH
2006 + h->plt.offset
2007 + 6),
6725bdbf 2008 htab->sgotplt->contents + got_offset);
252b5132
RH
2009
2010 /* Fill in the entry in the .rel.plt section. */
6725bdbf
AM
2011 rel.r_offset = (htab->sgotplt->output_section->vma
2012 + htab->sgotplt->output_offset
252b5132
RH
2013 + got_offset);
2014 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
2015 bfd_elf32_swap_reloc_out (output_bfd, &rel,
6725bdbf 2016 ((Elf32_External_Rel *) htab->srelplt->contents
252b5132
RH
2017 + plt_index));
2018
2019 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2020 {
2021 /* Mark the symbol as undefined, rather than as defined in
2022 the .plt section. Leave the value alone. */
2023 sym->st_shndx = SHN_UNDEF;
2024 }
2025 }
2026
2027 if (h->got.offset != (bfd_vma) -1)
2028 {
252b5132
RH
2029 Elf_Internal_Rel rel;
2030
2031 /* This symbol has an entry in the global offset table. Set it
2032 up. */
2033
ffb2e45b
AM
2034 if (htab->sgot == NULL || htab->srelgot == NULL)
2035 abort ();
252b5132 2036
6725bdbf
AM
2037 rel.r_offset = (htab->sgot->output_section->vma
2038 + htab->sgot->output_offset
dc810e39 2039 + (h->got.offset & ~(bfd_vma) 1));
252b5132 2040
dd5724d5
AM
2041 /* If this is a static link, or it is a -Bsymbolic link and the
2042 symbol is defined locally or was forced to be local because
2043 of a version file, we just want to emit a RELATIVE reloc.
252b5132
RH
2044 The entry in the global offset table will already have been
2045 initialized in the relocate_section function. */
6725bdbf
AM
2046 if (info->shared
2047 && (info->symbolic
2048 || h->dynindx == -1
2049 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
2050 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
dd5724d5 2051 {
6725bdbf 2052 BFD_ASSERT((h->got.offset & 1) != 0);
dd5724d5
AM
2053 rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
2054 }
252b5132
RH
2055 else
2056 {
dd5724d5 2057 BFD_ASSERT((h->got.offset & 1) == 0);
6725bdbf
AM
2058 bfd_put_32 (output_bfd, (bfd_vma) 0,
2059 htab->sgot->contents + h->got.offset);
252b5132
RH
2060 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT);
2061 }
2062
2063 bfd_elf32_swap_reloc_out (output_bfd, &rel,
6725bdbf
AM
2064 ((Elf32_External_Rel *) htab->srelgot->contents
2065 + htab->srelgot->reloc_count));
2066 ++htab->srelgot->reloc_count;
252b5132
RH
2067 }
2068
791987af 2069 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
252b5132 2070 {
252b5132
RH
2071 Elf_Internal_Rel rel;
2072
2073 /* This symbol needs a copy reloc. Set it up. */
2074
ffb2e45b
AM
2075 if (h->dynindx == -1
2076 || (h->root.type != bfd_link_hash_defined
2077 && h->root.type != bfd_link_hash_defweak)
2078 || htab->srelbss == NULL)
2079 abort ();
252b5132
RH
2080
2081 rel.r_offset = (h->root.u.def.value
2082 + h->root.u.def.section->output_section->vma
2083 + h->root.u.def.section->output_offset);
2084 rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY);
2085 bfd_elf32_swap_reloc_out (output_bfd, &rel,
6725bdbf
AM
2086 ((Elf32_External_Rel *) htab->srelbss->contents
2087 + htab->srelbss->reloc_count));
2088 ++htab->srelbss->reloc_count;
252b5132
RH
2089 }
2090
2091 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2092 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2093 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2094 sym->st_shndx = SHN_ABS;
2095
2096 return true;
2097}
2098
2099/* Finish up the dynamic sections. */
2100
2101static boolean
2102elf_i386_finish_dynamic_sections (output_bfd, info)
2103 bfd *output_bfd;
2104 struct bfd_link_info *info;
2105{
6725bdbf 2106 struct elf_i386_link_hash_table *htab;
252b5132 2107 bfd *dynobj;
252b5132
RH
2108 asection *sdyn;
2109
6725bdbf
AM
2110 htab = elf_i386_hash_table (info);
2111 dynobj = htab->root.dynobj;
252b5132
RH
2112 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2113
6725bdbf 2114 if (htab->root.dynamic_sections_created)
252b5132 2115 {
252b5132
RH
2116 Elf32_External_Dyn *dyncon, *dynconend;
2117
ffb2e45b
AM
2118 if (sdyn == NULL || htab->sgot == NULL)
2119 abort ();
252b5132
RH
2120
2121 dyncon = (Elf32_External_Dyn *) sdyn->contents;
2122 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
2123 for (; dyncon < dynconend; dyncon++)
2124 {
2125 Elf_Internal_Dyn dyn;
252b5132
RH
2126
2127 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
2128
2129 switch (dyn.d_tag)
2130 {
2131 default:
2132 break;
2133
2134 case DT_PLTGOT:
6725bdbf
AM
2135 dyn.d_un.d_ptr = htab->sgot->output_section->vma;
2136 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2137 break;
2138
252b5132 2139 case DT_JMPREL:
6725bdbf 2140 dyn.d_un.d_ptr = htab->srelplt->output_section->vma;
252b5132
RH
2141 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2142 break;
2143
2144 case DT_PLTRELSZ:
6725bdbf
AM
2145 if (htab->srelplt->output_section->_cooked_size != 0)
2146 dyn.d_un.d_val = htab->srelplt->output_section->_cooked_size;
252b5132 2147 else
6725bdbf 2148 dyn.d_un.d_val = htab->srelplt->output_section->_raw_size;
252b5132
RH
2149 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2150 break;
2151
2152 case DT_RELSZ:
2153 /* My reading of the SVR4 ABI indicates that the
2154 procedure linkage table relocs (DT_JMPREL) should be
2155 included in the overall relocs (DT_REL). This is
2156 what Solaris does. However, UnixWare can not handle
2157 that case. Therefore, we override the DT_RELSZ entry
2158 here to make it not include the JMPREL relocs. Since
2159 the linker script arranges for .rel.plt to follow all
2160 other relocation sections, we don't have to worry
2161 about changing the DT_REL entry. */
6725bdbf 2162 if (htab->srelplt != NULL)
252b5132 2163 {
6725bdbf
AM
2164 if (htab->srelplt->output_section->_cooked_size != 0)
2165 dyn.d_un.d_val -= htab->srelplt->output_section->_cooked_size;
252b5132 2166 else
6725bdbf 2167 dyn.d_un.d_val -= htab->srelplt->output_section->_raw_size;
252b5132
RH
2168 }
2169 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2170 break;
2171 }
2172 }
2173
2174 /* Fill in the first entry in the procedure linkage table. */
6725bdbf 2175 if (htab->splt && htab->splt->_raw_size > 0)
252b5132
RH
2176 {
2177 if (info->shared)
6725bdbf
AM
2178 memcpy (htab->splt->contents,
2179 elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
252b5132
RH
2180 else
2181 {
6725bdbf
AM
2182 memcpy (htab->splt->contents,
2183 elf_i386_plt0_entry, PLT_ENTRY_SIZE);
252b5132 2184 bfd_put_32 (output_bfd,
6725bdbf
AM
2185 (htab->sgotplt->output_section->vma
2186 + htab->sgotplt->output_offset
2187 + 4),
2188 htab->splt->contents + 2);
252b5132 2189 bfd_put_32 (output_bfd,
6725bdbf
AM
2190 (htab->sgotplt->output_section->vma
2191 + htab->sgotplt->output_offset
2192 + 8),
2193 htab->splt->contents + 8);
252b5132
RH
2194 }
2195
2196 /* UnixWare sets the entsize of .plt to 4, although that doesn't
2197 really seem like the right value. */
6725bdbf
AM
2198 elf_section_data (htab->splt->output_section)
2199 ->this_hdr.sh_entsize = 4;
252b5132
RH
2200 }
2201 }
2202
12d0ee4a 2203 if (htab->sgotplt)
252b5132 2204 {
12d0ee4a
AM
2205 /* Fill in the first three entries in the global offset table. */
2206 if (htab->sgotplt->_raw_size > 0)
2207 {
2208 bfd_put_32 (output_bfd,
2209 (sdyn == NULL ? (bfd_vma) 0
2210 : sdyn->output_section->vma + sdyn->output_offset),
2211 htab->sgotplt->contents);
2212 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4);
2213 bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8);
2214 }
252b5132 2215
12d0ee4a
AM
2216 elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = 4;
2217 }
252b5132
RH
2218 return true;
2219}
2220
dd484e5c
L
2221/* Set the correct type for an x86 ELF section. We do this by the
2222 section name, which is a hack, but ought to work. */
2223
2224static boolean
2225elf_i386_fake_sections (abfd, hdr, sec)
2226 bfd *abfd ATTRIBUTE_UNUSED;
2227 Elf32_Internal_Shdr *hdr;
2228 asection *sec;
2229{
2230 register const char *name;
2231
2232 name = bfd_get_section_name (abfd, sec);
2233
2234 if (strcmp (name, ".reloc") == 0)
2235 /*
2236 * This is an ugly, but unfortunately necessary hack that is
2237 * needed when producing EFI binaries on x86. It tells
2238 * elf.c:elf_fake_sections() not to consider ".reloc" as a section
2239 * containing ELF relocation info. We need this hack in order to
2240 * be able to generate ELF binaries that can be translated into
2241 * EFI applications (which are essentially COFF objects). Those
2242 * files contain a COFF ".reloc" section inside an ELFNN object,
2243 * which would normally cause BFD to segfault because it would
2244 * attempt to interpret this section as containing relocation
2245 * entries for section "oc". With this hack enabled, ".reloc"
2246 * will be treated as a normal data section, which will avoid the
2247 * segfault. However, you won't be able to create an ELFNN binary
2248 * with a section named "oc" that needs relocations, but that's
2249 * the kind of ugly side-effects you get when detecting section
2250 * types based on their names... In practice, this limitation is
2251 * unlikely to bite.
2252 */
2253 hdr->sh_type = SHT_PROGBITS;
2254
2255 return true;
2256}
2257
db6751f2 2258static enum elf_reloc_type_class
f51e552e
AM
2259elf_i386_reloc_type_class (rela)
2260 const Elf_Internal_Rela *rela;
db6751f2 2261{
f51e552e 2262 switch ((int) ELF32_R_TYPE (rela->r_info))
db6751f2
JJ
2263 {
2264 case R_386_RELATIVE:
2265 return reloc_class_relative;
2266 case R_386_JUMP_SLOT:
2267 return reloc_class_plt;
2268 case R_386_COPY:
2269 return reloc_class_copy;
2270 default:
2271 return reloc_class_normal;
2272 }
2273}
dd484e5c 2274
c5fccbec
DJ
2275/* Support for core dump NOTE sections */
2276static boolean
2277elf_i386_grok_prstatus (abfd, note)
2278 bfd *abfd;
2279 Elf_Internal_Note *note;
2280{
2281 int offset;
dc810e39 2282 size_t raw_size;
c5fccbec
DJ
2283
2284 switch (note->descsz)
2285 {
2286 default:
2287 return false;
2288
2289 case 144: /* Linux/i386 */
2290 /* pr_cursig */
2291 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2292
2293 /* pr_pid */
2294 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2295
2296 /* pr_reg */
2297 offset = 72;
2298 raw_size = 68;
2299
2300 break;
2301 }
2302
2303 /* Make a ".reg/999" section. */
2304 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2305 raw_size, note->descpos + offset);
2306}
2307
2308static boolean
2309elf_i386_grok_psinfo (abfd, note)
2310 bfd *abfd;
2311 Elf_Internal_Note *note;
2312{
2313 switch (note->descsz)
2314 {
2315 default:
2316 return false;
2317
2318 case 128: /* Linux/MIPS elf_prpsinfo */
2319 elf_tdata (abfd)->core_program
2320 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
2321 elf_tdata (abfd)->core_command
2322 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
2323 }
2324
2325 /* Note that for some reason, a spurious space is tacked
2326 onto the end of the args in some (at least one anyway)
2327 implementations, so strip it off if it exists. */
2328
2329 {
2330 char *command = elf_tdata (abfd)->core_command;
2331 int n = strlen (command);
2332
2333 if (0 < n && command[n - 1] == ' ')
2334 command[n - 1] = '\0';
2335 }
2336
2337 return true;
2338}
2339
252b5132
RH
2340#define TARGET_LITTLE_SYM bfd_elf32_i386_vec
2341#define TARGET_LITTLE_NAME "elf32-i386"
2342#define ELF_ARCH bfd_arch_i386
2343#define ELF_MACHINE_CODE EM_386
2344#define ELF_MAXPAGESIZE 0x1000
252b5132
RH
2345
2346#define elf_backend_can_gc_sections 1
2347#define elf_backend_want_got_plt 1
2348#define elf_backend_plt_readonly 1
2349#define elf_backend_want_plt_sym 0
2350#define elf_backend_got_header_size 12
2351#define elf_backend_plt_header_size PLT_ENTRY_SIZE
2352
dd5724d5
AM
2353#define elf_info_to_howto elf_i386_info_to_howto
2354#define elf_info_to_howto_rel elf_i386_info_to_howto_rel
2355
dd5724d5
AM
2356#define bfd_elf32_bfd_is_local_label_name elf_i386_is_local_label_name
2357#define bfd_elf32_bfd_link_hash_table_create elf_i386_link_hash_table_create
2358#define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup
2359
2360#define elf_backend_adjust_dynamic_symbol elf_i386_adjust_dynamic_symbol
2361#define elf_backend_check_relocs elf_i386_check_relocs
6725bdbf 2362#define elf_backend_create_dynamic_sections elf_i386_create_dynamic_sections
dd5724d5
AM
2363#define elf_backend_finish_dynamic_sections elf_i386_finish_dynamic_sections
2364#define elf_backend_finish_dynamic_symbol elf_i386_finish_dynamic_symbol
2365#define elf_backend_gc_mark_hook elf_i386_gc_mark_hook
2366#define elf_backend_gc_sweep_hook elf_i386_gc_sweep_hook
2367#define elf_backend_relocate_section elf_i386_relocate_section
2368#define elf_backend_size_dynamic_sections elf_i386_size_dynamic_sections
83be169b 2369#define elf_backend_fake_sections elf_i386_fake_sections
c5fccbec
DJ
2370#define elf_backend_grok_prstatus elf_i386_grok_prstatus
2371#define elf_backend_grok_psinfo elf_i386_grok_psinfo
db6751f2 2372#define elf_backend_reloc_type_class elf_i386_reloc_type_class
dd5724d5 2373
252b5132 2374#include "elf32-target.h"
This page took 0.21477 seconds and 4 git commands to generate.