Cast to uintptr_t when calling ptrace32 on aix
[deliverable/binutils-gdb.git] / bfd / elf.c
CommitLineData
252b5132 1/* ELF executable support for BFD.
340b6d91 2
dc9155b2 3 Copyright 1993-2014 Free Software Foundation, Inc.
252b5132 4
5e8d7549 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
5e8d7549
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
5e8d7549 10 (at your option) any later version.
252b5132 11
5e8d7549
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
5e8d7549 17 You should have received a copy of the GNU General Public License
b34976b6 18 along with this program; if not, write to the Free Software
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
252b5132 22
1b74d094
BW
23/*
24SECTION
252b5132
RH
25 ELF backends
26
27 BFD support for ELF formats is being worked on.
28 Currently, the best supported back ends are for sparc and i386
29 (running svr4 or Solaris 2).
30
31 Documentation of the internals of the support code still needs
32 to be written. The code is changing quickly enough that we
661a3fd4 33 haven't bothered yet. */
252b5132 34
7ee38065
MS
35/* For sparc64-cross-sparc32. */
36#define _SYSCALL32
252b5132 37#include "sysdep.h"
3db64b00 38#include "bfd.h"
252b5132
RH
39#include "bfdlink.h"
40#include "libbfd.h"
41#define ARCH_SIZE 0
42#include "elf-bfd.h"
e0e8c97f 43#include "libiberty.h"
ff59fc36 44#include "safe-ctype.h"
70a38d42 45#include "elf-linux-psinfo.h"
252b5132 46
8bc7f138
L
47#ifdef CORE_HEADER
48#include CORE_HEADER
49#endif
50
217aa764 51static int elf_sort_sections (const void *, const void *);
c84fca4d 52static bfd_boolean assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
217aa764
AM
53static bfd_boolean prep_headers (bfd *);
54static bfd_boolean swap_out_syms (bfd *, struct bfd_strtab_hash **, int) ;
718175fa
JK
55static bfd_boolean elf_read_notes (bfd *, file_ptr, bfd_size_type) ;
56static bfd_boolean elf_parse_notes (bfd *abfd, char *buf, size_t size,
57 file_ptr offset);
50b2bdb7 58
252b5132
RH
59/* Swap version information in and out. The version information is
60 currently size independent. If that ever changes, this code will
61 need to move into elfcode.h. */
62
63/* Swap in a Verdef structure. */
64
65void
217aa764
AM
66_bfd_elf_swap_verdef_in (bfd *abfd,
67 const Elf_External_Verdef *src,
68 Elf_Internal_Verdef *dst)
252b5132 69{
dc810e39
AM
70 dst->vd_version = H_GET_16 (abfd, src->vd_version);
71 dst->vd_flags = H_GET_16 (abfd, src->vd_flags);
72 dst->vd_ndx = H_GET_16 (abfd, src->vd_ndx);
73 dst->vd_cnt = H_GET_16 (abfd, src->vd_cnt);
74 dst->vd_hash = H_GET_32 (abfd, src->vd_hash);
75 dst->vd_aux = H_GET_32 (abfd, src->vd_aux);
76 dst->vd_next = H_GET_32 (abfd, src->vd_next);
252b5132
RH
77}
78
79/* Swap out a Verdef structure. */
80
81void
217aa764
AM
82_bfd_elf_swap_verdef_out (bfd *abfd,
83 const Elf_Internal_Verdef *src,
84 Elf_External_Verdef *dst)
252b5132 85{
dc810e39
AM
86 H_PUT_16 (abfd, src->vd_version, dst->vd_version);
87 H_PUT_16 (abfd, src->vd_flags, dst->vd_flags);
88 H_PUT_16 (abfd, src->vd_ndx, dst->vd_ndx);
89 H_PUT_16 (abfd, src->vd_cnt, dst->vd_cnt);
90 H_PUT_32 (abfd, src->vd_hash, dst->vd_hash);
91 H_PUT_32 (abfd, src->vd_aux, dst->vd_aux);
92 H_PUT_32 (abfd, src->vd_next, dst->vd_next);
252b5132
RH
93}
94
95/* Swap in a Verdaux structure. */
96
97void
217aa764
AM
98_bfd_elf_swap_verdaux_in (bfd *abfd,
99 const Elf_External_Verdaux *src,
100 Elf_Internal_Verdaux *dst)
252b5132 101{
dc810e39
AM
102 dst->vda_name = H_GET_32 (abfd, src->vda_name);
103 dst->vda_next = H_GET_32 (abfd, src->vda_next);
252b5132
RH
104}
105
106/* Swap out a Verdaux structure. */
107
108void
217aa764
AM
109_bfd_elf_swap_verdaux_out (bfd *abfd,
110 const Elf_Internal_Verdaux *src,
111 Elf_External_Verdaux *dst)
252b5132 112{
dc810e39
AM
113 H_PUT_32 (abfd, src->vda_name, dst->vda_name);
114 H_PUT_32 (abfd, src->vda_next, dst->vda_next);
252b5132
RH
115}
116
117/* Swap in a Verneed structure. */
118
119void
217aa764
AM
120_bfd_elf_swap_verneed_in (bfd *abfd,
121 const Elf_External_Verneed *src,
122 Elf_Internal_Verneed *dst)
252b5132 123{
dc810e39
AM
124 dst->vn_version = H_GET_16 (abfd, src->vn_version);
125 dst->vn_cnt = H_GET_16 (abfd, src->vn_cnt);
126 dst->vn_file = H_GET_32 (abfd, src->vn_file);
127 dst->vn_aux = H_GET_32 (abfd, src->vn_aux);
128 dst->vn_next = H_GET_32 (abfd, src->vn_next);
252b5132
RH
129}
130
131/* Swap out a Verneed structure. */
132
133void
217aa764
AM
134_bfd_elf_swap_verneed_out (bfd *abfd,
135 const Elf_Internal_Verneed *src,
136 Elf_External_Verneed *dst)
252b5132 137{
dc810e39
AM
138 H_PUT_16 (abfd, src->vn_version, dst->vn_version);
139 H_PUT_16 (abfd, src->vn_cnt, dst->vn_cnt);
140 H_PUT_32 (abfd, src->vn_file, dst->vn_file);
141 H_PUT_32 (abfd, src->vn_aux, dst->vn_aux);
142 H_PUT_32 (abfd, src->vn_next, dst->vn_next);
252b5132
RH
143}
144
145/* Swap in a Vernaux structure. */
146
147void
217aa764
AM
148_bfd_elf_swap_vernaux_in (bfd *abfd,
149 const Elf_External_Vernaux *src,
150 Elf_Internal_Vernaux *dst)
252b5132 151{
dc810e39
AM
152 dst->vna_hash = H_GET_32 (abfd, src->vna_hash);
153 dst->vna_flags = H_GET_16 (abfd, src->vna_flags);
154 dst->vna_other = H_GET_16 (abfd, src->vna_other);
155 dst->vna_name = H_GET_32 (abfd, src->vna_name);
156 dst->vna_next = H_GET_32 (abfd, src->vna_next);
252b5132
RH
157}
158
159/* Swap out a Vernaux structure. */
160
161void
217aa764
AM
162_bfd_elf_swap_vernaux_out (bfd *abfd,
163 const Elf_Internal_Vernaux *src,
164 Elf_External_Vernaux *dst)
252b5132 165{
dc810e39
AM
166 H_PUT_32 (abfd, src->vna_hash, dst->vna_hash);
167 H_PUT_16 (abfd, src->vna_flags, dst->vna_flags);
168 H_PUT_16 (abfd, src->vna_other, dst->vna_other);
169 H_PUT_32 (abfd, src->vna_name, dst->vna_name);
170 H_PUT_32 (abfd, src->vna_next, dst->vna_next);
252b5132
RH
171}
172
173/* Swap in a Versym structure. */
174
175void
217aa764
AM
176_bfd_elf_swap_versym_in (bfd *abfd,
177 const Elf_External_Versym *src,
178 Elf_Internal_Versym *dst)
252b5132 179{
dc810e39 180 dst->vs_vers = H_GET_16 (abfd, src->vs_vers);
252b5132
RH
181}
182
183/* Swap out a Versym structure. */
184
185void
217aa764
AM
186_bfd_elf_swap_versym_out (bfd *abfd,
187 const Elf_Internal_Versym *src,
188 Elf_External_Versym *dst)
252b5132 189{
dc810e39 190 H_PUT_16 (abfd, src->vs_vers, dst->vs_vers);
252b5132
RH
191}
192
193/* Standard ELF hash function. Do not change this function; you will
194 cause invalid hash tables to be generated. */
3a99b017 195
252b5132 196unsigned long
217aa764 197bfd_elf_hash (const char *namearg)
252b5132 198{
3a99b017 199 const unsigned char *name = (const unsigned char *) namearg;
252b5132
RH
200 unsigned long h = 0;
201 unsigned long g;
202 int ch;
203
204 while ((ch = *name++) != '\0')
205 {
206 h = (h << 4) + ch;
207 if ((g = (h & 0xf0000000)) != 0)
208 {
209 h ^= g >> 24;
210 /* The ELF ABI says `h &= ~g', but this is equivalent in
211 this case and on some machines one insn instead of two. */
212 h ^= g;
213 }
214 }
32dfa85d 215 return h & 0xffffffff;
252b5132
RH
216}
217
fdc90cb4
JJ
218/* DT_GNU_HASH hash function. Do not change this function; you will
219 cause invalid hash tables to be generated. */
220
221unsigned long
222bfd_elf_gnu_hash (const char *namearg)
223{
224 const unsigned char *name = (const unsigned char *) namearg;
225 unsigned long h = 5381;
226 unsigned char ch;
227
228 while ((ch = *name++) != '\0')
229 h = (h << 5) + h + ch;
230 return h & 0xffffffff;
231}
232
0c8d6e5c
AM
233/* Create a tdata field OBJECT_SIZE bytes in length, zeroed out and with
234 the object_id field of an elf_obj_tdata field set to OBJECT_ID. */
b34976b6 235bfd_boolean
0c8d6e5c 236bfd_elf_allocate_object (bfd *abfd,
0ffa91dd 237 size_t object_size,
4dfe6ac6 238 enum elf_target_id object_id)
252b5132 239{
0ffa91dd
NC
240 BFD_ASSERT (object_size >= sizeof (struct elf_obj_tdata));
241 abfd->tdata.any = bfd_zalloc (abfd, object_size);
242 if (abfd->tdata.any == NULL)
243 return FALSE;
252b5132 244
0ffa91dd 245 elf_object_id (abfd) = object_id;
c0355132
AM
246 if (abfd->direction != read_direction)
247 {
248 struct output_elf_obj_tdata *o = bfd_zalloc (abfd, sizeof *o);
249 if (o == NULL)
250 return FALSE;
251 elf_tdata (abfd)->o = o;
252 elf_program_header_size (abfd) = (bfd_size_type) -1;
253 }
b34976b6 254 return TRUE;
252b5132
RH
255}
256
0ffa91dd
NC
257
258bfd_boolean
ae95ffa6 259bfd_elf_make_object (bfd *abfd)
0ffa91dd 260{
ae95ffa6 261 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
0ffa91dd 262 return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
ae95ffa6 263 bed->target_id);
0ffa91dd
NC
264}
265
b34976b6 266bfd_boolean
217aa764 267bfd_elf_mkcorefile (bfd *abfd)
252b5132 268{
c044fabd 269 /* I think this can be done just like an object file. */
228e534f
AM
270 if (!abfd->xvec->_bfd_set_format[(int) bfd_object] (abfd))
271 return FALSE;
272 elf_tdata (abfd)->core = bfd_zalloc (abfd, sizeof (*elf_tdata (abfd)->core));
273 return elf_tdata (abfd)->core != NULL;
252b5132
RH
274}
275
72a80a16 276static char *
217aa764 277bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
252b5132
RH
278{
279 Elf_Internal_Shdr **i_shdrp;
f075ee0c 280 bfd_byte *shstrtab = NULL;
dc810e39
AM
281 file_ptr offset;
282 bfd_size_type shstrtabsize;
252b5132
RH
283
284 i_shdrp = elf_elfsections (abfd);
74f2e02b
AM
285 if (i_shdrp == 0
286 || shindex >= elf_numsections (abfd)
287 || i_shdrp[shindex] == 0)
f075ee0c 288 return NULL;
252b5132 289
f075ee0c 290 shstrtab = i_shdrp[shindex]->contents;
252b5132
RH
291 if (shstrtab == NULL)
292 {
c044fabd 293 /* No cached one, attempt to read, and cache what we read. */
252b5132
RH
294 offset = i_shdrp[shindex]->sh_offset;
295 shstrtabsize = i_shdrp[shindex]->sh_size;
c6c60d09
JJ
296
297 /* Allocate and clear an extra byte at the end, to prevent crashes
298 in case the string table is not terminated. */
3471d59d 299 if (shstrtabsize + 1 <= 1
a50b1753 300 || (shstrtab = (bfd_byte *) bfd_alloc (abfd, shstrtabsize + 1)) == NULL
c6c60d09
JJ
301 || bfd_seek (abfd, offset, SEEK_SET) != 0)
302 shstrtab = NULL;
303 else if (bfd_bread (shstrtab, shstrtabsize, abfd) != shstrtabsize)
304 {
305 if (bfd_get_error () != bfd_error_system_call)
306 bfd_set_error (bfd_error_file_truncated);
307 shstrtab = NULL;
3471d59d
CC
308 /* Once we've failed to read it, make sure we don't keep
309 trying. Otherwise, we'll keep allocating space for
310 the string table over and over. */
311 i_shdrp[shindex]->sh_size = 0;
c6c60d09
JJ
312 }
313 else
314 shstrtab[shstrtabsize] = '\0';
217aa764 315 i_shdrp[shindex]->contents = shstrtab;
252b5132 316 }
f075ee0c 317 return (char *) shstrtab;
252b5132
RH
318}
319
320char *
217aa764
AM
321bfd_elf_string_from_elf_section (bfd *abfd,
322 unsigned int shindex,
323 unsigned int strindex)
252b5132
RH
324{
325 Elf_Internal_Shdr *hdr;
326
327 if (strindex == 0)
328 return "";
329
74f2e02b
AM
330 if (elf_elfsections (abfd) == NULL || shindex >= elf_numsections (abfd))
331 return NULL;
332
252b5132
RH
333 hdr = elf_elfsections (abfd)[shindex];
334
335 if (hdr->contents == NULL
336 && bfd_elf_get_str_section (abfd, shindex) == NULL)
337 return NULL;
338
339 if (strindex >= hdr->sh_size)
340 {
1b3a8575 341 unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
252b5132 342 (*_bfd_error_handler)
d003868e
AM
343 (_("%B: invalid string offset %u >= %lu for section `%s'"),
344 abfd, strindex, (unsigned long) hdr->sh_size,
1b3a8575 345 (shindex == shstrndx && strindex == hdr->sh_name
252b5132 346 ? ".shstrtab"
1b3a8575 347 : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
45b222d6 348 return NULL;
252b5132
RH
349 }
350
351 return ((char *) hdr->contents) + strindex;
352}
353
6cdc0ccc
AM
354/* Read and convert symbols to internal format.
355 SYMCOUNT specifies the number of symbols to read, starting from
356 symbol SYMOFFSET. If any of INTSYM_BUF, EXTSYM_BUF or EXTSHNDX_BUF
357 are non-NULL, they are used to store the internal symbols, external
b7c368d0
NC
358 symbols, and symbol section index extensions, respectively.
359 Returns a pointer to the internal symbol buffer (malloced if necessary)
360 or NULL if there were no symbols or some kind of problem. */
6cdc0ccc
AM
361
362Elf_Internal_Sym *
217aa764
AM
363bfd_elf_get_elf_syms (bfd *ibfd,
364 Elf_Internal_Shdr *symtab_hdr,
365 size_t symcount,
366 size_t symoffset,
367 Elf_Internal_Sym *intsym_buf,
368 void *extsym_buf,
369 Elf_External_Sym_Shndx *extshndx_buf)
6cdc0ccc
AM
370{
371 Elf_Internal_Shdr *shndx_hdr;
217aa764 372 void *alloc_ext;
df622259 373 const bfd_byte *esym;
6cdc0ccc
AM
374 Elf_External_Sym_Shndx *alloc_extshndx;
375 Elf_External_Sym_Shndx *shndx;
4dd07732 376 Elf_Internal_Sym *alloc_intsym;
6cdc0ccc
AM
377 Elf_Internal_Sym *isym;
378 Elf_Internal_Sym *isymend;
9c5bfbb7 379 const struct elf_backend_data *bed;
6cdc0ccc
AM
380 size_t extsym_size;
381 bfd_size_type amt;
382 file_ptr pos;
383
e44a2c9c
AM
384 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
385 abort ();
386
6cdc0ccc
AM
387 if (symcount == 0)
388 return intsym_buf;
389
390 /* Normal syms might have section extension entries. */
391 shndx_hdr = NULL;
392 if (symtab_hdr == &elf_tdata (ibfd)->symtab_hdr)
393 shndx_hdr = &elf_tdata (ibfd)->symtab_shndx_hdr;
394
395 /* Read the symbols. */
396 alloc_ext = NULL;
397 alloc_extshndx = NULL;
4dd07732 398 alloc_intsym = NULL;
6cdc0ccc
AM
399 bed = get_elf_backend_data (ibfd);
400 extsym_size = bed->s->sizeof_sym;
401 amt = symcount * extsym_size;
402 pos = symtab_hdr->sh_offset + symoffset * extsym_size;
403 if (extsym_buf == NULL)
404 {
d0fb9a8d 405 alloc_ext = bfd_malloc2 (symcount, extsym_size);
6cdc0ccc
AM
406 extsym_buf = alloc_ext;
407 }
408 if (extsym_buf == NULL
409 || bfd_seek (ibfd, pos, SEEK_SET) != 0
410 || bfd_bread (extsym_buf, amt, ibfd) != amt)
411 {
412 intsym_buf = NULL;
413 goto out;
414 }
415
416 if (shndx_hdr == NULL || shndx_hdr->sh_size == 0)
417 extshndx_buf = NULL;
418 else
419 {
420 amt = symcount * sizeof (Elf_External_Sym_Shndx);
421 pos = shndx_hdr->sh_offset + symoffset * sizeof (Elf_External_Sym_Shndx);
422 if (extshndx_buf == NULL)
423 {
a50b1753
NC
424 alloc_extshndx = (Elf_External_Sym_Shndx *)
425 bfd_malloc2 (symcount, sizeof (Elf_External_Sym_Shndx));
6cdc0ccc
AM
426 extshndx_buf = alloc_extshndx;
427 }
428 if (extshndx_buf == NULL
429 || bfd_seek (ibfd, pos, SEEK_SET) != 0
430 || bfd_bread (extshndx_buf, amt, ibfd) != amt)
431 {
432 intsym_buf = NULL;
433 goto out;
434 }
435 }
436
437 if (intsym_buf == NULL)
438 {
a50b1753
NC
439 alloc_intsym = (Elf_Internal_Sym *)
440 bfd_malloc2 (symcount, sizeof (Elf_Internal_Sym));
4dd07732 441 intsym_buf = alloc_intsym;
6cdc0ccc
AM
442 if (intsym_buf == NULL)
443 goto out;
444 }
445
446 /* Convert the symbols to internal form. */
447 isymend = intsym_buf + symcount;
a50b1753
NC
448 for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
449 shndx = extshndx_buf;
6cdc0ccc
AM
450 isym < isymend;
451 esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
8384fb8f
AM
452 if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
453 {
454 symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
455 (*_bfd_error_handler) (_("%B symbol number %lu references "
456 "nonexistent SHT_SYMTAB_SHNDX section"),
457 ibfd, (unsigned long) symoffset);
4dd07732
AM
458 if (alloc_intsym != NULL)
459 free (alloc_intsym);
8384fb8f
AM
460 intsym_buf = NULL;
461 goto out;
462 }
6cdc0ccc
AM
463
464 out:
465 if (alloc_ext != NULL)
466 free (alloc_ext);
467 if (alloc_extshndx != NULL)
468 free (alloc_extshndx);
469
470 return intsym_buf;
471}
472
5cab59f6
AM
473/* Look up a symbol name. */
474const char *
be8dd2ca
AM
475bfd_elf_sym_name (bfd *abfd,
476 Elf_Internal_Shdr *symtab_hdr,
26c61ae5
L
477 Elf_Internal_Sym *isym,
478 asection *sym_sec)
5cab59f6 479{
26c61ae5 480 const char *name;
5cab59f6 481 unsigned int iname = isym->st_name;
be8dd2ca 482 unsigned int shindex = symtab_hdr->sh_link;
26c61ae5 483
138f35cc
JJ
484 if (iname == 0 && ELF_ST_TYPE (isym->st_info) == STT_SECTION
485 /* Check for a bogus st_shndx to avoid crashing. */
4fbb74a6 486 && isym->st_shndx < elf_numsections (abfd))
5cab59f6
AM
487 {
488 iname = elf_elfsections (abfd)[isym->st_shndx]->sh_name;
489 shindex = elf_elfheader (abfd)->e_shstrndx;
490 }
491
26c61ae5
L
492 name = bfd_elf_string_from_elf_section (abfd, shindex, iname);
493 if (name == NULL)
494 name = "(null)";
495 else if (sym_sec && *name == '\0')
496 name = bfd_section_name (abfd, sym_sec);
497
498 return name;
5cab59f6
AM
499}
500
dbb410c3
AM
501/* Elf_Internal_Shdr->contents is an array of these for SHT_GROUP
502 sections. The first element is the flags, the rest are section
503 pointers. */
504
505typedef union elf_internal_group {
506 Elf_Internal_Shdr *shdr;
507 unsigned int flags;
508} Elf_Internal_Group;
509
b885599b
AM
510/* Return the name of the group signature symbol. Why isn't the
511 signature just a string? */
512
513static const char *
217aa764 514group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
b885599b 515{
9dce4196 516 Elf_Internal_Shdr *hdr;
9dce4196
AM
517 unsigned char esym[sizeof (Elf64_External_Sym)];
518 Elf_External_Sym_Shndx eshndx;
519 Elf_Internal_Sym isym;
b885599b 520
13792e9d
L
521 /* First we need to ensure the symbol table is available. Make sure
522 that it is a symbol table section. */
4fbb74a6
AM
523 if (ghdr->sh_link >= elf_numsections (abfd))
524 return NULL;
13792e9d
L
525 hdr = elf_elfsections (abfd) [ghdr->sh_link];
526 if (hdr->sh_type != SHT_SYMTAB
527 || ! bfd_section_from_shdr (abfd, ghdr->sh_link))
b885599b
AM
528 return NULL;
529
9dce4196
AM
530 /* Go read the symbol. */
531 hdr = &elf_tdata (abfd)->symtab_hdr;
6cdc0ccc
AM
532 if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
533 &isym, esym, &eshndx) == NULL)
b885599b 534 return NULL;
9dce4196 535
26c61ae5 536 return bfd_elf_sym_name (abfd, hdr, &isym, NULL);
b885599b
AM
537}
538
dbb410c3
AM
539/* Set next_in_group list pointer, and group name for NEWSECT. */
540
b34976b6 541static bfd_boolean
217aa764 542setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
dbb410c3
AM
543{
544 unsigned int num_group = elf_tdata (abfd)->num_group;
545
546 /* If num_group is zero, read in all SHT_GROUP sections. The count
547 is set to -1 if there are no SHT_GROUP sections. */
548 if (num_group == 0)
549 {
550 unsigned int i, shnum;
551
552 /* First count the number of groups. If we have a SHT_GROUP
553 section with just a flag word (ie. sh_size is 4), ignore it. */
9ad5cbcf 554 shnum = elf_numsections (abfd);
dbb410c3 555 num_group = 0;
08a40648 556
44534af3 557#define IS_VALID_GROUP_SECTION_HEADER(shdr, minsize) \
1783205a 558 ( (shdr)->sh_type == SHT_GROUP \
44534af3 559 && (shdr)->sh_size >= minsize \
1783205a
NC
560 && (shdr)->sh_entsize == GRP_ENTRY_SIZE \
561 && ((shdr)->sh_size % GRP_ENTRY_SIZE) == 0)
08a40648 562
dbb410c3
AM
563 for (i = 0; i < shnum; i++)
564 {
565 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 566
44534af3 567 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3
AM
568 num_group += 1;
569 }
570
571 if (num_group == 0)
20dbb49d
L
572 {
573 num_group = (unsigned) -1;
574 elf_tdata (abfd)->num_group = num_group;
575 }
576 else
dbb410c3
AM
577 {
578 /* We keep a list of elf section headers for group sections,
579 so we can find them quickly. */
20dbb49d 580 bfd_size_type amt;
d0fb9a8d 581
20dbb49d 582 elf_tdata (abfd)->num_group = num_group;
a50b1753
NC
583 elf_tdata (abfd)->group_sect_ptr = (Elf_Internal_Shdr **)
584 bfd_alloc2 (abfd, num_group, sizeof (Elf_Internal_Shdr *));
dbb410c3 585 if (elf_tdata (abfd)->group_sect_ptr == NULL)
b34976b6 586 return FALSE;
dbb410c3
AM
587
588 num_group = 0;
589 for (i = 0; i < shnum; i++)
590 {
591 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[i];
1783205a 592
44534af3 593 if (IS_VALID_GROUP_SECTION_HEADER (shdr, 2 * GRP_ENTRY_SIZE))
dbb410c3 594 {
973ffd63 595 unsigned char *src;
dbb410c3
AM
596 Elf_Internal_Group *dest;
597
598 /* Add to list of sections. */
599 elf_tdata (abfd)->group_sect_ptr[num_group] = shdr;
600 num_group += 1;
601
602 /* Read the raw contents. */
603 BFD_ASSERT (sizeof (*dest) >= 4);
604 amt = shdr->sh_size * sizeof (*dest) / 4;
a50b1753
NC
605 shdr->contents = (unsigned char *)
606 bfd_alloc2 (abfd, shdr->sh_size, sizeof (*dest) / 4);
1783205a
NC
607 /* PR binutils/4110: Handle corrupt group headers. */
608 if (shdr->contents == NULL)
609 {
610 _bfd_error_handler
611 (_("%B: Corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
612 bfd_set_error (bfd_error_bad_value);
613 return FALSE;
614 }
615
616 memset (shdr->contents, 0, amt);
617
618 if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
dbb410c3
AM
619 || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
620 != shdr->sh_size))
b34976b6 621 return FALSE;
dbb410c3
AM
622
623 /* Translate raw contents, a flag word followed by an
624 array of elf section indices all in target byte order,
625 to the flag word followed by an array of elf section
626 pointers. */
627 src = shdr->contents + shdr->sh_size;
628 dest = (Elf_Internal_Group *) (shdr->contents + amt);
629 while (1)
630 {
631 unsigned int idx;
632
633 src -= 4;
634 --dest;
635 idx = H_GET_32 (abfd, src);
636 if (src == shdr->contents)
637 {
638 dest->flags = idx;
b885599b
AM
639 if (shdr->bfd_section != NULL && (idx & GRP_COMDAT))
640 shdr->bfd_section->flags
641 |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
dbb410c3
AM
642 break;
643 }
644 if (idx >= shnum)
645 {
646 ((*_bfd_error_handler)
d003868e 647 (_("%B: invalid SHT_GROUP entry"), abfd));
dbb410c3
AM
648 idx = 0;
649 }
650 dest->shdr = elf_elfsections (abfd)[idx];
651 }
652 }
653 }
654 }
655 }
656
657 if (num_group != (unsigned) -1)
658 {
659 unsigned int i;
660
661 for (i = 0; i < num_group; i++)
662 {
663 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
664 Elf_Internal_Group *idx = (Elf_Internal_Group *) shdr->contents;
665 unsigned int n_elt = shdr->sh_size / 4;
666
667 /* Look through this group's sections to see if current
668 section is a member. */
669 while (--n_elt != 0)
670 if ((++idx)->shdr == hdr)
671 {
e0e8c97f 672 asection *s = NULL;
dbb410c3
AM
673
674 /* We are a member of this group. Go looking through
675 other members to see if any others are linked via
676 next_in_group. */
677 idx = (Elf_Internal_Group *) shdr->contents;
678 n_elt = shdr->sh_size / 4;
679 while (--n_elt != 0)
680 if ((s = (++idx)->shdr->bfd_section) != NULL
945906ff 681 && elf_next_in_group (s) != NULL)
dbb410c3
AM
682 break;
683 if (n_elt != 0)
684 {
dbb410c3
AM
685 /* Snarf the group name from other member, and
686 insert current section in circular list. */
945906ff
AM
687 elf_group_name (newsect) = elf_group_name (s);
688 elf_next_in_group (newsect) = elf_next_in_group (s);
689 elf_next_in_group (s) = newsect;
dbb410c3
AM
690 }
691 else
692 {
dbb410c3
AM
693 const char *gname;
694
b885599b
AM
695 gname = group_signature (abfd, shdr);
696 if (gname == NULL)
b34976b6 697 return FALSE;
945906ff 698 elf_group_name (newsect) = gname;
dbb410c3
AM
699
700 /* Start a circular list with one element. */
945906ff 701 elf_next_in_group (newsect) = newsect;
dbb410c3 702 }
b885599b 703
9dce4196
AM
704 /* If the group section has been created, point to the
705 new member. */
dbb410c3 706 if (shdr->bfd_section != NULL)
945906ff 707 elf_next_in_group (shdr->bfd_section) = newsect;
b885599b 708
dbb410c3
AM
709 i = num_group - 1;
710 break;
711 }
712 }
713 }
714
945906ff 715 if (elf_group_name (newsect) == NULL)
dbb410c3 716 {
d003868e
AM
717 (*_bfd_error_handler) (_("%B: no group info for section %A"),
718 abfd, newsect);
dbb410c3 719 }
b34976b6 720 return TRUE;
dbb410c3
AM
721}
722
3d7f7666 723bfd_boolean
dd863624 724_bfd_elf_setup_sections (bfd *abfd)
3d7f7666
L
725{
726 unsigned int i;
727 unsigned int num_group = elf_tdata (abfd)->num_group;
728 bfd_boolean result = TRUE;
dd863624
L
729 asection *s;
730
731 /* Process SHF_LINK_ORDER. */
732 for (s = abfd->sections; s != NULL; s = s->next)
733 {
734 Elf_Internal_Shdr *this_hdr = &elf_section_data (s)->this_hdr;
735 if ((this_hdr->sh_flags & SHF_LINK_ORDER) != 0)
736 {
737 unsigned int elfsec = this_hdr->sh_link;
738 /* FIXME: The old Intel compiler and old strip/objcopy may
739 not set the sh_link or sh_info fields. Hence we could
740 get the situation where elfsec is 0. */
741 if (elfsec == 0)
742 {
4fbb74a6 743 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
dd863624
L
744 if (bed->link_order_error_handler)
745 bed->link_order_error_handler
746 (_("%B: warning: sh_link not set for section `%A'"),
747 abfd, s);
748 }
749 else
750 {
91d6fa6a 751 asection *linksec = NULL;
25bbc984 752
4fbb74a6
AM
753 if (elfsec < elf_numsections (abfd))
754 {
755 this_hdr = elf_elfsections (abfd)[elfsec];
91d6fa6a 756 linksec = this_hdr->bfd_section;
4fbb74a6 757 }
25bbc984
L
758
759 /* PR 1991, 2008:
760 Some strip/objcopy may leave an incorrect value in
761 sh_link. We don't want to proceed. */
91d6fa6a 762 if (linksec == NULL)
25bbc984
L
763 {
764 (*_bfd_error_handler)
765 (_("%B: sh_link [%d] in section `%A' is incorrect"),
766 s->owner, s, elfsec);
767 result = FALSE;
768 }
769
91d6fa6a 770 elf_linked_to_section (s) = linksec;
dd863624
L
771 }
772 }
773 }
3d7f7666 774
dd863624 775 /* Process section groups. */
3d7f7666
L
776 if (num_group == (unsigned) -1)
777 return result;
778
779 for (i = 0; i < num_group; i++)
780 {
781 Elf_Internal_Shdr *shdr = elf_tdata (abfd)->group_sect_ptr[i];
782 Elf_Internal_Group *idx = (Elf_Internal_Group *) shdr->contents;
783 unsigned int n_elt = shdr->sh_size / 4;
784
785 while (--n_elt != 0)
786 if ((++idx)->shdr->bfd_section)
787 elf_sec_group (idx->shdr->bfd_section) = shdr->bfd_section;
788 else if (idx->shdr->sh_type == SHT_RELA
789 || idx->shdr->sh_type == SHT_REL)
790 /* We won't include relocation sections in section groups in
791 output object files. We adjust the group section size here
792 so that relocatable link will work correctly when
793 relocation sections are in section group in input object
794 files. */
795 shdr->bfd_section->size -= 4;
796 else
797 {
798 /* There are some unknown sections in the group. */
799 (*_bfd_error_handler)
d003868e
AM
800 (_("%B: unknown [%d] section `%s' in group [%s]"),
801 abfd,
3d7f7666 802 (unsigned int) idx->shdr->sh_type,
1b3a8575
AM
803 bfd_elf_string_from_elf_section (abfd,
804 (elf_elfheader (abfd)
805 ->e_shstrndx),
806 idx->shdr->sh_name),
3d7f7666
L
807 shdr->bfd_section->name);
808 result = FALSE;
809 }
810 }
811 return result;
812}
813
72adc230
AM
814bfd_boolean
815bfd_elf_is_group_section (bfd *abfd ATTRIBUTE_UNUSED, const asection *sec)
816{
817 return elf_next_in_group (sec) != NULL;
818}
819
252b5132
RH
820/* Make a BFD section from an ELF section. We store a pointer to the
821 BFD section in the bfd_section field of the header. */
822
b34976b6 823bfd_boolean
217aa764
AM
824_bfd_elf_make_section_from_shdr (bfd *abfd,
825 Elf_Internal_Shdr *hdr,
6dc132d9
L
826 const char *name,
827 int shindex)
252b5132
RH
828{
829 asection *newsect;
830 flagword flags;
9c5bfbb7 831 const struct elf_backend_data *bed;
252b5132
RH
832
833 if (hdr->bfd_section != NULL)
4e011fb5 834 return TRUE;
252b5132
RH
835
836 newsect = bfd_make_section_anyway (abfd, name);
837 if (newsect == NULL)
b34976b6 838 return FALSE;
252b5132 839
1829f4b2
AM
840 hdr->bfd_section = newsect;
841 elf_section_data (newsect)->this_hdr = *hdr;
6dc132d9 842 elf_section_data (newsect)->this_idx = shindex;
1829f4b2 843
2f89ff8d
L
844 /* Always use the real type/flags. */
845 elf_section_type (newsect) = hdr->sh_type;
846 elf_section_flags (newsect) = hdr->sh_flags;
847
252b5132
RH
848 newsect->filepos = hdr->sh_offset;
849
850 if (! bfd_set_section_vma (abfd, newsect, hdr->sh_addr)
851 || ! bfd_set_section_size (abfd, newsect, hdr->sh_size)
852 || ! bfd_set_section_alignment (abfd, newsect,
72de5009 853 bfd_log2 (hdr->sh_addralign)))
b34976b6 854 return FALSE;
252b5132
RH
855
856 flags = SEC_NO_FLAGS;
857 if (hdr->sh_type != SHT_NOBITS)
858 flags |= SEC_HAS_CONTENTS;
dbb410c3 859 if (hdr->sh_type == SHT_GROUP)
b3096250 860 flags |= SEC_GROUP | SEC_EXCLUDE;
252b5132
RH
861 if ((hdr->sh_flags & SHF_ALLOC) != 0)
862 {
863 flags |= SEC_ALLOC;
864 if (hdr->sh_type != SHT_NOBITS)
865 flags |= SEC_LOAD;
866 }
867 if ((hdr->sh_flags & SHF_WRITE) == 0)
868 flags |= SEC_READONLY;
869 if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
870 flags |= SEC_CODE;
871 else if ((flags & SEC_LOAD) != 0)
872 flags |= SEC_DATA;
f5fa8ca2
JJ
873 if ((hdr->sh_flags & SHF_MERGE) != 0)
874 {
875 flags |= SEC_MERGE;
876 newsect->entsize = hdr->sh_entsize;
877 if ((hdr->sh_flags & SHF_STRINGS) != 0)
878 flags |= SEC_STRINGS;
879 }
dbb410c3
AM
880 if (hdr->sh_flags & SHF_GROUP)
881 if (!setup_group (abfd, hdr, newsect))
b34976b6 882 return FALSE;
13ae64f3
JJ
883 if ((hdr->sh_flags & SHF_TLS) != 0)
884 flags |= SEC_THREAD_LOCAL;
18ae9cc1
L
885 if ((hdr->sh_flags & SHF_EXCLUDE) != 0)
886 flags |= SEC_EXCLUDE;
252b5132 887
3d2b39cf 888 if ((flags & SEC_ALLOC) == 0)
7a6cc5fb 889 {
3d2b39cf
L
890 /* The debugging sections appear to be recognized only by name,
891 not any sort of flag. Their SEC_ALLOC bits are cleared. */
3d2b39cf
L
892 if (name [0] == '.')
893 {
f073ced3
AM
894 const char *p;
895 int n;
896 if (name[1] == 'd')
897 p = ".debug", n = 6;
898 else if (name[1] == 'g' && name[2] == 'n')
899 p = ".gnu.linkonce.wi.", n = 17;
900 else if (name[1] == 'g' && name[2] == 'd')
901 p = ".gdb_index", n = 11; /* yes we really do mean 11. */
902 else if (name[1] == 'l')
903 p = ".line", n = 5;
904 else if (name[1] == 's')
905 p = ".stab", n = 5;
906 else if (name[1] == 'z')
907 p = ".zdebug", n = 7;
908 else
909 p = NULL, n = 0;
910 if (p != NULL && strncmp (name, p, n) == 0)
3d2b39cf
L
911 flags |= SEC_DEBUGGING;
912 }
913 }
252b5132
RH
914
915 /* As a GNU extension, if the name begins with .gnu.linkonce, we
916 only link a single copy of the section. This is used to support
917 g++. g++ will emit each template expansion in its own section.
918 The symbols will be defined as weak, so that multiple definitions
919 are permitted. The GNU linker extension is to actually discard
920 all but one of the sections. */
0112cd26 921 if (CONST_STRNEQ (name, ".gnu.linkonce")
b885599b 922 && elf_next_in_group (newsect) == NULL)
252b5132
RH
923 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
924
fa152c49
JW
925 bed = get_elf_backend_data (abfd);
926 if (bed->elf_backend_section_flags)
927 if (! bed->elf_backend_section_flags (&flags, hdr))
b34976b6 928 return FALSE;
fa152c49 929
252b5132 930 if (! bfd_set_section_flags (abfd, newsect, flags))
b34976b6 931 return FALSE;
252b5132 932
718175fa
JK
933 /* We do not parse the PT_NOTE segments as we are interested even in the
934 separate debug info files which may have the segments offsets corrupted.
935 PT_NOTEs from the core files are currently not parsed using BFD. */
936 if (hdr->sh_type == SHT_NOTE)
937 {
baea7ef1 938 bfd_byte *contents;
718175fa 939
baea7ef1 940 if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
718175fa
JK
941 return FALSE;
942
baea7ef1 943 elf_parse_notes (abfd, (char *) contents, hdr->sh_size, -1);
718175fa
JK
944 free (contents);
945 }
946
252b5132
RH
947 if ((flags & SEC_ALLOC) != 0)
948 {
949 Elf_Internal_Phdr *phdr;
6ffd7900
AM
950 unsigned int i, nload;
951
952 /* Some ELF linkers produce binaries with all the program header
953 p_paddr fields zero. If we have such a binary with more than
954 one PT_LOAD header, then leave the section lma equal to vma
955 so that we don't create sections with overlapping lma. */
956 phdr = elf_tdata (abfd)->phdr;
957 for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
958 if (phdr->p_paddr != 0)
959 break;
960 else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
961 ++nload;
962 if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
963 return TRUE;
252b5132 964
252b5132
RH
965 phdr = elf_tdata (abfd)->phdr;
966 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
967 {
86b2281f
AM
968 if (((phdr->p_type == PT_LOAD
969 && (hdr->sh_flags & SHF_TLS) == 0)
970 || phdr->p_type == PT_TLS)
9a83a553 971 && ELF_SECTION_IN_SEGMENT (hdr, phdr))
252b5132 972 {
88967714
AM
973 if ((flags & SEC_LOAD) == 0)
974 newsect->lma = (phdr->p_paddr
975 + hdr->sh_addr - phdr->p_vaddr);
976 else
977 /* We used to use the same adjustment for SEC_LOAD
978 sections, but that doesn't work if the segment
979 is packed with code from multiple VMAs.
980 Instead we calculate the section LMA based on
981 the segment LMA. It is assumed that the
982 segment will contain sections with contiguous
983 LMAs, even if the VMAs are not. */
984 newsect->lma = (phdr->p_paddr
985 + hdr->sh_offset - phdr->p_offset);
986
987 /* With contiguous segments, we can't tell from file
988 offsets whether a section with zero size should
989 be placed at the end of one segment or the
990 beginning of the next. Decide based on vaddr. */
991 if (hdr->sh_addr >= phdr->p_vaddr
992 && (hdr->sh_addr + hdr->sh_size
993 <= phdr->p_vaddr + phdr->p_memsz))
994 break;
252b5132
RH
995 }
996 }
997 }
998
4a114e3e
L
999 /* Compress/decompress DWARF debug sections with names: .debug_* and
1000 .zdebug_*, after the section flags is set. */
1001 if ((flags & SEC_DEBUGGING)
1002 && ((name[1] == 'd' && name[6] == '_')
1003 || (name[1] == 'z' && name[7] == '_')))
1004 {
1005 enum { nothing, compress, decompress } action = nothing;
4e011fb5 1006 char *new_name;
4a114e3e
L
1007
1008 if (bfd_is_section_compressed (abfd, newsect))
1009 {
1010 /* Compressed section. Check if we should decompress. */
1011 if ((abfd->flags & BFD_DECOMPRESS))
1012 action = decompress;
1013 }
1014 else
1015 {
1016 /* Normal section. Check if we should compress. */
5a5ed5b0 1017 if ((abfd->flags & BFD_COMPRESS) && newsect->size != 0)
4a114e3e
L
1018 action = compress;
1019 }
1020
4e011fb5 1021 new_name = NULL;
4a114e3e
L
1022 switch (action)
1023 {
1024 case nothing:
1025 break;
1026 case compress:
1027 if (!bfd_init_section_compress_status (abfd, newsect))
1028 {
1029 (*_bfd_error_handler)
bc823199 1030 (_("%B: unable to initialize compress status for section %s"),
4a114e3e
L
1031 abfd, name);
1032 return FALSE;
1033 }
4e011fb5
AM
1034 if (name[1] != 'z')
1035 {
1036 unsigned int len = strlen (name);
1037
1038 new_name = bfd_alloc (abfd, len + 2);
1039 if (new_name == NULL)
1040 return FALSE;
1041 new_name[0] = '.';
1042 new_name[1] = 'z';
1043 memcpy (new_name + 2, name + 1, len);
1044 }
4a114e3e
L
1045 break;
1046 case decompress:
1047 if (!bfd_init_section_decompress_status (abfd, newsect))
1048 {
1049 (*_bfd_error_handler)
bc823199 1050 (_("%B: unable to initialize decompress status for section %s"),
4a114e3e
L
1051 abfd, name);
1052 return FALSE;
1053 }
4e011fb5
AM
1054 if (name[1] == 'z')
1055 {
1056 unsigned int len = strlen (name);
1057
1058 new_name = bfd_alloc (abfd, len);
1059 if (new_name == NULL)
1060 return FALSE;
1061 new_name[0] = '.';
1062 memcpy (new_name + 1, name + 2, len - 1);
1063 }
4a114e3e
L
1064 break;
1065 }
4e011fb5
AM
1066 if (new_name != NULL)
1067 bfd_rename_section (abfd, newsect, new_name);
4a114e3e
L
1068 }
1069
b34976b6 1070 return TRUE;
252b5132
RH
1071}
1072
252b5132
RH
1073const char *const bfd_elf_section_type_names[] = {
1074 "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
1075 "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
1076 "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM",
1077};
1078
1049f94e 1079/* ELF relocs are against symbols. If we are producing relocatable
252b5132
RH
1080 output, and the reloc is against an external symbol, and nothing
1081 has given us any additional addend, the resulting reloc will also
1082 be against the same symbol. In such a case, we don't want to
1083 change anything about the way the reloc is handled, since it will
1084 all be done at final link time. Rather than put special case code
1085 into bfd_perform_relocation, all the reloc types use this howto
1086 function. It just short circuits the reloc if producing
1049f94e 1087 relocatable output against an external symbol. */
252b5132 1088
252b5132 1089bfd_reloc_status_type
217aa764
AM
1090bfd_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1091 arelent *reloc_entry,
1092 asymbol *symbol,
1093 void *data ATTRIBUTE_UNUSED,
1094 asection *input_section,
1095 bfd *output_bfd,
1096 char **error_message ATTRIBUTE_UNUSED)
1097{
1098 if (output_bfd != NULL
252b5132
RH
1099 && (symbol->flags & BSF_SECTION_SYM) == 0
1100 && (! reloc_entry->howto->partial_inplace
1101 || reloc_entry->addend == 0))
1102 {
1103 reloc_entry->address += input_section->output_offset;
1104 return bfd_reloc_ok;
1105 }
1106
1107 return bfd_reloc_continue;
1108}
1109\f
0ac4564e
L
1110/* Copy the program header and other data from one object module to
1111 another. */
252b5132 1112
b34976b6 1113bfd_boolean
217aa764 1114_bfd_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
2d502050
L
1115{
1116 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1117 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 1118 return TRUE;
2d502050 1119
57b828ef
L
1120 if (!elf_flags_init (obfd))
1121 {
1122 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1123 elf_flags_init (obfd) = TRUE;
1124 }
2d502050 1125
0ac4564e 1126 elf_gp (obfd) = elf_gp (ibfd);
57b828ef
L
1127
1128 /* Also copy the EI_OSABI field. */
1129 elf_elfheader (obfd)->e_ident[EI_OSABI] =
1130 elf_elfheader (ibfd)->e_ident[EI_OSABI];
104d59d1
JM
1131
1132 /* Copy object attributes. */
1133 _bfd_elf_copy_obj_attributes (ibfd, obfd);
b34976b6 1134 return TRUE;
2d502050
L
1135}
1136
cedc298e
L
1137static const char *
1138get_segment_type (unsigned int p_type)
1139{
1140 const char *pt;
1141 switch (p_type)
1142 {
1143 case PT_NULL: pt = "NULL"; break;
1144 case PT_LOAD: pt = "LOAD"; break;
1145 case PT_DYNAMIC: pt = "DYNAMIC"; break;
1146 case PT_INTERP: pt = "INTERP"; break;
1147 case PT_NOTE: pt = "NOTE"; break;
1148 case PT_SHLIB: pt = "SHLIB"; break;
1149 case PT_PHDR: pt = "PHDR"; break;
1150 case PT_TLS: pt = "TLS"; break;
1151 case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break;
2b05f1b7 1152 case PT_GNU_STACK: pt = "STACK"; break;
cedc298e
L
1153 case PT_GNU_RELRO: pt = "RELRO"; break;
1154 default: pt = NULL; break;
1155 }
1156 return pt;
1157}
1158
f0b79d91
L
1159/* Print out the program headers. */
1160
b34976b6 1161bfd_boolean
217aa764 1162_bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
252b5132 1163{
a50b1753 1164 FILE *f = (FILE *) farg;
252b5132
RH
1165 Elf_Internal_Phdr *p;
1166 asection *s;
1167 bfd_byte *dynbuf = NULL;
1168
1169 p = elf_tdata (abfd)->phdr;
1170 if (p != NULL)
1171 {
1172 unsigned int i, c;
1173
1174 fprintf (f, _("\nProgram Header:\n"));
1175 c = elf_elfheader (abfd)->e_phnum;
1176 for (i = 0; i < c; i++, p++)
1177 {
cedc298e 1178 const char *pt = get_segment_type (p->p_type);
252b5132
RH
1179 char buf[20];
1180
cedc298e 1181 if (pt == NULL)
252b5132 1182 {
cedc298e
L
1183 sprintf (buf, "0x%lx", p->p_type);
1184 pt = buf;
252b5132 1185 }
dc810e39 1186 fprintf (f, "%8s off 0x", pt);
60b89a18 1187 bfd_fprintf_vma (abfd, f, p->p_offset);
252b5132 1188 fprintf (f, " vaddr 0x");
60b89a18 1189 bfd_fprintf_vma (abfd, f, p->p_vaddr);
252b5132 1190 fprintf (f, " paddr 0x");
60b89a18 1191 bfd_fprintf_vma (abfd, f, p->p_paddr);
252b5132
RH
1192 fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
1193 fprintf (f, " filesz 0x");
60b89a18 1194 bfd_fprintf_vma (abfd, f, p->p_filesz);
252b5132 1195 fprintf (f, " memsz 0x");
60b89a18 1196 bfd_fprintf_vma (abfd, f, p->p_memsz);
252b5132
RH
1197 fprintf (f, " flags %c%c%c",
1198 (p->p_flags & PF_R) != 0 ? 'r' : '-',
1199 (p->p_flags & PF_W) != 0 ? 'w' : '-',
1200 (p->p_flags & PF_X) != 0 ? 'x' : '-');
dc810e39
AM
1201 if ((p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X)) != 0)
1202 fprintf (f, " %lx", p->p_flags &~ (unsigned) (PF_R | PF_W | PF_X));
252b5132
RH
1203 fprintf (f, "\n");
1204 }
1205 }
1206
1207 s = bfd_get_section_by_name (abfd, ".dynamic");
1208 if (s != NULL)
1209 {
cb33740c 1210 unsigned int elfsec;
dc810e39 1211 unsigned long shlink;
252b5132
RH
1212 bfd_byte *extdyn, *extdynend;
1213 size_t extdynsize;
217aa764 1214 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
252b5132
RH
1215
1216 fprintf (f, _("\nDynamic Section:\n"));
1217
eea6121a 1218 if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
252b5132
RH
1219 goto error_return;
1220
1221 elfsec = _bfd_elf_section_from_bfd_section (abfd, s);
cb33740c 1222 if (elfsec == SHN_BAD)
252b5132 1223 goto error_return;
dc810e39 1224 shlink = elf_elfsections (abfd)[elfsec]->sh_link;
252b5132
RH
1225
1226 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1227 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1228
1229 extdyn = dynbuf;
eea6121a 1230 extdynend = extdyn + s->size;
252b5132
RH
1231 for (; extdyn < extdynend; extdyn += extdynsize)
1232 {
1233 Elf_Internal_Dyn dyn;
ad9563d6 1234 const char *name = "";
252b5132 1235 char ab[20];
b34976b6 1236 bfd_boolean stringp;
ad9563d6 1237 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 1238
217aa764 1239 (*swap_dyn_in) (abfd, extdyn, &dyn);
252b5132
RH
1240
1241 if (dyn.d_tag == DT_NULL)
1242 break;
1243
b34976b6 1244 stringp = FALSE;
252b5132
RH
1245 switch (dyn.d_tag)
1246 {
1247 default:
ad9563d6
CM
1248 if (bed->elf_backend_get_target_dtag)
1249 name = (*bed->elf_backend_get_target_dtag) (dyn.d_tag);
1250
1251 if (!strcmp (name, ""))
1252 {
1253 sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag);
1254 name = ab;
1255 }
252b5132
RH
1256 break;
1257
b34976b6 1258 case DT_NEEDED: name = "NEEDED"; stringp = TRUE; break;
252b5132
RH
1259 case DT_PLTRELSZ: name = "PLTRELSZ"; break;
1260 case DT_PLTGOT: name = "PLTGOT"; break;
1261 case DT_HASH: name = "HASH"; break;
1262 case DT_STRTAB: name = "STRTAB"; break;
1263 case DT_SYMTAB: name = "SYMTAB"; break;
1264 case DT_RELA: name = "RELA"; break;
1265 case DT_RELASZ: name = "RELASZ"; break;
1266 case DT_RELAENT: name = "RELAENT"; break;
1267 case DT_STRSZ: name = "STRSZ"; break;
1268 case DT_SYMENT: name = "SYMENT"; break;
1269 case DT_INIT: name = "INIT"; break;
1270 case DT_FINI: name = "FINI"; break;
b34976b6
AM
1271 case DT_SONAME: name = "SONAME"; stringp = TRUE; break;
1272 case DT_RPATH: name = "RPATH"; stringp = TRUE; break;
252b5132
RH
1273 case DT_SYMBOLIC: name = "SYMBOLIC"; break;
1274 case DT_REL: name = "REL"; break;
1275 case DT_RELSZ: name = "RELSZ"; break;
1276 case DT_RELENT: name = "RELENT"; break;
1277 case DT_PLTREL: name = "PLTREL"; break;
1278 case DT_DEBUG: name = "DEBUG"; break;
1279 case DT_TEXTREL: name = "TEXTREL"; break;
1280 case DT_JMPREL: name = "JMPREL"; break;
94558834
L
1281 case DT_BIND_NOW: name = "BIND_NOW"; break;
1282 case DT_INIT_ARRAY: name = "INIT_ARRAY"; break;
1283 case DT_FINI_ARRAY: name = "FINI_ARRAY"; break;
1284 case DT_INIT_ARRAYSZ: name = "INIT_ARRAYSZ"; break;
1285 case DT_FINI_ARRAYSZ: name = "FINI_ARRAYSZ"; break;
b34976b6 1286 case DT_RUNPATH: name = "RUNPATH"; stringp = TRUE; break;
94558834
L
1287 case DT_FLAGS: name = "FLAGS"; break;
1288 case DT_PREINIT_ARRAY: name = "PREINIT_ARRAY"; break;
1289 case DT_PREINIT_ARRAYSZ: name = "PREINIT_ARRAYSZ"; break;
d48188b9 1290 case DT_CHECKSUM: name = "CHECKSUM"; break;
94558834
L
1291 case DT_PLTPADSZ: name = "PLTPADSZ"; break;
1292 case DT_MOVEENT: name = "MOVEENT"; break;
1293 case DT_MOVESZ: name = "MOVESZ"; break;
1294 case DT_FEATURE: name = "FEATURE"; break;
1295 case DT_POSFLAG_1: name = "POSFLAG_1"; break;
1296 case DT_SYMINSZ: name = "SYMINSZ"; break;
1297 case DT_SYMINENT: name = "SYMINENT"; break;
b34976b6
AM
1298 case DT_CONFIG: name = "CONFIG"; stringp = TRUE; break;
1299 case DT_DEPAUDIT: name = "DEPAUDIT"; stringp = TRUE; break;
1300 case DT_AUDIT: name = "AUDIT"; stringp = TRUE; break;
94558834
L
1301 case DT_PLTPAD: name = "PLTPAD"; break;
1302 case DT_MOVETAB: name = "MOVETAB"; break;
1303 case DT_SYMINFO: name = "SYMINFO"; break;
1304 case DT_RELACOUNT: name = "RELACOUNT"; break;
1305 case DT_RELCOUNT: name = "RELCOUNT"; break;
1306 case DT_FLAGS_1: name = "FLAGS_1"; break;
252b5132
RH
1307 case DT_VERSYM: name = "VERSYM"; break;
1308 case DT_VERDEF: name = "VERDEF"; break;
1309 case DT_VERDEFNUM: name = "VERDEFNUM"; break;
1310 case DT_VERNEED: name = "VERNEED"; break;
1311 case DT_VERNEEDNUM: name = "VERNEEDNUM"; break;
b34976b6 1312 case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
94558834 1313 case DT_USED: name = "USED"; break;
b34976b6 1314 case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
fdc90cb4 1315 case DT_GNU_HASH: name = "GNU_HASH"; break;
252b5132
RH
1316 }
1317
ad9563d6 1318 fprintf (f, " %-20s ", name);
252b5132 1319 if (! stringp)
a1f3c56e
AN
1320 {
1321 fprintf (f, "0x");
1322 bfd_fprintf_vma (abfd, f, dyn.d_un.d_val);
1323 }
252b5132
RH
1324 else
1325 {
1326 const char *string;
dc810e39 1327 unsigned int tagv = dyn.d_un.d_val;
252b5132 1328
dc810e39 1329 string = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
252b5132
RH
1330 if (string == NULL)
1331 goto error_return;
1332 fprintf (f, "%s", string);
1333 }
1334 fprintf (f, "\n");
1335 }
1336
1337 free (dynbuf);
1338 dynbuf = NULL;
1339 }
1340
1341 if ((elf_dynverdef (abfd) != 0 && elf_tdata (abfd)->verdef == NULL)
1342 || (elf_dynverref (abfd) != 0 && elf_tdata (abfd)->verref == NULL))
1343 {
fc0e6df6 1344 if (! _bfd_elf_slurp_version_tables (abfd, FALSE))
b34976b6 1345 return FALSE;
252b5132
RH
1346 }
1347
1348 if (elf_dynverdef (abfd) != 0)
1349 {
1350 Elf_Internal_Verdef *t;
1351
1352 fprintf (f, _("\nVersion definitions:\n"));
1353 for (t = elf_tdata (abfd)->verdef; t != NULL; t = t->vd_nextdef)
1354 {
1355 fprintf (f, "%d 0x%2.2x 0x%8.8lx %s\n", t->vd_ndx,
d0fb9a8d
JJ
1356 t->vd_flags, t->vd_hash,
1357 t->vd_nodename ? t->vd_nodename : "<corrupt>");
1358 if (t->vd_auxptr != NULL && t->vd_auxptr->vda_nextptr != NULL)
252b5132
RH
1359 {
1360 Elf_Internal_Verdaux *a;
1361
1362 fprintf (f, "\t");
1363 for (a = t->vd_auxptr->vda_nextptr;
1364 a != NULL;
1365 a = a->vda_nextptr)
d0fb9a8d
JJ
1366 fprintf (f, "%s ",
1367 a->vda_nodename ? a->vda_nodename : "<corrupt>");
252b5132
RH
1368 fprintf (f, "\n");
1369 }
1370 }
1371 }
1372
1373 if (elf_dynverref (abfd) != 0)
1374 {
1375 Elf_Internal_Verneed *t;
1376
1377 fprintf (f, _("\nVersion References:\n"));
1378 for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref)
1379 {
1380 Elf_Internal_Vernaux *a;
1381
d0fb9a8d
JJ
1382 fprintf (f, _(" required from %s:\n"),
1383 t->vn_filename ? t->vn_filename : "<corrupt>");
252b5132
RH
1384 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1385 fprintf (f, " 0x%8.8lx 0x%2.2x %2.2d %s\n", a->vna_hash,
d0fb9a8d
JJ
1386 a->vna_flags, a->vna_other,
1387 a->vna_nodename ? a->vna_nodename : "<corrupt>");
252b5132
RH
1388 }
1389 }
1390
b34976b6 1391 return TRUE;
252b5132
RH
1392
1393 error_return:
1394 if (dynbuf != NULL)
1395 free (dynbuf);
b34976b6 1396 return FALSE;
252b5132
RH
1397}
1398
1399/* Display ELF-specific fields of a symbol. */
1400
1401void
217aa764
AM
1402bfd_elf_print_symbol (bfd *abfd,
1403 void *filep,
1404 asymbol *symbol,
1405 bfd_print_symbol_type how)
252b5132 1406{
a50b1753 1407 FILE *file = (FILE *) filep;
252b5132
RH
1408 switch (how)
1409 {
1410 case bfd_print_symbol_name:
1411 fprintf (file, "%s", symbol->name);
1412 break;
1413 case bfd_print_symbol_more:
1414 fprintf (file, "elf ");
60b89a18 1415 bfd_fprintf_vma (abfd, file, symbol->value);
0af1713e 1416 fprintf (file, " %lx", (unsigned long) symbol->flags);
252b5132
RH
1417 break;
1418 case bfd_print_symbol_all:
1419 {
4e8a9624
AM
1420 const char *section_name;
1421 const char *name = NULL;
9c5bfbb7 1422 const struct elf_backend_data *bed;
7a13edea 1423 unsigned char st_other;
dbb410c3 1424 bfd_vma val;
c044fabd 1425
252b5132 1426 section_name = symbol->section ? symbol->section->name : "(*none*)";
587ff49e
RH
1427
1428 bed = get_elf_backend_data (abfd);
1429 if (bed->elf_backend_print_symbol_all)
c044fabd 1430 name = (*bed->elf_backend_print_symbol_all) (abfd, filep, symbol);
587ff49e
RH
1431
1432 if (name == NULL)
1433 {
7ee38065 1434 name = symbol->name;
217aa764 1435 bfd_print_symbol_vandf (abfd, file, symbol);
587ff49e
RH
1436 }
1437
252b5132
RH
1438 fprintf (file, " %s\t", section_name);
1439 /* Print the "other" value for a symbol. For common symbols,
1440 we've already printed the size; now print the alignment.
1441 For other symbols, we have no specified alignment, and
1442 we've printed the address; now print the size. */
dcf6c779 1443 if (symbol->section && bfd_is_com_section (symbol->section))
dbb410c3
AM
1444 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
1445 else
1446 val = ((elf_symbol_type *) symbol)->internal_elf_sym.st_size;
1447 bfd_fprintf_vma (abfd, file, val);
252b5132
RH
1448
1449 /* If we have version information, print it. */
12bd6957
AM
1450 if (elf_dynversym (abfd) != 0
1451 && (elf_dynverdef (abfd) != 0
1452 || elf_dynverref (abfd) != 0))
252b5132
RH
1453 {
1454 unsigned int vernum;
1455 const char *version_string;
1456
1457 vernum = ((elf_symbol_type *) symbol)->version & VERSYM_VERSION;
1458
1459 if (vernum == 0)
1460 version_string = "";
1461 else if (vernum == 1)
1462 version_string = "Base";
1463 else if (vernum <= elf_tdata (abfd)->cverdefs)
1464 version_string =
1465 elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
1466 else
1467 {
1468 Elf_Internal_Verneed *t;
1469
1470 version_string = "";
1471 for (t = elf_tdata (abfd)->verref;
1472 t != NULL;
1473 t = t->vn_nextref)
1474 {
1475 Elf_Internal_Vernaux *a;
1476
1477 for (a = t->vn_auxptr; a != NULL; a = a->vna_nextptr)
1478 {
1479 if (a->vna_other == vernum)
1480 {
1481 version_string = a->vna_nodename;
1482 break;
1483 }
1484 }
1485 }
1486 }
1487
1488 if ((((elf_symbol_type *) symbol)->version & VERSYM_HIDDEN) == 0)
1489 fprintf (file, " %-11s", version_string);
1490 else
1491 {
1492 int i;
1493
1494 fprintf (file, " (%s)", version_string);
1495 for (i = 10 - strlen (version_string); i > 0; --i)
1496 putc (' ', file);
1497 }
1498 }
1499
1500 /* If the st_other field is not zero, print it. */
7a13edea 1501 st_other = ((elf_symbol_type *) symbol)->internal_elf_sym.st_other;
c044fabd 1502
7a13edea
NC
1503 switch (st_other)
1504 {
1505 case 0: break;
1506 case STV_INTERNAL: fprintf (file, " .internal"); break;
1507 case STV_HIDDEN: fprintf (file, " .hidden"); break;
1508 case STV_PROTECTED: fprintf (file, " .protected"); break;
1509 default:
1510 /* Some other non-defined flags are also present, so print
1511 everything hex. */
1512 fprintf (file, " 0x%02x", (unsigned int) st_other);
1513 }
252b5132 1514
587ff49e 1515 fprintf (file, " %s", name);
252b5132
RH
1516 }
1517 break;
1518 }
1519}
252b5132 1520
252b5132
RH
1521/* Allocate an ELF string table--force the first byte to be zero. */
1522
1523struct bfd_strtab_hash *
217aa764 1524_bfd_elf_stringtab_init (void)
252b5132
RH
1525{
1526 struct bfd_strtab_hash *ret;
1527
1528 ret = _bfd_stringtab_init ();
1529 if (ret != NULL)
1530 {
1531 bfd_size_type loc;
1532
b34976b6 1533 loc = _bfd_stringtab_add (ret, "", TRUE, FALSE);
252b5132
RH
1534 BFD_ASSERT (loc == 0 || loc == (bfd_size_type) -1);
1535 if (loc == (bfd_size_type) -1)
1536 {
1537 _bfd_stringtab_free (ret);
1538 ret = NULL;
1539 }
1540 }
1541 return ret;
1542}
1543\f
1544/* ELF .o/exec file reading */
1545
c044fabd 1546/* Create a new bfd section from an ELF section header. */
252b5132 1547
b34976b6 1548bfd_boolean
217aa764 1549bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
252b5132 1550{
4fbb74a6
AM
1551 Elf_Internal_Shdr *hdr;
1552 Elf_Internal_Ehdr *ehdr;
1553 const struct elf_backend_data *bed;
90937f86 1554 const char *name;
252b5132 1555
4fbb74a6
AM
1556 if (shindex >= elf_numsections (abfd))
1557 return FALSE;
1558
1559 hdr = elf_elfsections (abfd)[shindex];
1560 ehdr = elf_elfheader (abfd);
1561 name = bfd_elf_string_from_elf_section (abfd, ehdr->e_shstrndx,
1b3a8575 1562 hdr->sh_name);
933d961a
JJ
1563 if (name == NULL)
1564 return FALSE;
252b5132 1565
4fbb74a6 1566 bed = get_elf_backend_data (abfd);
252b5132
RH
1567 switch (hdr->sh_type)
1568 {
1569 case SHT_NULL:
1570 /* Inactive section. Throw it away. */
b34976b6 1571 return TRUE;
252b5132
RH
1572
1573 case SHT_PROGBITS: /* Normal section with contents. */
252b5132
RH
1574 case SHT_NOBITS: /* .bss section. */
1575 case SHT_HASH: /* .hash section. */
1576 case SHT_NOTE: /* .note section. */
25e27870
L
1577 case SHT_INIT_ARRAY: /* .init_array section. */
1578 case SHT_FINI_ARRAY: /* .fini_array section. */
1579 case SHT_PREINIT_ARRAY: /* .preinit_array section. */
7f1204bb 1580 case SHT_GNU_LIBLIST: /* .gnu.liblist section. */
fdc90cb4 1581 case SHT_GNU_HASH: /* .gnu.hash section. */
6dc132d9 1582 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
252b5132 1583
797fc050 1584 case SHT_DYNAMIC: /* Dynamic linking information. */
6dc132d9 1585 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
b34976b6 1586 return FALSE;
cfcac11d
NC
1587 if (hdr->sh_link > elf_numsections (abfd))
1588 {
caa83f8b 1589 /* PR 10478: Accept Solaris binaries with a sh_link
cfcac11d
NC
1590 field set to SHN_BEFORE or SHN_AFTER. */
1591 switch (bfd_get_arch (abfd))
1592 {
caa83f8b 1593 case bfd_arch_i386:
cfcac11d
NC
1594 case bfd_arch_sparc:
1595 if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
1596 || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
1597 break;
1598 /* Otherwise fall through. */
1599 default:
1600 return FALSE;
1601 }
1602 }
1603 else if (elf_elfsections (abfd)[hdr->sh_link] == NULL)
8e0ed13f 1604 return FALSE;
cfcac11d 1605 else if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_STRTAB)
797fc050
AM
1606 {
1607 Elf_Internal_Shdr *dynsymhdr;
1608
1609 /* The shared libraries distributed with hpux11 have a bogus
1610 sh_link field for the ".dynamic" section. Find the
1611 string table for the ".dynsym" section instead. */
1612 if (elf_dynsymtab (abfd) != 0)
1613 {
1614 dynsymhdr = elf_elfsections (abfd)[elf_dynsymtab (abfd)];
1615 hdr->sh_link = dynsymhdr->sh_link;
1616 }
1617 else
1618 {
1619 unsigned int i, num_sec;
1620
1621 num_sec = elf_numsections (abfd);
1622 for (i = 1; i < num_sec; i++)
1623 {
1624 dynsymhdr = elf_elfsections (abfd)[i];
1625 if (dynsymhdr->sh_type == SHT_DYNSYM)
1626 {
1627 hdr->sh_link = dynsymhdr->sh_link;
1628 break;
1629 }
1630 }
1631 }
1632 }
1633 break;
1634
252b5132
RH
1635 case SHT_SYMTAB: /* A symbol table */
1636 if (elf_onesymtab (abfd) == shindex)
b34976b6 1637 return TRUE;
252b5132 1638
a50b2160
JJ
1639 if (hdr->sh_entsize != bed->s->sizeof_sym)
1640 return FALSE;
3337c1e5 1641 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
eee3b786
AM
1642 {
1643 if (hdr->sh_size != 0)
1644 return FALSE;
1645 /* Some assemblers erroneously set sh_info to one with a
1646 zero sh_size. ld sees this as a global symbol count
1647 of (unsigned) -1. Fix it here. */
1648 hdr->sh_info = 0;
1649 return TRUE;
1650 }
252b5132
RH
1651 BFD_ASSERT (elf_onesymtab (abfd) == 0);
1652 elf_onesymtab (abfd) = shindex;
1653 elf_tdata (abfd)->symtab_hdr = *hdr;
1654 elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->symtab_hdr;
1655 abfd->flags |= HAS_SYMS;
1656
1657 /* Sometimes a shared object will map in the symbol table. If
08a40648
AM
1658 SHF_ALLOC is set, and this is a shared object, then we also
1659 treat this section as a BFD section. We can not base the
1660 decision purely on SHF_ALLOC, because that flag is sometimes
1661 set in a relocatable object file, which would confuse the
1662 linker. */
252b5132
RH
1663 if ((hdr->sh_flags & SHF_ALLOC) != 0
1664 && (abfd->flags & DYNAMIC) != 0
6dc132d9
L
1665 && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name,
1666 shindex))
b34976b6 1667 return FALSE;
252b5132 1668
1b3a8575
AM
1669 /* Go looking for SHT_SYMTAB_SHNDX too, since if there is one we
1670 can't read symbols without that section loaded as well. It
1671 is most likely specified by the next section header. */
1672 if (elf_elfsections (abfd)[elf_symtab_shndx (abfd)]->sh_link != shindex)
1673 {
1674 unsigned int i, num_sec;
1675
1676 num_sec = elf_numsections (abfd);
1677 for (i = shindex + 1; i < num_sec; i++)
1678 {
1679 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
1680 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
1681 && hdr2->sh_link == shindex)
1682 break;
1683 }
1684 if (i == num_sec)
1685 for (i = 1; i < shindex; i++)
1686 {
1687 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
1688 if (hdr2->sh_type == SHT_SYMTAB_SHNDX
1689 && hdr2->sh_link == shindex)
1690 break;
1691 }
1692 if (i != shindex)
1693 return bfd_section_from_shdr (abfd, i);
1694 }
b34976b6 1695 return TRUE;
252b5132
RH
1696
1697 case SHT_DYNSYM: /* A dynamic symbol table */
1698 if (elf_dynsymtab (abfd) == shindex)
b34976b6 1699 return TRUE;
252b5132 1700
a50b2160
JJ
1701 if (hdr->sh_entsize != bed->s->sizeof_sym)
1702 return FALSE;
eee3b786
AM
1703 if (hdr->sh_info * hdr->sh_entsize > hdr->sh_size)
1704 {
1705 if (hdr->sh_size != 0)
1706 return FALSE;
1707 /* Some linkers erroneously set sh_info to one with a
1708 zero sh_size. ld sees this as a global symbol count
1709 of (unsigned) -1. Fix it here. */
1710 hdr->sh_info = 0;
1711 return TRUE;
1712 }
252b5132
RH
1713 BFD_ASSERT (elf_dynsymtab (abfd) == 0);
1714 elf_dynsymtab (abfd) = shindex;
1715 elf_tdata (abfd)->dynsymtab_hdr = *hdr;
1716 elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1717 abfd->flags |= HAS_SYMS;
1718
1719 /* Besides being a symbol table, we also treat this as a regular
1720 section, so that objcopy can handle it. */
6dc132d9 1721 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
252b5132 1722
9ad5cbcf
AM
1723 case SHT_SYMTAB_SHNDX: /* Symbol section indices when >64k sections */
1724 if (elf_symtab_shndx (abfd) == shindex)
b34976b6 1725 return TRUE;
9ad5cbcf 1726
1b3a8575 1727 BFD_ASSERT (elf_symtab_shndx (abfd) == 0);
9ad5cbcf
AM
1728 elf_symtab_shndx (abfd) = shindex;
1729 elf_tdata (abfd)->symtab_shndx_hdr = *hdr;
1730 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->symtab_shndx_hdr;
b34976b6 1731 return TRUE;
9ad5cbcf 1732
252b5132
RH
1733 case SHT_STRTAB: /* A string table */
1734 if (hdr->bfd_section != NULL)
b34976b6 1735 return TRUE;
252b5132
RH
1736 if (ehdr->e_shstrndx == shindex)
1737 {
1738 elf_tdata (abfd)->shstrtab_hdr = *hdr;
1739 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
b34976b6 1740 return TRUE;
252b5132 1741 }
1b3a8575
AM
1742 if (elf_elfsections (abfd)[elf_onesymtab (abfd)]->sh_link == shindex)
1743 {
1744 symtab_strtab:
1745 elf_tdata (abfd)->strtab_hdr = *hdr;
1746 elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->strtab_hdr;
1747 return TRUE;
1748 }
1749 if (elf_elfsections (abfd)[elf_dynsymtab (abfd)]->sh_link == shindex)
1750 {
1751 dynsymtab_strtab:
1752 elf_tdata (abfd)->dynstrtab_hdr = *hdr;
1753 hdr = &elf_tdata (abfd)->dynstrtab_hdr;
1754 elf_elfsections (abfd)[shindex] = hdr;
1755 /* We also treat this as a regular section, so that objcopy
1756 can handle it. */
6dc132d9
L
1757 return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
1758 shindex);
1b3a8575 1759 }
252b5132 1760
1b3a8575
AM
1761 /* If the string table isn't one of the above, then treat it as a
1762 regular section. We need to scan all the headers to be sure,
1763 just in case this strtab section appeared before the above. */
1764 if (elf_onesymtab (abfd) == 0 || elf_dynsymtab (abfd) == 0)
1765 {
1766 unsigned int i, num_sec;
252b5132 1767
1b3a8575
AM
1768 num_sec = elf_numsections (abfd);
1769 for (i = 1; i < num_sec; i++)
1770 {
1771 Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i];
1772 if (hdr2->sh_link == shindex)
1773 {
933d961a
JJ
1774 /* Prevent endless recursion on broken objects. */
1775 if (i == shindex)
1776 return FALSE;
1b3a8575
AM
1777 if (! bfd_section_from_shdr (abfd, i))
1778 return FALSE;
1779 if (elf_onesymtab (abfd) == i)
1780 goto symtab_strtab;
1781 if (elf_dynsymtab (abfd) == i)
1782 goto dynsymtab_strtab;
1783 }
1784 }
1785 }
6dc132d9 1786 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
252b5132
RH
1787
1788 case SHT_REL:
1789 case SHT_RELA:
1790 /* *These* do a lot of work -- but build no sections! */
1791 {
1792 asection *target_sect;
d4730f92 1793 Elf_Internal_Shdr *hdr2, **p_hdr;
9ad5cbcf 1794 unsigned int num_sec = elf_numsections (abfd);
d4730f92
BS
1795 struct bfd_elf_section_data *esdt;
1796 bfd_size_type amt;
252b5132 1797
aa2ca951
JJ
1798 if (hdr->sh_entsize
1799 != (bfd_size_type) (hdr->sh_type == SHT_REL
a50b2160
JJ
1800 ? bed->s->sizeof_rel : bed->s->sizeof_rela))
1801 return FALSE;
1802
03ae5f59 1803 /* Check for a bogus link to avoid crashing. */
4fbb74a6 1804 if (hdr->sh_link >= num_sec)
03ae5f59
ILT
1805 {
1806 ((*_bfd_error_handler)
d003868e
AM
1807 (_("%B: invalid link %lu for reloc section %s (index %u)"),
1808 abfd, hdr->sh_link, name, shindex));
6dc132d9
L
1809 return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
1810 shindex);
03ae5f59
ILT
1811 }
1812
252b5132
RH
1813 /* For some incomprehensible reason Oracle distributes
1814 libraries for Solaris in which some of the objects have
1815 bogus sh_link fields. It would be nice if we could just
1816 reject them, but, unfortunately, some people need to use
1817 them. We scan through the section headers; if we find only
1818 one suitable symbol table, we clobber the sh_link to point
83b89087
L
1819 to it. I hope this doesn't break anything.
1820
1821 Don't do it on executable nor shared library. */
1822 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0
1823 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB
252b5132
RH
1824 && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM)
1825 {
9ad5cbcf 1826 unsigned int scan;
252b5132
RH
1827 int found;
1828
1829 found = 0;
9ad5cbcf 1830 for (scan = 1; scan < num_sec; scan++)
252b5132
RH
1831 {
1832 if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB
1833 || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM)
1834 {
1835 if (found != 0)
1836 {
1837 found = 0;
1838 break;
1839 }
1840 found = scan;
1841 }
1842 }
1843 if (found != 0)
1844 hdr->sh_link = found;
1845 }
1846
1847 /* Get the symbol table. */
1b3a8575
AM
1848 if ((elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB
1849 || elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_DYNSYM)
252b5132 1850 && ! bfd_section_from_shdr (abfd, hdr->sh_link))
b34976b6 1851 return FALSE;
252b5132
RH
1852
1853 /* If this reloc section does not use the main symbol table we
1854 don't treat it as a reloc section. BFD can't adequately
1855 represent such a section, so at least for now, we don't
c044fabd 1856 try. We just present it as a normal section. We also
60bcf0fa 1857 can't use it as a reloc section if it points to the null
83b89087
L
1858 section, an invalid section, another reloc section, or its
1859 sh_link points to the null section. */
185ef66d 1860 if (hdr->sh_link != elf_onesymtab (abfd)
83b89087 1861 || hdr->sh_link == SHN_UNDEF
185ef66d 1862 || hdr->sh_info == SHN_UNDEF
185ef66d
AM
1863 || hdr->sh_info >= num_sec
1864 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL
1865 || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_RELA)
6dc132d9
L
1866 return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
1867 shindex);
252b5132
RH
1868
1869 if (! bfd_section_from_shdr (abfd, hdr->sh_info))
b34976b6 1870 return FALSE;
252b5132
RH
1871 target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info);
1872 if (target_sect == NULL)
b34976b6 1873 return FALSE;
252b5132 1874
d4730f92
BS
1875 esdt = elf_section_data (target_sect);
1876 if (hdr->sh_type == SHT_RELA)
1877 p_hdr = &esdt->rela.hdr;
252b5132 1878 else
d4730f92
BS
1879 p_hdr = &esdt->rel.hdr;
1880
1881 BFD_ASSERT (*p_hdr == NULL);
1882 amt = sizeof (*hdr2);
1883 hdr2 = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
1884 if (hdr2 == NULL)
1885 return FALSE;
252b5132 1886 *hdr2 = *hdr;
d4730f92 1887 *p_hdr = hdr2;
252b5132 1888 elf_elfsections (abfd)[shindex] = hdr2;
d9bc7a44 1889 target_sect->reloc_count += NUM_SHDR_ENTRIES (hdr);
252b5132
RH
1890 target_sect->flags |= SEC_RELOC;
1891 target_sect->relocation = NULL;
1892 target_sect->rel_filepos = hdr->sh_offset;
bf572ba0
MM
1893 /* In the section to which the relocations apply, mark whether
1894 its relocations are of the REL or RELA variety. */
72730e0c 1895 if (hdr->sh_size != 0)
d4730f92
BS
1896 {
1897 if (hdr->sh_type == SHT_RELA)
1898 target_sect->use_rela_p = 1;
1899 }
252b5132 1900 abfd->flags |= HAS_RELOC;
b34976b6 1901 return TRUE;
252b5132 1902 }
252b5132
RH
1903
1904 case SHT_GNU_verdef:
1905 elf_dynverdef (abfd) = shindex;
1906 elf_tdata (abfd)->dynverdef_hdr = *hdr;
6dc132d9 1907 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
252b5132
RH
1908
1909 case SHT_GNU_versym:
a50b2160
JJ
1910 if (hdr->sh_entsize != sizeof (Elf_External_Versym))
1911 return FALSE;
252b5132
RH
1912 elf_dynversym (abfd) = shindex;
1913 elf_tdata (abfd)->dynversym_hdr = *hdr;
6dc132d9 1914 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
252b5132
RH
1915
1916 case SHT_GNU_verneed:
1917 elf_dynverref (abfd) = shindex;
1918 elf_tdata (abfd)->dynverref_hdr = *hdr;
6dc132d9 1919 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
252b5132
RH
1920
1921 case SHT_SHLIB:
b34976b6 1922 return TRUE;
252b5132 1923
dbb410c3 1924 case SHT_GROUP:
44534af3 1925 if (! IS_VALID_GROUP_SECTION_HEADER (hdr, GRP_ENTRY_SIZE))
a50b2160 1926 return FALSE;
6dc132d9 1927 if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
b34976b6 1928 return FALSE;
dbb410c3
AM
1929 if (hdr->contents != NULL)
1930 {
1931 Elf_Internal_Group *idx = (Elf_Internal_Group *) hdr->contents;
1783205a 1932 unsigned int n_elt = hdr->sh_size / GRP_ENTRY_SIZE;
dbb410c3
AM
1933 asection *s;
1934
b885599b
AM
1935 if (idx->flags & GRP_COMDAT)
1936 hdr->bfd_section->flags
1937 |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1938
45c5e9ed
L
1939 /* We try to keep the same section order as it comes in. */
1940 idx += n_elt;
dbb410c3 1941 while (--n_elt != 0)
1783205a
NC
1942 {
1943 --idx;
1944
1945 if (idx->shdr != NULL
1946 && (s = idx->shdr->bfd_section) != NULL
1947 && elf_next_in_group (s) != NULL)
1948 {
1949 elf_next_in_group (hdr->bfd_section) = s;
1950 break;
1951 }
1952 }
dbb410c3
AM
1953 }
1954 break;
1955
252b5132 1956 default:
104d59d1
JM
1957 /* Possibly an attributes section. */
1958 if (hdr->sh_type == SHT_GNU_ATTRIBUTES
1959 || hdr->sh_type == bed->obj_attrs_section_type)
1960 {
1961 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1962 return FALSE;
1963 _bfd_elf_parse_attributes (abfd, hdr);
1964 return TRUE;
1965 }
1966
252b5132 1967 /* Check for any processor-specific section types. */
3eb70a79
L
1968 if (bed->elf_backend_section_from_shdr (abfd, hdr, name, shindex))
1969 return TRUE;
1970
1971 if (hdr->sh_type >= SHT_LOUSER && hdr->sh_type <= SHT_HIUSER)
1972 {
1973 if ((hdr->sh_flags & SHF_ALLOC) != 0)
1974 /* FIXME: How to properly handle allocated section reserved
1975 for applications? */
1976 (*_bfd_error_handler)
1977 (_("%B: don't know how to handle allocated, application "
1978 "specific section `%s' [0x%8x]"),
1979 abfd, name, hdr->sh_type);
1980 else
1981 /* Allow sections reserved for applications. */
1982 return _bfd_elf_make_section_from_shdr (abfd, hdr, name,
1983 shindex);
1984 }
1985 else if (hdr->sh_type >= SHT_LOPROC
1986 && hdr->sh_type <= SHT_HIPROC)
1987 /* FIXME: We should handle this section. */
1988 (*_bfd_error_handler)
1989 (_("%B: don't know how to handle processor specific section "
1990 "`%s' [0x%8x]"),
1991 abfd, name, hdr->sh_type);
1992 else if (hdr->sh_type >= SHT_LOOS && hdr->sh_type <= SHT_HIOS)
ff15b240
NC
1993 {
1994 /* Unrecognised OS-specific sections. */
1995 if ((hdr->sh_flags & SHF_OS_NONCONFORMING) != 0)
1996 /* SHF_OS_NONCONFORMING indicates that special knowledge is
08a40648 1997 required to correctly process the section and the file should
ff15b240
NC
1998 be rejected with an error message. */
1999 (*_bfd_error_handler)
2000 (_("%B: don't know how to handle OS specific section "
2001 "`%s' [0x%8x]"),
2002 abfd, name, hdr->sh_type);
2003 else
2004 /* Otherwise it should be processed. */
2005 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
2006 }
3eb70a79
L
2007 else
2008 /* FIXME: We should handle this section. */
2009 (*_bfd_error_handler)
2010 (_("%B: don't know how to handle section `%s' [0x%8x]"),
2011 abfd, name, hdr->sh_type);
2012
2013 return FALSE;
252b5132
RH
2014 }
2015
b34976b6 2016 return TRUE;
252b5132
RH
2017}
2018
87d72d41 2019/* Return the local symbol specified by ABFD, R_SYMNDX. */
ec338859 2020
87d72d41
AM
2021Elf_Internal_Sym *
2022bfd_sym_from_r_symndx (struct sym_cache *cache,
2023 bfd *abfd,
2024 unsigned long r_symndx)
ec338859 2025{
ec338859
AM
2026 unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
2027
a5d1b3b5
AM
2028 if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
2029 {
2030 Elf_Internal_Shdr *symtab_hdr;
2031 unsigned char esym[sizeof (Elf64_External_Sym)];
2032 Elf_External_Sym_Shndx eshndx;
ec338859 2033
a5d1b3b5
AM
2034 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2035 if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
87d72d41 2036 &cache->sym[ent], esym, &eshndx) == NULL)
a5d1b3b5 2037 return NULL;
9ad5cbcf 2038
a5d1b3b5
AM
2039 if (cache->abfd != abfd)
2040 {
2041 memset (cache->indx, -1, sizeof (cache->indx));
2042 cache->abfd = abfd;
2043 }
2044 cache->indx[ent] = r_symndx;
ec338859 2045 }
a5d1b3b5 2046
87d72d41 2047 return &cache->sym[ent];
ec338859
AM
2048}
2049
252b5132
RH
2050/* Given an ELF section number, retrieve the corresponding BFD
2051 section. */
2052
2053asection *
91d6fa6a 2054bfd_section_from_elf_index (bfd *abfd, unsigned int sec_index)
252b5132 2055{
91d6fa6a 2056 if (sec_index >= elf_numsections (abfd))
252b5132 2057 return NULL;
91d6fa6a 2058 return elf_elfsections (abfd)[sec_index]->bfd_section;
252b5132
RH
2059}
2060
b35d266b 2061static const struct bfd_elf_special_section special_sections_b[] =
2f89ff8d 2062{
0112cd26
NC
2063 { STRING_COMMA_LEN (".bss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2064 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2065};
2066
b35d266b 2067static const struct bfd_elf_special_section special_sections_c[] =
7f4d3958 2068{
0112cd26
NC
2069 { STRING_COMMA_LEN (".comment"), 0, SHT_PROGBITS, 0 },
2070 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2071};
2072
b35d266b 2073static const struct bfd_elf_special_section special_sections_d[] =
7f4d3958 2074{
0112cd26
NC
2075 { STRING_COMMA_LEN (".data"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2076 { STRING_COMMA_LEN (".data1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
a9a72a65
DE
2077 /* There are more DWARF sections than these, but they needn't be added here
2078 unless you have to cope with broken compilers that don't emit section
2079 attributes or you want to help the user writing assembler. */
0112cd26
NC
2080 { STRING_COMMA_LEN (".debug"), 0, SHT_PROGBITS, 0 },
2081 { STRING_COMMA_LEN (".debug_line"), 0, SHT_PROGBITS, 0 },
2082 { STRING_COMMA_LEN (".debug_info"), 0, SHT_PROGBITS, 0 },
2083 { STRING_COMMA_LEN (".debug_abbrev"), 0, SHT_PROGBITS, 0 },
2084 { STRING_COMMA_LEN (".debug_aranges"), 0, SHT_PROGBITS, 0 },
2085 { STRING_COMMA_LEN (".dynamic"), 0, SHT_DYNAMIC, SHF_ALLOC },
2086 { STRING_COMMA_LEN (".dynstr"), 0, SHT_STRTAB, SHF_ALLOC },
2087 { STRING_COMMA_LEN (".dynsym"), 0, SHT_DYNSYM, SHF_ALLOC },
2088 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2089};
2090
b35d266b 2091static const struct bfd_elf_special_section special_sections_f[] =
7f4d3958 2092{
0112cd26
NC
2093 { STRING_COMMA_LEN (".fini"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2094 { STRING_COMMA_LEN (".fini_array"), 0, SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
2095 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2096};
2097
b35d266b 2098static const struct bfd_elf_special_section special_sections_g[] =
7f4d3958 2099{
0112cd26 2100 { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
68efed41 2101 { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE },
0112cd26
NC
2102 { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2103 { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 },
2104 { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 },
2105 { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 },
2106 { STRING_COMMA_LEN (".gnu.liblist"), 0, SHT_GNU_LIBLIST, SHF_ALLOC },
2107 { STRING_COMMA_LEN (".gnu.conflict"), 0, SHT_RELA, SHF_ALLOC },
2108 { STRING_COMMA_LEN (".gnu.hash"), 0, SHT_GNU_HASH, SHF_ALLOC },
2109 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2110};
2111
b35d266b 2112static const struct bfd_elf_special_section special_sections_h[] =
7f4d3958 2113{
0112cd26
NC
2114 { STRING_COMMA_LEN (".hash"), 0, SHT_HASH, SHF_ALLOC },
2115 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2116};
2117
b35d266b 2118static const struct bfd_elf_special_section special_sections_i[] =
7f4d3958 2119{
0112cd26
NC
2120 { STRING_COMMA_LEN (".init"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2121 { STRING_COMMA_LEN (".init_array"), 0, SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2122 { STRING_COMMA_LEN (".interp"), 0, SHT_PROGBITS, 0 },
2123 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2124};
2125
b35d266b 2126static const struct bfd_elf_special_section special_sections_l[] =
7f4d3958 2127{
0112cd26
NC
2128 { STRING_COMMA_LEN (".line"), 0, SHT_PROGBITS, 0 },
2129 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2130};
2131
b35d266b 2132static const struct bfd_elf_special_section special_sections_n[] =
7f4d3958 2133{
0112cd26
NC
2134 { STRING_COMMA_LEN (".note.GNU-stack"), 0, SHT_PROGBITS, 0 },
2135 { STRING_COMMA_LEN (".note"), -1, SHT_NOTE, 0 },
2136 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2137};
2138
b35d266b 2139static const struct bfd_elf_special_section special_sections_p[] =
7f4d3958 2140{
0112cd26
NC
2141 { STRING_COMMA_LEN (".preinit_array"), 0, SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
2142 { STRING_COMMA_LEN (".plt"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2143 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2144};
2145
b35d266b 2146static const struct bfd_elf_special_section special_sections_r[] =
7f4d3958 2147{
0112cd26
NC
2148 { STRING_COMMA_LEN (".rodata"), -2, SHT_PROGBITS, SHF_ALLOC },
2149 { STRING_COMMA_LEN (".rodata1"), 0, SHT_PROGBITS, SHF_ALLOC },
2150 { STRING_COMMA_LEN (".rela"), -1, SHT_RELA, 0 },
2151 { STRING_COMMA_LEN (".rel"), -1, SHT_REL, 0 },
2152 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2153};
2154
b35d266b 2155static const struct bfd_elf_special_section special_sections_s[] =
7f4d3958 2156{
0112cd26
NC
2157 { STRING_COMMA_LEN (".shstrtab"), 0, SHT_STRTAB, 0 },
2158 { STRING_COMMA_LEN (".strtab"), 0, SHT_STRTAB, 0 },
2159 { STRING_COMMA_LEN (".symtab"), 0, SHT_SYMTAB, 0 },
60ff4dc4
HPN
2160 /* See struct bfd_elf_special_section declaration for the semantics of
2161 this special case where .prefix_length != strlen (.prefix). */
2162 { ".stabstr", 5, 3, SHT_STRTAB, 0 },
0112cd26 2163 { NULL, 0, 0, 0, 0 }
2f89ff8d
L
2164};
2165
b35d266b 2166static const struct bfd_elf_special_section special_sections_t[] =
7f4d3958 2167{
0112cd26
NC
2168 { STRING_COMMA_LEN (".text"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
2169 { STRING_COMMA_LEN (".tbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2170 { STRING_COMMA_LEN (".tdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
2171 { NULL, 0, 0, 0, 0 }
7f4d3958
L
2172};
2173
1b315056
CS
2174static const struct bfd_elf_special_section special_sections_z[] =
2175{
2176 { STRING_COMMA_LEN (".zdebug_line"), 0, SHT_PROGBITS, 0 },
2177 { STRING_COMMA_LEN (".zdebug_info"), 0, SHT_PROGBITS, 0 },
2178 { STRING_COMMA_LEN (".zdebug_abbrev"), 0, SHT_PROGBITS, 0 },
2179 { STRING_COMMA_LEN (".zdebug_aranges"), 0, SHT_PROGBITS, 0 },
2180 { NULL, 0, 0, 0, 0 }
2181};
2182
e4c93b56 2183static const struct bfd_elf_special_section * const special_sections[] =
7f4d3958 2184{
7f4d3958 2185 special_sections_b, /* 'b' */
98ece1b3 2186 special_sections_c, /* 'c' */
7f4d3958
L
2187 special_sections_d, /* 'd' */
2188 NULL, /* 'e' */
2189 special_sections_f, /* 'f' */
2190 special_sections_g, /* 'g' */
2191 special_sections_h, /* 'h' */
2192 special_sections_i, /* 'i' */
2193 NULL, /* 'j' */
2194 NULL, /* 'k' */
2195 special_sections_l, /* 'l' */
2196 NULL, /* 'm' */
2197 special_sections_n, /* 'n' */
2198 NULL, /* 'o' */
2199 special_sections_p, /* 'p' */
2200 NULL, /* 'q' */
2201 special_sections_r, /* 'r' */
2202 special_sections_s, /* 's' */
2203 special_sections_t, /* 't' */
1b315056
CS
2204 NULL, /* 'u' */
2205 NULL, /* 'v' */
2206 NULL, /* 'w' */
2207 NULL, /* 'x' */
2208 NULL, /* 'y' */
2209 special_sections_z /* 'z' */
7f4d3958
L
2210};
2211
551b43fd
AM
2212const struct bfd_elf_special_section *
2213_bfd_elf_get_special_section (const char *name,
2214 const struct bfd_elf_special_section *spec,
2215 unsigned int rela)
2f89ff8d
L
2216{
2217 int i;
7f4d3958 2218 int len;
7f4d3958 2219
551b43fd 2220 len = strlen (name);
7f4d3958 2221
551b43fd 2222 for (i = 0; spec[i].prefix != NULL; i++)
7dcb9820
AM
2223 {
2224 int suffix_len;
551b43fd 2225 int prefix_len = spec[i].prefix_length;
7dcb9820
AM
2226
2227 if (len < prefix_len)
2228 continue;
551b43fd 2229 if (memcmp (name, spec[i].prefix, prefix_len) != 0)
7dcb9820
AM
2230 continue;
2231
551b43fd 2232 suffix_len = spec[i].suffix_length;
7dcb9820
AM
2233 if (suffix_len <= 0)
2234 {
2235 if (name[prefix_len] != 0)
2236 {
2237 if (suffix_len == 0)
2238 continue;
2239 if (name[prefix_len] != '.'
2240 && (suffix_len == -2
551b43fd 2241 || (rela && spec[i].type == SHT_REL)))
7dcb9820
AM
2242 continue;
2243 }
2244 }
2245 else
2246 {
2247 if (len < prefix_len + suffix_len)
2248 continue;
2249 if (memcmp (name + len - suffix_len,
551b43fd 2250 spec[i].prefix + prefix_len,
7dcb9820
AM
2251 suffix_len) != 0)
2252 continue;
2253 }
551b43fd 2254 return &spec[i];
7dcb9820 2255 }
2f89ff8d
L
2256
2257 return NULL;
2258}
2259
7dcb9820 2260const struct bfd_elf_special_section *
29ef7005 2261_bfd_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2f89ff8d 2262{
551b43fd
AM
2263 int i;
2264 const struct bfd_elf_special_section *spec;
29ef7005 2265 const struct elf_backend_data *bed;
2f89ff8d
L
2266
2267 /* See if this is one of the special sections. */
551b43fd
AM
2268 if (sec->name == NULL)
2269 return NULL;
2f89ff8d 2270
29ef7005
L
2271 bed = get_elf_backend_data (abfd);
2272 spec = bed->special_sections;
2273 if (spec)
2274 {
2275 spec = _bfd_elf_get_special_section (sec->name,
2276 bed->special_sections,
2277 sec->use_rela_p);
2278 if (spec != NULL)
2279 return spec;
2280 }
2281
551b43fd
AM
2282 if (sec->name[0] != '.')
2283 return NULL;
2f89ff8d 2284
551b43fd 2285 i = sec->name[1] - 'b';
1b315056 2286 if (i < 0 || i > 'z' - 'b')
551b43fd
AM
2287 return NULL;
2288
2289 spec = special_sections[i];
2f89ff8d 2290
551b43fd
AM
2291 if (spec == NULL)
2292 return NULL;
2293
2294 return _bfd_elf_get_special_section (sec->name, spec, sec->use_rela_p);
2f89ff8d
L
2295}
2296
b34976b6 2297bfd_boolean
217aa764 2298_bfd_elf_new_section_hook (bfd *abfd, asection *sec)
252b5132
RH
2299{
2300 struct bfd_elf_section_data *sdata;
551b43fd 2301 const struct elf_backend_data *bed;
7dcb9820 2302 const struct bfd_elf_special_section *ssect;
252b5132 2303
f0abc2a1
AM
2304 sdata = (struct bfd_elf_section_data *) sec->used_by_bfd;
2305 if (sdata == NULL)
2306 {
a50b1753
NC
2307 sdata = (struct bfd_elf_section_data *) bfd_zalloc (abfd,
2308 sizeof (*sdata));
f0abc2a1
AM
2309 if (sdata == NULL)
2310 return FALSE;
217aa764 2311 sec->used_by_bfd = sdata;
f0abc2a1 2312 }
bf572ba0 2313
551b43fd
AM
2314 /* Indicate whether or not this section should use RELA relocations. */
2315 bed = get_elf_backend_data (abfd);
2316 sec->use_rela_p = bed->default_use_rela_p;
2317
e843e0f8
L
2318 /* When we read a file, we don't need to set ELF section type and
2319 flags. They will be overridden in _bfd_elf_make_section_from_shdr
2320 anyway. We will set ELF section type and flags for all linker
2321 created sections. If user specifies BFD section flags, we will
2322 set ELF section type and flags based on BFD section flags in
02ecc8e9
L
2323 elf_fake_sections. Special handling for .init_array/.fini_array
2324 output sections since they may contain .ctors/.dtors input
2325 sections. We don't want _bfd_elf_init_private_section_data to
2326 copy ELF section type from .ctors/.dtors input sections. */
2327 if (abfd->direction != read_direction
3496cb2a 2328 || (sec->flags & SEC_LINKER_CREATED) != 0)
2f89ff8d 2329 {
551b43fd 2330 ssect = (*bed->get_sec_type_attr) (abfd, sec);
02ecc8e9
L
2331 if (ssect != NULL
2332 && (!sec->flags
2333 || (sec->flags & SEC_LINKER_CREATED) != 0
2334 || ssect->type == SHT_INIT_ARRAY
2335 || ssect->type == SHT_FINI_ARRAY))
a31501e9
L
2336 {
2337 elf_section_type (sec) = ssect->type;
2338 elf_section_flags (sec) = ssect->attr;
2339 }
2f89ff8d
L
2340 }
2341
f592407e 2342 return _bfd_generic_new_section_hook (abfd, sec);
252b5132
RH
2343}
2344
2345/* Create a new bfd section from an ELF program header.
2346
2347 Since program segments have no names, we generate a synthetic name
2348 of the form segment<NUM>, where NUM is generally the index in the
2349 program header table. For segments that are split (see below) we
2350 generate the names segment<NUM>a and segment<NUM>b.
2351
2352 Note that some program segments may have a file size that is different than
2353 (less than) the memory size. All this means is that at execution the
2354 system must allocate the amount of memory specified by the memory size,
2355 but only initialize it with the first "file size" bytes read from the
2356 file. This would occur for example, with program segments consisting
2357 of combined data+bss.
2358
2359 To handle the above situation, this routine generates TWO bfd sections
2360 for the single program segment. The first has the length specified by
2361 the file size of the segment, and the second has the length specified
2362 by the difference between the two sizes. In effect, the segment is split
d5191d0c 2363 into its initialized and uninitialized parts.
252b5132
RH
2364
2365 */
2366
b34976b6 2367bfd_boolean
217aa764
AM
2368_bfd_elf_make_section_from_phdr (bfd *abfd,
2369 Elf_Internal_Phdr *hdr,
91d6fa6a 2370 int hdr_index,
a50b1753 2371 const char *type_name)
252b5132
RH
2372{
2373 asection *newsect;
2374 char *name;
2375 char namebuf[64];
d4c88bbb 2376 size_t len;
252b5132
RH
2377 int split;
2378
2379 split = ((hdr->p_memsz > 0)
2380 && (hdr->p_filesz > 0)
2381 && (hdr->p_memsz > hdr->p_filesz));
d5191d0c
AM
2382
2383 if (hdr->p_filesz > 0)
252b5132 2384 {
91d6fa6a 2385 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "a" : "");
d5191d0c 2386 len = strlen (namebuf) + 1;
a50b1753 2387 name = (char *) bfd_alloc (abfd, len);
d5191d0c
AM
2388 if (!name)
2389 return FALSE;
2390 memcpy (name, namebuf, len);
2391 newsect = bfd_make_section (abfd, name);
2392 if (newsect == NULL)
2393 return FALSE;
2394 newsect->vma = hdr->p_vaddr;
2395 newsect->lma = hdr->p_paddr;
2396 newsect->size = hdr->p_filesz;
2397 newsect->filepos = hdr->p_offset;
2398 newsect->flags |= SEC_HAS_CONTENTS;
2399 newsect->alignment_power = bfd_log2 (hdr->p_align);
2400 if (hdr->p_type == PT_LOAD)
252b5132 2401 {
d5191d0c
AM
2402 newsect->flags |= SEC_ALLOC;
2403 newsect->flags |= SEC_LOAD;
2404 if (hdr->p_flags & PF_X)
2405 {
2406 /* FIXME: all we known is that it has execute PERMISSION,
2407 may be data. */
2408 newsect->flags |= SEC_CODE;
2409 }
2410 }
2411 if (!(hdr->p_flags & PF_W))
2412 {
2413 newsect->flags |= SEC_READONLY;
252b5132 2414 }
252b5132
RH
2415 }
2416
d5191d0c 2417 if (hdr->p_memsz > hdr->p_filesz)
252b5132 2418 {
d5191d0c
AM
2419 bfd_vma align;
2420
91d6fa6a 2421 sprintf (namebuf, "%s%d%s", type_name, hdr_index, split ? "b" : "");
d4c88bbb 2422 len = strlen (namebuf) + 1;
a50b1753 2423 name = (char *) bfd_alloc (abfd, len);
252b5132 2424 if (!name)
b34976b6 2425 return FALSE;
d4c88bbb 2426 memcpy (name, namebuf, len);
252b5132
RH
2427 newsect = bfd_make_section (abfd, name);
2428 if (newsect == NULL)
b34976b6 2429 return FALSE;
252b5132
RH
2430 newsect->vma = hdr->p_vaddr + hdr->p_filesz;
2431 newsect->lma = hdr->p_paddr + hdr->p_filesz;
eea6121a 2432 newsect->size = hdr->p_memsz - hdr->p_filesz;
d5191d0c
AM
2433 newsect->filepos = hdr->p_offset + hdr->p_filesz;
2434 align = newsect->vma & -newsect->vma;
2435 if (align == 0 || align > hdr->p_align)
2436 align = hdr->p_align;
2437 newsect->alignment_power = bfd_log2 (align);
252b5132
RH
2438 if (hdr->p_type == PT_LOAD)
2439 {
d5191d0c
AM
2440 /* Hack for gdb. Segments that have not been modified do
2441 not have their contents written to a core file, on the
2442 assumption that a debugger can find the contents in the
2443 executable. We flag this case by setting the fake
2444 section size to zero. Note that "real" bss sections will
2445 always have their contents dumped to the core file. */
2446 if (bfd_get_format (abfd) == bfd_core)
2447 newsect->size = 0;
252b5132
RH
2448 newsect->flags |= SEC_ALLOC;
2449 if (hdr->p_flags & PF_X)
2450 newsect->flags |= SEC_CODE;
2451 }
2452 if (!(hdr->p_flags & PF_W))
2453 newsect->flags |= SEC_READONLY;
2454 }
2455
b34976b6 2456 return TRUE;
252b5132
RH
2457}
2458
b34976b6 2459bfd_boolean
91d6fa6a 2460bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index)
20cfcaae 2461{
9c5bfbb7 2462 const struct elf_backend_data *bed;
20cfcaae
NC
2463
2464 switch (hdr->p_type)
2465 {
2466 case PT_NULL:
91d6fa6a 2467 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "null");
20cfcaae
NC
2468
2469 case PT_LOAD:
91d6fa6a 2470 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "load");
20cfcaae
NC
2471
2472 case PT_DYNAMIC:
91d6fa6a 2473 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "dynamic");
20cfcaae
NC
2474
2475 case PT_INTERP:
91d6fa6a 2476 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "interp");
20cfcaae
NC
2477
2478 case PT_NOTE:
91d6fa6a 2479 if (! _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "note"))
b34976b6 2480 return FALSE;
718175fa 2481 if (! elf_read_notes (abfd, hdr->p_offset, hdr->p_filesz))
b34976b6
AM
2482 return FALSE;
2483 return TRUE;
20cfcaae
NC
2484
2485 case PT_SHLIB:
91d6fa6a 2486 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "shlib");
20cfcaae
NC
2487
2488 case PT_PHDR:
91d6fa6a 2489 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "phdr");
20cfcaae 2490
811072d8 2491 case PT_GNU_EH_FRAME:
91d6fa6a 2492 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index,
811072d8
RM
2493 "eh_frame_hdr");
2494
2b05f1b7 2495 case PT_GNU_STACK:
91d6fa6a 2496 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "stack");
9ee5e499 2497
8c37241b 2498 case PT_GNU_RELRO:
91d6fa6a 2499 return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro");
8c37241b 2500
20cfcaae 2501 default:
8c1acd09 2502 /* Check for any processor-specific program segment types. */
20cfcaae 2503 bed = get_elf_backend_data (abfd);
91d6fa6a 2504 return bed->elf_backend_section_from_phdr (abfd, hdr, hdr_index, "proc");
20cfcaae
NC
2505 }
2506}
2507
d4730f92
BS
2508/* Return the REL_HDR for SEC, assuming there is only a single one, either
2509 REL or RELA. */
2510
2511Elf_Internal_Shdr *
2512_bfd_elf_single_rel_hdr (asection *sec)
2513{
2514 if (elf_section_data (sec)->rel.hdr)
2515 {
2516 BFD_ASSERT (elf_section_data (sec)->rela.hdr == NULL);
2517 return elf_section_data (sec)->rel.hdr;
2518 }
2519 else
2520 return elf_section_data (sec)->rela.hdr;
2521}
2522
2523/* Allocate and initialize a section-header for a new reloc section,
2524 containing relocations against ASECT. It is stored in RELDATA. If
2525 USE_RELA_P is TRUE, we use RELA relocations; otherwise, we use REL
2526 relocations. */
23bc299b 2527
5d13b3b3 2528static bfd_boolean
217aa764 2529_bfd_elf_init_reloc_shdr (bfd *abfd,
d4730f92 2530 struct bfd_elf_section_reloc_data *reldata,
217aa764
AM
2531 asection *asect,
2532 bfd_boolean use_rela_p)
23bc299b 2533{
d4730f92 2534 Elf_Internal_Shdr *rel_hdr;
23bc299b 2535 char *name;
9c5bfbb7 2536 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92
BS
2537 bfd_size_type amt;
2538
2539 amt = sizeof (Elf_Internal_Shdr);
2540 BFD_ASSERT (reldata->hdr == NULL);
2541 rel_hdr = bfd_zalloc (abfd, amt);
2542 reldata->hdr = rel_hdr;
23bc299b 2543
d324f6d6 2544 amt = sizeof ".rela" + strlen (asect->name);
a50b1753 2545 name = (char *) bfd_alloc (abfd, amt);
23bc299b 2546 if (name == NULL)
b34976b6 2547 return FALSE;
23bc299b
MM
2548 sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", asect->name);
2549 rel_hdr->sh_name =
2b0f7ef9 2550 (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd), name,
b34976b6 2551 FALSE);
23bc299b 2552 if (rel_hdr->sh_name == (unsigned int) -1)
b34976b6 2553 return FALSE;
23bc299b
MM
2554 rel_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
2555 rel_hdr->sh_entsize = (use_rela_p
2556 ? bed->s->sizeof_rela
2557 : bed->s->sizeof_rel);
72de5009 2558 rel_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
23bc299b
MM
2559 rel_hdr->sh_flags = 0;
2560 rel_hdr->sh_addr = 0;
2561 rel_hdr->sh_size = 0;
2562 rel_hdr->sh_offset = 0;
2563
b34976b6 2564 return TRUE;
23bc299b
MM
2565}
2566
94be91de
JB
2567/* Return the default section type based on the passed in section flags. */
2568
2569int
2570bfd_elf_get_default_section_type (flagword flags)
2571{
2572 if ((flags & SEC_ALLOC) != 0
2e76e85a 2573 && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
94be91de
JB
2574 return SHT_NOBITS;
2575 return SHT_PROGBITS;
2576}
2577
d4730f92
BS
2578struct fake_section_arg
2579{
2580 struct bfd_link_info *link_info;
2581 bfd_boolean failed;
2582};
2583
252b5132
RH
2584/* Set up an ELF internal section header for a section. */
2585
252b5132 2586static void
d4730f92 2587elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
252b5132 2588{
d4730f92 2589 struct fake_section_arg *arg = (struct fake_section_arg *)fsarg;
9c5bfbb7 2590 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 2591 struct bfd_elf_section_data *esd = elf_section_data (asect);
252b5132 2592 Elf_Internal_Shdr *this_hdr;
0414f35b 2593 unsigned int sh_type;
252b5132 2594
d4730f92 2595 if (arg->failed)
252b5132
RH
2596 {
2597 /* We already failed; just get out of the bfd_map_over_sections
08a40648 2598 loop. */
252b5132
RH
2599 return;
2600 }
2601
d4730f92 2602 this_hdr = &esd->this_hdr;
252b5132 2603
e57b5356
AM
2604 this_hdr->sh_name = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
2605 asect->name, FALSE);
2606 if (this_hdr->sh_name == (unsigned int) -1)
252b5132 2607 {
d4730f92 2608 arg->failed = TRUE;
252b5132
RH
2609 return;
2610 }
2611
a4d8e49b 2612 /* Don't clear sh_flags. Assembler may set additional bits. */
252b5132
RH
2613
2614 if ((asect->flags & SEC_ALLOC) != 0
2615 || asect->user_set_vma)
2616 this_hdr->sh_addr = asect->vma;
2617 else
2618 this_hdr->sh_addr = 0;
2619
2620 this_hdr->sh_offset = 0;
eea6121a 2621 this_hdr->sh_size = asect->size;
252b5132 2622 this_hdr->sh_link = 0;
72de5009 2623 this_hdr->sh_addralign = (bfd_vma) 1 << asect->alignment_power;
252b5132
RH
2624 /* The sh_entsize and sh_info fields may have been set already by
2625 copy_private_section_data. */
2626
2627 this_hdr->bfd_section = asect;
2628 this_hdr->contents = NULL;
2629
3cddba1e
L
2630 /* If the section type is unspecified, we set it based on
2631 asect->flags. */
98ece1b3
AM
2632 if ((asect->flags & SEC_GROUP) != 0)
2633 sh_type = SHT_GROUP;
98ece1b3 2634 else
94be91de 2635 sh_type = bfd_elf_get_default_section_type (asect->flags);
98ece1b3 2636
3cddba1e 2637 if (this_hdr->sh_type == SHT_NULL)
98ece1b3
AM
2638 this_hdr->sh_type = sh_type;
2639 else if (this_hdr->sh_type == SHT_NOBITS
2640 && sh_type == SHT_PROGBITS
2641 && (asect->flags & SEC_ALLOC) != 0)
3cddba1e 2642 {
98ece1b3
AM
2643 /* Warn if we are changing a NOBITS section to PROGBITS, but
2644 allow the link to proceed. This can happen when users link
2645 non-bss input sections to bss output sections, or emit data
2646 to a bss output section via a linker script. */
2647 (*_bfd_error_handler)
58f0869b 2648 (_("warning: section `%A' type changed to PROGBITS"), asect);
98ece1b3 2649 this_hdr->sh_type = sh_type;
3cddba1e
L
2650 }
2651
2f89ff8d 2652 switch (this_hdr->sh_type)
252b5132 2653 {
2f89ff8d 2654 default:
2f89ff8d
L
2655 break;
2656
2657 case SHT_STRTAB:
2658 case SHT_INIT_ARRAY:
2659 case SHT_FINI_ARRAY:
2660 case SHT_PREINIT_ARRAY:
2661 case SHT_NOTE:
2662 case SHT_NOBITS:
2663 case SHT_PROGBITS:
2664 break;
2665
2666 case SHT_HASH:
c7ac6ff8 2667 this_hdr->sh_entsize = bed->s->sizeof_hash_entry;
2f89ff8d 2668 break;
5de3bf90 2669
2f89ff8d 2670 case SHT_DYNSYM:
252b5132 2671 this_hdr->sh_entsize = bed->s->sizeof_sym;
2f89ff8d
L
2672 break;
2673
2674 case SHT_DYNAMIC:
252b5132 2675 this_hdr->sh_entsize = bed->s->sizeof_dyn;
2f89ff8d
L
2676 break;
2677
2678 case SHT_RELA:
2679 if (get_elf_backend_data (abfd)->may_use_rela_p)
2680 this_hdr->sh_entsize = bed->s->sizeof_rela;
2681 break;
2682
2683 case SHT_REL:
2684 if (get_elf_backend_data (abfd)->may_use_rel_p)
2685 this_hdr->sh_entsize = bed->s->sizeof_rel;
2686 break;
2687
2688 case SHT_GNU_versym:
252b5132 2689 this_hdr->sh_entsize = sizeof (Elf_External_Versym);
2f89ff8d
L
2690 break;
2691
2692 case SHT_GNU_verdef:
252b5132
RH
2693 this_hdr->sh_entsize = 0;
2694 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
2695 cverdefs. The linker will set cverdefs, but sh_info will be
2696 zero. */
252b5132
RH
2697 if (this_hdr->sh_info == 0)
2698 this_hdr->sh_info = elf_tdata (abfd)->cverdefs;
2699 else
2700 BFD_ASSERT (elf_tdata (abfd)->cverdefs == 0
2701 || this_hdr->sh_info == elf_tdata (abfd)->cverdefs);
2f89ff8d
L
2702 break;
2703
2704 case SHT_GNU_verneed:
252b5132
RH
2705 this_hdr->sh_entsize = 0;
2706 /* objcopy or strip will copy over sh_info, but may not set
08a40648
AM
2707 cverrefs. The linker will set cverrefs, but sh_info will be
2708 zero. */
252b5132
RH
2709 if (this_hdr->sh_info == 0)
2710 this_hdr->sh_info = elf_tdata (abfd)->cverrefs;
2711 else
2712 BFD_ASSERT (elf_tdata (abfd)->cverrefs == 0
2713 || this_hdr->sh_info == elf_tdata (abfd)->cverrefs);
2f89ff8d
L
2714 break;
2715
2716 case SHT_GROUP:
1783205a 2717 this_hdr->sh_entsize = GRP_ENTRY_SIZE;
2f89ff8d 2718 break;
fdc90cb4
JJ
2719
2720 case SHT_GNU_HASH:
2721 this_hdr->sh_entsize = bed->s->arch_size == 64 ? 0 : 4;
2722 break;
dbb410c3 2723 }
252b5132
RH
2724
2725 if ((asect->flags & SEC_ALLOC) != 0)
2726 this_hdr->sh_flags |= SHF_ALLOC;
2727 if ((asect->flags & SEC_READONLY) == 0)
2728 this_hdr->sh_flags |= SHF_WRITE;
2729 if ((asect->flags & SEC_CODE) != 0)
2730 this_hdr->sh_flags |= SHF_EXECINSTR;
f5fa8ca2
JJ
2731 if ((asect->flags & SEC_MERGE) != 0)
2732 {
2733 this_hdr->sh_flags |= SHF_MERGE;
2734 this_hdr->sh_entsize = asect->entsize;
2735 if ((asect->flags & SEC_STRINGS) != 0)
2736 this_hdr->sh_flags |= SHF_STRINGS;
2737 }
1126897b 2738 if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
dbb410c3 2739 this_hdr->sh_flags |= SHF_GROUP;
13ae64f3 2740 if ((asect->flags & SEC_THREAD_LOCAL) != 0)
704afa60
JJ
2741 {
2742 this_hdr->sh_flags |= SHF_TLS;
3a800eb9
AM
2743 if (asect->size == 0
2744 && (asect->flags & SEC_HAS_CONTENTS) == 0)
704afa60 2745 {
3a800eb9 2746 struct bfd_link_order *o = asect->map_tail.link_order;
b34976b6 2747
704afa60 2748 this_hdr->sh_size = 0;
3a800eb9
AM
2749 if (o != NULL)
2750 {
704afa60 2751 this_hdr->sh_size = o->offset + o->size;
3a800eb9
AM
2752 if (this_hdr->sh_size != 0)
2753 this_hdr->sh_type = SHT_NOBITS;
2754 }
704afa60
JJ
2755 }
2756 }
18ae9cc1
L
2757 if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
2758 this_hdr->sh_flags |= SHF_EXCLUDE;
252b5132 2759
d4730f92
BS
2760 /* If the section has relocs, set up a section header for the
2761 SHT_REL[A] section. If two relocation sections are required for
2762 this section, it is up to the processor-specific back-end to
2763 create the other. */
2764 if ((asect->flags & SEC_RELOC) != 0)
2765 {
2766 /* When doing a relocatable link, create both REL and RELA sections if
2767 needed. */
2768 if (arg->link_info
2769 /* Do the normal setup if we wouldn't create any sections here. */
2770 && esd->rel.count + esd->rela.count > 0
2771 && (arg->link_info->relocatable || arg->link_info->emitrelocations))
2772 {
2773 if (esd->rel.count && esd->rel.hdr == NULL
2774 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rel, asect, FALSE))
2775 {
2776 arg->failed = TRUE;
2777 return;
2778 }
2779 if (esd->rela.count && esd->rela.hdr == NULL
2780 && !_bfd_elf_init_reloc_shdr (abfd, &esd->rela, asect, TRUE))
2781 {
2782 arg->failed = TRUE;
2783 return;
2784 }
2785 }
2786 else if (!_bfd_elf_init_reloc_shdr (abfd,
2787 (asect->use_rela_p
2788 ? &esd->rela : &esd->rel),
2789 asect,
2790 asect->use_rela_p))
2791 arg->failed = TRUE;
2792 }
2793
252b5132 2794 /* Check for processor-specific section types. */
0414f35b 2795 sh_type = this_hdr->sh_type;
e1fddb6b
AO
2796 if (bed->elf_backend_fake_sections
2797 && !(*bed->elf_backend_fake_sections) (abfd, this_hdr, asect))
d4730f92 2798 arg->failed = TRUE;
252b5132 2799
42bb2e33 2800 if (sh_type == SHT_NOBITS && asect->size != 0)
0414f35b
AM
2801 {
2802 /* Don't change the header type from NOBITS if we are being
42bb2e33 2803 called for objcopy --only-keep-debug. */
0414f35b
AM
2804 this_hdr->sh_type = sh_type;
2805 }
252b5132
RH
2806}
2807
bcacc0f5
AM
2808/* Fill in the contents of a SHT_GROUP section. Called from
2809 _bfd_elf_compute_section_file_positions for gas, objcopy, and
2810 when ELF targets use the generic linker, ld. Called for ld -r
2811 from bfd_elf_final_link. */
dbb410c3 2812
1126897b 2813void
217aa764 2814bfd_elf_set_group_contents (bfd *abfd, asection *sec, void *failedptrarg)
dbb410c3 2815{
a50b1753 2816 bfd_boolean *failedptr = (bfd_boolean *) failedptrarg;
9dce4196 2817 asection *elt, *first;
dbb410c3 2818 unsigned char *loc;
b34976b6 2819 bfd_boolean gas;
dbb410c3 2820
7e4111ad
L
2821 /* Ignore linker created group section. See elfNN_ia64_object_p in
2822 elfxx-ia64.c. */
2823 if (((sec->flags & (SEC_GROUP | SEC_LINKER_CREATED)) != SEC_GROUP)
dbb410c3
AM
2824 || *failedptr)
2825 return;
2826
bcacc0f5
AM
2827 if (elf_section_data (sec)->this_hdr.sh_info == 0)
2828 {
2829 unsigned long symindx = 0;
2830
2831 /* elf_group_id will have been set up by objcopy and the
2832 generic linker. */
2833 if (elf_group_id (sec) != NULL)
2834 symindx = elf_group_id (sec)->udata.i;
1126897b 2835
bcacc0f5
AM
2836 if (symindx == 0)
2837 {
2838 /* If called from the assembler, swap_out_syms will have set up
2839 elf_section_syms. */
2840 BFD_ASSERT (elf_section_syms (abfd) != NULL);
2841 symindx = elf_section_syms (abfd)[sec->index]->udata.i;
2842 }
2843 elf_section_data (sec)->this_hdr.sh_info = symindx;
2844 }
2845 else if (elf_section_data (sec)->this_hdr.sh_info == (unsigned int) -2)
1126897b 2846 {
bcacc0f5
AM
2847 /* The ELF backend linker sets sh_info to -2 when the group
2848 signature symbol is global, and thus the index can't be
2849 set until all local symbols are output. */
2850 asection *igroup = elf_sec_group (elf_next_in_group (sec));
2851 struct bfd_elf_section_data *sec_data = elf_section_data (igroup);
2852 unsigned long symndx = sec_data->this_hdr.sh_info;
2853 unsigned long extsymoff = 0;
2854 struct elf_link_hash_entry *h;
2855
2856 if (!elf_bad_symtab (igroup->owner))
2857 {
2858 Elf_Internal_Shdr *symtab_hdr;
2859
2860 symtab_hdr = &elf_tdata (igroup->owner)->symtab_hdr;
2861 extsymoff = symtab_hdr->sh_info;
2862 }
2863 h = elf_sym_hashes (igroup->owner)[symndx - extsymoff];
2864 while (h->root.type == bfd_link_hash_indirect
2865 || h->root.type == bfd_link_hash_warning)
2866 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2867
2868 elf_section_data (sec)->this_hdr.sh_info = h->indx;
1126897b 2869 }
dbb410c3 2870
1126897b 2871 /* The contents won't be allocated for "ld -r" or objcopy. */
b34976b6 2872 gas = TRUE;
dbb410c3
AM
2873 if (sec->contents == NULL)
2874 {
b34976b6 2875 gas = FALSE;
a50b1753 2876 sec->contents = (unsigned char *) bfd_alloc (abfd, sec->size);
9dce4196
AM
2877
2878 /* Arrange for the section to be written out. */
2879 elf_section_data (sec)->this_hdr.contents = sec->contents;
dbb410c3
AM
2880 if (sec->contents == NULL)
2881 {
b34976b6 2882 *failedptr = TRUE;
dbb410c3
AM
2883 return;
2884 }
2885 }
2886
eea6121a 2887 loc = sec->contents + sec->size;
dbb410c3 2888
9dce4196
AM
2889 /* Get the pointer to the first section in the group that gas
2890 squirreled away here. objcopy arranges for this to be set to the
2891 start of the input section group. */
2892 first = elt = elf_next_in_group (sec);
dbb410c3
AM
2893
2894 /* First element is a flag word. Rest of section is elf section
2895 indices for all the sections of the group. Write them backwards
2896 just to keep the group in the same order as given in .section
2897 directives, not that it matters. */
2898 while (elt != NULL)
2899 {
9dce4196 2900 asection *s;
9dce4196 2901
9dce4196 2902 s = elt;
415f38a6
AM
2903 if (!gas)
2904 s = s->output_section;
2905 if (s != NULL
2906 && !bfd_is_abs_section (s))
01e1a5bc 2907 {
415f38a6
AM
2908 unsigned int idx = elf_section_data (s)->this_idx;
2909
01e1a5bc 2910 loc -= 4;
01e1a5bc
NC
2911 H_PUT_32 (abfd, idx, loc);
2912 }
945906ff 2913 elt = elf_next_in_group (elt);
9dce4196
AM
2914 if (elt == first)
2915 break;
dbb410c3
AM
2916 }
2917
3d7f7666 2918 if ((loc -= 4) != sec->contents)
9dce4196 2919 abort ();
dbb410c3 2920
9dce4196 2921 H_PUT_32 (abfd, sec->flags & SEC_LINK_ONCE ? GRP_COMDAT : 0, loc);
dbb410c3
AM
2922}
2923
252b5132
RH
2924/* Assign all ELF section numbers. The dummy first section is handled here
2925 too. The link/info pointers for the standard section types are filled
2926 in here too, while we're at it. */
2927
b34976b6 2928static bfd_boolean
da9f89d4 2929assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
252b5132
RH
2930{
2931 struct elf_obj_tdata *t = elf_tdata (abfd);
2932 asection *sec;
2b0f7ef9 2933 unsigned int section_number, secn;
252b5132 2934 Elf_Internal_Shdr **i_shdrp;
47cc2cf5 2935 struct bfd_elf_section_data *d;
3516e984 2936 bfd_boolean need_symtab;
252b5132
RH
2937
2938 section_number = 1;
2939
2b0f7ef9
JJ
2940 _bfd_elf_strtab_clear_all_refs (elf_shstrtab (abfd));
2941
da9f89d4
L
2942 /* SHT_GROUP sections are in relocatable files only. */
2943 if (link_info == NULL || link_info->relocatable)
252b5132 2944 {
da9f89d4 2945 /* Put SHT_GROUP sections first. */
04dd1667 2946 for (sec = abfd->sections; sec != NULL; sec = sec->next)
47cc2cf5 2947 {
5daa8fe7 2948 d = elf_section_data (sec);
da9f89d4
L
2949
2950 if (d->this_hdr.sh_type == SHT_GROUP)
08a40648 2951 {
5daa8fe7 2952 if (sec->flags & SEC_LINKER_CREATED)
da9f89d4
L
2953 {
2954 /* Remove the linker created SHT_GROUP sections. */
5daa8fe7 2955 bfd_section_list_remove (abfd, sec);
da9f89d4 2956 abfd->section_count--;
da9f89d4 2957 }
08a40648 2958 else
4fbb74a6 2959 d->this_idx = section_number++;
da9f89d4 2960 }
47cc2cf5
PB
2961 }
2962 }
2963
2964 for (sec = abfd->sections; sec; sec = sec->next)
2965 {
2966 d = elf_section_data (sec);
2967
2968 if (d->this_hdr.sh_type != SHT_GROUP)
4fbb74a6 2969 d->this_idx = section_number++;
2b0f7ef9 2970 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->this_hdr.sh_name);
d4730f92 2971 if (d->rel.hdr)
2b0f7ef9 2972 {
d4730f92
BS
2973 d->rel.idx = section_number++;
2974 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rel.hdr->sh_name);
2b0f7ef9 2975 }
d4730f92
BS
2976 else
2977 d->rel.idx = 0;
23bc299b 2978
d4730f92 2979 if (d->rela.hdr)
2b0f7ef9 2980 {
d4730f92
BS
2981 d->rela.idx = section_number++;
2982 _bfd_elf_strtab_addref (elf_shstrtab (abfd), d->rela.hdr->sh_name);
2b0f7ef9 2983 }
23bc299b 2984 else
d4730f92 2985 d->rela.idx = 0;
252b5132
RH
2986 }
2987
12bd6957 2988 elf_shstrtab_sec (abfd) = section_number++;
2b0f7ef9 2989 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->shstrtab_hdr.sh_name);
12bd6957 2990 elf_elfheader (abfd)->e_shstrndx = elf_shstrtab_sec (abfd);
252b5132 2991
3516e984
L
2992 need_symtab = (bfd_get_symcount (abfd) > 0
2993 || (link_info == NULL
2994 && ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
2995 == HAS_RELOC)));
2996 if (need_symtab)
252b5132 2997 {
12bd6957 2998 elf_onesymtab (abfd) = section_number++;
2b0f7ef9 2999 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->symtab_hdr.sh_name);
4fbb74a6 3000 if (section_number > ((SHN_LORESERVE - 2) & 0xFFFF))
9ad5cbcf 3001 {
12bd6957 3002 elf_symtab_shndx (abfd) = section_number++;
9ad5cbcf
AM
3003 t->symtab_shndx_hdr.sh_name
3004 = (unsigned int) _bfd_elf_strtab_add (elf_shstrtab (abfd),
b34976b6 3005 ".symtab_shndx", FALSE);
9ad5cbcf 3006 if (t->symtab_shndx_hdr.sh_name == (unsigned int) -1)
b34976b6 3007 return FALSE;
9ad5cbcf 3008 }
12bd6957 3009 elf_strtab_sec (abfd) = section_number++;
2b0f7ef9 3010 _bfd_elf_strtab_addref (elf_shstrtab (abfd), t->strtab_hdr.sh_name);
252b5132
RH
3011 }
3012
1c52a645
L
3013 if (section_number >= SHN_LORESERVE)
3014 {
3015 _bfd_error_handler (_("%B: too many sections: %u"),
3016 abfd, section_number);
3017 return FALSE;
3018 }
3019
2b0f7ef9
JJ
3020 _bfd_elf_strtab_finalize (elf_shstrtab (abfd));
3021 t->shstrtab_hdr.sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
9ad5cbcf
AM
3022
3023 elf_numsections (abfd) = section_number;
252b5132
RH
3024 elf_elfheader (abfd)->e_shnum = section_number;
3025
3026 /* Set up the list of section header pointers, in agreement with the
3027 indices. */
a50b1753
NC
3028 i_shdrp = (Elf_Internal_Shdr **) bfd_zalloc2 (abfd, section_number,
3029 sizeof (Elf_Internal_Shdr *));
252b5132 3030 if (i_shdrp == NULL)
b34976b6 3031 return FALSE;
252b5132 3032
a50b1753
NC
3033 i_shdrp[0] = (Elf_Internal_Shdr *) bfd_zalloc (abfd,
3034 sizeof (Elf_Internal_Shdr));
252b5132
RH
3035 if (i_shdrp[0] == NULL)
3036 {
3037 bfd_release (abfd, i_shdrp);
b34976b6 3038 return FALSE;
252b5132 3039 }
252b5132
RH
3040
3041 elf_elfsections (abfd) = i_shdrp;
3042
12bd6957 3043 i_shdrp[elf_shstrtab_sec (abfd)] = &t->shstrtab_hdr;
3516e984 3044 if (need_symtab)
252b5132 3045 {
12bd6957 3046 i_shdrp[elf_onesymtab (abfd)] = &t->symtab_hdr;
4fbb74a6 3047 if (elf_numsections (abfd) > (SHN_LORESERVE & 0xFFFF))
9ad5cbcf 3048 {
12bd6957
AM
3049 i_shdrp[elf_symtab_shndx (abfd)] = &t->symtab_shndx_hdr;
3050 t->symtab_shndx_hdr.sh_link = elf_onesymtab (abfd);
9ad5cbcf 3051 }
12bd6957
AM
3052 i_shdrp[elf_strtab_sec (abfd)] = &t->strtab_hdr;
3053 t->symtab_hdr.sh_link = elf_strtab_sec (abfd);
252b5132 3054 }
38ce5b11 3055
252b5132
RH
3056 for (sec = abfd->sections; sec; sec = sec->next)
3057 {
252b5132
RH
3058 asection *s;
3059 const char *name;
3060
91d6fa6a
NC
3061 d = elf_section_data (sec);
3062
252b5132 3063 i_shdrp[d->this_idx] = &d->this_hdr;
d4730f92
BS
3064 if (d->rel.idx != 0)
3065 i_shdrp[d->rel.idx] = d->rel.hdr;
3066 if (d->rela.idx != 0)
3067 i_shdrp[d->rela.idx] = d->rela.hdr;
252b5132
RH
3068
3069 /* Fill in the sh_link and sh_info fields while we're at it. */
3070
3071 /* sh_link of a reloc section is the section index of the symbol
3072 table. sh_info is the section index of the section to which
3073 the relocation entries apply. */
d4730f92 3074 if (d->rel.idx != 0)
252b5132 3075 {
12bd6957 3076 d->rel.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3077 d->rel.hdr->sh_info = d->this_idx;
9ef5d938 3078 d->rel.hdr->sh_flags |= SHF_INFO_LINK;
252b5132 3079 }
d4730f92 3080 if (d->rela.idx != 0)
23bc299b 3081 {
12bd6957 3082 d->rela.hdr->sh_link = elf_onesymtab (abfd);
d4730f92 3083 d->rela.hdr->sh_info = d->this_idx;
9ef5d938 3084 d->rela.hdr->sh_flags |= SHF_INFO_LINK;
23bc299b 3085 }
252b5132 3086
38ce5b11
L
3087 /* We need to set up sh_link for SHF_LINK_ORDER. */
3088 if ((d->this_hdr.sh_flags & SHF_LINK_ORDER) != 0)
3089 {
3090 s = elf_linked_to_section (sec);
3091 if (s)
38ce5b11 3092 {
f2876037 3093 /* elf_linked_to_section points to the input section. */
ccd2ec6a 3094 if (link_info != NULL)
38ce5b11 3095 {
f2876037 3096 /* Check discarded linkonce section. */
dbaa2011 3097 if (discarded_section (s))
38ce5b11 3098 {
ccd2ec6a
L
3099 asection *kept;
3100 (*_bfd_error_handler)
3101 (_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
3102 abfd, d->this_hdr.bfd_section,
3103 s, s->owner);
3104 /* Point to the kept section if it has the same
3105 size as the discarded one. */
c0f00686 3106 kept = _bfd_elf_check_kept_section (s, link_info);
ccd2ec6a 3107 if (kept == NULL)
185d09ad 3108 {
ccd2ec6a
L
3109 bfd_set_error (bfd_error_bad_value);
3110 return FALSE;
185d09ad 3111 }
ccd2ec6a 3112 s = kept;
38ce5b11 3113 }
e424ecc8 3114
ccd2ec6a
L
3115 s = s->output_section;
3116 BFD_ASSERT (s != NULL);
38ce5b11 3117 }
f2876037
L
3118 else
3119 {
3120 /* Handle objcopy. */
3121 if (s->output_section == NULL)
3122 {
3123 (*_bfd_error_handler)
3124 (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
3125 abfd, d->this_hdr.bfd_section, s, s->owner);
3126 bfd_set_error (bfd_error_bad_value);
3127 return FALSE;
3128 }
3129 s = s->output_section;
3130 }
ccd2ec6a
L
3131 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3132 }
3133 else
3134 {
3135 /* PR 290:
3136 The Intel C compiler generates SHT_IA_64_UNWIND with
3137 SHF_LINK_ORDER. But it doesn't set the sh_link or
3138 sh_info fields. Hence we could get the situation
08a40648 3139 where s is NULL. */
ccd2ec6a
L
3140 const struct elf_backend_data *bed
3141 = get_elf_backend_data (abfd);
3142 if (bed->link_order_error_handler)
3143 bed->link_order_error_handler
3144 (_("%B: warning: sh_link not set for section `%A'"),
3145 abfd, sec);
38ce5b11
L
3146 }
3147 }
3148
252b5132
RH
3149 switch (d->this_hdr.sh_type)
3150 {
3151 case SHT_REL:
3152 case SHT_RELA:
3153 /* A reloc section which we are treating as a normal BFD
3154 section. sh_link is the section index of the symbol
3155 table. sh_info is the section index of the section to
3156 which the relocation entries apply. We assume that an
3157 allocated reloc section uses the dynamic symbol table.
3158 FIXME: How can we be sure? */
3159 s = bfd_get_section_by_name (abfd, ".dynsym");
3160 if (s != NULL)
3161 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3162
3163 /* We look up the section the relocs apply to by name. */
3164 name = sec->name;
3165 if (d->this_hdr.sh_type == SHT_REL)
3166 name += 4;
3167 else
3168 name += 5;
3169 s = bfd_get_section_by_name (abfd, name);
3170 if (s != NULL)
9ef5d938
L
3171 {
3172 d->this_hdr.sh_info = elf_section_data (s)->this_idx;
3173 d->this_hdr.sh_flags |= SHF_INFO_LINK;
3174 }
252b5132
RH
3175 break;
3176
3177 case SHT_STRTAB:
3178 /* We assume that a section named .stab*str is a stabs
3179 string section. We look for a section with the same name
3180 but without the trailing ``str'', and set its sh_link
3181 field to point to this section. */
0112cd26 3182 if (CONST_STRNEQ (sec->name, ".stab")
252b5132
RH
3183 && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0)
3184 {
3185 size_t len;
3186 char *alc;
3187
3188 len = strlen (sec->name);
a50b1753 3189 alc = (char *) bfd_malloc (len - 2);
252b5132 3190 if (alc == NULL)
b34976b6 3191 return FALSE;
d4c88bbb 3192 memcpy (alc, sec->name, len - 3);
252b5132
RH
3193 alc[len - 3] = '\0';
3194 s = bfd_get_section_by_name (abfd, alc);
3195 free (alc);
3196 if (s != NULL)
3197 {
3198 elf_section_data (s)->this_hdr.sh_link = d->this_idx;
3199
3200 /* This is a .stab section. */
0594c12d
AM
3201 if (elf_section_data (s)->this_hdr.sh_entsize == 0)
3202 elf_section_data (s)->this_hdr.sh_entsize
3203 = 4 + 2 * bfd_get_arch_size (abfd) / 8;
252b5132
RH
3204 }
3205 }
3206 break;
3207
3208 case SHT_DYNAMIC:
3209 case SHT_DYNSYM:
3210 case SHT_GNU_verneed:
3211 case SHT_GNU_verdef:
3212 /* sh_link is the section header index of the string table
3213 used for the dynamic entries, or the symbol table, or the
3214 version strings. */
3215 s = bfd_get_section_by_name (abfd, ".dynstr");
3216 if (s != NULL)
3217 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3218 break;
3219
7f1204bb
JJ
3220 case SHT_GNU_LIBLIST:
3221 /* sh_link is the section header index of the prelink library
08a40648
AM
3222 list used for the dynamic entries, or the symbol table, or
3223 the version strings. */
7f1204bb
JJ
3224 s = bfd_get_section_by_name (abfd, (sec->flags & SEC_ALLOC)
3225 ? ".dynstr" : ".gnu.libstr");
3226 if (s != NULL)
3227 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3228 break;
3229
252b5132 3230 case SHT_HASH:
fdc90cb4 3231 case SHT_GNU_HASH:
252b5132
RH
3232 case SHT_GNU_versym:
3233 /* sh_link is the section header index of the symbol table
3234 this hash table or version table is for. */
3235 s = bfd_get_section_by_name (abfd, ".dynsym");
3236 if (s != NULL)
3237 d->this_hdr.sh_link = elf_section_data (s)->this_idx;
3238 break;
dbb410c3
AM
3239
3240 case SHT_GROUP:
12bd6957 3241 d->this_hdr.sh_link = elf_onesymtab (abfd);
252b5132
RH
3242 }
3243 }
3244
2b0f7ef9 3245 for (secn = 1; secn < section_number; ++secn)
9ad5cbcf
AM
3246 if (i_shdrp[secn] == NULL)
3247 i_shdrp[secn] = i_shdrp[0];
3248 else
3249 i_shdrp[secn]->sh_name = _bfd_elf_strtab_offset (elf_shstrtab (abfd),
3250 i_shdrp[secn]->sh_name);
b34976b6 3251 return TRUE;
252b5132
RH
3252}
3253
5372391b 3254static bfd_boolean
217aa764 3255sym_is_global (bfd *abfd, asymbol *sym)
252b5132
RH
3256{
3257 /* If the backend has a special mapping, use it. */
9c5bfbb7 3258 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764
AM
3259 if (bed->elf_backend_sym_is_global)
3260 return (*bed->elf_backend_sym_is_global) (abfd, sym);
252b5132 3261
e47bf690 3262 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
252b5132
RH
3263 || bfd_is_und_section (bfd_get_section (sym))
3264 || bfd_is_com_section (bfd_get_section (sym)));
3265}
3266
5372391b 3267/* Don't output section symbols for sections that are not going to be
c6d8cab4 3268 output, that are duplicates or there is no BFD section. */
5372391b
AM
3269
3270static bfd_boolean
3271ignore_section_sym (bfd *abfd, asymbol *sym)
3272{
c6d8cab4
L
3273 elf_symbol_type *type_ptr;
3274
3275 if ((sym->flags & BSF_SECTION_SYM) == 0)
3276 return FALSE;
3277
3278 type_ptr = elf_symbol_from (abfd, sym);
3279 return ((type_ptr != NULL
3280 && type_ptr->internal_elf_sym.st_shndx != 0
3281 && bfd_is_abs_section (sym->section))
3282 || !(sym->section->owner == abfd
0f0a5e58 3283 || (sym->section->output_section->owner == abfd
2633a79c
AM
3284 && sym->section->output_offset == 0)
3285 || bfd_is_abs_section (sym->section)));
5372391b
AM
3286}
3287
2633a79c
AM
3288/* Map symbol from it's internal number to the external number, moving
3289 all local symbols to be at the head of the list. */
3290
b34976b6 3291static bfd_boolean
12bd6957 3292elf_map_symbols (bfd *abfd, unsigned int *pnum_locals)
252b5132 3293{
dc810e39 3294 unsigned int symcount = bfd_get_symcount (abfd);
252b5132
RH
3295 asymbol **syms = bfd_get_outsymbols (abfd);
3296 asymbol **sect_syms;
dc810e39
AM
3297 unsigned int num_locals = 0;
3298 unsigned int num_globals = 0;
3299 unsigned int num_locals2 = 0;
3300 unsigned int num_globals2 = 0;
252b5132 3301 int max_index = 0;
dc810e39 3302 unsigned int idx;
252b5132
RH
3303 asection *asect;
3304 asymbol **new_syms;
252b5132
RH
3305
3306#ifdef DEBUG
3307 fprintf (stderr, "elf_map_symbols\n");
3308 fflush (stderr);
3309#endif
3310
252b5132
RH
3311 for (asect = abfd->sections; asect; asect = asect->next)
3312 {
3313 if (max_index < asect->index)
3314 max_index = asect->index;
3315 }
3316
3317 max_index++;
a50b1753 3318 sect_syms = (asymbol **) bfd_zalloc2 (abfd, max_index, sizeof (asymbol *));
252b5132 3319 if (sect_syms == NULL)
b34976b6 3320 return FALSE;
252b5132 3321 elf_section_syms (abfd) = sect_syms;
4e89ac30 3322 elf_num_section_syms (abfd) = max_index;
252b5132 3323
079e9a2f
AM
3324 /* Init sect_syms entries for any section symbols we have already
3325 decided to output. */
252b5132
RH
3326 for (idx = 0; idx < symcount; idx++)
3327 {
dc810e39 3328 asymbol *sym = syms[idx];
c044fabd 3329
252b5132 3330 if ((sym->flags & BSF_SECTION_SYM) != 0
0f0a5e58 3331 && sym->value == 0
2633a79c
AM
3332 && !ignore_section_sym (abfd, sym)
3333 && !bfd_is_abs_section (sym->section))
252b5132 3334 {
5372391b 3335 asection *sec = sym->section;
252b5132 3336
5372391b
AM
3337 if (sec->owner != abfd)
3338 sec = sec->output_section;
252b5132 3339
5372391b 3340 sect_syms[sec->index] = syms[idx];
252b5132
RH
3341 }
3342 }
3343
252b5132
RH
3344 /* Classify all of the symbols. */
3345 for (idx = 0; idx < symcount; idx++)
3346 {
2633a79c 3347 if (sym_is_global (abfd, syms[idx]))
252b5132 3348 num_globals++;
2633a79c
AM
3349 else if (!ignore_section_sym (abfd, syms[idx]))
3350 num_locals++;
252b5132 3351 }
079e9a2f 3352
5372391b 3353 /* We will be adding a section symbol for each normal BFD section. Most
079e9a2f
AM
3354 sections will already have a section symbol in outsymbols, but
3355 eg. SHT_GROUP sections will not, and we need the section symbol mapped
3356 at least in that case. */
252b5132
RH
3357 for (asect = abfd->sections; asect; asect = asect->next)
3358 {
079e9a2f 3359 if (sect_syms[asect->index] == NULL)
252b5132 3360 {
079e9a2f 3361 if (!sym_is_global (abfd, asect->symbol))
252b5132
RH
3362 num_locals++;
3363 else
3364 num_globals++;
252b5132
RH
3365 }
3366 }
3367
3368 /* Now sort the symbols so the local symbols are first. */
a50b1753
NC
3369 new_syms = (asymbol **) bfd_alloc2 (abfd, num_locals + num_globals,
3370 sizeof (asymbol *));
dc810e39 3371
252b5132 3372 if (new_syms == NULL)
b34976b6 3373 return FALSE;
252b5132
RH
3374
3375 for (idx = 0; idx < symcount; idx++)
3376 {
3377 asymbol *sym = syms[idx];
dc810e39 3378 unsigned int i;
252b5132 3379
2633a79c
AM
3380 if (sym_is_global (abfd, sym))
3381 i = num_locals + num_globals2++;
3382 else if (!ignore_section_sym (abfd, sym))
252b5132
RH
3383 i = num_locals2++;
3384 else
2633a79c 3385 continue;
252b5132
RH
3386 new_syms[i] = sym;
3387 sym->udata.i = i + 1;
3388 }
3389 for (asect = abfd->sections; asect; asect = asect->next)
3390 {
079e9a2f 3391 if (sect_syms[asect->index] == NULL)
252b5132 3392 {
079e9a2f 3393 asymbol *sym = asect->symbol;
dc810e39 3394 unsigned int i;
252b5132 3395
079e9a2f 3396 sect_syms[asect->index] = sym;
252b5132
RH
3397 if (!sym_is_global (abfd, sym))
3398 i = num_locals2++;
3399 else
3400 i = num_locals + num_globals2++;
3401 new_syms[i] = sym;
3402 sym->udata.i = i + 1;
3403 }
3404 }
3405
3406 bfd_set_symtab (abfd, new_syms, num_locals + num_globals);
3407
12bd6957 3408 *pnum_locals = num_locals;
b34976b6 3409 return TRUE;
252b5132
RH
3410}
3411
3412/* Align to the maximum file alignment that could be required for any
3413 ELF data structure. */
3414
268b6b39 3415static inline file_ptr
217aa764 3416align_file_position (file_ptr off, int align)
252b5132
RH
3417{
3418 return (off + align - 1) & ~(align - 1);
3419}
3420
3421/* Assign a file position to a section, optionally aligning to the
3422 required section alignment. */
3423
217aa764
AM
3424file_ptr
3425_bfd_elf_assign_file_position_for_section (Elf_Internal_Shdr *i_shdrp,
3426 file_ptr offset,
3427 bfd_boolean align)
252b5132 3428{
72de5009
AM
3429 if (align && i_shdrp->sh_addralign > 1)
3430 offset = BFD_ALIGN (offset, i_shdrp->sh_addralign);
252b5132
RH
3431 i_shdrp->sh_offset = offset;
3432 if (i_shdrp->bfd_section != NULL)
3433 i_shdrp->bfd_section->filepos = offset;
3434 if (i_shdrp->sh_type != SHT_NOBITS)
3435 offset += i_shdrp->sh_size;
3436 return offset;
3437}
3438
3439/* Compute the file positions we are going to put the sections at, and
3440 otherwise prepare to begin writing out the ELF file. If LINK_INFO
3441 is not NULL, this is being called by the ELF backend linker. */
3442
b34976b6 3443bfd_boolean
217aa764
AM
3444_bfd_elf_compute_section_file_positions (bfd *abfd,
3445 struct bfd_link_info *link_info)
252b5132 3446{
9c5bfbb7 3447 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
d4730f92 3448 struct fake_section_arg fsargs;
b34976b6 3449 bfd_boolean failed;
4b6c0f2f 3450 struct bfd_strtab_hash *strtab = NULL;
252b5132 3451 Elf_Internal_Shdr *shstrtab_hdr;
3516e984 3452 bfd_boolean need_symtab;
252b5132
RH
3453
3454 if (abfd->output_has_begun)
b34976b6 3455 return TRUE;
252b5132
RH
3456
3457 /* Do any elf backend specific processing first. */
3458 if (bed->elf_backend_begin_write_processing)
3459 (*bed->elf_backend_begin_write_processing) (abfd, link_info);
3460
3461 if (! prep_headers (abfd))
b34976b6 3462 return FALSE;
252b5132 3463
e6c51ed4 3464 /* Post process the headers if necessary. */
78245035 3465 (*bed->elf_backend_post_process_headers) (abfd, link_info);
e6c51ed4 3466
d4730f92
BS
3467 fsargs.failed = FALSE;
3468 fsargs.link_info = link_info;
3469 bfd_map_over_sections (abfd, elf_fake_sections, &fsargs);
3470 if (fsargs.failed)
b34976b6 3471 return FALSE;
252b5132 3472
da9f89d4 3473 if (!assign_section_numbers (abfd, link_info))
b34976b6 3474 return FALSE;
252b5132
RH
3475
3476 /* The backend linker builds symbol table information itself. */
3516e984
L
3477 need_symtab = (link_info == NULL
3478 && (bfd_get_symcount (abfd) > 0
3479 || ((abfd->flags & (EXEC_P | DYNAMIC | HAS_RELOC))
3480 == HAS_RELOC)));
3481 if (need_symtab)
252b5132
RH
3482 {
3483 /* Non-zero if doing a relocatable link. */
3484 int relocatable_p = ! (abfd->flags & (EXEC_P | DYNAMIC));
3485
3486 if (! swap_out_syms (abfd, &strtab, relocatable_p))
b34976b6 3487 return FALSE;
252b5132
RH
3488 }
3489
d4730f92 3490 failed = FALSE;
1126897b 3491 if (link_info == NULL)
dbb410c3 3492 {
1126897b 3493 bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
dbb410c3 3494 if (failed)
b34976b6 3495 return FALSE;
dbb410c3
AM
3496 }
3497
252b5132
RH
3498 shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr;
3499 /* sh_name was set in prep_headers. */
3500 shstrtab_hdr->sh_type = SHT_STRTAB;
3501 shstrtab_hdr->sh_flags = 0;
3502 shstrtab_hdr->sh_addr = 0;
2b0f7ef9 3503 shstrtab_hdr->sh_size = _bfd_elf_strtab_size (elf_shstrtab (abfd));
252b5132
RH
3504 shstrtab_hdr->sh_entsize = 0;
3505 shstrtab_hdr->sh_link = 0;
3506 shstrtab_hdr->sh_info = 0;
3507 /* sh_offset is set in assign_file_positions_except_relocs. */
3508 shstrtab_hdr->sh_addralign = 1;
3509
c84fca4d 3510 if (!assign_file_positions_except_relocs (abfd, link_info))
b34976b6 3511 return FALSE;
252b5132 3512
3516e984 3513 if (need_symtab)
252b5132
RH
3514 {
3515 file_ptr off;
3516 Elf_Internal_Shdr *hdr;
3517
12bd6957 3518 off = elf_next_file_pos (abfd);
252b5132
RH
3519
3520 hdr = &elf_tdata (abfd)->symtab_hdr;
b34976b6 3521 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 3522
9ad5cbcf
AM
3523 hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
3524 if (hdr->sh_size != 0)
b34976b6 3525 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
9ad5cbcf 3526
252b5132 3527 hdr = &elf_tdata (abfd)->strtab_hdr;
b34976b6 3528 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132 3529
12bd6957 3530 elf_next_file_pos (abfd) = off;
252b5132
RH
3531
3532 /* Now that we know where the .strtab section goes, write it
08a40648 3533 out. */
252b5132
RH
3534 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
3535 || ! _bfd_stringtab_emit (abfd, strtab))
b34976b6 3536 return FALSE;
252b5132
RH
3537 _bfd_stringtab_free (strtab);
3538 }
3539
b34976b6 3540 abfd->output_has_begun = TRUE;
252b5132 3541
b34976b6 3542 return TRUE;
252b5132
RH
3543}
3544
8ded5a0f
AM
3545/* Make an initial estimate of the size of the program header. If we
3546 get the number wrong here, we'll redo section placement. */
3547
3548static bfd_size_type
3549get_program_header_size (bfd *abfd, struct bfd_link_info *info)
3550{
3551 size_t segs;
3552 asection *s;
2b05f1b7 3553 const struct elf_backend_data *bed;
8ded5a0f
AM
3554
3555 /* Assume we will need exactly two PT_LOAD segments: one for text
3556 and one for data. */
3557 segs = 2;
3558
3559 s = bfd_get_section_by_name (abfd, ".interp");
3560 if (s != NULL && (s->flags & SEC_LOAD) != 0)
3561 {
3562 /* If we have a loadable interpreter section, we need a
3563 PT_INTERP segment. In this case, assume we also need a
3564 PT_PHDR segment, although that may not be true for all
3565 targets. */
3566 segs += 2;
3567 }
3568
3569 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
3570 {
3571 /* We need a PT_DYNAMIC segment. */
3572 ++segs;
f210dcff 3573 }
08a40648 3574
ceae84aa 3575 if (info != NULL && info->relro)
f210dcff
L
3576 {
3577 /* We need a PT_GNU_RELRO segment. */
3578 ++segs;
8ded5a0f
AM
3579 }
3580
12bd6957 3581 if (elf_eh_frame_hdr (abfd))
8ded5a0f
AM
3582 {
3583 /* We need a PT_GNU_EH_FRAME segment. */
3584 ++segs;
3585 }
3586
12bd6957 3587 if (elf_stack_flags (abfd))
8ded5a0f 3588 {
2b05f1b7
L
3589 /* We need a PT_GNU_STACK segment. */
3590 ++segs;
3591 }
94b11780 3592
2b05f1b7
L
3593 for (s = abfd->sections; s != NULL; s = s->next)
3594 {
8ded5a0f 3595 if ((s->flags & SEC_LOAD) != 0
0112cd26 3596 && CONST_STRNEQ (s->name, ".note"))
8ded5a0f
AM
3597 {
3598 /* We need a PT_NOTE segment. */
3599 ++segs;
1c5265b5
JJ
3600 /* Try to create just one PT_NOTE segment
3601 for all adjacent loadable .note* sections.
3602 gABI requires that within a PT_NOTE segment
3603 (and also inside of each SHT_NOTE section)
3604 each note is padded to a multiple of 4 size,
3605 so we check whether the sections are correctly
3606 aligned. */
3607 if (s->alignment_power == 2)
3608 while (s->next != NULL
3609 && s->next->alignment_power == 2
3610 && (s->next->flags & SEC_LOAD) != 0
3611 && CONST_STRNEQ (s->next->name, ".note"))
3612 s = s->next;
8ded5a0f
AM
3613 }
3614 }
3615
3616 for (s = abfd->sections; s != NULL; s = s->next)
3617 {
3618 if (s->flags & SEC_THREAD_LOCAL)
3619 {
3620 /* We need a PT_TLS segment. */
3621 ++segs;
3622 break;
3623 }
3624 }
3625
3626 /* Let the backend count up any program headers it might need. */
2b05f1b7 3627 bed = get_elf_backend_data (abfd);
8ded5a0f
AM
3628 if (bed->elf_backend_additional_program_headers)
3629 {
3630 int a;
3631
3632 a = (*bed->elf_backend_additional_program_headers) (abfd, info);
3633 if (a == -1)
3634 abort ();
3635 segs += a;
3636 }
3637
3638 return segs * bed->s->sizeof_phdr;
3639}
3640
2ea37f1c
NC
3641/* Find the segment that contains the output_section of section. */
3642
3643Elf_Internal_Phdr *
3644_bfd_elf_find_segment_containing_section (bfd * abfd, asection * section)
3645{
3646 struct elf_segment_map *m;
3647 Elf_Internal_Phdr *p;
3648
12bd6957 3649 for (m = elf_seg_map (abfd), p = elf_tdata (abfd)->phdr;
2ea37f1c
NC
3650 m != NULL;
3651 m = m->next, p++)
3652 {
3653 int i;
3654
3655 for (i = m->count - 1; i >= 0; i--)
3656 if (m->sections[i] == section)
3657 return p;
3658 }
3659
3660 return NULL;
3661}
3662
252b5132
RH
3663/* Create a mapping from a set of sections to a program segment. */
3664
217aa764
AM
3665static struct elf_segment_map *
3666make_mapping (bfd *abfd,
3667 asection **sections,
3668 unsigned int from,
3669 unsigned int to,
3670 bfd_boolean phdr)
252b5132
RH
3671{
3672 struct elf_segment_map *m;
3673 unsigned int i;
3674 asection **hdrpp;
dc810e39 3675 bfd_size_type amt;
252b5132 3676
dc810e39
AM
3677 amt = sizeof (struct elf_segment_map);
3678 amt += (to - from - 1) * sizeof (asection *);
a50b1753 3679 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
3680 if (m == NULL)
3681 return NULL;
3682 m->next = NULL;
3683 m->p_type = PT_LOAD;
3684 for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++)
3685 m->sections[i - from] = *hdrpp;
3686 m->count = to - from;
3687
3688 if (from == 0 && phdr)
3689 {
3690 /* Include the headers in the first PT_LOAD segment. */
3691 m->includes_filehdr = 1;
3692 m->includes_phdrs = 1;
3693 }
3694
3695 return m;
3696}
3697
229fcec5
MM
3698/* Create the PT_DYNAMIC segment, which includes DYNSEC. Returns NULL
3699 on failure. */
3700
3701struct elf_segment_map *
3702_bfd_elf_make_dynamic_segment (bfd *abfd, asection *dynsec)
3703{
3704 struct elf_segment_map *m;
3705
a50b1753
NC
3706 m = (struct elf_segment_map *) bfd_zalloc (abfd,
3707 sizeof (struct elf_segment_map));
229fcec5
MM
3708 if (m == NULL)
3709 return NULL;
3710 m->next = NULL;
3711 m->p_type = PT_DYNAMIC;
3712 m->count = 1;
3713 m->sections[0] = dynsec;
08a40648 3714
229fcec5
MM
3715 return m;
3716}
3717
8ded5a0f 3718/* Possibly add or remove segments from the segment map. */
252b5132 3719
b34976b6 3720static bfd_boolean
3dea8fca
AM
3721elf_modify_segment_map (bfd *abfd,
3722 struct bfd_link_info *info,
3723 bfd_boolean remove_empty_load)
252b5132 3724{
252e386e 3725 struct elf_segment_map **m;
8ded5a0f 3726 const struct elf_backend_data *bed;
252b5132 3727
8ded5a0f
AM
3728 /* The placement algorithm assumes that non allocated sections are
3729 not in PT_LOAD segments. We ensure this here by removing such
3730 sections from the segment map. We also remove excluded
252e386e
AM
3731 sections. Finally, any PT_LOAD segment without sections is
3732 removed. */
12bd6957 3733 m = &elf_seg_map (abfd);
252e386e 3734 while (*m)
8ded5a0f
AM
3735 {
3736 unsigned int i, new_count;
252b5132 3737
252e386e 3738 for (new_count = 0, i = 0; i < (*m)->count; i++)
8ded5a0f 3739 {
252e386e
AM
3740 if (((*m)->sections[i]->flags & SEC_EXCLUDE) == 0
3741 && (((*m)->sections[i]->flags & SEC_ALLOC) != 0
3742 || (*m)->p_type != PT_LOAD))
8ded5a0f 3743 {
252e386e
AM
3744 (*m)->sections[new_count] = (*m)->sections[i];
3745 new_count++;
8ded5a0f
AM
3746 }
3747 }
252e386e 3748 (*m)->count = new_count;
252b5132 3749
3dea8fca 3750 if (remove_empty_load && (*m)->p_type == PT_LOAD && (*m)->count == 0)
252e386e
AM
3751 *m = (*m)->next;
3752 else
3753 m = &(*m)->next;
8ded5a0f 3754 }
252b5132 3755
8ded5a0f
AM
3756 bed = get_elf_backend_data (abfd);
3757 if (bed->elf_backend_modify_segment_map != NULL)
252b5132 3758 {
252e386e 3759 if (!(*bed->elf_backend_modify_segment_map) (abfd, info))
8ded5a0f 3760 return FALSE;
252b5132 3761 }
252b5132 3762
8ded5a0f
AM
3763 return TRUE;
3764}
252b5132 3765
8ded5a0f 3766/* Set up a mapping from BFD sections to program segments. */
252b5132 3767
8ded5a0f
AM
3768bfd_boolean
3769_bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
3770{
3771 unsigned int count;
3772 struct elf_segment_map *m;
3773 asection **sections = NULL;
3774 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3dea8fca 3775 bfd_boolean no_user_phdrs;
252b5132 3776
12bd6957 3777 no_user_phdrs = elf_seg_map (abfd) == NULL;
d324f6d6
RM
3778
3779 if (info != NULL)
3780 info->user_phdrs = !no_user_phdrs;
3781
3dea8fca 3782 if (no_user_phdrs && bfd_count_sections (abfd) != 0)
252b5132 3783 {
8ded5a0f
AM
3784 asection *s;
3785 unsigned int i;
3786 struct elf_segment_map *mfirst;
3787 struct elf_segment_map **pm;
3788 asection *last_hdr;
3789 bfd_vma last_size;
3790 unsigned int phdr_index;
3791 bfd_vma maxpagesize;
3792 asection **hdrpp;
3793 bfd_boolean phdr_in_segment = TRUE;
3794 bfd_boolean writable;
3795 int tls_count = 0;
3796 asection *first_tls = NULL;
3797 asection *dynsec, *eh_frame_hdr;
3798 bfd_size_type amt;
8d06853e 3799 bfd_vma addr_mask, wrap_to = 0;
252b5132 3800
8ded5a0f 3801 /* Select the allocated sections, and sort them. */
252b5132 3802
a50b1753
NC
3803 sections = (asection **) bfd_malloc2 (bfd_count_sections (abfd),
3804 sizeof (asection *));
8ded5a0f 3805 if (sections == NULL)
252b5132 3806 goto error_return;
252b5132 3807
8d06853e
AM
3808 /* Calculate top address, avoiding undefined behaviour of shift
3809 left operator when shift count is equal to size of type
3810 being shifted. */
3811 addr_mask = ((bfd_vma) 1 << (bfd_arch_bits_per_address (abfd) - 1)) - 1;
3812 addr_mask = (addr_mask << 1) + 1;
3813
8ded5a0f
AM
3814 i = 0;
3815 for (s = abfd->sections; s != NULL; s = s->next)
3816 {
3817 if ((s->flags & SEC_ALLOC) != 0)
3818 {
3819 sections[i] = s;
3820 ++i;
8d06853e
AM
3821 /* A wrapping section potentially clashes with header. */
3822 if (((s->lma + s->size) & addr_mask) < (s->lma & addr_mask))
3823 wrap_to = (s->lma + s->size) & addr_mask;
8ded5a0f
AM
3824 }
3825 }
3826 BFD_ASSERT (i <= bfd_count_sections (abfd));
3827 count = i;
252b5132 3828
8ded5a0f 3829 qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections);
252b5132 3830
8ded5a0f 3831 /* Build the mapping. */
252b5132 3832
8ded5a0f
AM
3833 mfirst = NULL;
3834 pm = &mfirst;
252b5132 3835
8ded5a0f
AM
3836 /* If we have a .interp section, then create a PT_PHDR segment for
3837 the program headers and a PT_INTERP segment for the .interp
3838 section. */
3839 s = bfd_get_section_by_name (abfd, ".interp");
3840 if (s != NULL && (s->flags & SEC_LOAD) != 0)
3841 {
3842 amt = sizeof (struct elf_segment_map);
a50b1753 3843 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
3844 if (m == NULL)
3845 goto error_return;
3846 m->next = NULL;
3847 m->p_type = PT_PHDR;
3848 /* FIXME: UnixWare and Solaris set PF_X, Irix 5 does not. */
3849 m->p_flags = PF_R | PF_X;
3850 m->p_flags_valid = 1;
3851 m->includes_phdrs = 1;
252b5132 3852
8ded5a0f
AM
3853 *pm = m;
3854 pm = &m->next;
252b5132 3855
8ded5a0f 3856 amt = sizeof (struct elf_segment_map);
a50b1753 3857 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
3858 if (m == NULL)
3859 goto error_return;
3860 m->next = NULL;
3861 m->p_type = PT_INTERP;
3862 m->count = 1;
3863 m->sections[0] = s;
3864
3865 *pm = m;
3866 pm = &m->next;
252b5132 3867 }
8ded5a0f
AM
3868
3869 /* Look through the sections. We put sections in the same program
3870 segment when the start of the second section can be placed within
3871 a few bytes of the end of the first section. */
3872 last_hdr = NULL;
3873 last_size = 0;
3874 phdr_index = 0;
3875 maxpagesize = bed->maxpagesize;
3876 writable = FALSE;
3877 dynsec = bfd_get_section_by_name (abfd, ".dynamic");
3878 if (dynsec != NULL
3879 && (dynsec->flags & SEC_LOAD) == 0)
3880 dynsec = NULL;
3881
3882 /* Deal with -Ttext or something similar such that the first section
3883 is not adjacent to the program headers. This is an
3884 approximation, since at this point we don't know exactly how many
3885 program headers we will need. */
3886 if (count > 0)
252b5132 3887 {
12bd6957 3888 bfd_size_type phdr_size = elf_program_header_size (abfd);
8ded5a0f 3889
62d7a5f6 3890 if (phdr_size == (bfd_size_type) -1)
8ded5a0f 3891 phdr_size = get_program_header_size (abfd, info);
d2bcb0d1 3892 phdr_size += bed->s->sizeof_ehdr;
8ded5a0f 3893 if ((abfd->flags & D_PAGED) == 0
8d06853e
AM
3894 || (sections[0]->lma & addr_mask) < phdr_size
3895 || ((sections[0]->lma & addr_mask) % maxpagesize
3896 < phdr_size % maxpagesize)
3897 || (sections[0]->lma & addr_mask & -maxpagesize) < wrap_to)
8ded5a0f 3898 phdr_in_segment = FALSE;
252b5132
RH
3899 }
3900
8ded5a0f 3901 for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
252b5132 3902 {
8ded5a0f
AM
3903 asection *hdr;
3904 bfd_boolean new_segment;
3905
3906 hdr = *hdrpp;
3907
3908 /* See if this section and the last one will fit in the same
3909 segment. */
3910
3911 if (last_hdr == NULL)
3912 {
3913 /* If we don't have a segment yet, then we don't need a new
3914 one (we build the last one after this loop). */
3915 new_segment = FALSE;
3916 }
3917 else if (last_hdr->lma - last_hdr->vma != hdr->lma - hdr->vma)
3918 {
3919 /* If this section has a different relation between the
3920 virtual address and the load address, then we need a new
3921 segment. */
3922 new_segment = TRUE;
3923 }
b5599592
AM
3924 else if (hdr->lma < last_hdr->lma + last_size
3925 || last_hdr->lma + last_size < last_hdr->lma)
3926 {
3927 /* If this section has a load address that makes it overlap
3928 the previous section, then we need a new segment. */
3929 new_segment = TRUE;
3930 }
39948a60
NC
3931 /* In the next test we have to be careful when last_hdr->lma is close
3932 to the end of the address space. If the aligned address wraps
3933 around to the start of the address space, then there are no more
3934 pages left in memory and it is OK to assume that the current
3935 section can be included in the current segment. */
3936 else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
3937 > last_hdr->lma)
3938 && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
4ff73856 3939 <= hdr->lma))
8ded5a0f
AM
3940 {
3941 /* If putting this section in this segment would force us to
3942 skip a page in the segment, then we need a new segment. */
3943 new_segment = TRUE;
3944 }
3945 else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
3946 && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0)
3947 {
3948 /* We don't want to put a loadable section after a
3949 nonloadable section in the same segment.
3950 Consider .tbss sections as loadable for this purpose. */
3951 new_segment = TRUE;
3952 }
3953 else if ((abfd->flags & D_PAGED) == 0)
3954 {
3955 /* If the file is not demand paged, which means that we
3956 don't require the sections to be correctly aligned in the
3957 file, then there is no other reason for a new segment. */
3958 new_segment = FALSE;
3959 }
3960 else if (! writable
3961 && (hdr->flags & SEC_READONLY) == 0
8d06853e
AM
3962 && (((last_hdr->lma + last_size - 1) & -maxpagesize)
3963 != (hdr->lma & -maxpagesize)))
8ded5a0f
AM
3964 {
3965 /* We don't want to put a writable section in a read only
3966 segment, unless they are on the same page in memory
3967 anyhow. We already know that the last section does not
3968 bring us past the current section on the page, so the
3969 only case in which the new section is not on the same
3970 page as the previous section is when the previous section
3971 ends precisely on a page boundary. */
3972 new_segment = TRUE;
3973 }
3974 else
3975 {
3976 /* Otherwise, we can use the same segment. */
3977 new_segment = FALSE;
3978 }
3979
2889e75b 3980 /* Allow interested parties a chance to override our decision. */
ceae84aa
AM
3981 if (last_hdr != NULL
3982 && info != NULL
3983 && info->callbacks->override_segment_assignment != NULL)
3984 new_segment
3985 = info->callbacks->override_segment_assignment (info, abfd, hdr,
3986 last_hdr,
3987 new_segment);
2889e75b 3988
8ded5a0f
AM
3989 if (! new_segment)
3990 {
3991 if ((hdr->flags & SEC_READONLY) == 0)
3992 writable = TRUE;
3993 last_hdr = hdr;
3994 /* .tbss sections effectively have zero size. */
3995 if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
3996 != SEC_THREAD_LOCAL)
3997 last_size = hdr->size;
3998 else
3999 last_size = 0;
4000 continue;
4001 }
4002
4003 /* We need a new program segment. We must create a new program
4004 header holding all the sections from phdr_index until hdr. */
4005
4006 m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4007 if (m == NULL)
4008 goto error_return;
4009
4010 *pm = m;
4011 pm = &m->next;
4012
252b5132 4013 if ((hdr->flags & SEC_READONLY) == 0)
b34976b6 4014 writable = TRUE;
8ded5a0f
AM
4015 else
4016 writable = FALSE;
4017
baaff79e
JJ
4018 last_hdr = hdr;
4019 /* .tbss sections effectively have zero size. */
e5caec89 4020 if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
eea6121a 4021 last_size = hdr->size;
baaff79e
JJ
4022 else
4023 last_size = 0;
8ded5a0f
AM
4024 phdr_index = i;
4025 phdr_in_segment = FALSE;
252b5132
RH
4026 }
4027
86b2281f
AM
4028 /* Create a final PT_LOAD program segment, but not if it's just
4029 for .tbss. */
4030 if (last_hdr != NULL
4031 && (i - phdr_index != 1
4032 || ((last_hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
4033 != SEC_THREAD_LOCAL)))
8ded5a0f
AM
4034 {
4035 m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
4036 if (m == NULL)
4037 goto error_return;
252b5132 4038
8ded5a0f
AM
4039 *pm = m;
4040 pm = &m->next;
4041 }
252b5132 4042
8ded5a0f
AM
4043 /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */
4044 if (dynsec != NULL)
4045 {
4046 m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
4047 if (m == NULL)
4048 goto error_return;
4049 *pm = m;
4050 pm = &m->next;
4051 }
252b5132 4052
1c5265b5
JJ
4053 /* For each batch of consecutive loadable .note sections,
4054 add a PT_NOTE segment. We don't use bfd_get_section_by_name,
4055 because if we link together nonloadable .note sections and
4056 loadable .note sections, we will generate two .note sections
4057 in the output file. FIXME: Using names for section types is
4058 bogus anyhow. */
8ded5a0f
AM
4059 for (s = abfd->sections; s != NULL; s = s->next)
4060 {
4061 if ((s->flags & SEC_LOAD) != 0
0112cd26 4062 && CONST_STRNEQ (s->name, ".note"))
8ded5a0f 4063 {
1c5265b5 4064 asection *s2;
91d6fa6a
NC
4065
4066 count = 1;
8ded5a0f 4067 amt = sizeof (struct elf_segment_map);
1c5265b5
JJ
4068 if (s->alignment_power == 2)
4069 for (s2 = s; s2->next != NULL; s2 = s2->next)
55b581a6
JJ
4070 {
4071 if (s2->next->alignment_power == 2
4072 && (s2->next->flags & SEC_LOAD) != 0
4073 && CONST_STRNEQ (s2->next->name, ".note")
8d06853e
AM
4074 && align_power (s2->lma + s2->size, 2)
4075 == s2->next->lma)
55b581a6
JJ
4076 count++;
4077 else
4078 break;
4079 }
1c5265b5 4080 amt += (count - 1) * sizeof (asection *);
a50b1753 4081 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4082 if (m == NULL)
4083 goto error_return;
4084 m->next = NULL;
4085 m->p_type = PT_NOTE;
1c5265b5
JJ
4086 m->count = count;
4087 while (count > 1)
4088 {
4089 m->sections[m->count - count--] = s;
4090 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
4091 s = s->next;
4092 }
4093 m->sections[m->count - 1] = s;
4094 BFD_ASSERT ((s->flags & SEC_THREAD_LOCAL) == 0);
8ded5a0f
AM
4095 *pm = m;
4096 pm = &m->next;
4097 }
4098 if (s->flags & SEC_THREAD_LOCAL)
4099 {
4100 if (! tls_count)
4101 first_tls = s;
4102 tls_count++;
4103 }
4104 }
252b5132 4105
8ded5a0f
AM
4106 /* If there are any SHF_TLS output sections, add PT_TLS segment. */
4107 if (tls_count > 0)
4108 {
8ded5a0f
AM
4109 amt = sizeof (struct elf_segment_map);
4110 amt += (tls_count - 1) * sizeof (asection *);
a50b1753 4111 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4112 if (m == NULL)
4113 goto error_return;
4114 m->next = NULL;
4115 m->p_type = PT_TLS;
4116 m->count = tls_count;
4117 /* Mandated PF_R. */
4118 m->p_flags = PF_R;
4119 m->p_flags_valid = 1;
91d6fa6a 4120 for (i = 0; i < (unsigned int) tls_count; ++i)
8ded5a0f
AM
4121 {
4122 BFD_ASSERT (first_tls->flags & SEC_THREAD_LOCAL);
4123 m->sections[i] = first_tls;
4124 first_tls = first_tls->next;
4125 }
252b5132 4126
8ded5a0f
AM
4127 *pm = m;
4128 pm = &m->next;
4129 }
252b5132 4130
8ded5a0f
AM
4131 /* If there is a .eh_frame_hdr section, throw in a PT_GNU_EH_FRAME
4132 segment. */
12bd6957 4133 eh_frame_hdr = elf_eh_frame_hdr (abfd);
8ded5a0f
AM
4134 if (eh_frame_hdr != NULL
4135 && (eh_frame_hdr->output_section->flags & SEC_LOAD) != 0)
252b5132 4136 {
dc810e39 4137 amt = sizeof (struct elf_segment_map);
a50b1753 4138 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
252b5132
RH
4139 if (m == NULL)
4140 goto error_return;
4141 m->next = NULL;
8ded5a0f 4142 m->p_type = PT_GNU_EH_FRAME;
252b5132 4143 m->count = 1;
8ded5a0f 4144 m->sections[0] = eh_frame_hdr->output_section;
252b5132
RH
4145
4146 *pm = m;
4147 pm = &m->next;
4148 }
13ae64f3 4149
12bd6957 4150 if (elf_stack_flags (abfd))
13ae64f3 4151 {
8ded5a0f 4152 amt = sizeof (struct elf_segment_map);
a50b1753 4153 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
8ded5a0f
AM
4154 if (m == NULL)
4155 goto error_return;
4156 m->next = NULL;
2b05f1b7 4157 m->p_type = PT_GNU_STACK;
12bd6957 4158 m->p_flags = elf_stack_flags (abfd);
04c3a755 4159 m->p_align = bed->stack_align;
8ded5a0f 4160 m->p_flags_valid = 1;
04c3a755
NS
4161 m->p_align_valid = m->p_align != 0;
4162 if (info->stacksize > 0)
4163 {
4164 m->p_size = info->stacksize;
4165 m->p_size_valid = 1;
4166 }
252b5132 4167
8ded5a0f
AM
4168 *pm = m;
4169 pm = &m->next;
4170 }
65765700 4171
ceae84aa 4172 if (info != NULL && info->relro)
8ded5a0f 4173 {
f210dcff
L
4174 for (m = mfirst; m != NULL; m = m->next)
4175 {
3832a4d8
AM
4176 if (m->p_type == PT_LOAD
4177 && m->count != 0
4178 && m->sections[0]->vma >= info->relro_start
4179 && m->sections[0]->vma < info->relro_end)
f210dcff 4180 {
3832a4d8
AM
4181 i = m->count;
4182 while (--i != (unsigned) -1)
4183 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS))
4184 == (SEC_LOAD | SEC_HAS_CONTENTS))
4185 break;
4186
4187 if (i == (unsigned) -1)
4188 continue;
65765700 4189
3832a4d8
AM
4190 if (m->sections[i]->vma + m->sections[i]->size
4191 >= info->relro_end)
f210dcff
L
4192 break;
4193 }
be01b344 4194 }
f210dcff
L
4195
4196 /* Make a PT_GNU_RELRO segment only when it isn't empty. */
4197 if (m != NULL)
4198 {
4199 amt = sizeof (struct elf_segment_map);
a50b1753 4200 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
f210dcff
L
4201 if (m == NULL)
4202 goto error_return;
4203 m->next = NULL;
4204 m->p_type = PT_GNU_RELRO;
4205 m->p_flags = PF_R;
4206 m->p_flags_valid = 1;
4207
4208 *pm = m;
4209 pm = &m->next;
4210 }
8ded5a0f 4211 }
9ee5e499 4212
8ded5a0f 4213 free (sections);
12bd6957 4214 elf_seg_map (abfd) = mfirst;
9ee5e499
JJ
4215 }
4216
3dea8fca 4217 if (!elf_modify_segment_map (abfd, info, no_user_phdrs))
8ded5a0f 4218 return FALSE;
8c37241b 4219
12bd6957 4220 for (count = 0, m = elf_seg_map (abfd); m != NULL; m = m->next)
8ded5a0f 4221 ++count;
12bd6957 4222 elf_program_header_size (abfd) = count * bed->s->sizeof_phdr;
252b5132 4223
b34976b6 4224 return TRUE;
252b5132
RH
4225
4226 error_return:
4227 if (sections != NULL)
4228 free (sections);
b34976b6 4229 return FALSE;
252b5132
RH
4230}
4231
4232/* Sort sections by address. */
4233
4234static int
217aa764 4235elf_sort_sections (const void *arg1, const void *arg2)
252b5132
RH
4236{
4237 const asection *sec1 = *(const asection **) arg1;
4238 const asection *sec2 = *(const asection **) arg2;
eecdbe52 4239 bfd_size_type size1, size2;
252b5132
RH
4240
4241 /* Sort by LMA first, since this is the address used to
4242 place the section into a segment. */
4243 if (sec1->lma < sec2->lma)
4244 return -1;
4245 else if (sec1->lma > sec2->lma)
4246 return 1;
4247
4248 /* Then sort by VMA. Normally the LMA and the VMA will be
4249 the same, and this will do nothing. */
4250 if (sec1->vma < sec2->vma)
4251 return -1;
4252 else if (sec1->vma > sec2->vma)
4253 return 1;
4254
4255 /* Put !SEC_LOAD sections after SEC_LOAD ones. */
4256
07c6e936 4257#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
252b5132
RH
4258
4259 if (TOEND (sec1))
4260 {
4261 if (TOEND (sec2))
00a7cdc5
NC
4262 {
4263 /* If the indicies are the same, do not return 0
4264 here, but continue to try the next comparison. */
4265 if (sec1->target_index - sec2->target_index != 0)
4266 return sec1->target_index - sec2->target_index;
4267 }
252b5132
RH
4268 else
4269 return 1;
4270 }
00a7cdc5 4271 else if (TOEND (sec2))
252b5132
RH
4272 return -1;
4273
4274#undef TOEND
4275
00a7cdc5
NC
4276 /* Sort by size, to put zero sized sections
4277 before others at the same address. */
252b5132 4278
eea6121a
AM
4279 size1 = (sec1->flags & SEC_LOAD) ? sec1->size : 0;
4280 size2 = (sec2->flags & SEC_LOAD) ? sec2->size : 0;
eecdbe52
JJ
4281
4282 if (size1 < size2)
252b5132 4283 return -1;
eecdbe52 4284 if (size1 > size2)
252b5132
RH
4285 return 1;
4286
4287 return sec1->target_index - sec2->target_index;
4288}
4289
340b6d91
AC
4290/* Ian Lance Taylor writes:
4291
4292 We shouldn't be using % with a negative signed number. That's just
4293 not good. We have to make sure either that the number is not
4294 negative, or that the number has an unsigned type. When the types
4295 are all the same size they wind up as unsigned. When file_ptr is a
4296 larger signed type, the arithmetic winds up as signed long long,
4297 which is wrong.
4298
4299 What we're trying to say here is something like ``increase OFF by
4300 the least amount that will cause it to be equal to the VMA modulo
4301 the page size.'' */
4302/* In other words, something like:
4303
4304 vma_offset = m->sections[0]->vma % bed->maxpagesize;
4305 off_offset = off % bed->maxpagesize;
4306 if (vma_offset < off_offset)
4307 adjustment = vma_offset + bed->maxpagesize - off_offset;
4308 else
4309 adjustment = vma_offset - off_offset;
08a40648 4310
340b6d91
AC
4311 which can can be collapsed into the expression below. */
4312
4313static file_ptr
4314vma_page_aligned_bias (bfd_vma vma, ufile_ptr off, bfd_vma maxpagesize)
4315{
dc9155b2
NC
4316 /* PR binutils/16199: Handle an alignment of zero. */
4317 if (maxpagesize == 0)
4318 maxpagesize = 1;
340b6d91
AC
4319 return ((vma - off) % maxpagesize);
4320}
4321
6d33f217
L
4322static void
4323print_segment_map (const struct elf_segment_map *m)
4324{
4325 unsigned int j;
4326 const char *pt = get_segment_type (m->p_type);
4327 char buf[32];
4328
4329 if (pt == NULL)
4330 {
4331 if (m->p_type >= PT_LOPROC && m->p_type <= PT_HIPROC)
4332 sprintf (buf, "LOPROC+%7.7x",
4333 (unsigned int) (m->p_type - PT_LOPROC));
4334 else if (m->p_type >= PT_LOOS && m->p_type <= PT_HIOS)
4335 sprintf (buf, "LOOS+%7.7x",
4336 (unsigned int) (m->p_type - PT_LOOS));
4337 else
4338 snprintf (buf, sizeof (buf), "%8.8x",
4339 (unsigned int) m->p_type);
4340 pt = buf;
4341 }
4a97a0e5 4342 fflush (stdout);
6d33f217
L
4343 fprintf (stderr, "%s:", pt);
4344 for (j = 0; j < m->count; j++)
4345 fprintf (stderr, " %s", m->sections [j]->name);
4346 putc ('\n',stderr);
4a97a0e5 4347 fflush (stderr);
6d33f217
L
4348}
4349
32812159
AM
4350static bfd_boolean
4351write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
4352{
4353 void *buf;
4354 bfd_boolean ret;
4355
4356 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
4357 return FALSE;
4358 buf = bfd_zmalloc (len);
4359 if (buf == NULL)
4360 return FALSE;
4361 ret = bfd_bwrite (buf, len, abfd) == len;
4362 free (buf);
4363 return ret;
4364}
4365
252b5132
RH
4366/* Assign file positions to the sections based on the mapping from
4367 sections to segments. This function also sets up some fields in
f3520d2f 4368 the file header. */
252b5132 4369
b34976b6 4370static bfd_boolean
f3520d2f
AM
4371assign_file_positions_for_load_sections (bfd *abfd,
4372 struct bfd_link_info *link_info)
252b5132
RH
4373{
4374 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 4375 struct elf_segment_map *m;
252b5132 4376 Elf_Internal_Phdr *phdrs;
252b5132 4377 Elf_Internal_Phdr *p;
02bf8d82 4378 file_ptr off;
3f570048 4379 bfd_size_type maxpagesize;
f3520d2f 4380 unsigned int alloc;
0920dee7 4381 unsigned int i, j;
2b0bc088 4382 bfd_vma header_pad = 0;
252b5132 4383
e36284ab 4384 if (link_info == NULL
ceae84aa 4385 && !_bfd_elf_map_sections_to_segments (abfd, link_info))
8ded5a0f 4386 return FALSE;
252b5132 4387
8ded5a0f 4388 alloc = 0;
12bd6957 4389 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
2b0bc088
NC
4390 {
4391 ++alloc;
4392 if (m->header_size)
4393 header_pad = m->header_size;
4394 }
252b5132 4395
82f2dbf7
NC
4396 if (alloc)
4397 {
4398 elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
4399 elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
4400 }
4401 else
4402 {
4403 /* PR binutils/12467. */
4404 elf_elfheader (abfd)->e_phoff = 0;
4405 elf_elfheader (abfd)->e_phentsize = 0;
4406 }
d324f6d6 4407
8ded5a0f 4408 elf_elfheader (abfd)->e_phnum = alloc;
252b5132 4409
12bd6957
AM
4410 if (elf_program_header_size (abfd) == (bfd_size_type) -1)
4411 elf_program_header_size (abfd) = alloc * bed->s->sizeof_phdr;
8ded5a0f 4412 else
12bd6957 4413 BFD_ASSERT (elf_program_header_size (abfd)
59e0647f 4414 >= alloc * bed->s->sizeof_phdr);
252b5132
RH
4415
4416 if (alloc == 0)
f3520d2f 4417 {
12bd6957 4418 elf_next_file_pos (abfd) = bed->s->sizeof_ehdr;
8ded5a0f 4419 return TRUE;
f3520d2f 4420 }
252b5132 4421
12bd6957 4422 /* We're writing the size in elf_program_header_size (abfd),
57268894
HPN
4423 see assign_file_positions_except_relocs, so make sure we have
4424 that amount allocated, with trailing space cleared.
12bd6957
AM
4425 The variable alloc contains the computed need, while
4426 elf_program_header_size (abfd) contains the size used for the
57268894
HPN
4427 layout.
4428 See ld/emultempl/elf-generic.em:gld${EMULATION_NAME}_map_segments
4429 where the layout is forced to according to a larger size in the
4430 last iterations for the testcase ld-elf/header. */
12bd6957 4431 BFD_ASSERT (elf_program_header_size (abfd) % bed->s->sizeof_phdr
57268894 4432 == 0);
a50b1753
NC
4433 phdrs = (Elf_Internal_Phdr *)
4434 bfd_zalloc2 (abfd,
12bd6957 4435 (elf_program_header_size (abfd) / bed->s->sizeof_phdr),
a50b1753 4436 sizeof (Elf_Internal_Phdr));
f3520d2f 4437 elf_tdata (abfd)->phdr = phdrs;
252b5132 4438 if (phdrs == NULL)
b34976b6 4439 return FALSE;
252b5132 4440
3f570048
AM
4441 maxpagesize = 1;
4442 if ((abfd->flags & D_PAGED) != 0)
4443 maxpagesize = bed->maxpagesize;
4444
252b5132
RH
4445 off = bed->s->sizeof_ehdr;
4446 off += alloc * bed->s->sizeof_phdr;
2b0bc088
NC
4447 if (header_pad < (bfd_vma) off)
4448 header_pad = 0;
4449 else
4450 header_pad -= off;
4451 off += header_pad;
252b5132 4452
12bd6957 4453 for (m = elf_seg_map (abfd), p = phdrs, j = 0;
252b5132 4454 m != NULL;
0920dee7 4455 m = m->next, p++, j++)
252b5132 4456 {
252b5132 4457 asection **secpp;
bf988460
AM
4458 bfd_vma off_adjust;
4459 bfd_boolean no_contents;
252b5132
RH
4460
4461 /* If elf_segment_map is not from map_sections_to_segments, the
08a40648 4462 sections may not be correctly ordered. NOTE: sorting should
52e9b619
MS
4463 not be done to the PT_NOTE section of a corefile, which may
4464 contain several pseudo-sections artificially created by bfd.
4465 Sorting these pseudo-sections breaks things badly. */
47d9a591
AM
4466 if (m->count > 1
4467 && !(elf_elfheader (abfd)->e_type == ET_CORE
52e9b619 4468 && m->p_type == PT_NOTE))
252b5132
RH
4469 qsort (m->sections, (size_t) m->count, sizeof (asection *),
4470 elf_sort_sections);
4471
b301b248
AM
4472 /* An ELF segment (described by Elf_Internal_Phdr) may contain a
4473 number of sections with contents contributing to both p_filesz
4474 and p_memsz, followed by a number of sections with no contents
4475 that just contribute to p_memsz. In this loop, OFF tracks next
02bf8d82 4476 available file offset for PT_LOAD and PT_NOTE segments. */
252b5132 4477 p->p_type = m->p_type;
28a7f3e7 4478 p->p_flags = m->p_flags;
252b5132 4479
3f570048
AM
4480 if (m->count == 0)
4481 p->p_vaddr = 0;
4482 else
3271a814 4483 p->p_vaddr = m->sections[0]->vma - m->p_vaddr_offset;
3f570048
AM
4484
4485 if (m->p_paddr_valid)
4486 p->p_paddr = m->p_paddr;
4487 else if (m->count == 0)
4488 p->p_paddr = 0;
4489 else
08a40648 4490 p->p_paddr = m->sections[0]->lma - m->p_vaddr_offset;
3f570048
AM
4491
4492 if (p->p_type == PT_LOAD
4493 && (abfd->flags & D_PAGED) != 0)
4494 {
4495 /* p_align in demand paged PT_LOAD segments effectively stores
4496 the maximum page size. When copying an executable with
4497 objcopy, we set m->p_align from the input file. Use this
4498 value for maxpagesize rather than bed->maxpagesize, which
4499 may be different. Note that we use maxpagesize for PT_TLS
4500 segment alignment later in this function, so we are relying
4501 on at least one PT_LOAD segment appearing before a PT_TLS
4502 segment. */
4503 if (m->p_align_valid)
4504 maxpagesize = m->p_align;
4505
4506 p->p_align = maxpagesize;
4507 }
3271a814
NS
4508 else if (m->p_align_valid)
4509 p->p_align = m->p_align;
e970b90a
DJ
4510 else if (m->count == 0)
4511 p->p_align = 1 << bed->s->log_file_align;
3f570048
AM
4512 else
4513 p->p_align = 0;
4514
bf988460
AM
4515 no_contents = FALSE;
4516 off_adjust = 0;
252b5132 4517 if (p->p_type == PT_LOAD
b301b248 4518 && m->count > 0)
252b5132 4519 {
b301b248 4520 bfd_size_type align;
a49e53ed 4521 unsigned int align_power = 0;
b301b248 4522
3271a814
NS
4523 if (m->p_align_valid)
4524 align = p->p_align;
4525 else
252b5132 4526 {
3271a814
NS
4527 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
4528 {
4529 unsigned int secalign;
08a40648 4530
3271a814
NS
4531 secalign = bfd_get_section_alignment (abfd, *secpp);
4532 if (secalign > align_power)
4533 align_power = secalign;
4534 }
4535 align = (bfd_size_type) 1 << align_power;
4536 if (align < maxpagesize)
4537 align = maxpagesize;
b301b248 4538 }
252b5132 4539
02bf8d82
AM
4540 for (i = 0; i < m->count; i++)
4541 if ((m->sections[i]->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
4542 /* If we aren't making room for this section, then
4543 it must be SHT_NOBITS regardless of what we've
4544 set via struct bfd_elf_special_section. */
4545 elf_section_type (m->sections[i]) = SHT_NOBITS;
4546
bf988460 4547 /* Find out whether this segment contains any loadable
aea274d3
AM
4548 sections. */
4549 no_contents = TRUE;
4550 for (i = 0; i < m->count; i++)
4551 if (elf_section_type (m->sections[i]) != SHT_NOBITS)
4552 {
4553 no_contents = FALSE;
4554 break;
4555 }
bf988460 4556
85cfcbfb 4557 off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
bf988460
AM
4558 off += off_adjust;
4559 if (no_contents)
4560 {
4561 /* We shouldn't need to align the segment on disk since
4562 the segment doesn't need file space, but the gABI
4563 arguably requires the alignment and glibc ld.so
4564 checks it. So to comply with the alignment
4565 requirement but not waste file space, we adjust
4566 p_offset for just this segment. (OFF_ADJUST is
4567 subtracted from OFF later.) This may put p_offset
4568 past the end of file, but that shouldn't matter. */
4569 }
4570 else
4571 off_adjust = 0;
252b5132 4572 }
b1a6d0b1
NC
4573 /* Make sure the .dynamic section is the first section in the
4574 PT_DYNAMIC segment. */
4575 else if (p->p_type == PT_DYNAMIC
4576 && m->count > 1
4577 && strcmp (m->sections[0]->name, ".dynamic") != 0)
4578 {
4579 _bfd_error_handler
b301b248
AM
4580 (_("%B: The first section in the PT_DYNAMIC segment is not the .dynamic section"),
4581 abfd);
b1a6d0b1
NC
4582 bfd_set_error (bfd_error_bad_value);
4583 return FALSE;
4584 }
3f001e84
JK
4585 /* Set the note section type to SHT_NOTE. */
4586 else if (p->p_type == PT_NOTE)
4587 for (i = 0; i < m->count; i++)
4588 elf_section_type (m->sections[i]) = SHT_NOTE;
252b5132 4589
252b5132
RH
4590 p->p_offset = 0;
4591 p->p_filesz = 0;
4592 p->p_memsz = 0;
4593
4594 if (m->includes_filehdr)
4595 {
bf988460 4596 if (!m->p_flags_valid)
252b5132 4597 p->p_flags |= PF_R;
252b5132
RH
4598 p->p_filesz = bed->s->sizeof_ehdr;
4599 p->p_memsz = bed->s->sizeof_ehdr;
4600 if (m->count > 0)
4601 {
252b5132
RH
4602 if (p->p_vaddr < (bfd_vma) off)
4603 {
caf47ea6 4604 (*_bfd_error_handler)
b301b248
AM
4605 (_("%B: Not enough room for program headers, try linking with -N"),
4606 abfd);
252b5132 4607 bfd_set_error (bfd_error_bad_value);
b34976b6 4608 return FALSE;
252b5132
RH
4609 }
4610
4611 p->p_vaddr -= off;
bf988460 4612 if (!m->p_paddr_valid)
252b5132
RH
4613 p->p_paddr -= off;
4614 }
252b5132
RH
4615 }
4616
4617 if (m->includes_phdrs)
4618 {
bf988460 4619 if (!m->p_flags_valid)
252b5132
RH
4620 p->p_flags |= PF_R;
4621
f3520d2f 4622 if (!m->includes_filehdr)
252b5132
RH
4623 {
4624 p->p_offset = bed->s->sizeof_ehdr;
4625
4626 if (m->count > 0)
4627 {
252b5132 4628 p->p_vaddr -= off - p->p_offset;
bf988460 4629 if (!m->p_paddr_valid)
252b5132
RH
4630 p->p_paddr -= off - p->p_offset;
4631 }
252b5132
RH
4632 }
4633
4634 p->p_filesz += alloc * bed->s->sizeof_phdr;
4635 p->p_memsz += alloc * bed->s->sizeof_phdr;
2b0bc088
NC
4636 if (m->count)
4637 {
4638 p->p_filesz += header_pad;
4639 p->p_memsz += header_pad;
4640 }
252b5132
RH
4641 }
4642
4643 if (p->p_type == PT_LOAD
4644 || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
4645 {
bf988460 4646 if (!m->includes_filehdr && !m->includes_phdrs)
02bf8d82 4647 p->p_offset = off;
252b5132
RH
4648 else
4649 {
4650 file_ptr adjust;
4651
4652 adjust = off - (p->p_offset + p->p_filesz);
bf988460
AM
4653 if (!no_contents)
4654 p->p_filesz += adjust;
252b5132
RH
4655 p->p_memsz += adjust;
4656 }
4657 }
4658
1ea63fd2
AM
4659 /* Set up p_filesz, p_memsz, p_align and p_flags from the section
4660 maps. Set filepos for sections in PT_LOAD segments, and in
4661 core files, for sections in PT_NOTE segments.
4662 assign_file_positions_for_non_load_sections will set filepos
4663 for other sections and update p_filesz for other segments. */
252b5132
RH
4664 for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
4665 {
4666 asection *sec;
252b5132 4667 bfd_size_type align;
627b32bc 4668 Elf_Internal_Shdr *this_hdr;
252b5132
RH
4669
4670 sec = *secpp;
02bf8d82 4671 this_hdr = &elf_section_data (sec)->this_hdr;
3f570048 4672 align = (bfd_size_type) 1 << bfd_get_section_alignment (abfd, sec);
252b5132 4673
88967714
AM
4674 if ((p->p_type == PT_LOAD
4675 || p->p_type == PT_TLS)
4676 && (this_hdr->sh_type != SHT_NOBITS
4677 || ((this_hdr->sh_flags & SHF_ALLOC) != 0
4678 && ((this_hdr->sh_flags & SHF_TLS) == 0
4679 || p->p_type == PT_TLS))))
252b5132 4680 {
b5599592
AM
4681 bfd_vma p_start = p->p_paddr;
4682 bfd_vma p_end = p_start + p->p_memsz;
4683 bfd_vma s_start = sec->lma;
4684 bfd_vma adjust = s_start - p_end;
252b5132 4685
a2d1e028
L
4686 if (adjust != 0
4687 && (s_start < p_end
4688 || p_end < p_start))
252b5132 4689 {
88967714 4690 (*_bfd_error_handler)
b5599592
AM
4691 (_("%B: section %A lma %#lx adjusted to %#lx"), abfd, sec,
4692 (unsigned long) s_start, (unsigned long) p_end);
88967714 4693 adjust = 0;
b5599592 4694 sec->lma = p_end;
1cfb7d1e 4695 }
3ac9b6c9 4696 p->p_memsz += adjust;
1cfb7d1e 4697
88967714
AM
4698 if (this_hdr->sh_type != SHT_NOBITS)
4699 {
32812159
AM
4700 if (p->p_filesz + adjust < p->p_memsz)
4701 {
4702 /* We have a PROGBITS section following NOBITS ones.
4703 Allocate file space for the NOBITS section(s) and
4704 zero it. */
4705 adjust = p->p_memsz - p->p_filesz;
4706 if (!write_zeros (abfd, off, adjust))
4707 return FALSE;
4708 }
88967714
AM
4709 off += adjust;
4710 p->p_filesz += adjust;
252b5132 4711 }
252b5132
RH
4712 }
4713
4714 if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)
4715 {
b301b248
AM
4716 /* The section at i == 0 is the one that actually contains
4717 everything. */
4a938328
MS
4718 if (i == 0)
4719 {
627b32bc 4720 this_hdr->sh_offset = sec->filepos = off;
6a3cd2b4
AM
4721 off += this_hdr->sh_size;
4722 p->p_filesz = this_hdr->sh_size;
b301b248
AM
4723 p->p_memsz = 0;
4724 p->p_align = 1;
252b5132 4725 }
4a938328 4726 else
252b5132 4727 {
b301b248 4728 /* The rest are fake sections that shouldn't be written. */
252b5132 4729 sec->filepos = 0;
eea6121a 4730 sec->size = 0;
b301b248
AM
4731 sec->flags = 0;
4732 continue;
252b5132 4733 }
252b5132
RH
4734 }
4735 else
4736 {
1e951488 4737 if (p->p_type == PT_LOAD)
b301b248 4738 {
1e951488
AM
4739 this_hdr->sh_offset = sec->filepos = off;
4740 if (this_hdr->sh_type != SHT_NOBITS)
4741 off += this_hdr->sh_size;
4742 }
4743 else if (this_hdr->sh_type == SHT_NOBITS
4744 && (this_hdr->sh_flags & SHF_TLS) != 0
4745 && this_hdr->sh_offset == 0)
4746 {
4747 /* This is a .tbss section that didn't get a PT_LOAD.
4748 (See _bfd_elf_map_sections_to_segments "Create a
4749 final PT_LOAD".) Set sh_offset to the value it
4750 would have if we had created a zero p_filesz and
4751 p_memsz PT_LOAD header for the section. This
4752 also makes the PT_TLS header have the same
4753 p_offset value. */
4754 bfd_vma adjust = vma_page_aligned_bias (this_hdr->sh_addr,
4755 off, align);
4756 this_hdr->sh_offset = sec->filepos = off + adjust;
b301b248 4757 }
252b5132 4758
02bf8d82 4759 if (this_hdr->sh_type != SHT_NOBITS)
b301b248 4760 {
6a3cd2b4 4761 p->p_filesz += this_hdr->sh_size;
02bf8d82
AM
4762 /* A load section without SHF_ALLOC is something like
4763 a note section in a PT_NOTE segment. These take
4764 file space but are not loaded into memory. */
4765 if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
6a3cd2b4 4766 p->p_memsz += this_hdr->sh_size;
b301b248 4767 }
6a3cd2b4 4768 else if ((this_hdr->sh_flags & SHF_ALLOC) != 0)
13ae64f3 4769 {
6a3cd2b4
AM
4770 if (p->p_type == PT_TLS)
4771 p->p_memsz += this_hdr->sh_size;
4772
4773 /* .tbss is special. It doesn't contribute to p_memsz of
4774 normal segments. */
4775 else if ((this_hdr->sh_flags & SHF_TLS) == 0)
4776 p->p_memsz += this_hdr->sh_size;
13ae64f3
JJ
4777 }
4778
b10a8ae0
L
4779 if (align > p->p_align
4780 && !m->p_align_valid
4781 && (p->p_type != PT_LOAD
4782 || (abfd->flags & D_PAGED) == 0))
252b5132
RH
4783 p->p_align = align;
4784 }
4785
bf988460 4786 if (!m->p_flags_valid)
252b5132
RH
4787 {
4788 p->p_flags |= PF_R;
02bf8d82 4789 if ((this_hdr->sh_flags & SHF_EXECINSTR) != 0)
252b5132 4790 p->p_flags |= PF_X;
02bf8d82 4791 if ((this_hdr->sh_flags & SHF_WRITE) != 0)
252b5132
RH
4792 p->p_flags |= PF_W;
4793 }
4794 }
bf988460 4795 off -= off_adjust;
0920dee7 4796
7c928300
AM
4797 /* Check that all sections are in a PT_LOAD segment.
4798 Don't check funky gdb generated core files. */
4799 if (p->p_type == PT_LOAD && bfd_get_format (abfd) != bfd_core)
9a83a553
AM
4800 {
4801 bfd_boolean check_vma = TRUE;
4802
4803 for (i = 1; i < m->count; i++)
4804 if (m->sections[i]->vma == m->sections[i - 1]->vma
4805 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i])
4806 ->this_hdr), p) != 0
4807 && ELF_SECTION_SIZE (&(elf_section_data (m->sections[i - 1])
4808 ->this_hdr), p) != 0)
0920dee7 4809 {
9a83a553
AM
4810 /* Looks like we have overlays packed into the segment. */
4811 check_vma = FALSE;
4812 break;
0920dee7 4813 }
9a83a553
AM
4814
4815 for (i = 0; i < m->count; i++)
4816 {
4817 Elf_Internal_Shdr *this_hdr;
4818 asection *sec;
4819
4820 sec = m->sections[i];
4821 this_hdr = &(elf_section_data(sec)->this_hdr);
86b2281f
AM
4822 if (!ELF_SECTION_IN_SEGMENT_1 (this_hdr, p, check_vma, 0)
4823 && !ELF_TBSS_SPECIAL (this_hdr, p))
9a83a553
AM
4824 {
4825 (*_bfd_error_handler)
4826 (_("%B: section `%A' can't be allocated in segment %d"),
4827 abfd, sec, j);
4828 print_segment_map (m);
4829 }
4830 }
4831 }
252b5132
RH
4832 }
4833
12bd6957 4834 elf_next_file_pos (abfd) = off;
f3520d2f
AM
4835 return TRUE;
4836}
4837
4838/* Assign file positions for the other sections. */
4839
4840static bfd_boolean
4841assign_file_positions_for_non_load_sections (bfd *abfd,
4842 struct bfd_link_info *link_info)
4843{
4844 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
4845 Elf_Internal_Shdr **i_shdrpp;
4846 Elf_Internal_Shdr **hdrpp;
4847 Elf_Internal_Phdr *phdrs;
4848 Elf_Internal_Phdr *p;
4849 struct elf_segment_map *m;
62655c7b 4850 struct elf_segment_map *hdrs_segment;
f3520d2f
AM
4851 bfd_vma filehdr_vaddr, filehdr_paddr;
4852 bfd_vma phdrs_vaddr, phdrs_paddr;
4853 file_ptr off;
4854 unsigned int num_sec;
4855 unsigned int i;
4856 unsigned int count;
4857
5c182d5f
AM
4858 i_shdrpp = elf_elfsections (abfd);
4859 num_sec = elf_numsections (abfd);
12bd6957 4860 off = elf_next_file_pos (abfd);
5c182d5f
AM
4861 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
4862 {
5c182d5f
AM
4863 Elf_Internal_Shdr *hdr;
4864
4865 hdr = *hdrpp;
4866 if (hdr->bfd_section != NULL
252e386e
AM
4867 && (hdr->bfd_section->filepos != 0
4868 || (hdr->sh_type == SHT_NOBITS
4869 && hdr->contents == NULL)))
627b32bc 4870 BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
5c182d5f
AM
4871 else if ((hdr->sh_flags & SHF_ALLOC) != 0)
4872 {
e8d2ba53
AM
4873 if (hdr->sh_size != 0)
4874 (*_bfd_error_handler)
4875 (_("%B: warning: allocated section `%s' not in segment"),
4876 abfd,
4877 (hdr->bfd_section == NULL
4878 ? "*unknown*"
4879 : hdr->bfd_section->name));
3ba71138
L
4880 /* We don't need to page align empty sections. */
4881 if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
5c182d5f
AM
4882 off += vma_page_aligned_bias (hdr->sh_addr, off,
4883 bed->maxpagesize);
4884 else
4885 off += vma_page_aligned_bias (hdr->sh_addr, off,
4886 hdr->sh_addralign);
4887 off = _bfd_elf_assign_file_position_for_section (hdr, off,
4888 FALSE);
4889 }
4890 else if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
4891 && hdr->bfd_section == NULL)
12bd6957
AM
4892 || hdr == i_shdrpp[elf_onesymtab (abfd)]
4893 || hdr == i_shdrpp[elf_symtab_shndx (abfd)]
4894 || hdr == i_shdrpp[elf_strtab_sec (abfd)])
5c182d5f
AM
4895 hdr->sh_offset = -1;
4896 else
4897 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
5c182d5f
AM
4898 }
4899
252b5132
RH
4900 /* Now that we have set the section file positions, we can set up
4901 the file positions for the non PT_LOAD segments. */
f3520d2f
AM
4902 count = 0;
4903 filehdr_vaddr = 0;
4904 filehdr_paddr = 0;
4905 phdrs_vaddr = bed->maxpagesize + bed->s->sizeof_ehdr;
4906 phdrs_paddr = 0;
62655c7b 4907 hdrs_segment = NULL;
f3520d2f 4908 phdrs = elf_tdata (abfd)->phdr;
12bd6957 4909 for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
f3520d2f
AM
4910 {
4911 ++count;
4912 if (p->p_type != PT_LOAD)
4913 continue;
4914
4915 if (m->includes_filehdr)
4916 {
4917 filehdr_vaddr = p->p_vaddr;
4918 filehdr_paddr = p->p_paddr;
4919 }
4920 if (m->includes_phdrs)
4921 {
4922 phdrs_vaddr = p->p_vaddr;
4923 phdrs_paddr = p->p_paddr;
4924 if (m->includes_filehdr)
4925 {
62655c7b 4926 hdrs_segment = m;
f3520d2f
AM
4927 phdrs_vaddr += bed->s->sizeof_ehdr;
4928 phdrs_paddr += bed->s->sizeof_ehdr;
4929 }
4930 }
4931 }
4932
62655c7b
RM
4933 if (hdrs_segment != NULL && link_info != NULL)
4934 {
4935 /* There is a segment that contains both the file headers and the
4936 program headers, so provide a symbol __ehdr_start pointing there.
4937 A program can use this to examine itself robustly. */
4938
4939 struct elf_link_hash_entry *hash
4940 = elf_link_hash_lookup (elf_hash_table (link_info), "__ehdr_start",
4941 FALSE, FALSE, TRUE);
4942 /* If the symbol was referenced and not defined, define it. */
4943 if (hash != NULL
4944 && (hash->root.type == bfd_link_hash_new
4945 || hash->root.type == bfd_link_hash_undefined
4946 || hash->root.type == bfd_link_hash_undefweak
4947 || hash->root.type == bfd_link_hash_common))
4948 {
4949 asection *s = NULL;
4950 if (hdrs_segment->count != 0)
4951 /* The segment contains sections, so use the first one. */
4952 s = hdrs_segment->sections[0];
4953 else
4954 /* Use the first (i.e. lowest-addressed) section in any segment. */
12bd6957 4955 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
62655c7b
RM
4956 if (m->count != 0)
4957 {
4958 s = m->sections[0];
4959 break;
4960 }
4961
4962 if (s != NULL)
4963 {
4964 hash->root.u.def.value = filehdr_vaddr - s->vma;
4965 hash->root.u.def.section = s;
4966 }
4967 else
4968 {
4969 hash->root.u.def.value = filehdr_vaddr;
4970 hash->root.u.def.section = bfd_abs_section_ptr;
4971 }
4972
4973 hash->root.type = bfd_link_hash_defined;
4974 hash->def_regular = 1;
4975 hash->non_elf = 0;
4976 }
4977 }
4978
12bd6957 4979 for (m = elf_seg_map (abfd), p = phdrs; m != NULL; m = m->next, p++)
252b5132 4980 {
129af99f 4981 if (p->p_type == PT_GNU_RELRO)
252b5132 4982 {
b84a33b5 4983 const Elf_Internal_Phdr *lp;
3146fac4 4984 struct elf_segment_map *lm;
1ea63fd2 4985
129af99f 4986 if (link_info != NULL)
8c37241b 4987 {
129af99f
AS
4988 /* During linking the range of the RELRO segment is passed
4989 in link_info. */
12bd6957 4990 for (lm = elf_seg_map (abfd), lp = phdrs;
3146fac4
AM
4991 lm != NULL;
4992 lm = lm->next, lp++)
8c37241b
JJ
4993 {
4994 if (lp->p_type == PT_LOAD
b84a33b5 4995 && lp->p_vaddr < link_info->relro_end
3146fac4
AM
4996 && lp->p_vaddr + lp->p_filesz >= link_info->relro_end
4997 && lm->count != 0
4998 && lm->sections[0]->vma >= link_info->relro_start)
8c37241b
JJ
4999 break;
5000 }
8981c88a
L
5001
5002 /* PR ld/14207. If the RELRO segment doesn't fit in the
5003 LOAD segment, it should be removed. */
3146fac4 5004 BFD_ASSERT (lm != NULL);
8c37241b 5005 }
129af99f
AS
5006 else
5007 {
5008 /* Otherwise we are copying an executable or shared
b84a33b5 5009 library, but we need to use the same linker logic. */
129af99f
AS
5010 for (lp = phdrs; lp < phdrs + count; ++lp)
5011 {
5012 if (lp->p_type == PT_LOAD
5013 && lp->p_paddr == p->p_paddr)
5014 break;
5015 }
b84a33b5
AM
5016 }
5017
5018 if (lp < phdrs + count)
5019 {
5020 p->p_vaddr = lp->p_vaddr;
5021 p->p_paddr = lp->p_paddr;
5022 p->p_offset = lp->p_offset;
5023 if (link_info != NULL)
5024 p->p_filesz = link_info->relro_end - lp->p_vaddr;
5025 else if (m->p_size_valid)
5026 p->p_filesz = m->p_size;
129af99f
AS
5027 else
5028 abort ();
b84a33b5 5029 p->p_memsz = p->p_filesz;
f3944f72
L
5030 /* Preserve the alignment and flags if they are valid. The
5031 gold linker generates RW/4 for the PT_GNU_RELRO section.
5032 It is better for objcopy/strip to honor these attributes
5033 otherwise gdb will choke when using separate debug files.
5034 */
5035 if (!m->p_align_valid)
5036 p->p_align = 1;
5037 if (!m->p_flags_valid)
5038 p->p_flags = (lp->p_flags & ~PF_W);
129af99f 5039 }
9433b9b1 5040 else
b84a33b5
AM
5041 {
5042 memset (p, 0, sizeof *p);
5043 p->p_type = PT_NULL;
5044 }
129af99f 5045 }
04c3a755
NS
5046 else if (p->p_type == PT_GNU_STACK)
5047 {
5048 if (m->p_size_valid)
5049 p->p_memsz = m->p_size;
5050 }
129af99f
AS
5051 else if (m->count != 0)
5052 {
5053 if (p->p_type != PT_LOAD
5054 && (p->p_type != PT_NOTE
5055 || bfd_get_format (abfd) != bfd_core))
5056 {
129af99f
AS
5057 BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
5058
86b2281f 5059 p->p_filesz = 0;
129af99f 5060 p->p_offset = m->sections[0]->filepos;
86b2281f
AM
5061 for (i = m->count; i-- != 0;)
5062 {
5063 asection *sect = m->sections[i];
5064 Elf_Internal_Shdr *hdr = &elf_section_data (sect)->this_hdr;
5065 if (hdr->sh_type != SHT_NOBITS)
5066 {
5067 p->p_filesz = (sect->filepos - m->sections[0]->filepos
5068 + hdr->sh_size);
5069 break;
5070 }
5071 }
129af99f
AS
5072 }
5073 }
5074 else if (m->includes_filehdr)
5075 {
5076 p->p_vaddr = filehdr_vaddr;
5077 if (! m->p_paddr_valid)
5078 p->p_paddr = filehdr_paddr;
5079 }
5080 else if (m->includes_phdrs)
5081 {
5082 p->p_vaddr = phdrs_vaddr;
5083 if (! m->p_paddr_valid)
5084 p->p_paddr = phdrs_paddr;
252b5132
RH
5085 }
5086 }
5087
12bd6957 5088 elf_next_file_pos (abfd) = off;
252b5132 5089
b34976b6 5090 return TRUE;
252b5132
RH
5091}
5092
252b5132
RH
5093/* Work out the file positions of all the sections. This is called by
5094 _bfd_elf_compute_section_file_positions. All the section sizes and
5095 VMAs must be known before this is called.
5096
e0638f70
AM
5097 Reloc sections come in two flavours: Those processed specially as
5098 "side-channel" data attached to a section to which they apply, and
5099 those that bfd doesn't process as relocations. The latter sort are
5100 stored in a normal bfd section by bfd_section_from_shdr. We don't
5101 consider the former sort here, unless they form part of the loadable
5102 image. Reloc sections not assigned here will be handled later by
5103 assign_file_positions_for_relocs.
252b5132
RH
5104
5105 We also don't set the positions of the .symtab and .strtab here. */
5106
b34976b6 5107static bfd_boolean
c84fca4d
AO
5108assign_file_positions_except_relocs (bfd *abfd,
5109 struct bfd_link_info *link_info)
252b5132 5110{
5c182d5f
AM
5111 struct elf_obj_tdata *tdata = elf_tdata (abfd);
5112 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
252b5132 5113 file_ptr off;
9c5bfbb7 5114 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
5115
5116 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
5117 && bfd_get_format (abfd) != bfd_core)
5118 {
5c182d5f
AM
5119 Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd);
5120 unsigned int num_sec = elf_numsections (abfd);
252b5132
RH
5121 Elf_Internal_Shdr **hdrpp;
5122 unsigned int i;
5123
5124 /* Start after the ELF header. */
5125 off = i_ehdrp->e_ehsize;
5126
5127 /* We are not creating an executable, which means that we are
5128 not creating a program header, and that the actual order of
5129 the sections in the file is unimportant. */
9ad5cbcf 5130 for (i = 1, hdrpp = i_shdrpp + 1; i < num_sec; i++, hdrpp++)
252b5132
RH
5131 {
5132 Elf_Internal_Shdr *hdr;
5133
5134 hdr = *hdrpp;
e0638f70
AM
5135 if (((hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA)
5136 && hdr->bfd_section == NULL)
12bd6957
AM
5137 || i == elf_onesymtab (abfd)
5138 || i == elf_symtab_shndx (abfd)
5139 || i == elf_strtab_sec (abfd))
252b5132
RH
5140 {
5141 hdr->sh_offset = -1;
252b5132 5142 }
9ad5cbcf 5143 else
b34976b6 5144 off = _bfd_elf_assign_file_position_for_section (hdr, off, TRUE);
252b5132
RH
5145 }
5146 }
5147 else
5148 {
f3520d2f
AM
5149 unsigned int alloc;
5150
252b5132 5151 /* Assign file positions for the loaded sections based on the
08a40648 5152 assignment of sections to segments. */
f3520d2f
AM
5153 if (!assign_file_positions_for_load_sections (abfd, link_info))
5154 return FALSE;
5155
5156 /* And for non-load sections. */
5157 if (!assign_file_positions_for_non_load_sections (abfd, link_info))
5158 return FALSE;
5159
e36284ab
AM
5160 if (bed->elf_backend_modify_program_headers != NULL)
5161 {
5162 if (!(*bed->elf_backend_modify_program_headers) (abfd, link_info))
5163 return FALSE;
5164 }
5165
58e7ebac
L
5166 /* Set e_type in ELF header to ET_EXEC for -pie -Ttext-segment=. */
5167 if (link_info != NULL
5168 && link_info->executable
5169 && link_info->shared)
5170 {
5171 unsigned int num_segments = elf_elfheader (abfd)->e_phnum;
5172 Elf_Internal_Phdr *segment = elf_tdata (abfd)->phdr;
5173 Elf_Internal_Phdr *end_segment = &segment[num_segments];
5174
5175 /* Find the lowest p_vaddr in PT_LOAD segments. */
5176 bfd_vma p_vaddr = (bfd_vma) -1;
5177 for (; segment < end_segment; segment++)
5178 if (segment->p_type == PT_LOAD && p_vaddr > segment->p_vaddr)
5179 p_vaddr = segment->p_vaddr;
5180
5181 /* Set e_type to ET_EXEC if the lowest p_vaddr in PT_LOAD
5182 segments is non-zero. */
5183 if (p_vaddr)
5184 i_ehdrp->e_type = ET_EXEC;
5185 }
5186
f3520d2f 5187 /* Write out the program headers. */
12bd6957 5188 alloc = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
f3520d2f
AM
5189 if (bfd_seek (abfd, (bfd_signed_vma) bed->s->sizeof_ehdr, SEEK_SET) != 0
5190 || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
b34976b6 5191 return FALSE;
252b5132 5192
12bd6957 5193 off = elf_next_file_pos (abfd);
252b5132
RH
5194 }
5195
5196 /* Place the section headers. */
45d6a902 5197 off = align_file_position (off, 1 << bed->s->log_file_align);
252b5132
RH
5198 i_ehdrp->e_shoff = off;
5199 off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
5200
12bd6957 5201 elf_next_file_pos (abfd) = off;
252b5132 5202
b34976b6 5203 return TRUE;
252b5132
RH
5204}
5205
b34976b6 5206static bfd_boolean
217aa764 5207prep_headers (bfd *abfd)
252b5132 5208{
3d540e93 5209 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
2b0f7ef9 5210 struct elf_strtab_hash *shstrtab;
9c5bfbb7 5211 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132
RH
5212
5213 i_ehdrp = elf_elfheader (abfd);
252b5132 5214
2b0f7ef9 5215 shstrtab = _bfd_elf_strtab_init ();
252b5132 5216 if (shstrtab == NULL)
b34976b6 5217 return FALSE;
252b5132
RH
5218
5219 elf_shstrtab (abfd) = shstrtab;
5220
5221 i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
5222 i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
5223 i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
5224 i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
5225
5226 i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass;
5227 i_ehdrp->e_ident[EI_DATA] =
5228 bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB;
5229 i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current;
5230
252b5132
RH
5231 if ((abfd->flags & DYNAMIC) != 0)
5232 i_ehdrp->e_type = ET_DYN;
5233 else if ((abfd->flags & EXEC_P) != 0)
5234 i_ehdrp->e_type = ET_EXEC;
5235 else if (bfd_get_format (abfd) == bfd_core)
5236 i_ehdrp->e_type = ET_CORE;
5237 else
5238 i_ehdrp->e_type = ET_REL;
5239
5240 switch (bfd_get_arch (abfd))
5241 {
5242 case bfd_arch_unknown:
5243 i_ehdrp->e_machine = EM_NONE;
5244 break;
aa4f99bb
AO
5245
5246 /* There used to be a long list of cases here, each one setting
5247 e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
5248 in the corresponding bfd definition. To avoid duplication,
5249 the switch was removed. Machines that need special handling
5250 can generally do it in elf_backend_final_write_processing(),
5251 unless they need the information earlier than the final write.
5252 Such need can generally be supplied by replacing the tests for
5253 e_machine with the conditions used to determine it. */
252b5132 5254 default:
9c5bfbb7
AM
5255 i_ehdrp->e_machine = bed->elf_machine_code;
5256 }
aa4f99bb 5257
252b5132
RH
5258 i_ehdrp->e_version = bed->s->ev_current;
5259 i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
5260
c044fabd 5261 /* No program header, for now. */
252b5132
RH
5262 i_ehdrp->e_phoff = 0;
5263 i_ehdrp->e_phentsize = 0;
5264 i_ehdrp->e_phnum = 0;
5265
c044fabd 5266 /* Each bfd section is section header entry. */
252b5132
RH
5267 i_ehdrp->e_entry = bfd_get_start_address (abfd);
5268 i_ehdrp->e_shentsize = bed->s->sizeof_shdr;
5269
c044fabd 5270 /* If we're building an executable, we'll need a program header table. */
252b5132 5271 if (abfd->flags & EXEC_P)
0e71e495
BE
5272 /* It all happens later. */
5273 ;
252b5132
RH
5274 else
5275 {
5276 i_ehdrp->e_phentsize = 0;
252b5132
RH
5277 i_ehdrp->e_phoff = 0;
5278 }
5279
5280 elf_tdata (abfd)->symtab_hdr.sh_name =
b34976b6 5281 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".symtab", FALSE);
252b5132 5282 elf_tdata (abfd)->strtab_hdr.sh_name =
b34976b6 5283 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".strtab", FALSE);
252b5132 5284 elf_tdata (abfd)->shstrtab_hdr.sh_name =
b34976b6 5285 (unsigned int) _bfd_elf_strtab_add (shstrtab, ".shstrtab", FALSE);
252b5132
RH
5286 if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
5287 || elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1
5288 || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1)
b34976b6 5289 return FALSE;
252b5132 5290
b34976b6 5291 return TRUE;
252b5132
RH
5292}
5293
5294/* Assign file positions for all the reloc sections which are not part
5295 of the loadable file image. */
5296
5297void
217aa764 5298_bfd_elf_assign_file_positions_for_relocs (bfd *abfd)
252b5132
RH
5299{
5300 file_ptr off;
9ad5cbcf 5301 unsigned int i, num_sec;
252b5132
RH
5302 Elf_Internal_Shdr **shdrpp;
5303
12bd6957 5304 off = elf_next_file_pos (abfd);
252b5132 5305
9ad5cbcf
AM
5306 num_sec = elf_numsections (abfd);
5307 for (i = 1, shdrpp = elf_elfsections (abfd) + 1; i < num_sec; i++, shdrpp++)
252b5132
RH
5308 {
5309 Elf_Internal_Shdr *shdrp;
5310
5311 shdrp = *shdrpp;
5312 if ((shdrp->sh_type == SHT_REL || shdrp->sh_type == SHT_RELA)
5313 && shdrp->sh_offset == -1)
b34976b6 5314 off = _bfd_elf_assign_file_position_for_section (shdrp, off, TRUE);
252b5132
RH
5315 }
5316
12bd6957 5317 elf_next_file_pos (abfd) = off;
252b5132
RH
5318}
5319
b34976b6 5320bfd_boolean
217aa764 5321_bfd_elf_write_object_contents (bfd *abfd)
252b5132 5322{
9c5bfbb7 5323 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 5324 Elf_Internal_Shdr **i_shdrp;
b34976b6 5325 bfd_boolean failed;
9ad5cbcf 5326 unsigned int count, num_sec;
30e8ee25 5327 struct elf_obj_tdata *t;
252b5132
RH
5328
5329 if (! abfd->output_has_begun
217aa764 5330 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 5331 return FALSE;
252b5132
RH
5332
5333 i_shdrp = elf_elfsections (abfd);
252b5132 5334
b34976b6 5335 failed = FALSE;
252b5132
RH
5336 bfd_map_over_sections (abfd, bed->s->write_relocs, &failed);
5337 if (failed)
b34976b6 5338 return FALSE;
252b5132
RH
5339
5340 _bfd_elf_assign_file_positions_for_relocs (abfd);
5341
c044fabd 5342 /* After writing the headers, we need to write the sections too... */
9ad5cbcf
AM
5343 num_sec = elf_numsections (abfd);
5344 for (count = 1; count < num_sec; count++)
252b5132
RH
5345 {
5346 if (bed->elf_backend_section_processing)
5347 (*bed->elf_backend_section_processing) (abfd, i_shdrp[count]);
5348 if (i_shdrp[count]->contents)
5349 {
dc810e39
AM
5350 bfd_size_type amt = i_shdrp[count]->sh_size;
5351
252b5132 5352 if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0
dc810e39 5353 || bfd_bwrite (i_shdrp[count]->contents, amt, abfd) != amt)
b34976b6 5354 return FALSE;
252b5132
RH
5355 }
5356 }
5357
5358 /* Write out the section header names. */
30e8ee25 5359 t = elf_tdata (abfd);
26ae6d5e 5360 if (elf_shstrtab (abfd) != NULL
30e8ee25 5361 && (bfd_seek (abfd, t->shstrtab_hdr.sh_offset, SEEK_SET) != 0
08a40648 5362 || !_bfd_elf_strtab_emit (abfd, elf_shstrtab (abfd))))
b34976b6 5363 return FALSE;
252b5132
RH
5364
5365 if (bed->elf_backend_final_write_processing)
12bd6957 5366 (*bed->elf_backend_final_write_processing) (abfd, elf_linker (abfd));
252b5132 5367
ff59fc36
RM
5368 if (!bed->s->write_shdrs_and_ehdr (abfd))
5369 return FALSE;
5370
5371 /* This is last since write_shdrs_and_ehdr can touch i_shdrp[0]. */
c0355132
AM
5372 if (t->o->build_id.after_write_object_contents != NULL)
5373 return (*t->o->build_id.after_write_object_contents) (abfd);
ff59fc36
RM
5374
5375 return TRUE;
252b5132
RH
5376}
5377
b34976b6 5378bfd_boolean
217aa764 5379_bfd_elf_write_corefile_contents (bfd *abfd)
252b5132 5380{
c044fabd 5381 /* Hopefully this can be done just like an object file. */
252b5132
RH
5382 return _bfd_elf_write_object_contents (abfd);
5383}
c044fabd
KH
5384
5385/* Given a section, search the header to find them. */
5386
cb33740c 5387unsigned int
198beae2 5388_bfd_elf_section_from_bfd_section (bfd *abfd, struct bfd_section *asect)
252b5132 5389{
9c5bfbb7 5390 const struct elf_backend_data *bed;
91d6fa6a 5391 unsigned int sec_index;
252b5132 5392
9ad5cbcf
AM
5393 if (elf_section_data (asect) != NULL
5394 && elf_section_data (asect)->this_idx != 0)
5395 return elf_section_data (asect)->this_idx;
5396
5397 if (bfd_is_abs_section (asect))
91d6fa6a 5398 sec_index = SHN_ABS;
af746e92 5399 else if (bfd_is_com_section (asect))
91d6fa6a 5400 sec_index = SHN_COMMON;
af746e92 5401 else if (bfd_is_und_section (asect))
91d6fa6a 5402 sec_index = SHN_UNDEF;
af746e92 5403 else
91d6fa6a 5404 sec_index = SHN_BAD;
252b5132 5405
af746e92 5406 bed = get_elf_backend_data (abfd);
252b5132
RH
5407 if (bed->elf_backend_section_from_bfd_section)
5408 {
91d6fa6a 5409 int retval = sec_index;
9ad5cbcf 5410
af746e92
AM
5411 if ((*bed->elf_backend_section_from_bfd_section) (abfd, asect, &retval))
5412 return retval;
252b5132
RH
5413 }
5414
91d6fa6a 5415 if (sec_index == SHN_BAD)
af746e92 5416 bfd_set_error (bfd_error_nonrepresentable_section);
252b5132 5417
91d6fa6a 5418 return sec_index;
252b5132
RH
5419}
5420
5421/* Given a BFD symbol, return the index in the ELF symbol table, or -1
5422 on error. */
5423
5424int
217aa764 5425_bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
252b5132
RH
5426{
5427 asymbol *asym_ptr = *asym_ptr_ptr;
5428 int idx;
5429 flagword flags = asym_ptr->flags;
5430
5431 /* When gas creates relocations against local labels, it creates its
5432 own symbol for the section, but does put the symbol into the
5433 symbol chain, so udata is 0. When the linker is generating
5434 relocatable output, this section symbol may be for one of the
5435 input sections rather than the output section. */
5436 if (asym_ptr->udata.i == 0
5437 && (flags & BSF_SECTION_SYM)
5438 && asym_ptr->section)
5439 {
5372391b 5440 asection *sec;
252b5132
RH
5441 int indx;
5442
5372391b
AM
5443 sec = asym_ptr->section;
5444 if (sec->owner != abfd && sec->output_section != NULL)
5445 sec = sec->output_section;
5446 if (sec->owner == abfd
5447 && (indx = sec->index) < elf_num_section_syms (abfd)
4e89ac30 5448 && elf_section_syms (abfd)[indx] != NULL)
252b5132
RH
5449 asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
5450 }
5451
5452 idx = asym_ptr->udata.i;
5453
5454 if (idx == 0)
5455 {
5456 /* This case can occur when using --strip-symbol on a symbol
08a40648 5457 which is used in a relocation entry. */
252b5132 5458 (*_bfd_error_handler)
d003868e
AM
5459 (_("%B: symbol `%s' required but not present"),
5460 abfd, bfd_asymbol_name (asym_ptr));
252b5132
RH
5461 bfd_set_error (bfd_error_no_symbols);
5462 return -1;
5463 }
5464
5465#if DEBUG & 4
5466 {
5467 fprintf (stderr,
9ccb8af9
AM
5468 "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx\n",
5469 (long) asym_ptr, asym_ptr->name, idx, (long) flags);
252b5132
RH
5470 fflush (stderr);
5471 }
5472#endif
5473
5474 return idx;
5475}
5476
84d1d650 5477/* Rewrite program header information. */
252b5132 5478
b34976b6 5479static bfd_boolean
84d1d650 5480rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
252b5132 5481{
b34976b6
AM
5482 Elf_Internal_Ehdr *iehdr;
5483 struct elf_segment_map *map;
5484 struct elf_segment_map *map_first;
5485 struct elf_segment_map **pointer_to_map;
5486 Elf_Internal_Phdr *segment;
5487 asection *section;
5488 unsigned int i;
5489 unsigned int num_segments;
5490 bfd_boolean phdr_included = FALSE;
5c44b38e 5491 bfd_boolean p_paddr_valid;
b34976b6
AM
5492 bfd_vma maxpagesize;
5493 struct elf_segment_map *phdr_adjust_seg = NULL;
5494 unsigned int phdr_adjust_num = 0;
9c5bfbb7 5495 const struct elf_backend_data *bed;
bc67d8a6 5496
caf47ea6 5497 bed = get_elf_backend_data (ibfd);
252b5132
RH
5498 iehdr = elf_elfheader (ibfd);
5499
bc67d8a6 5500 map_first = NULL;
c044fabd 5501 pointer_to_map = &map_first;
252b5132
RH
5502
5503 num_segments = elf_elfheader (ibfd)->e_phnum;
bc67d8a6
NC
5504 maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
5505
5506 /* Returns the end address of the segment + 1. */
aecc8f8a
AM
5507#define SEGMENT_END(segment, start) \
5508 (start + (segment->p_memsz > segment->p_filesz \
5509 ? segment->p_memsz : segment->p_filesz))
bc67d8a6 5510
eecdbe52
JJ
5511#define SECTION_SIZE(section, segment) \
5512 (((section->flags & (SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) \
5513 != SEC_THREAD_LOCAL || segment->p_type == PT_TLS) \
eea6121a 5514 ? section->size : 0)
eecdbe52 5515
b34976b6 5516 /* Returns TRUE if the given section is contained within
bc67d8a6 5517 the given segment. VMA addresses are compared. */
aecc8f8a
AM
5518#define IS_CONTAINED_BY_VMA(section, segment) \
5519 (section->vma >= segment->p_vaddr \
eecdbe52 5520 && (section->vma + SECTION_SIZE (section, segment) \
aecc8f8a 5521 <= (SEGMENT_END (segment, segment->p_vaddr))))
c044fabd 5522
b34976b6 5523 /* Returns TRUE if the given section is contained within
bc67d8a6 5524 the given segment. LMA addresses are compared. */
aecc8f8a
AM
5525#define IS_CONTAINED_BY_LMA(section, segment, base) \
5526 (section->lma >= base \
eecdbe52 5527 && (section->lma + SECTION_SIZE (section, segment) \
aecc8f8a 5528 <= SEGMENT_END (segment, base)))
252b5132 5529
0efc80c8
L
5530 /* Handle PT_NOTE segment. */
5531#define IS_NOTE(p, s) \
aecc8f8a 5532 (p->p_type == PT_NOTE \
0efc80c8 5533 && elf_section_type (s) == SHT_NOTE \
aecc8f8a 5534 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 5535 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 5536 <= p->p_offset + p->p_filesz))
252b5132 5537
0efc80c8
L
5538 /* Special case: corefile "NOTE" section containing regs, prpsinfo
5539 etc. */
5540#define IS_COREFILE_NOTE(p, s) \
5541 (IS_NOTE (p, s) \
5542 && bfd_get_format (ibfd) == bfd_core \
5543 && s->vma == 0 \
5544 && s->lma == 0)
5545
252b5132
RH
5546 /* The complicated case when p_vaddr is 0 is to handle the Solaris
5547 linker, which generates a PT_INTERP section with p_vaddr and
5548 p_memsz set to 0. */
aecc8f8a
AM
5549#define IS_SOLARIS_PT_INTERP(p, s) \
5550 (p->p_vaddr == 0 \
5551 && p->p_paddr == 0 \
5552 && p->p_memsz == 0 \
5553 && p->p_filesz > 0 \
5554 && (s->flags & SEC_HAS_CONTENTS) != 0 \
eea6121a 5555 && s->size > 0 \
aecc8f8a 5556 && (bfd_vma) s->filepos >= p->p_offset \
cb3ff1e5 5557 && ((bfd_vma) s->filepos + s->size \
aecc8f8a 5558 <= p->p_offset + p->p_filesz))
5c440b1e 5559
bc67d8a6
NC
5560 /* Decide if the given section should be included in the given segment.
5561 A section will be included if:
f5ffc919 5562 1. It is within the address space of the segment -- we use the LMA
08a40648 5563 if that is set for the segment and the VMA otherwise,
0efc80c8 5564 2. It is an allocated section or a NOTE section in a PT_NOTE
d324f6d6 5565 segment.
bc67d8a6 5566 3. There is an output section associated with it,
eecdbe52 5567 4. The section has not already been allocated to a previous segment.
2b05f1b7 5568 5. PT_GNU_STACK segments do not include any sections.
03394ac9 5569 6. PT_TLS segment includes only SHF_TLS sections.
6f79b219
JJ
5570 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments.
5571 8. PT_DYNAMIC should not contain empty sections at the beginning
08a40648 5572 (with the possible exception of .dynamic). */
9f17e2a6 5573#define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \
2b05f1b7
L
5574 ((((segment->p_paddr \
5575 ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \
5576 : IS_CONTAINED_BY_VMA (section, segment)) \
5577 && (section->flags & SEC_ALLOC) != 0) \
0efc80c8 5578 || IS_NOTE (segment, section)) \
2b05f1b7
L
5579 && segment->p_type != PT_GNU_STACK \
5580 && (segment->p_type != PT_TLS \
5581 || (section->flags & SEC_THREAD_LOCAL)) \
5582 && (segment->p_type == PT_LOAD \
5583 || segment->p_type == PT_TLS \
5584 || (section->flags & SEC_THREAD_LOCAL) == 0) \
5585 && (segment->p_type != PT_DYNAMIC \
5586 || SECTION_SIZE (section, segment) > 0 \
5587 || (segment->p_paddr \
5588 ? segment->p_paddr != section->lma \
5589 : segment->p_vaddr != section->vma) \
5590 || (strcmp (bfd_get_section_name (ibfd, section), ".dynamic") \
5591 == 0)) \
0067a569 5592 && !section->segment_mark)
bc67d8a6 5593
9f17e2a6
L
5594/* If the output section of a section in the input segment is NULL,
5595 it is removed from the corresponding output segment. */
5596#define INCLUDE_SECTION_IN_SEGMENT(section, segment, bed) \
5597 (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed) \
5598 && section->output_section != NULL)
5599
b34976b6 5600 /* Returns TRUE iff seg1 starts after the end of seg2. */
b5f852ea
NC
5601#define SEGMENT_AFTER_SEGMENT(seg1, seg2, field) \
5602 (seg1->field >= SEGMENT_END (seg2, seg2->field))
5603
5604 /* Returns TRUE iff seg1 and seg2 overlap. Segments overlap iff both
5605 their VMA address ranges and their LMA address ranges overlap.
5606 It is possible to have overlapping VMA ranges without overlapping LMA
5607 ranges. RedBoot images for example can have both .data and .bss mapped
5608 to the same VMA range, but with the .data section mapped to a different
5609 LMA. */
aecc8f8a 5610#define SEGMENT_OVERLAPS(seg1, seg2) \
b5f852ea 5611 ( !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_vaddr) \
08a40648 5612 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_vaddr)) \
b5f852ea 5613 && !(SEGMENT_AFTER_SEGMENT (seg1, seg2, p_paddr) \
08a40648 5614 || SEGMENT_AFTER_SEGMENT (seg2, seg1, p_paddr)))
bc67d8a6
NC
5615
5616 /* Initialise the segment mark field. */
5617 for (section = ibfd->sections; section != NULL; section = section->next)
b34976b6 5618 section->segment_mark = FALSE;
bc67d8a6 5619
5c44b38e
AM
5620 /* The Solaris linker creates program headers in which all the
5621 p_paddr fields are zero. When we try to objcopy or strip such a
5622 file, we get confused. Check for this case, and if we find it
5623 don't set the p_paddr_valid fields. */
5624 p_paddr_valid = FALSE;
5625 for (i = 0, segment = elf_tdata (ibfd)->phdr;
5626 i < num_segments;
5627 i++, segment++)
5628 if (segment->p_paddr != 0)
5629 {
5630 p_paddr_valid = TRUE;
5631 break;
5632 }
5633
252b5132 5634 /* Scan through the segments specified in the program header
bc67d8a6 5635 of the input BFD. For this first scan we look for overlaps
9ad5cbcf 5636 in the loadable segments. These can be created by weird
aecc8f8a 5637 parameters to objcopy. Also, fix some solaris weirdness. */
bc67d8a6
NC
5638 for (i = 0, segment = elf_tdata (ibfd)->phdr;
5639 i < num_segments;
c044fabd 5640 i++, segment++)
252b5132 5641 {
252b5132 5642 unsigned int j;
c044fabd 5643 Elf_Internal_Phdr *segment2;
252b5132 5644
aecc8f8a
AM
5645 if (segment->p_type == PT_INTERP)
5646 for (section = ibfd->sections; section; section = section->next)
5647 if (IS_SOLARIS_PT_INTERP (segment, section))
5648 {
5649 /* Mininal change so that the normal section to segment
4cc11e76 5650 assignment code will work. */
aecc8f8a
AM
5651 segment->p_vaddr = section->vma;
5652 break;
5653 }
5654
bc67d8a6 5655 if (segment->p_type != PT_LOAD)
b10a8ae0
L
5656 {
5657 /* Remove PT_GNU_RELRO segment. */
5658 if (segment->p_type == PT_GNU_RELRO)
5659 segment->p_type = PT_NULL;
5660 continue;
5661 }
c044fabd 5662
bc67d8a6 5663 /* Determine if this segment overlaps any previous segments. */
0067a569 5664 for (j = 0, segment2 = elf_tdata (ibfd)->phdr; j < i; j++, segment2++)
bc67d8a6
NC
5665 {
5666 bfd_signed_vma extra_length;
c044fabd 5667
bc67d8a6 5668 if (segment2->p_type != PT_LOAD
0067a569 5669 || !SEGMENT_OVERLAPS (segment, segment2))
bc67d8a6 5670 continue;
c044fabd 5671
bc67d8a6
NC
5672 /* Merge the two segments together. */
5673 if (segment2->p_vaddr < segment->p_vaddr)
5674 {
c044fabd 5675 /* Extend SEGMENT2 to include SEGMENT and then delete
08a40648 5676 SEGMENT. */
0067a569
AM
5677 extra_length = (SEGMENT_END (segment, segment->p_vaddr)
5678 - SEGMENT_END (segment2, segment2->p_vaddr));
c044fabd 5679
bc67d8a6
NC
5680 if (extra_length > 0)
5681 {
0067a569 5682 segment2->p_memsz += extra_length;
bc67d8a6
NC
5683 segment2->p_filesz += extra_length;
5684 }
c044fabd 5685
bc67d8a6 5686 segment->p_type = PT_NULL;
c044fabd 5687
bc67d8a6
NC
5688 /* Since we have deleted P we must restart the outer loop. */
5689 i = 0;
5690 segment = elf_tdata (ibfd)->phdr;
5691 break;
5692 }
5693 else
5694 {
c044fabd 5695 /* Extend SEGMENT to include SEGMENT2 and then delete
08a40648 5696 SEGMENT2. */
0067a569
AM
5697 extra_length = (SEGMENT_END (segment2, segment2->p_vaddr)
5698 - SEGMENT_END (segment, segment->p_vaddr));
c044fabd 5699
bc67d8a6
NC
5700 if (extra_length > 0)
5701 {
0067a569 5702 segment->p_memsz += extra_length;
bc67d8a6
NC
5703 segment->p_filesz += extra_length;
5704 }
c044fabd 5705
bc67d8a6
NC
5706 segment2->p_type = PT_NULL;
5707 }
5708 }
5709 }
c044fabd 5710
bc67d8a6
NC
5711 /* The second scan attempts to assign sections to segments. */
5712 for (i = 0, segment = elf_tdata (ibfd)->phdr;
5713 i < num_segments;
0067a569 5714 i++, segment++)
bc67d8a6 5715 {
0067a569
AM
5716 unsigned int section_count;
5717 asection **sections;
5718 asection *output_section;
5719 unsigned int isec;
5720 bfd_vma matching_lma;
5721 bfd_vma suggested_lma;
5722 unsigned int j;
dc810e39 5723 bfd_size_type amt;
0067a569
AM
5724 asection *first_section;
5725 bfd_boolean first_matching_lma;
5726 bfd_boolean first_suggested_lma;
bc67d8a6
NC
5727
5728 if (segment->p_type == PT_NULL)
5729 continue;
c044fabd 5730
9f17e2a6 5731 first_section = NULL;
bc67d8a6 5732 /* Compute how many sections might be placed into this segment. */
b5f852ea
NC
5733 for (section = ibfd->sections, section_count = 0;
5734 section != NULL;
5735 section = section->next)
9f17e2a6
L
5736 {
5737 /* Find the first section in the input segment, which may be
5738 removed from the corresponding output segment. */
5739 if (IS_SECTION_IN_INPUT_SEGMENT (section, segment, bed))
5740 {
5741 if (first_section == NULL)
5742 first_section = section;
5743 if (section->output_section != NULL)
5744 ++section_count;
5745 }
5746 }
811072d8 5747
b5f852ea
NC
5748 /* Allocate a segment map big enough to contain
5749 all of the sections we have selected. */
dc810e39
AM
5750 amt = sizeof (struct elf_segment_map);
5751 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
a50b1753 5752 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 5753 if (map == NULL)
b34976b6 5754 return FALSE;
252b5132
RH
5755
5756 /* Initialise the fields of the segment map. Default to
5757 using the physical address of the segment in the input BFD. */
0067a569
AM
5758 map->next = NULL;
5759 map->p_type = segment->p_type;
5760 map->p_flags = segment->p_flags;
bc67d8a6 5761 map->p_flags_valid = 1;
55d55ac7 5762
9f17e2a6
L
5763 /* If the first section in the input segment is removed, there is
5764 no need to preserve segment physical address in the corresponding
5765 output segment. */
945c025a 5766 if (!first_section || first_section->output_section != NULL)
9f17e2a6
L
5767 {
5768 map->p_paddr = segment->p_paddr;
5c44b38e 5769 map->p_paddr_valid = p_paddr_valid;
9f17e2a6 5770 }
252b5132
RH
5771
5772 /* Determine if this segment contains the ELF file header
5773 and if it contains the program headers themselves. */
bc67d8a6
NC
5774 map->includes_filehdr = (segment->p_offset == 0
5775 && segment->p_filesz >= iehdr->e_ehsize);
bc67d8a6 5776 map->includes_phdrs = 0;
252b5132 5777
0067a569 5778 if (!phdr_included || segment->p_type != PT_LOAD)
252b5132 5779 {
bc67d8a6
NC
5780 map->includes_phdrs =
5781 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
5782 && (segment->p_offset + segment->p_filesz
252b5132
RH
5783 >= ((bfd_vma) iehdr->e_phoff
5784 + iehdr->e_phnum * iehdr->e_phentsize)));
c044fabd 5785
bc67d8a6 5786 if (segment->p_type == PT_LOAD && map->includes_phdrs)
b34976b6 5787 phdr_included = TRUE;
252b5132
RH
5788 }
5789
bc67d8a6 5790 if (section_count == 0)
252b5132
RH
5791 {
5792 /* Special segments, such as the PT_PHDR segment, may contain
5793 no sections, but ordinary, loadable segments should contain
1ed89aa9
NC
5794 something. They are allowed by the ELF spec however, so only
5795 a warning is produced. */
bc67d8a6 5796 if (segment->p_type == PT_LOAD)
0067a569
AM
5797 (*_bfd_error_handler) (_("%B: warning: Empty loadable segment"
5798 " detected, is this intentional ?\n"),
5799 ibfd);
252b5132 5800
bc67d8a6 5801 map->count = 0;
c044fabd
KH
5802 *pointer_to_map = map;
5803 pointer_to_map = &map->next;
252b5132
RH
5804
5805 continue;
5806 }
5807
5808 /* Now scan the sections in the input BFD again and attempt
5809 to add their corresponding output sections to the segment map.
5810 The problem here is how to handle an output section which has
5811 been moved (ie had its LMA changed). There are four possibilities:
5812
5813 1. None of the sections have been moved.
5814 In this case we can continue to use the segment LMA from the
5815 input BFD.
5816
5817 2. All of the sections have been moved by the same amount.
5818 In this case we can change the segment's LMA to match the LMA
5819 of the first section.
5820
5821 3. Some of the sections have been moved, others have not.
5822 In this case those sections which have not been moved can be
5823 placed in the current segment which will have to have its size,
5824 and possibly its LMA changed, and a new segment or segments will
5825 have to be created to contain the other sections.
5826
b5f852ea 5827 4. The sections have been moved, but not by the same amount.
252b5132
RH
5828 In this case we can change the segment's LMA to match the LMA
5829 of the first section and we will have to create a new segment
5830 or segments to contain the other sections.
5831
5832 In order to save time, we allocate an array to hold the section
5833 pointers that we are interested in. As these sections get assigned
5834 to a segment, they are removed from this array. */
5835
a50b1753 5836 sections = (asection **) bfd_malloc2 (section_count, sizeof (asection *));
252b5132 5837 if (sections == NULL)
b34976b6 5838 return FALSE;
252b5132
RH
5839
5840 /* Step One: Scan for segment vs section LMA conflicts.
5841 Also add the sections to the section array allocated above.
5842 Also add the sections to the current segment. In the common
5843 case, where the sections have not been moved, this means that
5844 we have completely filled the segment, and there is nothing
5845 more to do. */
252b5132 5846 isec = 0;
72730e0c 5847 matching_lma = 0;
252b5132 5848 suggested_lma = 0;
0067a569
AM
5849 first_matching_lma = TRUE;
5850 first_suggested_lma = TRUE;
252b5132 5851
147d51c2 5852 for (section = ibfd->sections;
bc67d8a6
NC
5853 section != NULL;
5854 section = section->next)
147d51c2
L
5855 if (section == first_section)
5856 break;
5857
5858 for (j = 0; section != NULL; section = section->next)
252b5132 5859 {
caf47ea6 5860 if (INCLUDE_SECTION_IN_SEGMENT (section, segment, bed))
c0f7859b 5861 {
bc67d8a6
NC
5862 output_section = section->output_section;
5863
0067a569 5864 sections[j++] = section;
252b5132
RH
5865
5866 /* The Solaris native linker always sets p_paddr to 0.
5867 We try to catch that case here, and set it to the
5e8d7549
NC
5868 correct value. Note - some backends require that
5869 p_paddr be left as zero. */
5c44b38e 5870 if (!p_paddr_valid
4455705d 5871 && segment->p_vaddr != 0
0067a569 5872 && !bed->want_p_paddr_set_to_zero
252b5132 5873 && isec == 0
bc67d8a6 5874 && output_section->lma != 0
0067a569
AM
5875 && output_section->vma == (segment->p_vaddr
5876 + (map->includes_filehdr
5877 ? iehdr->e_ehsize
5878 : 0)
5879 + (map->includes_phdrs
5880 ? (iehdr->e_phnum
5881 * iehdr->e_phentsize)
5882 : 0)))
bc67d8a6 5883 map->p_paddr = segment->p_vaddr;
252b5132
RH
5884
5885 /* Match up the physical address of the segment with the
5886 LMA address of the output section. */
bc67d8a6 5887 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
5e8d7549 5888 || IS_COREFILE_NOTE (segment, section)
0067a569
AM
5889 || (bed->want_p_paddr_set_to_zero
5890 && IS_CONTAINED_BY_VMA (output_section, segment)))
252b5132 5891 {
0067a569
AM
5892 if (first_matching_lma || output_section->lma < matching_lma)
5893 {
5894 matching_lma = output_section->lma;
5895 first_matching_lma = FALSE;
5896 }
252b5132
RH
5897
5898 /* We assume that if the section fits within the segment
bc67d8a6 5899 then it does not overlap any other section within that
252b5132 5900 segment. */
0067a569
AM
5901 map->sections[isec++] = output_section;
5902 }
5903 else if (first_suggested_lma)
5904 {
5905 suggested_lma = output_section->lma;
5906 first_suggested_lma = FALSE;
252b5132 5907 }
147d51c2
L
5908
5909 if (j == section_count)
5910 break;
252b5132
RH
5911 }
5912 }
5913
bc67d8a6 5914 BFD_ASSERT (j == section_count);
252b5132
RH
5915
5916 /* Step Two: Adjust the physical address of the current segment,
5917 if necessary. */
bc67d8a6 5918 if (isec == section_count)
252b5132
RH
5919 {
5920 /* All of the sections fitted within the segment as currently
5921 specified. This is the default case. Add the segment to
5922 the list of built segments and carry on to process the next
5923 program header in the input BFD. */
bc67d8a6 5924 map->count = section_count;
c044fabd
KH
5925 *pointer_to_map = map;
5926 pointer_to_map = &map->next;
08a40648 5927
5c44b38e
AM
5928 if (p_paddr_valid
5929 && !bed->want_p_paddr_set_to_zero
147d51c2 5930 && matching_lma != map->p_paddr
5c44b38e
AM
5931 && !map->includes_filehdr
5932 && !map->includes_phdrs)
3271a814
NS
5933 /* There is some padding before the first section in the
5934 segment. So, we must account for that in the output
5935 segment's vma. */
5936 map->p_vaddr_offset = matching_lma - map->p_paddr;
08a40648 5937
252b5132
RH
5938 free (sections);
5939 continue;
5940 }
252b5132
RH
5941 else
5942 {
0067a569 5943 if (!first_matching_lma)
72730e0c
AM
5944 {
5945 /* At least one section fits inside the current segment.
5946 Keep it, but modify its physical address to match the
5947 LMA of the first section that fitted. */
bc67d8a6 5948 map->p_paddr = matching_lma;
72730e0c
AM
5949 }
5950 else
5951 {
5952 /* None of the sections fitted inside the current segment.
5953 Change the current segment's physical address to match
5954 the LMA of the first section. */
bc67d8a6 5955 map->p_paddr = suggested_lma;
72730e0c
AM
5956 }
5957
bc67d8a6
NC
5958 /* Offset the segment physical address from the lma
5959 to allow for space taken up by elf headers. */
5960 if (map->includes_filehdr)
010c8431
AM
5961 {
5962 if (map->p_paddr >= iehdr->e_ehsize)
5963 map->p_paddr -= iehdr->e_ehsize;
5964 else
5965 {
5966 map->includes_filehdr = FALSE;
5967 map->includes_phdrs = FALSE;
5968 }
5969 }
252b5132 5970
bc67d8a6
NC
5971 if (map->includes_phdrs)
5972 {
010c8431
AM
5973 if (map->p_paddr >= iehdr->e_phnum * iehdr->e_phentsize)
5974 {
5975 map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize;
5976
5977 /* iehdr->e_phnum is just an estimate of the number
5978 of program headers that we will need. Make a note
5979 here of the number we used and the segment we chose
5980 to hold these headers, so that we can adjust the
5981 offset when we know the correct value. */
5982 phdr_adjust_num = iehdr->e_phnum;
5983 phdr_adjust_seg = map;
5984 }
5985 else
5986 map->includes_phdrs = FALSE;
bc67d8a6 5987 }
252b5132
RH
5988 }
5989
5990 /* Step Three: Loop over the sections again, this time assigning
caf47ea6 5991 those that fit to the current segment and removing them from the
252b5132
RH
5992 sections array; but making sure not to leave large gaps. Once all
5993 possible sections have been assigned to the current segment it is
5994 added to the list of built segments and if sections still remain
5995 to be assigned, a new segment is constructed before repeating
5996 the loop. */
5997 isec = 0;
5998 do
5999 {
bc67d8a6 6000 map->count = 0;
252b5132 6001 suggested_lma = 0;
0067a569 6002 first_suggested_lma = TRUE;
252b5132
RH
6003
6004 /* Fill the current segment with sections that fit. */
bc67d8a6 6005 for (j = 0; j < section_count; j++)
252b5132 6006 {
bc67d8a6 6007 section = sections[j];
252b5132 6008
bc67d8a6 6009 if (section == NULL)
252b5132
RH
6010 continue;
6011
bc67d8a6 6012 output_section = section->output_section;
252b5132 6013
bc67d8a6 6014 BFD_ASSERT (output_section != NULL);
c044fabd 6015
bc67d8a6
NC
6016 if (IS_CONTAINED_BY_LMA (output_section, segment, map->p_paddr)
6017 || IS_COREFILE_NOTE (segment, section))
252b5132 6018 {
bc67d8a6 6019 if (map->count == 0)
252b5132
RH
6020 {
6021 /* If the first section in a segment does not start at
bc67d8a6
NC
6022 the beginning of the segment, then something is
6023 wrong. */
0067a569
AM
6024 if (output_section->lma
6025 != (map->p_paddr
6026 + (map->includes_filehdr ? iehdr->e_ehsize : 0)
6027 + (map->includes_phdrs
6028 ? iehdr->e_phnum * iehdr->e_phentsize
6029 : 0)))
252b5132
RH
6030 abort ();
6031 }
6032 else
6033 {
0067a569 6034 asection *prev_sec;
252b5132 6035
bc67d8a6 6036 prev_sec = map->sections[map->count - 1];
252b5132
RH
6037
6038 /* If the gap between the end of the previous section
bc67d8a6
NC
6039 and the start of this section is more than
6040 maxpagesize then we need to start a new segment. */
eea6121a 6041 if ((BFD_ALIGN (prev_sec->lma + prev_sec->size,
079e9a2f 6042 maxpagesize)
caf47ea6 6043 < BFD_ALIGN (output_section->lma, maxpagesize))
0067a569 6044 || (prev_sec->lma + prev_sec->size
079e9a2f 6045 > output_section->lma))
252b5132 6046 {
0067a569
AM
6047 if (first_suggested_lma)
6048 {
6049 suggested_lma = output_section->lma;
6050 first_suggested_lma = FALSE;
6051 }
252b5132
RH
6052
6053 continue;
6054 }
6055 }
6056
bc67d8a6 6057 map->sections[map->count++] = output_section;
252b5132
RH
6058 ++isec;
6059 sections[j] = NULL;
b34976b6 6060 section->segment_mark = TRUE;
252b5132 6061 }
0067a569
AM
6062 else if (first_suggested_lma)
6063 {
6064 suggested_lma = output_section->lma;
6065 first_suggested_lma = FALSE;
6066 }
252b5132
RH
6067 }
6068
bc67d8a6 6069 BFD_ASSERT (map->count > 0);
252b5132
RH
6070
6071 /* Add the current segment to the list of built segments. */
c044fabd
KH
6072 *pointer_to_map = map;
6073 pointer_to_map = &map->next;
252b5132 6074
bc67d8a6 6075 if (isec < section_count)
252b5132
RH
6076 {
6077 /* We still have not allocated all of the sections to
6078 segments. Create a new segment here, initialise it
6079 and carry on looping. */
dc810e39
AM
6080 amt = sizeof (struct elf_segment_map);
6081 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
5964fc3a 6082 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
bc67d8a6 6083 if (map == NULL)
5ed6aba4
NC
6084 {
6085 free (sections);
6086 return FALSE;
6087 }
252b5132
RH
6088
6089 /* Initialise the fields of the segment map. Set the physical
6090 physical address to the LMA of the first section that has
6091 not yet been assigned. */
0067a569
AM
6092 map->next = NULL;
6093 map->p_type = segment->p_type;
6094 map->p_flags = segment->p_flags;
6095 map->p_flags_valid = 1;
6096 map->p_paddr = suggested_lma;
5c44b38e 6097 map->p_paddr_valid = p_paddr_valid;
bc67d8a6 6098 map->includes_filehdr = 0;
0067a569 6099 map->includes_phdrs = 0;
252b5132
RH
6100 }
6101 }
bc67d8a6 6102 while (isec < section_count);
252b5132
RH
6103
6104 free (sections);
6105 }
6106
12bd6957 6107 elf_seg_map (obfd) = map_first;
bc67d8a6
NC
6108
6109 /* If we had to estimate the number of program headers that were
9ad5cbcf 6110 going to be needed, then check our estimate now and adjust
bc67d8a6
NC
6111 the offset if necessary. */
6112 if (phdr_adjust_seg != NULL)
6113 {
6114 unsigned int count;
c044fabd 6115
bc67d8a6 6116 for (count = 0, map = map_first; map != NULL; map = map->next)
c044fabd 6117 count++;
252b5132 6118
bc67d8a6
NC
6119 if (count > phdr_adjust_num)
6120 phdr_adjust_seg->p_paddr
6121 -= (count - phdr_adjust_num) * iehdr->e_phentsize;
6122 }
c044fabd 6123
bc67d8a6 6124#undef SEGMENT_END
eecdbe52 6125#undef SECTION_SIZE
bc67d8a6
NC
6126#undef IS_CONTAINED_BY_VMA
6127#undef IS_CONTAINED_BY_LMA
0efc80c8 6128#undef IS_NOTE
252b5132 6129#undef IS_COREFILE_NOTE
bc67d8a6 6130#undef IS_SOLARIS_PT_INTERP
9f17e2a6 6131#undef IS_SECTION_IN_INPUT_SEGMENT
bc67d8a6
NC
6132#undef INCLUDE_SECTION_IN_SEGMENT
6133#undef SEGMENT_AFTER_SEGMENT
6134#undef SEGMENT_OVERLAPS
b34976b6 6135 return TRUE;
252b5132
RH
6136}
6137
84d1d650
L
6138/* Copy ELF program header information. */
6139
6140static bfd_boolean
6141copy_elf_program_header (bfd *ibfd, bfd *obfd)
6142{
6143 Elf_Internal_Ehdr *iehdr;
6144 struct elf_segment_map *map;
6145 struct elf_segment_map *map_first;
6146 struct elf_segment_map **pointer_to_map;
6147 Elf_Internal_Phdr *segment;
6148 unsigned int i;
6149 unsigned int num_segments;
6150 bfd_boolean phdr_included = FALSE;
88967714 6151 bfd_boolean p_paddr_valid;
84d1d650
L
6152
6153 iehdr = elf_elfheader (ibfd);
6154
6155 map_first = NULL;
6156 pointer_to_map = &map_first;
6157
88967714
AM
6158 /* If all the segment p_paddr fields are zero, don't set
6159 map->p_paddr_valid. */
6160 p_paddr_valid = FALSE;
84d1d650 6161 num_segments = elf_elfheader (ibfd)->e_phnum;
88967714
AM
6162 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6163 i < num_segments;
6164 i++, segment++)
6165 if (segment->p_paddr != 0)
6166 {
6167 p_paddr_valid = TRUE;
6168 break;
6169 }
6170
84d1d650
L
6171 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6172 i < num_segments;
6173 i++, segment++)
6174 {
6175 asection *section;
6176 unsigned int section_count;
6177 bfd_size_type amt;
6178 Elf_Internal_Shdr *this_hdr;
53020534 6179 asection *first_section = NULL;
a76e6f2f 6180 asection *lowest_section;
84d1d650 6181
84d1d650
L
6182 /* Compute how many sections are in this segment. */
6183 for (section = ibfd->sections, section_count = 0;
6184 section != NULL;
6185 section = section->next)
6186 {
6187 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 6188 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
3271a814 6189 {
a76e6f2f
AM
6190 if (first_section == NULL)
6191 first_section = section;
3271a814
NS
6192 section_count++;
6193 }
84d1d650
L
6194 }
6195
6196 /* Allocate a segment map big enough to contain
6197 all of the sections we have selected. */
6198 amt = sizeof (struct elf_segment_map);
6199 if (section_count != 0)
6200 amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
a50b1753 6201 map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
84d1d650
L
6202 if (map == NULL)
6203 return FALSE;
6204
6205 /* Initialize the fields of the output segment map with the
6206 input segment. */
6207 map->next = NULL;
6208 map->p_type = segment->p_type;
6209 map->p_flags = segment->p_flags;
6210 map->p_flags_valid = 1;
6211 map->p_paddr = segment->p_paddr;
88967714 6212 map->p_paddr_valid = p_paddr_valid;
3f570048
AM
6213 map->p_align = segment->p_align;
6214 map->p_align_valid = 1;
3271a814 6215 map->p_vaddr_offset = 0;
84d1d650 6216
04c3a755
NS
6217 if (map->p_type == PT_GNU_RELRO
6218 || map->p_type == PT_GNU_STACK)
b10a8ae0
L
6219 {
6220 /* The PT_GNU_RELRO segment may contain the first a few
6221 bytes in the .got.plt section even if the whole .got.plt
6222 section isn't in the PT_GNU_RELRO segment. We won't
04c3a755
NS
6223 change the size of the PT_GNU_RELRO segment.
6224 Similarly, PT_GNU_STACK size is significant on uclinux
6225 systems. */
9433b9b1 6226 map->p_size = segment->p_memsz;
b10a8ae0
L
6227 map->p_size_valid = 1;
6228 }
6229
84d1d650
L
6230 /* Determine if this segment contains the ELF file header
6231 and if it contains the program headers themselves. */
6232 map->includes_filehdr = (segment->p_offset == 0
6233 && segment->p_filesz >= iehdr->e_ehsize);
6234
6235 map->includes_phdrs = 0;
6236 if (! phdr_included || segment->p_type != PT_LOAD)
6237 {
6238 map->includes_phdrs =
6239 (segment->p_offset <= (bfd_vma) iehdr->e_phoff
6240 && (segment->p_offset + segment->p_filesz
6241 >= ((bfd_vma) iehdr->e_phoff
6242 + iehdr->e_phnum * iehdr->e_phentsize)));
6243
6244 if (segment->p_type == PT_LOAD && map->includes_phdrs)
6245 phdr_included = TRUE;
6246 }
6247
a76e6f2f 6248 lowest_section = first_section;
84d1d650
L
6249 if (section_count != 0)
6250 {
6251 unsigned int isec = 0;
6252
53020534 6253 for (section = first_section;
84d1d650
L
6254 section != NULL;
6255 section = section->next)
6256 {
6257 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 6258 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
53020534
L
6259 {
6260 map->sections[isec++] = section->output_section;
a76e6f2f
AM
6261 if ((section->flags & SEC_ALLOC) != 0)
6262 {
6263 bfd_vma seg_off;
6264
fb8a5684
AM
6265 if (section->lma < lowest_section->lma)
6266 lowest_section = section;
6267
a76e6f2f
AM
6268 /* Section lmas are set up from PT_LOAD header
6269 p_paddr in _bfd_elf_make_section_from_shdr.
6270 If this header has a p_paddr that disagrees
6271 with the section lma, flag the p_paddr as
6272 invalid. */
6273 if ((section->flags & SEC_LOAD) != 0)
6274 seg_off = this_hdr->sh_offset - segment->p_offset;
6275 else
6276 seg_off = this_hdr->sh_addr - segment->p_vaddr;
6277 if (section->lma - segment->p_paddr != seg_off)
6278 map->p_paddr_valid = FALSE;
6279 }
53020534
L
6280 if (isec == section_count)
6281 break;
6282 }
84d1d650
L
6283 }
6284 }
6285
a76e6f2f
AM
6286 if (map->includes_filehdr && lowest_section != NULL)
6287 /* We need to keep the space used by the headers fixed. */
6288 map->header_size = lowest_section->vma - segment->p_vaddr;
d324f6d6 6289
a76e6f2f
AM
6290 if (!map->includes_phdrs
6291 && !map->includes_filehdr
6292 && map->p_paddr_valid)
6293 /* There is some other padding before the first section. */
6294 map->p_vaddr_offset = ((lowest_section ? lowest_section->lma : 0)
6295 - segment->p_paddr);
6296
84d1d650
L
6297 map->count = section_count;
6298 *pointer_to_map = map;
6299 pointer_to_map = &map->next;
6300 }
6301
12bd6957 6302 elf_seg_map (obfd) = map_first;
84d1d650
L
6303 return TRUE;
6304}
6305
6306/* Copy private BFD data. This copies or rewrites ELF program header
6307 information. */
6308
6309static bfd_boolean
6310copy_private_bfd_data (bfd *ibfd, bfd *obfd)
6311{
84d1d650
L
6312 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6313 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6314 return TRUE;
6315
6316 if (elf_tdata (ibfd)->phdr == NULL)
6317 return TRUE;
6318
6319 if (ibfd->xvec == obfd->xvec)
6320 {
cb3ff1e5
NC
6321 /* Check to see if any sections in the input BFD
6322 covered by ELF program header have changed. */
d55ce4e2 6323 Elf_Internal_Phdr *segment;
84d1d650
L
6324 asection *section, *osec;
6325 unsigned int i, num_segments;
6326 Elf_Internal_Shdr *this_hdr;
147d51c2
L
6327 const struct elf_backend_data *bed;
6328
6329 bed = get_elf_backend_data (ibfd);
6330
6331 /* Regenerate the segment map if p_paddr is set to 0. */
6332 if (bed->want_p_paddr_set_to_zero)
6333 goto rewrite;
84d1d650
L
6334
6335 /* Initialize the segment mark field. */
6336 for (section = obfd->sections; section != NULL;
6337 section = section->next)
6338 section->segment_mark = FALSE;
6339
6340 num_segments = elf_elfheader (ibfd)->e_phnum;
6341 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6342 i < num_segments;
6343 i++, segment++)
6344 {
5f6999aa
NC
6345 /* PR binutils/3535. The Solaris linker always sets the p_paddr
6346 and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
6347 which severly confuses things, so always regenerate the segment
6348 map in this case. */
6349 if (segment->p_paddr == 0
6350 && segment->p_memsz == 0
6351 && (segment->p_type == PT_INTERP || segment->p_type == PT_DYNAMIC))
cb3ff1e5 6352 goto rewrite;
5f6999aa 6353
84d1d650
L
6354 for (section = ibfd->sections;
6355 section != NULL; section = section->next)
6356 {
6357 /* We mark the output section so that we know it comes
6358 from the input BFD. */
6359 osec = section->output_section;
6360 if (osec)
6361 osec->segment_mark = TRUE;
6362
6363 /* Check if this section is covered by the segment. */
6364 this_hdr = &(elf_section_data(section)->this_hdr);
f4638467 6365 if (ELF_SECTION_IN_SEGMENT (this_hdr, segment))
84d1d650
L
6366 {
6367 /* FIXME: Check if its output section is changed or
6368 removed. What else do we need to check? */
6369 if (osec == NULL
6370 || section->flags != osec->flags
6371 || section->lma != osec->lma
6372 || section->vma != osec->vma
6373 || section->size != osec->size
6374 || section->rawsize != osec->rawsize
6375 || section->alignment_power != osec->alignment_power)
6376 goto rewrite;
6377 }
6378 }
6379 }
6380
cb3ff1e5 6381 /* Check to see if any output section do not come from the
84d1d650
L
6382 input BFD. */
6383 for (section = obfd->sections; section != NULL;
6384 section = section->next)
6385 {
6386 if (section->segment_mark == FALSE)
6387 goto rewrite;
6388 else
6389 section->segment_mark = FALSE;
6390 }
6391
6392 return copy_elf_program_header (ibfd, obfd);
6393 }
6394
6395rewrite:
f1d85785
L
6396 if (ibfd->xvec == obfd->xvec)
6397 {
6398 /* When rewriting program header, set the output maxpagesize to
6399 the maximum alignment of input PT_LOAD segments. */
6400 Elf_Internal_Phdr *segment;
6401 unsigned int i;
6402 unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
6403 bfd_vma maxpagesize = 0;
6404
6405 for (i = 0, segment = elf_tdata (ibfd)->phdr;
6406 i < num_segments;
6407 i++, segment++)
6408 if (segment->p_type == PT_LOAD
6409 && maxpagesize < segment->p_align)
6410 maxpagesize = segment->p_align;
6411
6412 if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
6413 bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
6414 }
6415
84d1d650
L
6416 return rewrite_elf_program_header (ibfd, obfd);
6417}
6418
ccd2ec6a
L
6419/* Initialize private output section information from input section. */
6420
6421bfd_boolean
6422_bfd_elf_init_private_section_data (bfd *ibfd,
6423 asection *isec,
6424 bfd *obfd,
6425 asection *osec,
6426 struct bfd_link_info *link_info)
6427
6428{
6429 Elf_Internal_Shdr *ihdr, *ohdr;
dfa7b0b8 6430 bfd_boolean final_link = link_info != NULL && !link_info->relocatable;
ccd2ec6a
L
6431
6432 if (ibfd->xvec->flavour != bfd_target_elf_flavour
6433 || obfd->xvec->flavour != bfd_target_elf_flavour)
6434 return TRUE;
6435
ba85c43e
NC
6436 BFD_ASSERT (elf_section_data (osec) != NULL);
6437
dfa7b0b8
AM
6438 /* For objcopy and relocatable link, don't copy the output ELF
6439 section type from input if the output BFD section flags have been
6440 set to something different. For a final link allow some flags
6441 that the linker clears to differ. */
42bb2e33 6442 if (elf_section_type (osec) == SHT_NULL
dfa7b0b8
AM
6443 && (osec->flags == isec->flags
6444 || (final_link
6445 && ((osec->flags ^ isec->flags)
0814be7d 6446 & ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC)) == 0)))
42bb2e33 6447 elf_section_type (osec) = elf_section_type (isec);
d270463e
L
6448
6449 /* FIXME: Is this correct for all OS/PROC specific flags? */
6450 elf_section_flags (osec) |= (elf_section_flags (isec)
6451 & (SHF_MASKOS | SHF_MASKPROC));
ccd2ec6a
L
6452
6453 /* Set things up for objcopy and relocatable link. The output
6454 SHT_GROUP section will have its elf_next_in_group pointing back
6455 to the input group members. Ignore linker created group section.
6456 See elfNN_ia64_object_p in elfxx-ia64.c. */
dfa7b0b8 6457 if (!final_link)
ccd2ec6a
L
6458 {
6459 if (elf_sec_group (isec) == NULL
6460 || (elf_sec_group (isec)->flags & SEC_LINKER_CREATED) == 0)
6461 {
6462 if (elf_section_flags (isec) & SHF_GROUP)
6463 elf_section_flags (osec) |= SHF_GROUP;
6464 elf_next_in_group (osec) = elf_next_in_group (isec);
9659de1c 6465 elf_section_data (osec)->group = elf_section_data (isec)->group;
ccd2ec6a
L
6466 }
6467 }
6468
6469 ihdr = &elf_section_data (isec)->this_hdr;
6470
6471 /* We need to handle elf_linked_to_section for SHF_LINK_ORDER. We
6472 don't use the output section of the linked-to section since it
6473 may be NULL at this point. */
6474 if ((ihdr->sh_flags & SHF_LINK_ORDER) != 0)
6475 {
6476 ohdr = &elf_section_data (osec)->this_hdr;
6477 ohdr->sh_flags |= SHF_LINK_ORDER;
6478 elf_linked_to_section (osec) = elf_linked_to_section (isec);
6479 }
6480
6481 osec->use_rela_p = isec->use_rela_p;
6482
6483 return TRUE;
6484}
6485
252b5132
RH
6486/* Copy private section information. This copies over the entsize
6487 field, and sometimes the info field. */
6488
b34976b6 6489bfd_boolean
217aa764
AM
6490_bfd_elf_copy_private_section_data (bfd *ibfd,
6491 asection *isec,
6492 bfd *obfd,
6493 asection *osec)
252b5132
RH
6494{
6495 Elf_Internal_Shdr *ihdr, *ohdr;
6496
6497 if (ibfd->xvec->flavour != bfd_target_elf_flavour
6498 || obfd->xvec->flavour != bfd_target_elf_flavour)
b34976b6 6499 return TRUE;
252b5132 6500
252b5132
RH
6501 ihdr = &elf_section_data (isec)->this_hdr;
6502 ohdr = &elf_section_data (osec)->this_hdr;
6503
6504 ohdr->sh_entsize = ihdr->sh_entsize;
6505
6506 if (ihdr->sh_type == SHT_SYMTAB
6507 || ihdr->sh_type == SHT_DYNSYM
6508 || ihdr->sh_type == SHT_GNU_verneed
6509 || ihdr->sh_type == SHT_GNU_verdef)
6510 ohdr->sh_info = ihdr->sh_info;
6511
ccd2ec6a
L
6512 return _bfd_elf_init_private_section_data (ibfd, isec, obfd, osec,
6513 NULL);
252b5132
RH
6514}
6515
d0bf826b
AM
6516/* Look at all the SHT_GROUP sections in IBFD, making any adjustments
6517 necessary if we are removing either the SHT_GROUP section or any of
6518 the group member sections. DISCARDED is the value that a section's
6519 output_section has if the section will be discarded, NULL when this
6520 function is called from objcopy, bfd_abs_section_ptr when called
6521 from the linker. */
80fccad2
BW
6522
6523bfd_boolean
d0bf826b 6524_bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
80fccad2 6525{
30288845
AM
6526 asection *isec;
6527
30288845 6528 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
415f38a6 6529 if (elf_section_type (isec) == SHT_GROUP)
30288845
AM
6530 {
6531 asection *first = elf_next_in_group (isec);
6532 asection *s = first;
d0bf826b
AM
6533 bfd_size_type removed = 0;
6534
30288845
AM
6535 while (s != NULL)
6536 {
415f38a6
AM
6537 /* If this member section is being output but the
6538 SHT_GROUP section is not, then clear the group info
6539 set up by _bfd_elf_copy_private_section_data. */
d0bf826b
AM
6540 if (s->output_section != discarded
6541 && isec->output_section == discarded)
30288845
AM
6542 {
6543 elf_section_flags (s->output_section) &= ~SHF_GROUP;
6544 elf_group_name (s->output_section) = NULL;
6545 }
415f38a6
AM
6546 /* Conversely, if the member section is not being output
6547 but the SHT_GROUP section is, then adjust its size. */
d0bf826b
AM
6548 else if (s->output_section == discarded
6549 && isec->output_section != discarded)
6550 removed += 4;
30288845
AM
6551 s = elf_next_in_group (s);
6552 if (s == first)
6553 break;
6554 }
d0bf826b
AM
6555 if (removed != 0)
6556 {
6557 if (discarded != NULL)
6558 {
6559 /* If we've been called for ld -r, then we need to
6560 adjust the input section size. This function may
6561 be called multiple times, so save the original
6562 size. */
6563 if (isec->rawsize == 0)
6564 isec->rawsize = isec->size;
6565 isec->size = isec->rawsize - removed;
6566 }
6567 else
6568 {
6569 /* Adjust the output section size when called from
6570 objcopy. */
6571 isec->output_section->size -= removed;
6572 }
6573 }
30288845
AM
6574 }
6575
80fccad2
BW
6576 return TRUE;
6577}
6578
d0bf826b
AM
6579/* Copy private header information. */
6580
6581bfd_boolean
6582_bfd_elf_copy_private_header_data (bfd *ibfd, bfd *obfd)
6583{
6584 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6585 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
6586 return TRUE;
6587
6588 /* Copy over private BFD data if it has not already been copied.
6589 This must be done here, rather than in the copy_private_bfd_data
6590 entry point, because the latter is called after the section
6591 contents have been set, which means that the program headers have
6592 already been worked out. */
12bd6957 6593 if (elf_seg_map (obfd) == NULL && elf_tdata (ibfd)->phdr != NULL)
d0bf826b
AM
6594 {
6595 if (! copy_private_bfd_data (ibfd, obfd))
6596 return FALSE;
6597 }
6598
6599 return _bfd_elf_fixup_group_sections (ibfd, NULL);
6600}
6601
252b5132
RH
6602/* Copy private symbol information. If this symbol is in a section
6603 which we did not map into a BFD section, try to map the section
6604 index correctly. We use special macro definitions for the mapped
6605 section indices; these definitions are interpreted by the
6606 swap_out_syms function. */
6607
9ad5cbcf
AM
6608#define MAP_ONESYMTAB (SHN_HIOS + 1)
6609#define MAP_DYNSYMTAB (SHN_HIOS + 2)
6610#define MAP_STRTAB (SHN_HIOS + 3)
6611#define MAP_SHSTRTAB (SHN_HIOS + 4)
6612#define MAP_SYM_SHNDX (SHN_HIOS + 5)
252b5132 6613
b34976b6 6614bfd_boolean
217aa764
AM
6615_bfd_elf_copy_private_symbol_data (bfd *ibfd,
6616 asymbol *isymarg,
6617 bfd *obfd,
6618 asymbol *osymarg)
252b5132
RH
6619{
6620 elf_symbol_type *isym, *osym;
6621
6622 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
6623 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 6624 return TRUE;
252b5132
RH
6625
6626 isym = elf_symbol_from (ibfd, isymarg);
6627 osym = elf_symbol_from (obfd, osymarg);
6628
6629 if (isym != NULL
8424d8f5 6630 && isym->internal_elf_sym.st_shndx != 0
252b5132
RH
6631 && osym != NULL
6632 && bfd_is_abs_section (isym->symbol.section))
6633 {
6634 unsigned int shndx;
6635
6636 shndx = isym->internal_elf_sym.st_shndx;
6637 if (shndx == elf_onesymtab (ibfd))
6638 shndx = MAP_ONESYMTAB;
6639 else if (shndx == elf_dynsymtab (ibfd))
6640 shndx = MAP_DYNSYMTAB;
12bd6957 6641 else if (shndx == elf_strtab_sec (ibfd))
252b5132 6642 shndx = MAP_STRTAB;
12bd6957 6643 else if (shndx == elf_shstrtab_sec (ibfd))
252b5132 6644 shndx = MAP_SHSTRTAB;
12bd6957 6645 else if (shndx == elf_symtab_shndx (ibfd))
9ad5cbcf 6646 shndx = MAP_SYM_SHNDX;
252b5132
RH
6647 osym->internal_elf_sym.st_shndx = shndx;
6648 }
6649
b34976b6 6650 return TRUE;
252b5132
RH
6651}
6652
6653/* Swap out the symbols. */
6654
b34976b6 6655static bfd_boolean
217aa764
AM
6656swap_out_syms (bfd *abfd,
6657 struct bfd_strtab_hash **sttp,
6658 int relocatable_p)
252b5132 6659{
9c5bfbb7 6660 const struct elf_backend_data *bed;
079e9a2f
AM
6661 int symcount;
6662 asymbol **syms;
6663 struct bfd_strtab_hash *stt;
6664 Elf_Internal_Shdr *symtab_hdr;
9ad5cbcf 6665 Elf_Internal_Shdr *symtab_shndx_hdr;
079e9a2f 6666 Elf_Internal_Shdr *symstrtab_hdr;
f075ee0c
AM
6667 bfd_byte *outbound_syms;
6668 bfd_byte *outbound_shndx;
079e9a2f 6669 int idx;
12bd6957 6670 unsigned int num_locals;
079e9a2f 6671 bfd_size_type amt;
174fd7f9 6672 bfd_boolean name_local_sections;
252b5132 6673
12bd6957 6674 if (!elf_map_symbols (abfd, &num_locals))
b34976b6 6675 return FALSE;
252b5132 6676
c044fabd 6677 /* Dump out the symtabs. */
079e9a2f
AM
6678 stt = _bfd_elf_stringtab_init ();
6679 if (stt == NULL)
b34976b6 6680 return FALSE;
252b5132 6681
079e9a2f
AM
6682 bed = get_elf_backend_data (abfd);
6683 symcount = bfd_get_symcount (abfd);
6684 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6685 symtab_hdr->sh_type = SHT_SYMTAB;
6686 symtab_hdr->sh_entsize = bed->s->sizeof_sym;
6687 symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
12bd6957 6688 symtab_hdr->sh_info = num_locals + 1;
72de5009 6689 symtab_hdr->sh_addralign = (bfd_vma) 1 << bed->s->log_file_align;
079e9a2f
AM
6690
6691 symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
6692 symstrtab_hdr->sh_type = SHT_STRTAB;
6693
a50b1753
NC
6694 outbound_syms = (bfd_byte *) bfd_alloc2 (abfd, 1 + symcount,
6695 bed->s->sizeof_sym);
079e9a2f 6696 if (outbound_syms == NULL)
5ed6aba4
NC
6697 {
6698 _bfd_stringtab_free (stt);
6699 return FALSE;
6700 }
217aa764 6701 symtab_hdr->contents = outbound_syms;
252b5132 6702
9ad5cbcf
AM
6703 outbound_shndx = NULL;
6704 symtab_shndx_hdr = &elf_tdata (abfd)->symtab_shndx_hdr;
6705 if (symtab_shndx_hdr->sh_name != 0)
6706 {
6707 amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
a50b1753
NC
6708 outbound_shndx = (bfd_byte *)
6709 bfd_zalloc2 (abfd, 1 + symcount, sizeof (Elf_External_Sym_Shndx));
9ad5cbcf 6710 if (outbound_shndx == NULL)
5ed6aba4
NC
6711 {
6712 _bfd_stringtab_free (stt);
6713 return FALSE;
6714 }
6715
9ad5cbcf
AM
6716 symtab_shndx_hdr->contents = outbound_shndx;
6717 symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
6718 symtab_shndx_hdr->sh_size = amt;
6719 symtab_shndx_hdr->sh_addralign = sizeof (Elf_External_Sym_Shndx);
6720 symtab_shndx_hdr->sh_entsize = sizeof (Elf_External_Sym_Shndx);
6721 }
6722
589e6347 6723 /* Now generate the data (for "contents"). */
079e9a2f
AM
6724 {
6725 /* Fill in zeroth symbol and swap it out. */
6726 Elf_Internal_Sym sym;
6727 sym.st_name = 0;
6728 sym.st_value = 0;
6729 sym.st_size = 0;
6730 sym.st_info = 0;
6731 sym.st_other = 0;
6732 sym.st_shndx = SHN_UNDEF;
35fc36a8 6733 sym.st_target_internal = 0;
9ad5cbcf 6734 bed->s->swap_symbol_out (abfd, &sym, outbound_syms, outbound_shndx);
079e9a2f 6735 outbound_syms += bed->s->sizeof_sym;
9ad5cbcf
AM
6736 if (outbound_shndx != NULL)
6737 outbound_shndx += sizeof (Elf_External_Sym_Shndx);
079e9a2f 6738 }
252b5132 6739
174fd7f9
RS
6740 name_local_sections
6741 = (bed->elf_backend_name_local_section_symbols
6742 && bed->elf_backend_name_local_section_symbols (abfd));
6743
079e9a2f
AM
6744 syms = bfd_get_outsymbols (abfd);
6745 for (idx = 0; idx < symcount; idx++)
252b5132 6746 {
252b5132 6747 Elf_Internal_Sym sym;
079e9a2f
AM
6748 bfd_vma value = syms[idx]->value;
6749 elf_symbol_type *type_ptr;
6750 flagword flags = syms[idx]->flags;
6751 int type;
252b5132 6752
174fd7f9
RS
6753 if (!name_local_sections
6754 && (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
079e9a2f
AM
6755 {
6756 /* Local section symbols have no name. */
6757 sym.st_name = 0;
6758 }
6759 else
6760 {
6761 sym.st_name = (unsigned long) _bfd_stringtab_add (stt,
6762 syms[idx]->name,
b34976b6 6763 TRUE, FALSE);
079e9a2f 6764 if (sym.st_name == (unsigned long) -1)
5ed6aba4
NC
6765 {
6766 _bfd_stringtab_free (stt);
6767 return FALSE;
6768 }
079e9a2f 6769 }
252b5132 6770
079e9a2f 6771 type_ptr = elf_symbol_from (abfd, syms[idx]);
252b5132 6772
079e9a2f
AM
6773 if ((flags & BSF_SECTION_SYM) == 0
6774 && bfd_is_com_section (syms[idx]->section))
6775 {
6776 /* ELF common symbols put the alignment into the `value' field,
6777 and the size into the `size' field. This is backwards from
6778 how BFD handles it, so reverse it here. */
6779 sym.st_size = value;
6780 if (type_ptr == NULL
6781 || type_ptr->internal_elf_sym.st_value == 0)
6782 sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value));
6783 else
6784 sym.st_value = type_ptr->internal_elf_sym.st_value;
6785 sym.st_shndx = _bfd_elf_section_from_bfd_section
6786 (abfd, syms[idx]->section);
6787 }
6788 else
6789 {
6790 asection *sec = syms[idx]->section;
cb33740c 6791 unsigned int shndx;
252b5132 6792
079e9a2f
AM
6793 if (sec->output_section)
6794 {
6795 value += sec->output_offset;
6796 sec = sec->output_section;
6797 }
589e6347 6798
079e9a2f
AM
6799 /* Don't add in the section vma for relocatable output. */
6800 if (! relocatable_p)
6801 value += sec->vma;
6802 sym.st_value = value;
6803 sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
6804
6805 if (bfd_is_abs_section (sec)
6806 && type_ptr != NULL
6807 && type_ptr->internal_elf_sym.st_shndx != 0)
6808 {
6809 /* This symbol is in a real ELF section which we did
6810 not create as a BFD section. Undo the mapping done
6811 by copy_private_symbol_data. */
6812 shndx = type_ptr->internal_elf_sym.st_shndx;
6813 switch (shndx)
6814 {
6815 case MAP_ONESYMTAB:
6816 shndx = elf_onesymtab (abfd);
6817 break;
6818 case MAP_DYNSYMTAB:
6819 shndx = elf_dynsymtab (abfd);
6820 break;
6821 case MAP_STRTAB:
12bd6957 6822 shndx = elf_strtab_sec (abfd);
079e9a2f
AM
6823 break;
6824 case MAP_SHSTRTAB:
12bd6957 6825 shndx = elf_shstrtab_sec (abfd);
079e9a2f 6826 break;
9ad5cbcf 6827 case MAP_SYM_SHNDX:
12bd6957 6828 shndx = elf_symtab_shndx (abfd);
9ad5cbcf 6829 break;
079e9a2f 6830 default:
15bc576a 6831 shndx = SHN_ABS;
079e9a2f
AM
6832 break;
6833 }
6834 }
6835 else
6836 {
6837 shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
252b5132 6838
cb33740c 6839 if (shndx == SHN_BAD)
079e9a2f
AM
6840 {
6841 asection *sec2;
6842
6843 /* Writing this would be a hell of a lot easier if
6844 we had some decent documentation on bfd, and
6845 knew what to expect of the library, and what to
6846 demand of applications. For example, it
6847 appears that `objcopy' might not set the
6848 section of a symbol to be a section that is
6849 actually in the output file. */
6850 sec2 = bfd_get_section_by_name (abfd, sec->name);
589e6347
NC
6851 if (sec2 == NULL)
6852 {
6853 _bfd_error_handler (_("\
6854Unable to find equivalent output section for symbol '%s' from section '%s'"),
6855 syms[idx]->name ? syms[idx]->name : "<Local sym>",
6856 sec->name);
811072d8 6857 bfd_set_error (bfd_error_invalid_operation);
5ed6aba4 6858 _bfd_stringtab_free (stt);
589e6347
NC
6859 return FALSE;
6860 }
811072d8 6861
079e9a2f 6862 shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
cb33740c 6863 BFD_ASSERT (shndx != SHN_BAD);
079e9a2f
AM
6864 }
6865 }
252b5132 6866
079e9a2f
AM
6867 sym.st_shndx = shndx;
6868 }
252b5132 6869
13ae64f3
JJ
6870 if ((flags & BSF_THREAD_LOCAL) != 0)
6871 type = STT_TLS;
d8045f23
NC
6872 else if ((flags & BSF_GNU_INDIRECT_FUNCTION) != 0)
6873 type = STT_GNU_IFUNC;
13ae64f3 6874 else if ((flags & BSF_FUNCTION) != 0)
079e9a2f
AM
6875 type = STT_FUNC;
6876 else if ((flags & BSF_OBJECT) != 0)
6877 type = STT_OBJECT;
d9352518
DB
6878 else if ((flags & BSF_RELC) != 0)
6879 type = STT_RELC;
6880 else if ((flags & BSF_SRELC) != 0)
6881 type = STT_SRELC;
079e9a2f
AM
6882 else
6883 type = STT_NOTYPE;
252b5132 6884
13ae64f3
JJ
6885 if (syms[idx]->section->flags & SEC_THREAD_LOCAL)
6886 type = STT_TLS;
6887
589e6347 6888 /* Processor-specific types. */
079e9a2f
AM
6889 if (type_ptr != NULL
6890 && bed->elf_backend_get_symbol_type)
6891 type = ((*bed->elf_backend_get_symbol_type)
6892 (&type_ptr->internal_elf_sym, type));
252b5132 6893
079e9a2f
AM
6894 if (flags & BSF_SECTION_SYM)
6895 {
6896 if (flags & BSF_GLOBAL)
6897 sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
6898 else
6899 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
6900 }
6901 else if (bfd_is_com_section (syms[idx]->section))
0a40daed 6902 {
504b7d20 6903#ifdef USE_STT_COMMON
0a40daed
MK
6904 if (type == STT_OBJECT)
6905 sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_COMMON);
6906 else
504b7d20 6907#endif
c91e322a 6908 sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
0a40daed 6909 }
079e9a2f
AM
6910 else if (bfd_is_und_section (syms[idx]->section))
6911 sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
6912 ? STB_WEAK
6913 : STB_GLOBAL),
6914 type);
6915 else if (flags & BSF_FILE)
6916 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
6917 else
6918 {
6919 int bind = STB_LOCAL;
252b5132 6920
079e9a2f
AM
6921 if (flags & BSF_LOCAL)
6922 bind = STB_LOCAL;
3e7a7d11
NC
6923 else if (flags & BSF_GNU_UNIQUE)
6924 bind = STB_GNU_UNIQUE;
079e9a2f
AM
6925 else if (flags & BSF_WEAK)
6926 bind = STB_WEAK;
6927 else if (flags & BSF_GLOBAL)
6928 bind = STB_GLOBAL;
252b5132 6929
079e9a2f
AM
6930 sym.st_info = ELF_ST_INFO (bind, type);
6931 }
252b5132 6932
079e9a2f 6933 if (type_ptr != NULL)
35fc36a8
RS
6934 {
6935 sym.st_other = type_ptr->internal_elf_sym.st_other;
6936 sym.st_target_internal
6937 = type_ptr->internal_elf_sym.st_target_internal;
6938 }
079e9a2f 6939 else
35fc36a8
RS
6940 {
6941 sym.st_other = 0;
6942 sym.st_target_internal = 0;
6943 }
252b5132 6944
9ad5cbcf 6945 bed->s->swap_symbol_out (abfd, &sym, outbound_syms, outbound_shndx);
079e9a2f 6946 outbound_syms += bed->s->sizeof_sym;
9ad5cbcf
AM
6947 if (outbound_shndx != NULL)
6948 outbound_shndx += sizeof (Elf_External_Sym_Shndx);
079e9a2f 6949 }
252b5132 6950
079e9a2f
AM
6951 *sttp = stt;
6952 symstrtab_hdr->sh_size = _bfd_stringtab_size (stt);
6953 symstrtab_hdr->sh_type = SHT_STRTAB;
252b5132 6954
079e9a2f
AM
6955 symstrtab_hdr->sh_flags = 0;
6956 symstrtab_hdr->sh_addr = 0;
6957 symstrtab_hdr->sh_entsize = 0;
6958 symstrtab_hdr->sh_link = 0;
6959 symstrtab_hdr->sh_info = 0;
6960 symstrtab_hdr->sh_addralign = 1;
252b5132 6961
b34976b6 6962 return TRUE;
252b5132
RH
6963}
6964
6965/* Return the number of bytes required to hold the symtab vector.
6966
6967 Note that we base it on the count plus 1, since we will null terminate
6968 the vector allocated based on this size. However, the ELF symbol table
6969 always has a dummy entry as symbol #0, so it ends up even. */
6970
6971long
217aa764 6972_bfd_elf_get_symtab_upper_bound (bfd *abfd)
252b5132
RH
6973{
6974 long symcount;
6975 long symtab_size;
6976 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr;
6977
6978 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b99d1833
AM
6979 symtab_size = (symcount + 1) * (sizeof (asymbol *));
6980 if (symcount > 0)
6981 symtab_size -= sizeof (asymbol *);
252b5132
RH
6982
6983 return symtab_size;
6984}
6985
6986long
217aa764 6987_bfd_elf_get_dynamic_symtab_upper_bound (bfd *abfd)
252b5132
RH
6988{
6989 long symcount;
6990 long symtab_size;
6991 Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr;
6992
6993 if (elf_dynsymtab (abfd) == 0)
6994 {
6995 bfd_set_error (bfd_error_invalid_operation);
6996 return -1;
6997 }
6998
6999 symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym;
b99d1833
AM
7000 symtab_size = (symcount + 1) * (sizeof (asymbol *));
7001 if (symcount > 0)
7002 symtab_size -= sizeof (asymbol *);
252b5132
RH
7003
7004 return symtab_size;
7005}
7006
7007long
217aa764
AM
7008_bfd_elf_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
7009 sec_ptr asect)
252b5132
RH
7010{
7011 return (asect->reloc_count + 1) * sizeof (arelent *);
7012}
7013
7014/* Canonicalize the relocs. */
7015
7016long
217aa764
AM
7017_bfd_elf_canonicalize_reloc (bfd *abfd,
7018 sec_ptr section,
7019 arelent **relptr,
7020 asymbol **symbols)
252b5132
RH
7021{
7022 arelent *tblptr;
7023 unsigned int i;
9c5bfbb7 7024 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
252b5132 7025
b34976b6 7026 if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
252b5132
RH
7027 return -1;
7028
7029 tblptr = section->relocation;
7030 for (i = 0; i < section->reloc_count; i++)
7031 *relptr++ = tblptr++;
7032
7033 *relptr = NULL;
7034
7035 return section->reloc_count;
7036}
7037
7038long
6cee3f79 7039_bfd_elf_canonicalize_symtab (bfd *abfd, asymbol **allocation)
252b5132 7040{
9c5bfbb7 7041 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 7042 long symcount = bed->s->slurp_symbol_table (abfd, allocation, FALSE);
252b5132
RH
7043
7044 if (symcount >= 0)
7045 bfd_get_symcount (abfd) = symcount;
7046 return symcount;
7047}
7048
7049long
217aa764
AM
7050_bfd_elf_canonicalize_dynamic_symtab (bfd *abfd,
7051 asymbol **allocation)
252b5132 7052{
9c5bfbb7 7053 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
217aa764 7054 long symcount = bed->s->slurp_symbol_table (abfd, allocation, TRUE);
1f70368c
DJ
7055
7056 if (symcount >= 0)
7057 bfd_get_dynamic_symcount (abfd) = symcount;
7058 return symcount;
252b5132
RH
7059}
7060
8615f3f2
AM
7061/* Return the size required for the dynamic reloc entries. Any loadable
7062 section that was actually installed in the BFD, and has type SHT_REL
7063 or SHT_RELA, and uses the dynamic symbol table, is considered to be a
7064 dynamic reloc section. */
252b5132
RH
7065
7066long
217aa764 7067_bfd_elf_get_dynamic_reloc_upper_bound (bfd *abfd)
252b5132
RH
7068{
7069 long ret;
7070 asection *s;
7071
7072 if (elf_dynsymtab (abfd) == 0)
7073 {
7074 bfd_set_error (bfd_error_invalid_operation);
7075 return -1;
7076 }
7077
7078 ret = sizeof (arelent *);
7079 for (s = abfd->sections; s != NULL; s = s->next)
266b05cf 7080 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
7081 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7082 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
eea6121a 7083 ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
252b5132
RH
7084 * sizeof (arelent *));
7085
7086 return ret;
7087}
7088
8615f3f2
AM
7089/* Canonicalize the dynamic relocation entries. Note that we return the
7090 dynamic relocations as a single block, although they are actually
7091 associated with particular sections; the interface, which was
7092 designed for SunOS style shared libraries, expects that there is only
7093 one set of dynamic relocs. Any loadable section that was actually
7094 installed in the BFD, and has type SHT_REL or SHT_RELA, and uses the
7095 dynamic symbol table, is considered to be a dynamic reloc section. */
252b5132
RH
7096
7097long
217aa764
AM
7098_bfd_elf_canonicalize_dynamic_reloc (bfd *abfd,
7099 arelent **storage,
7100 asymbol **syms)
252b5132 7101{
217aa764 7102 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
252b5132
RH
7103 asection *s;
7104 long ret;
7105
7106 if (elf_dynsymtab (abfd) == 0)
7107 {
7108 bfd_set_error (bfd_error_invalid_operation);
7109 return -1;
7110 }
7111
7112 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
7113 ret = 0;
7114 for (s = abfd->sections; s != NULL; s = s->next)
7115 {
266b05cf 7116 if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
252b5132
RH
7117 && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
7118 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
7119 {
7120 arelent *p;
7121 long count, i;
7122
b34976b6 7123 if (! (*slurp_relocs) (abfd, s, syms, TRUE))
252b5132 7124 return -1;
eea6121a 7125 count = s->size / elf_section_data (s)->this_hdr.sh_entsize;
252b5132
RH
7126 p = s->relocation;
7127 for (i = 0; i < count; i++)
7128 *storage++ = p++;
7129 ret += count;
7130 }
7131 }
7132
7133 *storage = NULL;
7134
7135 return ret;
7136}
7137\f
7138/* Read in the version information. */
7139
b34976b6 7140bfd_boolean
fc0e6df6 7141_bfd_elf_slurp_version_tables (bfd *abfd, bfd_boolean default_imported_symver)
252b5132
RH
7142{
7143 bfd_byte *contents = NULL;
fc0e6df6
PB
7144 unsigned int freeidx = 0;
7145
7146 if (elf_dynverref (abfd) != 0)
7147 {
7148 Elf_Internal_Shdr *hdr;
7149 Elf_External_Verneed *everneed;
7150 Elf_Internal_Verneed *iverneed;
7151 unsigned int i;
d0fb9a8d 7152 bfd_byte *contents_end;
fc0e6df6
PB
7153
7154 hdr = &elf_tdata (abfd)->dynverref_hdr;
7155
a50b1753
NC
7156 elf_tdata (abfd)->verref = (Elf_Internal_Verneed *)
7157 bfd_zalloc2 (abfd, hdr->sh_info, sizeof (Elf_Internal_Verneed));
fc0e6df6
PB
7158 if (elf_tdata (abfd)->verref == NULL)
7159 goto error_return;
7160
7161 elf_tdata (abfd)->cverrefs = hdr->sh_info;
7162
a50b1753 7163 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
fc0e6df6 7164 if (contents == NULL)
d0fb9a8d
JJ
7165 {
7166error_return_verref:
7167 elf_tdata (abfd)->verref = NULL;
7168 elf_tdata (abfd)->cverrefs = 0;
7169 goto error_return;
7170 }
fc0e6df6
PB
7171 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
7172 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
d0fb9a8d 7173 goto error_return_verref;
fc0e6df6 7174
d0fb9a8d
JJ
7175 if (hdr->sh_info && hdr->sh_size < sizeof (Elf_External_Verneed))
7176 goto error_return_verref;
7177
7178 BFD_ASSERT (sizeof (Elf_External_Verneed)
7179 == sizeof (Elf_External_Vernaux));
7180 contents_end = contents + hdr->sh_size - sizeof (Elf_External_Verneed);
fc0e6df6
PB
7181 everneed = (Elf_External_Verneed *) contents;
7182 iverneed = elf_tdata (abfd)->verref;
7183 for (i = 0; i < hdr->sh_info; i++, iverneed++)
7184 {
7185 Elf_External_Vernaux *evernaux;
7186 Elf_Internal_Vernaux *ivernaux;
7187 unsigned int j;
7188
7189 _bfd_elf_swap_verneed_in (abfd, everneed, iverneed);
7190
7191 iverneed->vn_bfd = abfd;
7192
7193 iverneed->vn_filename =
7194 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
7195 iverneed->vn_file);
7196 if (iverneed->vn_filename == NULL)
d0fb9a8d 7197 goto error_return_verref;
fc0e6df6 7198
d0fb9a8d
JJ
7199 if (iverneed->vn_cnt == 0)
7200 iverneed->vn_auxptr = NULL;
7201 else
7202 {
a50b1753
NC
7203 iverneed->vn_auxptr = (struct elf_internal_vernaux *)
7204 bfd_alloc2 (abfd, iverneed->vn_cnt,
7205 sizeof (Elf_Internal_Vernaux));
d0fb9a8d
JJ
7206 if (iverneed->vn_auxptr == NULL)
7207 goto error_return_verref;
7208 }
7209
7210 if (iverneed->vn_aux
7211 > (size_t) (contents_end - (bfd_byte *) everneed))
7212 goto error_return_verref;
fc0e6df6
PB
7213
7214 evernaux = ((Elf_External_Vernaux *)
7215 ((bfd_byte *) everneed + iverneed->vn_aux));
7216 ivernaux = iverneed->vn_auxptr;
7217 for (j = 0; j < iverneed->vn_cnt; j++, ivernaux++)
7218 {
7219 _bfd_elf_swap_vernaux_in (abfd, evernaux, ivernaux);
7220
7221 ivernaux->vna_nodename =
7222 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
7223 ivernaux->vna_name);
7224 if (ivernaux->vna_nodename == NULL)
d0fb9a8d 7225 goto error_return_verref;
fc0e6df6
PB
7226
7227 if (j + 1 < iverneed->vn_cnt)
7228 ivernaux->vna_nextptr = ivernaux + 1;
7229 else
7230 ivernaux->vna_nextptr = NULL;
7231
d0fb9a8d
JJ
7232 if (ivernaux->vna_next
7233 > (size_t) (contents_end - (bfd_byte *) evernaux))
7234 goto error_return_verref;
7235
fc0e6df6
PB
7236 evernaux = ((Elf_External_Vernaux *)
7237 ((bfd_byte *) evernaux + ivernaux->vna_next));
7238
7239 if (ivernaux->vna_other > freeidx)
7240 freeidx = ivernaux->vna_other;
7241 }
7242
7243 if (i + 1 < hdr->sh_info)
7244 iverneed->vn_nextref = iverneed + 1;
7245 else
7246 iverneed->vn_nextref = NULL;
7247
d0fb9a8d
JJ
7248 if (iverneed->vn_next
7249 > (size_t) (contents_end - (bfd_byte *) everneed))
7250 goto error_return_verref;
7251
fc0e6df6
PB
7252 everneed = ((Elf_External_Verneed *)
7253 ((bfd_byte *) everneed + iverneed->vn_next));
7254 }
7255
7256 free (contents);
7257 contents = NULL;
7258 }
252b5132
RH
7259
7260 if (elf_dynverdef (abfd) != 0)
7261 {
7262 Elf_Internal_Shdr *hdr;
7263 Elf_External_Verdef *everdef;
7264 Elf_Internal_Verdef *iverdef;
f631889e
UD
7265 Elf_Internal_Verdef *iverdefarr;
7266 Elf_Internal_Verdef iverdefmem;
252b5132 7267 unsigned int i;
062e2358 7268 unsigned int maxidx;
d0fb9a8d 7269 bfd_byte *contents_end_def, *contents_end_aux;
252b5132
RH
7270
7271 hdr = &elf_tdata (abfd)->dynverdef_hdr;
7272
a50b1753 7273 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
252b5132
RH
7274 if (contents == NULL)
7275 goto error_return;
7276 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0
217aa764 7277 || bfd_bread (contents, hdr->sh_size, abfd) != hdr->sh_size)
252b5132
RH
7278 goto error_return;
7279
d0fb9a8d
JJ
7280 if (hdr->sh_info && hdr->sh_size < sizeof (Elf_External_Verdef))
7281 goto error_return;
7282
7283 BFD_ASSERT (sizeof (Elf_External_Verdef)
7284 >= sizeof (Elf_External_Verdaux));
7285 contents_end_def = contents + hdr->sh_size
7286 - sizeof (Elf_External_Verdef);
7287 contents_end_aux = contents + hdr->sh_size
7288 - sizeof (Elf_External_Verdaux);
7289
f631889e
UD
7290 /* We know the number of entries in the section but not the maximum
7291 index. Therefore we have to run through all entries and find
7292 the maximum. */
252b5132 7293 everdef = (Elf_External_Verdef *) contents;
f631889e
UD
7294 maxidx = 0;
7295 for (i = 0; i < hdr->sh_info; ++i)
7296 {
7297 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
7298
062e2358
AM
7299 if ((iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION)) > maxidx)
7300 maxidx = iverdefmem.vd_ndx & ((unsigned) VERSYM_VERSION);
f631889e 7301
d0fb9a8d
JJ
7302 if (iverdefmem.vd_next
7303 > (size_t) (contents_end_def - (bfd_byte *) everdef))
7304 goto error_return;
7305
f631889e
UD
7306 everdef = ((Elf_External_Verdef *)
7307 ((bfd_byte *) everdef + iverdefmem.vd_next));
7308 }
7309
fc0e6df6
PB
7310 if (default_imported_symver)
7311 {
7312 if (freeidx > maxidx)
7313 maxidx = ++freeidx;
7314 else
7315 freeidx = ++maxidx;
7316 }
a50b1753
NC
7317 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
7318 bfd_zalloc2 (abfd, maxidx, sizeof (Elf_Internal_Verdef));
f631889e
UD
7319 if (elf_tdata (abfd)->verdef == NULL)
7320 goto error_return;
7321
7322 elf_tdata (abfd)->cverdefs = maxidx;
7323
7324 everdef = (Elf_External_Verdef *) contents;
7325 iverdefarr = elf_tdata (abfd)->verdef;
7326 for (i = 0; i < hdr->sh_info; i++)
252b5132
RH
7327 {
7328 Elf_External_Verdaux *everdaux;
7329 Elf_Internal_Verdaux *iverdaux;
7330 unsigned int j;
7331
f631889e
UD
7332 _bfd_elf_swap_verdef_in (abfd, everdef, &iverdefmem);
7333
d0fb9a8d
JJ
7334 if ((iverdefmem.vd_ndx & VERSYM_VERSION) == 0)
7335 {
7336error_return_verdef:
7337 elf_tdata (abfd)->verdef = NULL;
7338 elf_tdata (abfd)->cverdefs = 0;
7339 goto error_return;
7340 }
7341
f631889e
UD
7342 iverdef = &iverdefarr[(iverdefmem.vd_ndx & VERSYM_VERSION) - 1];
7343 memcpy (iverdef, &iverdefmem, sizeof (Elf_Internal_Verdef));
252b5132
RH
7344
7345 iverdef->vd_bfd = abfd;
7346
d0fb9a8d
JJ
7347 if (iverdef->vd_cnt == 0)
7348 iverdef->vd_auxptr = NULL;
7349 else
7350 {
a50b1753
NC
7351 iverdef->vd_auxptr = (struct elf_internal_verdaux *)
7352 bfd_alloc2 (abfd, iverdef->vd_cnt,
7353 sizeof (Elf_Internal_Verdaux));
d0fb9a8d
JJ
7354 if (iverdef->vd_auxptr == NULL)
7355 goto error_return_verdef;
7356 }
7357
7358 if (iverdef->vd_aux
7359 > (size_t) (contents_end_aux - (bfd_byte *) everdef))
7360 goto error_return_verdef;
252b5132
RH
7361
7362 everdaux = ((Elf_External_Verdaux *)
7363 ((bfd_byte *) everdef + iverdef->vd_aux));
7364 iverdaux = iverdef->vd_auxptr;
7365 for (j = 0; j < iverdef->vd_cnt; j++, iverdaux++)
7366 {
7367 _bfd_elf_swap_verdaux_in (abfd, everdaux, iverdaux);
7368
7369 iverdaux->vda_nodename =
7370 bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
7371 iverdaux->vda_name);
7372 if (iverdaux->vda_nodename == NULL)
d0fb9a8d 7373 goto error_return_verdef;
252b5132
RH
7374
7375 if (j + 1 < iverdef->vd_cnt)
7376 iverdaux->vda_nextptr = iverdaux + 1;
7377 else
7378 iverdaux->vda_nextptr = NULL;
7379
d0fb9a8d
JJ
7380 if (iverdaux->vda_next
7381 > (size_t) (contents_end_aux - (bfd_byte *) everdaux))
7382 goto error_return_verdef;
7383
252b5132
RH
7384 everdaux = ((Elf_External_Verdaux *)
7385 ((bfd_byte *) everdaux + iverdaux->vda_next));
7386 }
7387
d0fb9a8d
JJ
7388 if (iverdef->vd_cnt)
7389 iverdef->vd_nodename = iverdef->vd_auxptr->vda_nodename;
252b5132 7390
d0fb9a8d 7391 if ((size_t) (iverdef - iverdefarr) + 1 < maxidx)
252b5132
RH
7392 iverdef->vd_nextdef = iverdef + 1;
7393 else
7394 iverdef->vd_nextdef = NULL;
7395
7396 everdef = ((Elf_External_Verdef *)
7397 ((bfd_byte *) everdef + iverdef->vd_next));
7398 }
7399
7400 free (contents);
7401 contents = NULL;
7402 }
fc0e6df6 7403 else if (default_imported_symver)
252b5132 7404 {
fc0e6df6
PB
7405 if (freeidx < 3)
7406 freeidx = 3;
7407 else
7408 freeidx++;
252b5132 7409
a50b1753
NC
7410 elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *)
7411 bfd_zalloc2 (abfd, freeidx, sizeof (Elf_Internal_Verdef));
fc0e6df6 7412 if (elf_tdata (abfd)->verdef == NULL)
252b5132
RH
7413 goto error_return;
7414
fc0e6df6
PB
7415 elf_tdata (abfd)->cverdefs = freeidx;
7416 }
252b5132 7417
fc0e6df6
PB
7418 /* Create a default version based on the soname. */
7419 if (default_imported_symver)
7420 {
7421 Elf_Internal_Verdef *iverdef;
7422 Elf_Internal_Verdaux *iverdaux;
252b5132 7423
5bb3703f 7424 iverdef = &elf_tdata (abfd)->verdef[freeidx - 1];
252b5132 7425
fc0e6df6
PB
7426 iverdef->vd_version = VER_DEF_CURRENT;
7427 iverdef->vd_flags = 0;
7428 iverdef->vd_ndx = freeidx;
7429 iverdef->vd_cnt = 1;
252b5132 7430
fc0e6df6 7431 iverdef->vd_bfd = abfd;
252b5132 7432
fc0e6df6
PB
7433 iverdef->vd_nodename = bfd_elf_get_dt_soname (abfd);
7434 if (iverdef->vd_nodename == NULL)
d0fb9a8d 7435 goto error_return_verdef;
fc0e6df6 7436 iverdef->vd_nextdef = NULL;
a50b1753
NC
7437 iverdef->vd_auxptr = (struct elf_internal_verdaux *)
7438 bfd_alloc (abfd, sizeof (Elf_Internal_Verdaux));
d0fb9a8d
JJ
7439 if (iverdef->vd_auxptr == NULL)
7440 goto error_return_verdef;
252b5132 7441
fc0e6df6
PB
7442 iverdaux = iverdef->vd_auxptr;
7443 iverdaux->vda_nodename = iverdef->vd_nodename;
7444 iverdaux->vda_nextptr = NULL;
252b5132
RH
7445 }
7446
b34976b6 7447 return TRUE;
252b5132
RH
7448
7449 error_return:
5ed6aba4 7450 if (contents != NULL)
252b5132 7451 free (contents);
b34976b6 7452 return FALSE;
252b5132
RH
7453}
7454\f
7455asymbol *
217aa764 7456_bfd_elf_make_empty_symbol (bfd *abfd)
252b5132
RH
7457{
7458 elf_symbol_type *newsym;
dc810e39 7459 bfd_size_type amt = sizeof (elf_symbol_type);
252b5132 7460
a50b1753 7461 newsym = (elf_symbol_type *) bfd_zalloc (abfd, amt);
252b5132
RH
7462 if (!newsym)
7463 return NULL;
7464 else
7465 {
7466 newsym->symbol.the_bfd = abfd;
7467 return &newsym->symbol;
7468 }
7469}
7470
7471void
217aa764
AM
7472_bfd_elf_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
7473 asymbol *symbol,
7474 symbol_info *ret)
252b5132
RH
7475{
7476 bfd_symbol_info (symbol, ret);
7477}
7478
7479/* Return whether a symbol name implies a local symbol. Most targets
7480 use this function for the is_local_label_name entry point, but some
7481 override it. */
7482
b34976b6 7483bfd_boolean
217aa764
AM
7484_bfd_elf_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
7485 const char *name)
252b5132
RH
7486{
7487 /* Normal local symbols start with ``.L''. */
7488 if (name[0] == '.' && name[1] == 'L')
b34976b6 7489 return TRUE;
252b5132
RH
7490
7491 /* At least some SVR4 compilers (e.g., UnixWare 2.1 cc) generate
7492 DWARF debugging symbols starting with ``..''. */
7493 if (name[0] == '.' && name[1] == '.')
b34976b6 7494 return TRUE;
252b5132
RH
7495
7496 /* gcc will sometimes generate symbols beginning with ``_.L_'' when
7497 emitting DWARF debugging output. I suspect this is actually a
7498 small bug in gcc (it calls ASM_OUTPUT_LABEL when it should call
7499 ASM_GENERATE_INTERNAL_LABEL, and this causes the leading
7500 underscore to be emitted on some ELF targets). For ease of use,
7501 we treat such symbols as local. */
7502 if (name[0] == '_' && name[1] == '.' && name[2] == 'L' && name[3] == '_')
b34976b6 7503 return TRUE;
252b5132 7504
b34976b6 7505 return FALSE;
252b5132
RH
7506}
7507
7508alent *
217aa764
AM
7509_bfd_elf_get_lineno (bfd *abfd ATTRIBUTE_UNUSED,
7510 asymbol *symbol ATTRIBUTE_UNUSED)
252b5132
RH
7511{
7512 abort ();
7513 return NULL;
7514}
7515
b34976b6 7516bfd_boolean
217aa764
AM
7517_bfd_elf_set_arch_mach (bfd *abfd,
7518 enum bfd_architecture arch,
7519 unsigned long machine)
252b5132
RH
7520{
7521 /* If this isn't the right architecture for this backend, and this
7522 isn't the generic backend, fail. */
7523 if (arch != get_elf_backend_data (abfd)->arch
7524 && arch != bfd_arch_unknown
7525 && get_elf_backend_data (abfd)->arch != bfd_arch_unknown)
b34976b6 7526 return FALSE;
252b5132
RH
7527
7528 return bfd_default_set_arch_mach (abfd, arch, machine);
7529}
7530
d1fad7c6
NC
7531/* Find the function to a particular section and offset,
7532 for error reporting. */
252b5132 7533
b34976b6 7534static bfd_boolean
b9d678e0 7535elf_find_function (bfd *abfd,
217aa764
AM
7536 asection *section,
7537 asymbol **symbols,
7538 bfd_vma offset,
7539 const char **filename_ptr,
7540 const char **functionname_ptr)
252b5132 7541{
619a703e
AM
7542 struct elf_find_function_cache
7543 {
7544 asection *last_section;
7545 asymbol *func;
7546 const char *filename;
7547 bfd_size_type func_size;
7548 } *cache;
252b5132 7549
a06c7d5a
NC
7550 if (symbols == NULL)
7551 return FALSE;
7552
619a703e
AM
7553 cache = elf_tdata (abfd)->elf_find_function_cache;
7554 if (cache == NULL)
7555 {
7556 cache = bfd_zalloc (abfd, sizeof (*cache));
7557 elf_tdata (abfd)->elf_find_function_cache = cache;
7558 if (cache == NULL)
7559 return FALSE;
7560 }
7561 if (cache->last_section != section
7562 || cache->func == NULL
7563 || offset < cache->func->value
7564 || offset >= cache->func->value + cache->func_size)
aef36ac1
AM
7565 {
7566 asymbol *file;
7567 bfd_vma low_func;
7568 asymbol **p;
7569 /* ??? Given multiple file symbols, it is impossible to reliably
7570 choose the right file name for global symbols. File symbols are
7571 local symbols, and thus all file symbols must sort before any
7572 global symbols. The ELF spec may be interpreted to say that a
7573 file symbol must sort before other local symbols, but currently
7574 ld -r doesn't do this. So, for ld -r output, it is possible to
7575 make a better choice of file name for local symbols by ignoring
7576 file symbols appearing after a given local symbol. */
7577 enum { nothing_seen, symbol_seen, file_after_symbol_seen } state;
7578 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7579
aef36ac1
AM
7580 file = NULL;
7581 low_func = 0;
7582 state = nothing_seen;
619a703e
AM
7583 cache->filename = NULL;
7584 cache->func = NULL;
7585 cache->func_size = 0;
7586 cache->last_section = section;
aef36ac1
AM
7587
7588 for (p = symbols; *p != NULL; p++)
7589 {
7590 asymbol *sym = *p;
7591 bfd_vma code_off;
7592 bfd_size_type size;
7593
7594 if ((sym->flags & BSF_FILE) != 0)
7595 {
7596 file = sym;
7597 if (state == symbol_seen)
7598 state = file_after_symbol_seen;
7599 continue;
7600 }
ff9e0f5b 7601
aef36ac1
AM
7602 size = bed->maybe_function_sym (sym, section, &code_off);
7603 if (size != 0
7604 && code_off <= offset
7605 && (code_off > low_func
7606 || (code_off == low_func
619a703e 7607 && size > cache->func_size)))
aef36ac1 7608 {
619a703e
AM
7609 cache->func = sym;
7610 cache->func_size = size;
7611 cache->filename = NULL;
aef36ac1 7612 low_func = code_off;
aef36ac1
AM
7613 if (file != NULL
7614 && ((sym->flags & BSF_LOCAL) != 0
7615 || state != file_after_symbol_seen))
619a703e 7616 cache->filename = bfd_asymbol_name (file);
aef36ac1
AM
7617 }
7618 if (state == nothing_seen)
7619 state = symbol_seen;
252b5132
RH
7620 }
7621 }
7622
619a703e 7623 if (cache->func == NULL)
b34976b6 7624 return FALSE;
252b5132 7625
d1fad7c6 7626 if (filename_ptr)
619a703e 7627 *filename_ptr = cache->filename;
d1fad7c6 7628 if (functionname_ptr)
619a703e 7629 *functionname_ptr = bfd_asymbol_name (cache->func);
d1fad7c6 7630
b34976b6 7631 return TRUE;
d1fad7c6
NC
7632}
7633
7634/* Find the nearest line to a particular section and offset,
7635 for error reporting. */
7636
b34976b6 7637bfd_boolean
217aa764
AM
7638_bfd_elf_find_nearest_line (bfd *abfd,
7639 asection *section,
7640 asymbol **symbols,
7641 bfd_vma offset,
7642 const char **filename_ptr,
7643 const char **functionname_ptr,
7644 unsigned int *line_ptr)
9b8d1a36
CC
7645{
7646 return _bfd_elf_find_nearest_line_discriminator (abfd, section, symbols,
7647 offset, filename_ptr,
7648 functionname_ptr,
7649 line_ptr,
7650 NULL);
7651}
7652
7653bfd_boolean
7654_bfd_elf_find_nearest_line_discriminator (bfd *abfd,
7655 asection *section,
7656 asymbol **symbols,
7657 bfd_vma offset,
7658 const char **filename_ptr,
7659 const char **functionname_ptr,
7660 unsigned int *line_ptr,
7661 unsigned int *discriminator_ptr)
d1fad7c6 7662{
b34976b6 7663 bfd_boolean found;
d1fad7c6
NC
7664
7665 if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
4e8a9624
AM
7666 filename_ptr, functionname_ptr,
7667 line_ptr))
d1fad7c6
NC
7668 {
7669 if (!*functionname_ptr)
4e8a9624
AM
7670 elf_find_function (abfd, section, symbols, offset,
7671 *filename_ptr ? NULL : filename_ptr,
7672 functionname_ptr);
7673
b34976b6 7674 return TRUE;
d1fad7c6
NC
7675 }
7676
fc28f9aa
TG
7677 if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
7678 section, symbols, offset,
4e8a9624 7679 filename_ptr, functionname_ptr,
9b8d1a36 7680 line_ptr, discriminator_ptr, 0,
4e8a9624 7681 &elf_tdata (abfd)->dwarf2_find_line_info))
d1fad7c6
NC
7682 {
7683 if (!*functionname_ptr)
4e8a9624
AM
7684 elf_find_function (abfd, section, symbols, offset,
7685 *filename_ptr ? NULL : filename_ptr,
7686 functionname_ptr);
7687
b34976b6 7688 return TRUE;
d1fad7c6
NC
7689 }
7690
7691 if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
4e8a9624
AM
7692 &found, filename_ptr,
7693 functionname_ptr, line_ptr,
7694 &elf_tdata (abfd)->line_info))
b34976b6 7695 return FALSE;
dc43ada5 7696 if (found && (*functionname_ptr || *line_ptr))
b34976b6 7697 return TRUE;
d1fad7c6
NC
7698
7699 if (symbols == NULL)
b34976b6 7700 return FALSE;
d1fad7c6
NC
7701
7702 if (! elf_find_function (abfd, section, symbols, offset,
4e8a9624 7703 filename_ptr, functionname_ptr))
b34976b6 7704 return FALSE;
d1fad7c6 7705
252b5132 7706 *line_ptr = 0;
b34976b6 7707 return TRUE;
252b5132
RH
7708}
7709
5420f73d
L
7710/* Find the line for a symbol. */
7711
7712bfd_boolean
7713_bfd_elf_find_line (bfd *abfd, asymbol **symbols, asymbol *symbol,
7714 const char **filename_ptr, unsigned int *line_ptr)
9b8d1a36
CC
7715{
7716 return _bfd_elf_find_line_discriminator (abfd, symbols, symbol,
7717 filename_ptr, line_ptr,
7718 NULL);
7719}
7720
7721bfd_boolean
7722_bfd_elf_find_line_discriminator (bfd *abfd, asymbol **symbols, asymbol *symbol,
7723 const char **filename_ptr,
7724 unsigned int *line_ptr,
7725 unsigned int *discriminator_ptr)
5420f73d
L
7726{
7727 return _bfd_dwarf2_find_line (abfd, symbols, symbol,
9b8d1a36 7728 filename_ptr, line_ptr, discriminator_ptr, 0,
5420f73d
L
7729 &elf_tdata (abfd)->dwarf2_find_line_info);
7730}
7731
4ab527b0
FF
7732/* After a call to bfd_find_nearest_line, successive calls to
7733 bfd_find_inliner_info can be used to get source information about
7734 each level of function inlining that terminated at the address
7735 passed to bfd_find_nearest_line. Currently this is only supported
7736 for DWARF2 with appropriate DWARF3 extensions. */
7737
7738bfd_boolean
7739_bfd_elf_find_inliner_info (bfd *abfd,
7740 const char **filename_ptr,
7741 const char **functionname_ptr,
7742 unsigned int *line_ptr)
7743{
7744 bfd_boolean found;
7745 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
7746 functionname_ptr, line_ptr,
7747 & elf_tdata (abfd)->dwarf2_find_line_info);
7748 return found;
7749}
7750
252b5132 7751int
a6b96beb 7752_bfd_elf_sizeof_headers (bfd *abfd, struct bfd_link_info *info)
252b5132 7753{
8ded5a0f
AM
7754 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7755 int ret = bed->s->sizeof_ehdr;
252b5132 7756
a6b96beb 7757 if (!info->relocatable)
8ded5a0f 7758 {
12bd6957 7759 bfd_size_type phdr_size = elf_program_header_size (abfd);
8ded5a0f 7760
62d7a5f6
AM
7761 if (phdr_size == (bfd_size_type) -1)
7762 {
7763 struct elf_segment_map *m;
7764
7765 phdr_size = 0;
12bd6957 7766 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
62d7a5f6 7767 phdr_size += bed->s->sizeof_phdr;
8ded5a0f 7768
62d7a5f6
AM
7769 if (phdr_size == 0)
7770 phdr_size = get_program_header_size (abfd, info);
7771 }
8ded5a0f 7772
12bd6957 7773 elf_program_header_size (abfd) = phdr_size;
8ded5a0f
AM
7774 ret += phdr_size;
7775 }
7776
252b5132
RH
7777 return ret;
7778}
7779
b34976b6 7780bfd_boolean
217aa764
AM
7781_bfd_elf_set_section_contents (bfd *abfd,
7782 sec_ptr section,
0f867abe 7783 const void *location,
217aa764
AM
7784 file_ptr offset,
7785 bfd_size_type count)
252b5132
RH
7786{
7787 Elf_Internal_Shdr *hdr;
dc810e39 7788 bfd_signed_vma pos;
252b5132
RH
7789
7790 if (! abfd->output_has_begun
217aa764 7791 && ! _bfd_elf_compute_section_file_positions (abfd, NULL))
b34976b6 7792 return FALSE;
252b5132
RH
7793
7794 hdr = &elf_section_data (section)->this_hdr;
dc810e39
AM
7795 pos = hdr->sh_offset + offset;
7796 if (bfd_seek (abfd, pos, SEEK_SET) != 0
7797 || bfd_bwrite (location, count, abfd) != count)
b34976b6 7798 return FALSE;
252b5132 7799
b34976b6 7800 return TRUE;
252b5132
RH
7801}
7802
7803void
217aa764
AM
7804_bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
7805 arelent *cache_ptr ATTRIBUTE_UNUSED,
7806 Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
252b5132
RH
7807{
7808 abort ();
7809}
7810
252b5132
RH
7811/* Try to convert a non-ELF reloc into an ELF one. */
7812
b34976b6 7813bfd_boolean
217aa764 7814_bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
252b5132 7815{
c044fabd 7816 /* Check whether we really have an ELF howto. */
252b5132
RH
7817
7818 if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec)
7819 {
7820 bfd_reloc_code_real_type code;
7821 reloc_howto_type *howto;
7822
7823 /* Alien reloc: Try to determine its type to replace it with an
c044fabd 7824 equivalent ELF reloc. */
252b5132
RH
7825
7826 if (areloc->howto->pc_relative)
7827 {
7828 switch (areloc->howto->bitsize)
7829 {
7830 case 8:
7831 code = BFD_RELOC_8_PCREL;
7832 break;
7833 case 12:
7834 code = BFD_RELOC_12_PCREL;
7835 break;
7836 case 16:
7837 code = BFD_RELOC_16_PCREL;
7838 break;
7839 case 24:
7840 code = BFD_RELOC_24_PCREL;
7841 break;
7842 case 32:
7843 code = BFD_RELOC_32_PCREL;
7844 break;
7845 case 64:
7846 code = BFD_RELOC_64_PCREL;
7847 break;
7848 default:
7849 goto fail;
7850 }
7851
7852 howto = bfd_reloc_type_lookup (abfd, code);
7853
7854 if (areloc->howto->pcrel_offset != howto->pcrel_offset)
7855 {
7856 if (howto->pcrel_offset)
7857 areloc->addend += areloc->address;
7858 else
7859 areloc->addend -= areloc->address; /* addend is unsigned!! */
7860 }
7861 }
7862 else
7863 {
7864 switch (areloc->howto->bitsize)
7865 {
7866 case 8:
7867 code = BFD_RELOC_8;
7868 break;
7869 case 14:
7870 code = BFD_RELOC_14;
7871 break;
7872 case 16:
7873 code = BFD_RELOC_16;
7874 break;
7875 case 26:
7876 code = BFD_RELOC_26;
7877 break;
7878 case 32:
7879 code = BFD_RELOC_32;
7880 break;
7881 case 64:
7882 code = BFD_RELOC_64;
7883 break;
7884 default:
7885 goto fail;
7886 }
7887
7888 howto = bfd_reloc_type_lookup (abfd, code);
7889 }
7890
7891 if (howto)
7892 areloc->howto = howto;
7893 else
7894 goto fail;
7895 }
7896
b34976b6 7897 return TRUE;
252b5132
RH
7898
7899 fail:
7900 (*_bfd_error_handler)
d003868e
AM
7901 (_("%B: unsupported relocation type %s"),
7902 abfd, areloc->howto->name);
252b5132 7903 bfd_set_error (bfd_error_bad_value);
b34976b6 7904 return FALSE;
252b5132
RH
7905}
7906
b34976b6 7907bfd_boolean
217aa764 7908_bfd_elf_close_and_cleanup (bfd *abfd)
252b5132 7909{
d9071b0c
TG
7910 struct elf_obj_tdata *tdata = elf_tdata (abfd);
7911 if (bfd_get_format (abfd) == bfd_object && tdata != NULL)
252b5132 7912 {
c0355132 7913 if (elf_tdata (abfd)->o != NULL && elf_shstrtab (abfd) != NULL)
2b0f7ef9 7914 _bfd_elf_strtab_free (elf_shstrtab (abfd));
d9071b0c 7915 _bfd_dwarf2_cleanup_debug_info (abfd, &tdata->dwarf2_find_line_info);
252b5132
RH
7916 }
7917
7918 return _bfd_generic_close_and_cleanup (abfd);
7919}
7920
7921/* For Rel targets, we encode meaningful data for BFD_RELOC_VTABLE_ENTRY
7922 in the relocation's offset. Thus we cannot allow any sort of sanity
7923 range-checking to interfere. There is nothing else to do in processing
7924 this reloc. */
7925
7926bfd_reloc_status_type
217aa764
AM
7927_bfd_elf_rel_vtable_reloc_fn
7928 (bfd *abfd ATTRIBUTE_UNUSED, arelent *re ATTRIBUTE_UNUSED,
fc0a2244 7929 struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
217aa764
AM
7930 void *data ATTRIBUTE_UNUSED, asection *is ATTRIBUTE_UNUSED,
7931 bfd *obfd ATTRIBUTE_UNUSED, char **errmsg ATTRIBUTE_UNUSED)
252b5132
RH
7932{
7933 return bfd_reloc_ok;
7934}
252b5132
RH
7935\f
7936/* Elf core file support. Much of this only works on native
7937 toolchains, since we rely on knowing the
7938 machine-dependent procfs structure in order to pick
c044fabd 7939 out details about the corefile. */
252b5132
RH
7940
7941#ifdef HAVE_SYS_PROCFS_H
16231b7b
DG
7942/* Needed for new procfs interface on sparc-solaris. */
7943# define _STRUCTURED_PROC 1
252b5132
RH
7944# include <sys/procfs.h>
7945#endif
7946
261b8d08
PA
7947/* Return a PID that identifies a "thread" for threaded cores, or the
7948 PID of the main process for non-threaded cores. */
252b5132
RH
7949
7950static int
217aa764 7951elfcore_make_pid (bfd *abfd)
252b5132 7952{
261b8d08
PA
7953 int pid;
7954
228e534f 7955 pid = elf_tdata (abfd)->core->lwpid;
261b8d08 7956 if (pid == 0)
228e534f 7957 pid = elf_tdata (abfd)->core->pid;
261b8d08
PA
7958
7959 return pid;
252b5132
RH
7960}
7961
252b5132
RH
7962/* If there isn't a section called NAME, make one, using
7963 data from SECT. Note, this function will generate a
7964 reference to NAME, so you shouldn't deallocate or
c044fabd 7965 overwrite it. */
252b5132 7966
b34976b6 7967static bfd_boolean
217aa764 7968elfcore_maybe_make_sect (bfd *abfd, char *name, asection *sect)
252b5132 7969{
c044fabd 7970 asection *sect2;
252b5132
RH
7971
7972 if (bfd_get_section_by_name (abfd, name) != NULL)
b34976b6 7973 return TRUE;
252b5132 7974
117ed4f8 7975 sect2 = bfd_make_section_with_flags (abfd, name, sect->flags);
252b5132 7976 if (sect2 == NULL)
b34976b6 7977 return FALSE;
252b5132 7978
eea6121a 7979 sect2->size = sect->size;
252b5132 7980 sect2->filepos = sect->filepos;
252b5132 7981 sect2->alignment_power = sect->alignment_power;
b34976b6 7982 return TRUE;
252b5132
RH
7983}
7984
bb0082d6
AM
7985/* Create a pseudosection containing SIZE bytes at FILEPOS. This
7986 actually creates up to two pseudosections:
7987 - For the single-threaded case, a section named NAME, unless
7988 such a section already exists.
7989 - For the multi-threaded case, a section named "NAME/PID", where
7990 PID is elfcore_make_pid (abfd).
7991 Both pseudosections have identical contents. */
b34976b6 7992bfd_boolean
217aa764
AM
7993_bfd_elfcore_make_pseudosection (bfd *abfd,
7994 char *name,
7995 size_t size,
7996 ufile_ptr filepos)
bb0082d6
AM
7997{
7998 char buf[100];
7999 char *threaded_name;
d4c88bbb 8000 size_t len;
bb0082d6
AM
8001 asection *sect;
8002
8003 /* Build the section name. */
8004
8005 sprintf (buf, "%s/%d", name, elfcore_make_pid (abfd));
d4c88bbb 8006 len = strlen (buf) + 1;
a50b1753 8007 threaded_name = (char *) bfd_alloc (abfd, len);
bb0082d6 8008 if (threaded_name == NULL)
b34976b6 8009 return FALSE;
d4c88bbb 8010 memcpy (threaded_name, buf, len);
bb0082d6 8011
117ed4f8
AM
8012 sect = bfd_make_section_anyway_with_flags (abfd, threaded_name,
8013 SEC_HAS_CONTENTS);
bb0082d6 8014 if (sect == NULL)
b34976b6 8015 return FALSE;
eea6121a 8016 sect->size = size;
bb0082d6 8017 sect->filepos = filepos;
bb0082d6
AM
8018 sect->alignment_power = 2;
8019
936e320b 8020 return elfcore_maybe_make_sect (abfd, name, sect);
bb0082d6
AM
8021}
8022
252b5132 8023/* prstatus_t exists on:
4a938328 8024 solaris 2.5+
252b5132
RH
8025 linux 2.[01] + glibc
8026 unixware 4.2
8027*/
8028
8029#if defined (HAVE_PRSTATUS_T)
a7b97311 8030
b34976b6 8031static bfd_boolean
217aa764 8032elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 8033{
eea6121a 8034 size_t size;
7ee38065 8035 int offset;
252b5132 8036
4a938328
MS
8037 if (note->descsz == sizeof (prstatus_t))
8038 {
8039 prstatus_t prstat;
252b5132 8040
eea6121a 8041 size = sizeof (prstat.pr_reg);
7ee38065 8042 offset = offsetof (prstatus_t, pr_reg);
4a938328 8043 memcpy (&prstat, note->descdata, sizeof (prstat));
252b5132 8044
fa49d224
NC
8045 /* Do not overwrite the core signal if it
8046 has already been set by another thread. */
228e534f
AM
8047 if (elf_tdata (abfd)->core->signal == 0)
8048 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8049 if (elf_tdata (abfd)->core->pid == 0)
8050 elf_tdata (abfd)->core->pid = prstat.pr_pid;
252b5132 8051
4a938328
MS
8052 /* pr_who exists on:
8053 solaris 2.5+
8054 unixware 4.2
8055 pr_who doesn't exist on:
8056 linux 2.[01]
8057 */
252b5132 8058#if defined (HAVE_PRSTATUS_T_PR_WHO)
228e534f 8059 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 8060#else
228e534f 8061 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
252b5132 8062#endif
4a938328 8063 }
7ee38065 8064#if defined (HAVE_PRSTATUS32_T)
4a938328
MS
8065 else if (note->descsz == sizeof (prstatus32_t))
8066 {
8067 /* 64-bit host, 32-bit corefile */
8068 prstatus32_t prstat;
8069
eea6121a 8070 size = sizeof (prstat.pr_reg);
7ee38065 8071 offset = offsetof (prstatus32_t, pr_reg);
4a938328
MS
8072 memcpy (&prstat, note->descdata, sizeof (prstat));
8073
fa49d224
NC
8074 /* Do not overwrite the core signal if it
8075 has already been set by another thread. */
228e534f
AM
8076 if (elf_tdata (abfd)->core->signal == 0)
8077 elf_tdata (abfd)->core->signal = prstat.pr_cursig;
8078 if (elf_tdata (abfd)->core->pid == 0)
8079 elf_tdata (abfd)->core->pid = prstat.pr_pid;
4a938328
MS
8080
8081 /* pr_who exists on:
8082 solaris 2.5+
8083 unixware 4.2
8084 pr_who doesn't exist on:
8085 linux 2.[01]
8086 */
7ee38065 8087#if defined (HAVE_PRSTATUS32_T_PR_WHO)
228e534f 8088 elf_tdata (abfd)->core->lwpid = prstat.pr_who;
261b8d08 8089#else
228e534f 8090 elf_tdata (abfd)->core->lwpid = prstat.pr_pid;
4a938328
MS
8091#endif
8092 }
7ee38065 8093#endif /* HAVE_PRSTATUS32_T */
4a938328
MS
8094 else
8095 {
8096 /* Fail - we don't know how to handle any other
8097 note size (ie. data object type). */
b34976b6 8098 return TRUE;
4a938328 8099 }
252b5132 8100
bb0082d6 8101 /* Make a ".reg/999" section and a ".reg" section. */
936e320b 8102 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 8103 size, note->descpos + offset);
252b5132
RH
8104}
8105#endif /* defined (HAVE_PRSTATUS_T) */
8106
bb0082d6 8107/* Create a pseudosection containing the exact contents of NOTE. */
b34976b6 8108static bfd_boolean
217aa764
AM
8109elfcore_make_note_pseudosection (bfd *abfd,
8110 char *name,
8111 Elf_Internal_Note *note)
252b5132 8112{
936e320b
AM
8113 return _bfd_elfcore_make_pseudosection (abfd, name,
8114 note->descsz, note->descpos);
252b5132
RH
8115}
8116
ff08c6bb
JB
8117/* There isn't a consistent prfpregset_t across platforms,
8118 but it doesn't matter, because we don't have to pick this
c044fabd
KH
8119 data structure apart. */
8120
b34976b6 8121static bfd_boolean
217aa764 8122elfcore_grok_prfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
8123{
8124 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
8125}
8126
ff08c6bb 8127/* Linux dumps the Intel SSE regs in a note named "LINUX" with a note
971d4640 8128 type of NT_PRXFPREG. Just include the whole note's contents
ff08c6bb 8129 literally. */
c044fabd 8130
b34976b6 8131static bfd_boolean
217aa764 8132elfcore_grok_prxfpreg (bfd *abfd, Elf_Internal_Note *note)
ff08c6bb
JB
8133{
8134 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
8135}
8136
4339cae0
L
8137/* Linux dumps the Intel XSAVE extended state in a note named "LINUX"
8138 with a note type of NT_X86_XSTATE. Just include the whole note's
8139 contents literally. */
8140
8141static bfd_boolean
8142elfcore_grok_xstatereg (bfd *abfd, Elf_Internal_Note *note)
8143{
8144 return elfcore_make_note_pseudosection (abfd, ".reg-xstate", note);
8145}
8146
97753bd5
AM
8147static bfd_boolean
8148elfcore_grok_ppc_vmx (bfd *abfd, Elf_Internal_Note *note)
8149{
8150 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vmx", note);
8151}
8152
89eeb0bc
LM
8153static bfd_boolean
8154elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note)
8155{
8156 return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note);
8157}
97753bd5 8158
0675e188
UW
8159static bfd_boolean
8160elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
8161{
8162 return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
8163}
8164
d7eeb400
MS
8165static bfd_boolean
8166elfcore_grok_s390_timer (bfd *abfd, Elf_Internal_Note *note)
8167{
8168 return elfcore_make_note_pseudosection (abfd, ".reg-s390-timer", note);
8169}
8170
8171static bfd_boolean
8172elfcore_grok_s390_todcmp (bfd *abfd, Elf_Internal_Note *note)
8173{
8174 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todcmp", note);
8175}
8176
8177static bfd_boolean
8178elfcore_grok_s390_todpreg (bfd *abfd, Elf_Internal_Note *note)
8179{
8180 return elfcore_make_note_pseudosection (abfd, ".reg-s390-todpreg", note);
8181}
8182
8183static bfd_boolean
8184elfcore_grok_s390_ctrs (bfd *abfd, Elf_Internal_Note *note)
8185{
8186 return elfcore_make_note_pseudosection (abfd, ".reg-s390-ctrs", note);
8187}
8188
8189static bfd_boolean
8190elfcore_grok_s390_prefix (bfd *abfd, Elf_Internal_Note *note)
8191{
8192 return elfcore_make_note_pseudosection (abfd, ".reg-s390-prefix", note);
8193}
8194
355b81d9
UW
8195static bfd_boolean
8196elfcore_grok_s390_last_break (bfd *abfd, Elf_Internal_Note *note)
8197{
8198 return elfcore_make_note_pseudosection (abfd, ".reg-s390-last-break", note);
8199}
8200
8201static bfd_boolean
8202elfcore_grok_s390_system_call (bfd *abfd, Elf_Internal_Note *note)
8203{
8204 return elfcore_make_note_pseudosection (abfd, ".reg-s390-system-call", note);
8205}
8206
abb3f6cc
NC
8207static bfd_boolean
8208elfcore_grok_s390_tdb (bfd *abfd, Elf_Internal_Note *note)
8209{
8210 return elfcore_make_note_pseudosection (abfd, ".reg-s390-tdb", note);
8211}
8212
faa9a424
UW
8213static bfd_boolean
8214elfcore_grok_arm_vfp (bfd *abfd, Elf_Internal_Note *note)
8215{
8216 return elfcore_make_note_pseudosection (abfd, ".reg-arm-vfp", note);
8217}
8218
652451f8
YZ
8219static bfd_boolean
8220elfcore_grok_aarch_tls (bfd *abfd, Elf_Internal_Note *note)
8221{
8222 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-tls", note);
8223}
8224
8225static bfd_boolean
8226elfcore_grok_aarch_hw_break (bfd *abfd, Elf_Internal_Note *note)
8227{
8228 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-break", note);
8229}
8230
8231static bfd_boolean
8232elfcore_grok_aarch_hw_watch (bfd *abfd, Elf_Internal_Note *note)
8233{
8234 return elfcore_make_note_pseudosection (abfd, ".reg-aarch-hw-watch", note);
8235}
8236
252b5132 8237#if defined (HAVE_PRPSINFO_T)
4a938328 8238typedef prpsinfo_t elfcore_psinfo_t;
7ee38065 8239#if defined (HAVE_PRPSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
8240typedef prpsinfo32_t elfcore_psinfo32_t;
8241#endif
252b5132
RH
8242#endif
8243
8244#if defined (HAVE_PSINFO_T)
4a938328 8245typedef psinfo_t elfcore_psinfo_t;
7ee38065 8246#if defined (HAVE_PSINFO32_T) /* Sparc64 cross Sparc32 */
4a938328
MS
8247typedef psinfo32_t elfcore_psinfo32_t;
8248#endif
252b5132
RH
8249#endif
8250
252b5132
RH
8251/* return a malloc'ed copy of a string at START which is at
8252 most MAX bytes long, possibly without a terminating '\0'.
c044fabd 8253 the copy will always have a terminating '\0'. */
252b5132 8254
936e320b 8255char *
217aa764 8256_bfd_elfcore_strndup (bfd *abfd, char *start, size_t max)
252b5132 8257{
dc810e39 8258 char *dups;
a50b1753 8259 char *end = (char *) memchr (start, '\0', max);
dc810e39 8260 size_t len;
252b5132
RH
8261
8262 if (end == NULL)
8263 len = max;
8264 else
8265 len = end - start;
8266
a50b1753 8267 dups = (char *) bfd_alloc (abfd, len + 1);
dc810e39 8268 if (dups == NULL)
252b5132
RH
8269 return NULL;
8270
dc810e39
AM
8271 memcpy (dups, start, len);
8272 dups[len] = '\0';
252b5132 8273
dc810e39 8274 return dups;
252b5132
RH
8275}
8276
bb0082d6 8277#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
b34976b6 8278static bfd_boolean
217aa764 8279elfcore_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
252b5132 8280{
4a938328
MS
8281 if (note->descsz == sizeof (elfcore_psinfo_t))
8282 {
8283 elfcore_psinfo_t psinfo;
252b5132 8284
7ee38065 8285 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 8286
335e41d4 8287#if defined (HAVE_PSINFO_T_PR_PID) || defined (HAVE_PRPSINFO_T_PR_PID)
228e534f 8288 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 8289#endif
228e534f 8290 elf_tdata (abfd)->core->program
936e320b
AM
8291 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
8292 sizeof (psinfo.pr_fname));
252b5132 8293
228e534f 8294 elf_tdata (abfd)->core->command
936e320b
AM
8295 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
8296 sizeof (psinfo.pr_psargs));
4a938328 8297 }
7ee38065 8298#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
4a938328
MS
8299 else if (note->descsz == sizeof (elfcore_psinfo32_t))
8300 {
8301 /* 64-bit host, 32-bit corefile */
8302 elfcore_psinfo32_t psinfo;
8303
7ee38065 8304 memcpy (&psinfo, note->descdata, sizeof (psinfo));
252b5132 8305
335e41d4 8306#if defined (HAVE_PSINFO32_T_PR_PID) || defined (HAVE_PRPSINFO32_T_PR_PID)
228e534f 8307 elf_tdata (abfd)->core->pid = psinfo.pr_pid;
335e41d4 8308#endif
228e534f 8309 elf_tdata (abfd)->core->program
936e320b
AM
8310 = _bfd_elfcore_strndup (abfd, psinfo.pr_fname,
8311 sizeof (psinfo.pr_fname));
4a938328 8312
228e534f 8313 elf_tdata (abfd)->core->command
936e320b
AM
8314 = _bfd_elfcore_strndup (abfd, psinfo.pr_psargs,
8315 sizeof (psinfo.pr_psargs));
4a938328
MS
8316 }
8317#endif
8318
8319 else
8320 {
8321 /* Fail - we don't know how to handle any other
8322 note size (ie. data object type). */
b34976b6 8323 return TRUE;
4a938328 8324 }
252b5132
RH
8325
8326 /* Note that for some reason, a spurious space is tacked
8327 onto the end of the args in some (at least one anyway)
c044fabd 8328 implementations, so strip it off if it exists. */
252b5132
RH
8329
8330 {
228e534f 8331 char *command = elf_tdata (abfd)->core->command;
252b5132
RH
8332 int n = strlen (command);
8333
8334 if (0 < n && command[n - 1] == ' ')
8335 command[n - 1] = '\0';
8336 }
8337
b34976b6 8338 return TRUE;
252b5132
RH
8339}
8340#endif /* defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T) */
8341
252b5132 8342#if defined (HAVE_PSTATUS_T)
b34976b6 8343static bfd_boolean
217aa764 8344elfcore_grok_pstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 8345{
f572a39d
AM
8346 if (note->descsz == sizeof (pstatus_t)
8347#if defined (HAVE_PXSTATUS_T)
8348 || note->descsz == sizeof (pxstatus_t)
8349#endif
8350 )
4a938328
MS
8351 {
8352 pstatus_t pstat;
252b5132 8353
4a938328 8354 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 8355
228e534f 8356 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328 8357 }
7ee38065 8358#if defined (HAVE_PSTATUS32_T)
4a938328
MS
8359 else if (note->descsz == sizeof (pstatus32_t))
8360 {
8361 /* 64-bit host, 32-bit corefile */
8362 pstatus32_t pstat;
252b5132 8363
4a938328 8364 memcpy (&pstat, note->descdata, sizeof (pstat));
252b5132 8365
228e534f 8366 elf_tdata (abfd)->core->pid = pstat.pr_pid;
4a938328
MS
8367 }
8368#endif
252b5132
RH
8369 /* Could grab some more details from the "representative"
8370 lwpstatus_t in pstat.pr_lwp, but we'll catch it all in an
c044fabd 8371 NT_LWPSTATUS note, presumably. */
252b5132 8372
b34976b6 8373 return TRUE;
252b5132
RH
8374}
8375#endif /* defined (HAVE_PSTATUS_T) */
8376
252b5132 8377#if defined (HAVE_LWPSTATUS_T)
b34976b6 8378static bfd_boolean
217aa764 8379elfcore_grok_lwpstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132
RH
8380{
8381 lwpstatus_t lwpstat;
8382 char buf[100];
c044fabd 8383 char *name;
d4c88bbb 8384 size_t len;
c044fabd 8385 asection *sect;
252b5132 8386
f572a39d
AM
8387 if (note->descsz != sizeof (lwpstat)
8388#if defined (HAVE_LWPXSTATUS_T)
8389 && note->descsz != sizeof (lwpxstatus_t)
8390#endif
8391 )
b34976b6 8392 return TRUE;
252b5132
RH
8393
8394 memcpy (&lwpstat, note->descdata, sizeof (lwpstat));
8395
228e534f 8396 elf_tdata (abfd)->core->lwpid = lwpstat.pr_lwpid;
a1504221
JB
8397 /* Do not overwrite the core signal if it has already been set by
8398 another thread. */
228e534f
AM
8399 if (elf_tdata (abfd)->core->signal == 0)
8400 elf_tdata (abfd)->core->signal = lwpstat.pr_cursig;
252b5132 8401
c044fabd 8402 /* Make a ".reg/999" section. */
252b5132
RH
8403
8404 sprintf (buf, ".reg/%d", elfcore_make_pid (abfd));
d4c88bbb 8405 len = strlen (buf) + 1;
217aa764 8406 name = bfd_alloc (abfd, len);
252b5132 8407 if (name == NULL)
b34976b6 8408 return FALSE;
d4c88bbb 8409 memcpy (name, buf, len);
252b5132 8410
117ed4f8 8411 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 8412 if (sect == NULL)
b34976b6 8413 return FALSE;
252b5132
RH
8414
8415#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 8416 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.gregs);
252b5132
RH
8417 sect->filepos = note->descpos
8418 + offsetof (lwpstatus_t, pr_context.uc_mcontext.gregs);
8419#endif
8420
8421#if defined (HAVE_LWPSTATUS_T_PR_REG)
eea6121a 8422 sect->size = sizeof (lwpstat.pr_reg);
252b5132
RH
8423 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_reg);
8424#endif
8425
252b5132
RH
8426 sect->alignment_power = 2;
8427
8428 if (!elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 8429 return FALSE;
252b5132
RH
8430
8431 /* Make a ".reg2/999" section */
8432
8433 sprintf (buf, ".reg2/%d", elfcore_make_pid (abfd));
d4c88bbb 8434 len = strlen (buf) + 1;
217aa764 8435 name = bfd_alloc (abfd, len);
252b5132 8436 if (name == NULL)
b34976b6 8437 return FALSE;
d4c88bbb 8438 memcpy (name, buf, len);
252b5132 8439
117ed4f8 8440 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
252b5132 8441 if (sect == NULL)
b34976b6 8442 return FALSE;
252b5132
RH
8443
8444#if defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
eea6121a 8445 sect->size = sizeof (lwpstat.pr_context.uc_mcontext.fpregs);
252b5132
RH
8446 sect->filepos = note->descpos
8447 + offsetof (lwpstatus_t, pr_context.uc_mcontext.fpregs);
8448#endif
8449
8450#if defined (HAVE_LWPSTATUS_T_PR_FPREG)
eea6121a 8451 sect->size = sizeof (lwpstat.pr_fpreg);
252b5132
RH
8452 sect->filepos = note->descpos + offsetof (lwpstatus_t, pr_fpreg);
8453#endif
8454
252b5132
RH
8455 sect->alignment_power = 2;
8456
936e320b 8457 return elfcore_maybe_make_sect (abfd, ".reg2", sect);
252b5132
RH
8458}
8459#endif /* defined (HAVE_LWPSTATUS_T) */
8460
b34976b6 8461static bfd_boolean
217aa764 8462elfcore_grok_win32pstatus (bfd *abfd, Elf_Internal_Note *note)
16e9c715
NC
8463{
8464 char buf[30];
c044fabd 8465 char *name;
d4c88bbb 8466 size_t len;
c044fabd 8467 asection *sect;
4a6636fb
PA
8468 int type;
8469 int is_active_thread;
8470 bfd_vma base_addr;
16e9c715 8471
4a6636fb 8472 if (note->descsz < 728)
b34976b6 8473 return TRUE;
16e9c715 8474
4a6636fb
PA
8475 if (! CONST_STRNEQ (note->namedata, "win32"))
8476 return TRUE;
8477
8478 type = bfd_get_32 (abfd, note->descdata);
c044fabd 8479
4a6636fb 8480 switch (type)
16e9c715 8481 {
4a6636fb 8482 case 1 /* NOTE_INFO_PROCESS */:
228e534f 8483 /* FIXME: need to add ->core->command. */
4a6636fb 8484 /* process_info.pid */
228e534f 8485 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 8);
4a6636fb 8486 /* process_info.signal */
228e534f 8487 elf_tdata (abfd)->core->signal = bfd_get_32 (abfd, note->descdata + 12);
c044fabd 8488 break;
16e9c715 8489
4a6636fb 8490 case 2 /* NOTE_INFO_THREAD */:
16e9c715 8491 /* Make a ".reg/999" section. */
4a6636fb
PA
8492 /* thread_info.tid */
8493 sprintf (buf, ".reg/%ld", (long) bfd_get_32 (abfd, note->descdata + 8));
c044fabd 8494
d4c88bbb 8495 len = strlen (buf) + 1;
a50b1753 8496 name = (char *) bfd_alloc (abfd, len);
16e9c715 8497 if (name == NULL)
b34976b6 8498 return FALSE;
c044fabd 8499
d4c88bbb 8500 memcpy (name, buf, len);
16e9c715 8501
117ed4f8 8502 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
16e9c715 8503 if (sect == NULL)
b34976b6 8504 return FALSE;
c044fabd 8505
4a6636fb
PA
8506 /* sizeof (thread_info.thread_context) */
8507 sect->size = 716;
8508 /* offsetof (thread_info.thread_context) */
8509 sect->filepos = note->descpos + 12;
16e9c715
NC
8510 sect->alignment_power = 2;
8511
4a6636fb
PA
8512 /* thread_info.is_active_thread */
8513 is_active_thread = bfd_get_32 (abfd, note->descdata + 8);
8514
8515 if (is_active_thread)
16e9c715 8516 if (! elfcore_maybe_make_sect (abfd, ".reg", sect))
b34976b6 8517 return FALSE;
16e9c715
NC
8518 break;
8519
4a6636fb 8520 case 3 /* NOTE_INFO_MODULE */:
16e9c715 8521 /* Make a ".module/xxxxxxxx" section. */
4a6636fb
PA
8522 /* module_info.base_address */
8523 base_addr = bfd_get_32 (abfd, note->descdata + 4);
0af1713e 8524 sprintf (buf, ".module/%08lx", (unsigned long) base_addr);
c044fabd 8525
d4c88bbb 8526 len = strlen (buf) + 1;
a50b1753 8527 name = (char *) bfd_alloc (abfd, len);
16e9c715 8528 if (name == NULL)
b34976b6 8529 return FALSE;
c044fabd 8530
d4c88bbb 8531 memcpy (name, buf, len);
252b5132 8532
117ed4f8 8533 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
c044fabd 8534
16e9c715 8535 if (sect == NULL)
b34976b6 8536 return FALSE;
c044fabd 8537
eea6121a 8538 sect->size = note->descsz;
16e9c715 8539 sect->filepos = note->descpos;
16e9c715
NC
8540 sect->alignment_power = 2;
8541 break;
8542
8543 default:
b34976b6 8544 return TRUE;
16e9c715
NC
8545 }
8546
b34976b6 8547 return TRUE;
16e9c715 8548}
252b5132 8549
b34976b6 8550static bfd_boolean
217aa764 8551elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
252b5132 8552{
9c5bfbb7 8553 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
bb0082d6 8554
252b5132
RH
8555 switch (note->type)
8556 {
8557 default:
b34976b6 8558 return TRUE;
252b5132 8559
252b5132 8560 case NT_PRSTATUS:
bb0082d6
AM
8561 if (bed->elf_backend_grok_prstatus)
8562 if ((*bed->elf_backend_grok_prstatus) (abfd, note))
b34976b6 8563 return TRUE;
bb0082d6 8564#if defined (HAVE_PRSTATUS_T)
252b5132 8565 return elfcore_grok_prstatus (abfd, note);
bb0082d6 8566#else
b34976b6 8567 return TRUE;
252b5132
RH
8568#endif
8569
8570#if defined (HAVE_PSTATUS_T)
8571 case NT_PSTATUS:
8572 return elfcore_grok_pstatus (abfd, note);
8573#endif
8574
8575#if defined (HAVE_LWPSTATUS_T)
8576 case NT_LWPSTATUS:
8577 return elfcore_grok_lwpstatus (abfd, note);
8578#endif
8579
8580 case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */
8581 return elfcore_grok_prfpreg (abfd, note);
8582
c044fabd 8583 case NT_WIN32PSTATUS:
16e9c715 8584 return elfcore_grok_win32pstatus (abfd, note);
16e9c715 8585
c044fabd 8586 case NT_PRXFPREG: /* Linux SSE extension */
e377ab71
MK
8587 if (note->namesz == 6
8588 && strcmp (note->namedata, "LINUX") == 0)
ff08c6bb
JB
8589 return elfcore_grok_prxfpreg (abfd, note);
8590 else
b34976b6 8591 return TRUE;
ff08c6bb 8592
4339cae0
L
8593 case NT_X86_XSTATE: /* Linux XSAVE extension */
8594 if (note->namesz == 6
8595 && strcmp (note->namedata, "LINUX") == 0)
8596 return elfcore_grok_xstatereg (abfd, note);
8597 else
8598 return TRUE;
8599
97753bd5
AM
8600 case NT_PPC_VMX:
8601 if (note->namesz == 6
8602 && strcmp (note->namedata, "LINUX") == 0)
8603 return elfcore_grok_ppc_vmx (abfd, note);
8604 else
8605 return TRUE;
8606
89eeb0bc
LM
8607 case NT_PPC_VSX:
8608 if (note->namesz == 6
8609 && strcmp (note->namedata, "LINUX") == 0)
8610 return elfcore_grok_ppc_vsx (abfd, note);
8611 else
8612 return TRUE;
8613
0675e188
UW
8614 case NT_S390_HIGH_GPRS:
8615 if (note->namesz == 6
8616 && strcmp (note->namedata, "LINUX") == 0)
8617 return elfcore_grok_s390_high_gprs (abfd, note);
8618 else
8619 return TRUE;
8620
d7eeb400
MS
8621 case NT_S390_TIMER:
8622 if (note->namesz == 6
8623 && strcmp (note->namedata, "LINUX") == 0)
8624 return elfcore_grok_s390_timer (abfd, note);
8625 else
8626 return TRUE;
8627
8628 case NT_S390_TODCMP:
8629 if (note->namesz == 6
8630 && strcmp (note->namedata, "LINUX") == 0)
8631 return elfcore_grok_s390_todcmp (abfd, note);
8632 else
8633 return TRUE;
8634
8635 case NT_S390_TODPREG:
8636 if (note->namesz == 6
8637 && strcmp (note->namedata, "LINUX") == 0)
8638 return elfcore_grok_s390_todpreg (abfd, note);
8639 else
8640 return TRUE;
8641
8642 case NT_S390_CTRS:
8643 if (note->namesz == 6
8644 && strcmp (note->namedata, "LINUX") == 0)
8645 return elfcore_grok_s390_ctrs (abfd, note);
8646 else
8647 return TRUE;
8648
8649 case NT_S390_PREFIX:
8650 if (note->namesz == 6
8651 && strcmp (note->namedata, "LINUX") == 0)
8652 return elfcore_grok_s390_prefix (abfd, note);
8653 else
8654 return TRUE;
8655
355b81d9
UW
8656 case NT_S390_LAST_BREAK:
8657 if (note->namesz == 6
8658 && strcmp (note->namedata, "LINUX") == 0)
8659 return elfcore_grok_s390_last_break (abfd, note);
8660 else
8661 return TRUE;
8662
8663 case NT_S390_SYSTEM_CALL:
8664 if (note->namesz == 6
8665 && strcmp (note->namedata, "LINUX") == 0)
8666 return elfcore_grok_s390_system_call (abfd, note);
8667 else
8668 return TRUE;
8669
abb3f6cc
NC
8670 case NT_S390_TDB:
8671 if (note->namesz == 6
8672 && strcmp (note->namedata, "LINUX") == 0)
8673 return elfcore_grok_s390_tdb (abfd, note);
8674 else
8675 return TRUE;
8676
faa9a424
UW
8677 case NT_ARM_VFP:
8678 if (note->namesz == 6
8679 && strcmp (note->namedata, "LINUX") == 0)
8680 return elfcore_grok_arm_vfp (abfd, note);
8681 else
8682 return TRUE;
8683
652451f8
YZ
8684 case NT_ARM_TLS:
8685 if (note->namesz == 6
8686 && strcmp (note->namedata, "LINUX") == 0)
8687 return elfcore_grok_aarch_tls (abfd, note);
8688 else
8689 return TRUE;
8690
8691 case NT_ARM_HW_BREAK:
8692 if (note->namesz == 6
8693 && strcmp (note->namedata, "LINUX") == 0)
8694 return elfcore_grok_aarch_hw_break (abfd, note);
8695 else
8696 return TRUE;
8697
8698 case NT_ARM_HW_WATCH:
8699 if (note->namesz == 6
8700 && strcmp (note->namedata, "LINUX") == 0)
8701 return elfcore_grok_aarch_hw_watch (abfd, note);
8702 else
8703 return TRUE;
8704
252b5132
RH
8705 case NT_PRPSINFO:
8706 case NT_PSINFO:
bb0082d6
AM
8707 if (bed->elf_backend_grok_psinfo)
8708 if ((*bed->elf_backend_grok_psinfo) (abfd, note))
b34976b6 8709 return TRUE;
bb0082d6 8710#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
252b5132 8711 return elfcore_grok_psinfo (abfd, note);
bb0082d6 8712#else
b34976b6 8713 return TRUE;
252b5132 8714#endif
3333a7c3
RM
8715
8716 case NT_AUXV:
8717 {
117ed4f8
AM
8718 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
8719 SEC_HAS_CONTENTS);
3333a7c3
RM
8720
8721 if (sect == NULL)
8722 return FALSE;
eea6121a 8723 sect->size = note->descsz;
3333a7c3 8724 sect->filepos = note->descpos;
3333a7c3
RM
8725 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
8726
8727 return TRUE;
8728 }
9015683b 8729
451b7c33
TT
8730 case NT_FILE:
8731 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.file",
8732 note);
8733
9015683b
TT
8734 case NT_SIGINFO:
8735 return elfcore_make_note_pseudosection (abfd, ".note.linuxcore.siginfo",
8736 note);
252b5132
RH
8737 }
8738}
8739
718175fa
JK
8740static bfd_boolean
8741elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note)
8742{
30e8ee25
AM
8743 struct elf_obj_tdata *t;
8744
8745 if (note->descsz == 0)
8746 return FALSE;
8747
8748 t = elf_tdata (abfd);
c0355132 8749 t->build_id = bfd_alloc (abfd, sizeof (*t->build_id) - 1 + note->descsz);
30e8ee25 8750 if (t->build_id == NULL)
718175fa
JK
8751 return FALSE;
8752
c0355132
AM
8753 t->build_id->size = note->descsz;
8754 memcpy (t->build_id->data, note->descdata, note->descsz);
718175fa
JK
8755
8756 return TRUE;
8757}
8758
8759static bfd_boolean
8760elfobj_grok_gnu_note (bfd *abfd, Elf_Internal_Note *note)
8761{
8762 switch (note->type)
8763 {
8764 default:
8765 return TRUE;
8766
8767 case NT_GNU_BUILD_ID:
8768 return elfobj_grok_gnu_build_id (abfd, note);
8769 }
8770}
8771
e21e5835
NC
8772static bfd_boolean
8773elfobj_grok_stapsdt_note_1 (bfd *abfd, Elf_Internal_Note *note)
8774{
8775 struct sdt_note *cur =
8776 (struct sdt_note *) bfd_alloc (abfd, sizeof (struct sdt_note)
8777 + note->descsz);
8778
8779 cur->next = (struct sdt_note *) (elf_tdata (abfd))->sdt_note_head;
8780 cur->size = (bfd_size_type) note->descsz;
8781 memcpy (cur->data, note->descdata, note->descsz);
8782
8783 elf_tdata (abfd)->sdt_note_head = cur;
8784
8785 return TRUE;
8786}
8787
8788static bfd_boolean
8789elfobj_grok_stapsdt_note (bfd *abfd, Elf_Internal_Note *note)
8790{
8791 switch (note->type)
8792 {
8793 case NT_STAPSDT:
8794 return elfobj_grok_stapsdt_note_1 (abfd, note);
8795
8796 default:
8797 return TRUE;
8798 }
8799}
8800
b34976b6 8801static bfd_boolean
217aa764 8802elfcore_netbsd_get_lwpid (Elf_Internal_Note *note, int *lwpidp)
50b2bdb7
AM
8803{
8804 char *cp;
8805
8806 cp = strchr (note->namedata, '@');
8807 if (cp != NULL)
8808 {
d2b64500 8809 *lwpidp = atoi(cp + 1);
b34976b6 8810 return TRUE;
50b2bdb7 8811 }
b34976b6 8812 return FALSE;
50b2bdb7
AM
8813}
8814
b34976b6 8815static bfd_boolean
217aa764 8816elfcore_grok_netbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7 8817{
50b2bdb7 8818 /* Signal number at offset 0x08. */
228e534f 8819 elf_tdata (abfd)->core->signal
50b2bdb7
AM
8820 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
8821
8822 /* Process ID at offset 0x50. */
228e534f 8823 elf_tdata (abfd)->core->pid
50b2bdb7
AM
8824 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x50);
8825
8826 /* Command name at 0x7c (max 32 bytes, including nul). */
228e534f 8827 elf_tdata (abfd)->core->command
50b2bdb7
AM
8828 = _bfd_elfcore_strndup (abfd, note->descdata + 0x7c, 31);
8829
7720ba9f
MK
8830 return elfcore_make_note_pseudosection (abfd, ".note.netbsdcore.procinfo",
8831 note);
50b2bdb7
AM
8832}
8833
b34976b6 8834static bfd_boolean
217aa764 8835elfcore_grok_netbsd_note (bfd *abfd, Elf_Internal_Note *note)
50b2bdb7
AM
8836{
8837 int lwp;
8838
8839 if (elfcore_netbsd_get_lwpid (note, &lwp))
228e534f 8840 elf_tdata (abfd)->core->lwpid = lwp;
50b2bdb7 8841
b4db1224 8842 if (note->type == NT_NETBSDCORE_PROCINFO)
50b2bdb7
AM
8843 {
8844 /* NetBSD-specific core "procinfo". Note that we expect to
08a40648
AM
8845 find this note before any of the others, which is fine,
8846 since the kernel writes this note out first when it
8847 creates a core file. */
47d9a591 8848
50b2bdb7
AM
8849 return elfcore_grok_netbsd_procinfo (abfd, note);
8850 }
8851
b4db1224
JT
8852 /* As of Jan 2002 there are no other machine-independent notes
8853 defined for NetBSD core files. If the note type is less
8854 than the start of the machine-dependent note types, we don't
8855 understand it. */
47d9a591 8856
b4db1224 8857 if (note->type < NT_NETBSDCORE_FIRSTMACH)
b34976b6 8858 return TRUE;
50b2bdb7
AM
8859
8860
8861 switch (bfd_get_arch (abfd))
8862 {
08a40648
AM
8863 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0 and
8864 PT_GETFPREGS == mach+2. */
50b2bdb7
AM
8865
8866 case bfd_arch_alpha:
8867 case bfd_arch_sparc:
8868 switch (note->type)
08a40648
AM
8869 {
8870 case NT_NETBSDCORE_FIRSTMACH+0:
8871 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 8872
08a40648
AM
8873 case NT_NETBSDCORE_FIRSTMACH+2:
8874 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 8875
08a40648
AM
8876 default:
8877 return TRUE;
8878 }
50b2bdb7 8879
08a40648
AM
8880 /* On all other arch's, PT_GETREGS == mach+1 and
8881 PT_GETFPREGS == mach+3. */
50b2bdb7
AM
8882
8883 default:
8884 switch (note->type)
08a40648
AM
8885 {
8886 case NT_NETBSDCORE_FIRSTMACH+1:
8887 return elfcore_make_note_pseudosection (abfd, ".reg", note);
50b2bdb7 8888
08a40648
AM
8889 case NT_NETBSDCORE_FIRSTMACH+3:
8890 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
50b2bdb7 8891
08a40648
AM
8892 default:
8893 return TRUE;
8894 }
50b2bdb7
AM
8895 }
8896 /* NOTREACHED */
8897}
8898
67cc5033
MK
8899static bfd_boolean
8900elfcore_grok_openbsd_procinfo (bfd *abfd, Elf_Internal_Note *note)
8901{
8902 /* Signal number at offset 0x08. */
228e534f 8903 elf_tdata (abfd)->core->signal
67cc5033
MK
8904 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x08);
8905
8906 /* Process ID at offset 0x20. */
228e534f 8907 elf_tdata (abfd)->core->pid
67cc5033
MK
8908 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + 0x20);
8909
8910 /* Command name at 0x48 (max 32 bytes, including nul). */
228e534f 8911 elf_tdata (abfd)->core->command
67cc5033
MK
8912 = _bfd_elfcore_strndup (abfd, note->descdata + 0x48, 31);
8913
8914 return TRUE;
8915}
8916
8917static bfd_boolean
8918elfcore_grok_openbsd_note (bfd *abfd, Elf_Internal_Note *note)
8919{
8920 if (note->type == NT_OPENBSD_PROCINFO)
8921 return elfcore_grok_openbsd_procinfo (abfd, note);
8922
8923 if (note->type == NT_OPENBSD_REGS)
8924 return elfcore_make_note_pseudosection (abfd, ".reg", note);
8925
8926 if (note->type == NT_OPENBSD_FPREGS)
8927 return elfcore_make_note_pseudosection (abfd, ".reg2", note);
8928
8929 if (note->type == NT_OPENBSD_XFPREGS)
8930 return elfcore_make_note_pseudosection (abfd, ".reg-xfp", note);
8931
8932 if (note->type == NT_OPENBSD_AUXV)
8933 {
8934 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".auxv",
8935 SEC_HAS_CONTENTS);
8936
8937 if (sect == NULL)
8938 return FALSE;
8939 sect->size = note->descsz;
8940 sect->filepos = note->descpos;
8941 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
8942
8943 return TRUE;
8944 }
8945
8946 if (note->type == NT_OPENBSD_WCOOKIE)
8947 {
8948 asection *sect = bfd_make_section_anyway_with_flags (abfd, ".wcookie",
8949 SEC_HAS_CONTENTS);
8950
8951 if (sect == NULL)
8952 return FALSE;
8953 sect->size = note->descsz;
8954 sect->filepos = note->descpos;
8955 sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32;
8956
8957 return TRUE;
8958 }
8959
8960 return TRUE;
8961}
8962
07c6e936 8963static bfd_boolean
d3fd4074 8964elfcore_grok_nto_status (bfd *abfd, Elf_Internal_Note *note, long *tid)
07c6e936
NC
8965{
8966 void *ddata = note->descdata;
8967 char buf[100];
8968 char *name;
8969 asection *sect;
f8843e87
AM
8970 short sig;
8971 unsigned flags;
07c6e936
NC
8972
8973 /* nto_procfs_status 'pid' field is at offset 0. */
228e534f 8974 elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, (bfd_byte *) ddata);
07c6e936 8975
f8843e87
AM
8976 /* nto_procfs_status 'tid' field is at offset 4. Pass it back. */
8977 *tid = bfd_get_32 (abfd, (bfd_byte *) ddata + 4);
8978
8979 /* nto_procfs_status 'flags' field is at offset 8. */
8980 flags = bfd_get_32 (abfd, (bfd_byte *) ddata + 8);
07c6e936
NC
8981
8982 /* nto_procfs_status 'what' field is at offset 14. */
f8843e87
AM
8983 if ((sig = bfd_get_16 (abfd, (bfd_byte *) ddata + 14)) > 0)
8984 {
228e534f
AM
8985 elf_tdata (abfd)->core->signal = sig;
8986 elf_tdata (abfd)->core->lwpid = *tid;
f8843e87 8987 }
07c6e936 8988
f8843e87
AM
8989 /* _DEBUG_FLAG_CURTID (current thread) is 0x80. Some cores
8990 do not come from signals so we make sure we set the current
8991 thread just in case. */
8992 if (flags & 0x00000080)
228e534f 8993 elf_tdata (abfd)->core->lwpid = *tid;
07c6e936
NC
8994
8995 /* Make a ".qnx_core_status/%d" section. */
d3fd4074 8996 sprintf (buf, ".qnx_core_status/%ld", *tid);
07c6e936 8997
a50b1753 8998 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
8999 if (name == NULL)
9000 return FALSE;
9001 strcpy (name, buf);
9002
117ed4f8 9003 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
9004 if (sect == NULL)
9005 return FALSE;
9006
eea6121a 9007 sect->size = note->descsz;
07c6e936 9008 sect->filepos = note->descpos;
07c6e936
NC
9009 sect->alignment_power = 2;
9010
9011 return (elfcore_maybe_make_sect (abfd, ".qnx_core_status", sect));
9012}
9013
9014static bfd_boolean
d69f560c
KW
9015elfcore_grok_nto_regs (bfd *abfd,
9016 Elf_Internal_Note *note,
d3fd4074 9017 long tid,
d69f560c 9018 char *base)
07c6e936
NC
9019{
9020 char buf[100];
9021 char *name;
9022 asection *sect;
9023
d69f560c 9024 /* Make a "(base)/%d" section. */
d3fd4074 9025 sprintf (buf, "%s/%ld", base, tid);
07c6e936 9026
a50b1753 9027 name = (char *) bfd_alloc (abfd, strlen (buf) + 1);
07c6e936
NC
9028 if (name == NULL)
9029 return FALSE;
9030 strcpy (name, buf);
9031
117ed4f8 9032 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
07c6e936
NC
9033 if (sect == NULL)
9034 return FALSE;
9035
eea6121a 9036 sect->size = note->descsz;
07c6e936 9037 sect->filepos = note->descpos;
07c6e936
NC
9038 sect->alignment_power = 2;
9039
f8843e87 9040 /* This is the current thread. */
228e534f 9041 if (elf_tdata (abfd)->core->lwpid == tid)
d69f560c 9042 return elfcore_maybe_make_sect (abfd, base, sect);
f8843e87
AM
9043
9044 return TRUE;
07c6e936
NC
9045}
9046
9047#define BFD_QNT_CORE_INFO 7
9048#define BFD_QNT_CORE_STATUS 8
9049#define BFD_QNT_CORE_GREG 9
9050#define BFD_QNT_CORE_FPREG 10
9051
9052static bfd_boolean
217aa764 9053elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
07c6e936
NC
9054{
9055 /* Every GREG section has a STATUS section before it. Store the
811072d8 9056 tid from the previous call to pass down to the next gregs
07c6e936 9057 function. */
d3fd4074 9058 static long tid = 1;
07c6e936
NC
9059
9060 switch (note->type)
9061 {
d69f560c
KW
9062 case BFD_QNT_CORE_INFO:
9063 return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
9064 case BFD_QNT_CORE_STATUS:
9065 return elfcore_grok_nto_status (abfd, note, &tid);
9066 case BFD_QNT_CORE_GREG:
9067 return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
9068 case BFD_QNT_CORE_FPREG:
9069 return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
9070 default:
9071 return TRUE;
07c6e936
NC
9072 }
9073}
9074
b15fa79e
AM
9075static bfd_boolean
9076elfcore_grok_spu_note (bfd *abfd, Elf_Internal_Note *note)
9077{
9078 char *name;
9079 asection *sect;
9080 size_t len;
9081
9082 /* Use note name as section name. */
9083 len = note->namesz;
a50b1753 9084 name = (char *) bfd_alloc (abfd, len);
b15fa79e
AM
9085 if (name == NULL)
9086 return FALSE;
9087 memcpy (name, note->namedata, len);
9088 name[len - 1] = '\0';
9089
9090 sect = bfd_make_section_anyway_with_flags (abfd, name, SEC_HAS_CONTENTS);
9091 if (sect == NULL)
9092 return FALSE;
9093
9094 sect->size = note->descsz;
9095 sect->filepos = note->descpos;
9096 sect->alignment_power = 1;
9097
9098 return TRUE;
9099}
9100
7c76fa91
MS
9101/* Function: elfcore_write_note
9102
47d9a591 9103 Inputs:
a39f3346 9104 buffer to hold note, and current size of buffer
7c76fa91
MS
9105 name of note
9106 type of note
9107 data for note
9108 size of data for note
9109
a39f3346
AM
9110 Writes note to end of buffer. ELF64 notes are written exactly as
9111 for ELF32, despite the current (as of 2006) ELF gabi specifying
9112 that they ought to have 8-byte namesz and descsz field, and have
9113 8-byte alignment. Other writers, eg. Linux kernel, do the same.
9114
7c76fa91 9115 Return:
a39f3346 9116 Pointer to realloc'd buffer, *BUFSIZ updated. */
7c76fa91
MS
9117
9118char *
a39f3346 9119elfcore_write_note (bfd *abfd,
217aa764 9120 char *buf,
a39f3346 9121 int *bufsiz,
217aa764 9122 const char *name,
a39f3346 9123 int type,
217aa764 9124 const void *input,
a39f3346 9125 int size)
7c76fa91
MS
9126{
9127 Elf_External_Note *xnp;
d4c88bbb 9128 size_t namesz;
d4c88bbb 9129 size_t newspace;
a39f3346 9130 char *dest;
7c76fa91 9131
d4c88bbb 9132 namesz = 0;
d4c88bbb 9133 if (name != NULL)
a39f3346 9134 namesz = strlen (name) + 1;
d4c88bbb 9135
a39f3346 9136 newspace = 12 + ((namesz + 3) & -4) + ((size + 3) & -4);
d4c88bbb 9137
a50b1753 9138 buf = (char *) realloc (buf, *bufsiz + newspace);
14b1c01e
AM
9139 if (buf == NULL)
9140 return buf;
a39f3346 9141 dest = buf + *bufsiz;
7c76fa91
MS
9142 *bufsiz += newspace;
9143 xnp = (Elf_External_Note *) dest;
9144 H_PUT_32 (abfd, namesz, xnp->namesz);
9145 H_PUT_32 (abfd, size, xnp->descsz);
9146 H_PUT_32 (abfd, type, xnp->type);
d4c88bbb
AM
9147 dest = xnp->name;
9148 if (name != NULL)
9149 {
9150 memcpy (dest, name, namesz);
9151 dest += namesz;
a39f3346 9152 while (namesz & 3)
d4c88bbb
AM
9153 {
9154 *dest++ = '\0';
a39f3346 9155 ++namesz;
d4c88bbb
AM
9156 }
9157 }
9158 memcpy (dest, input, size);
a39f3346
AM
9159 dest += size;
9160 while (size & 3)
9161 {
9162 *dest++ = '\0';
9163 ++size;
9164 }
9165 return buf;
7c76fa91
MS
9166}
9167
7c76fa91 9168char *
217aa764
AM
9169elfcore_write_prpsinfo (bfd *abfd,
9170 char *buf,
9171 int *bufsiz,
9172 const char *fname,
9173 const char *psargs)
7c76fa91 9174{
183e98be
AM
9175 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9176
9177 if (bed->elf_backend_write_core_note != NULL)
9178 {
9179 char *ret;
9180 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
9181 NT_PRPSINFO, fname, psargs);
9182 if (ret != NULL)
9183 return ret;
9184 }
7c76fa91 9185
1f20dca5 9186#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
183e98be
AM
9187#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
9188 if (bed->s->elfclass == ELFCLASS32)
9189 {
9190#if defined (HAVE_PSINFO32_T)
9191 psinfo32_t data;
9192 int note_type = NT_PSINFO;
9193#else
9194 prpsinfo32_t data;
9195 int note_type = NT_PRPSINFO;
9196#endif
9197
9198 memset (&data, 0, sizeof (data));
9199 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
9200 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
9201 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 9202 "CORE", note_type, &data, sizeof (data));
183e98be
AM
9203 }
9204 else
9205#endif
9206 {
7c76fa91 9207#if defined (HAVE_PSINFO_T)
183e98be
AM
9208 psinfo_t data;
9209 int note_type = NT_PSINFO;
7c76fa91 9210#else
183e98be
AM
9211 prpsinfo_t data;
9212 int note_type = NT_PRPSINFO;
7c76fa91
MS
9213#endif
9214
183e98be
AM
9215 memset (&data, 0, sizeof (data));
9216 strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
9217 strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
9218 return elfcore_write_note (abfd, buf, bufsiz,
1f20dca5 9219 "CORE", note_type, &data, sizeof (data));
183e98be 9220 }
7c76fa91
MS
9221#endif /* PSINFO_T or PRPSINFO_T */
9222
1f20dca5
UW
9223 free (buf);
9224 return NULL;
9225}
9226
70a38d42
SDJ
9227char *
9228elfcore_write_linux_prpsinfo32
9229 (bfd *abfd, char *buf, int *bufsiz,
9230 const struct elf_internal_linux_prpsinfo *prpsinfo)
9231{
9232 struct elf_external_linux_prpsinfo32 data;
9233
9234 memset (&data, 0, sizeof (data));
9235 LINUX_PRPSINFO32_SWAP_FIELDS (abfd, prpsinfo, data);
9236
9237 return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO,
9238 &data, sizeof (data));
9239}
9240
9241char *
9242elfcore_write_linux_prpsinfo64
9243 (bfd *abfd, char *buf, int *bufsiz,
9244 const struct elf_internal_linux_prpsinfo *prpsinfo)
9245{
9246 struct elf_external_linux_prpsinfo64 data;
9247
9248 memset (&data, 0, sizeof (data));
9249 LINUX_PRPSINFO64_SWAP_FIELDS (abfd, prpsinfo, data);
9250
9251 return elfcore_write_note (abfd, buf, bufsiz,
9252 "CORE", NT_PRPSINFO, &data, sizeof (data));
9253}
9254
7c76fa91 9255char *
217aa764
AM
9256elfcore_write_prstatus (bfd *abfd,
9257 char *buf,
9258 int *bufsiz,
9259 long pid,
9260 int cursig,
9261 const void *gregs)
7c76fa91 9262{
183e98be 9263 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 9264
183e98be
AM
9265 if (bed->elf_backend_write_core_note != NULL)
9266 {
9267 char *ret;
9268 ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
9269 NT_PRSTATUS,
9270 pid, cursig, gregs);
9271 if (ret != NULL)
9272 return ret;
9273 }
9274
1f20dca5 9275#if defined (HAVE_PRSTATUS_T)
183e98be
AM
9276#if defined (HAVE_PRSTATUS32_T)
9277 if (bed->s->elfclass == ELFCLASS32)
9278 {
9279 prstatus32_t prstat;
9280
9281 memset (&prstat, 0, sizeof (prstat));
9282 prstat.pr_pid = pid;
9283 prstat.pr_cursig = cursig;
9284 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 9285 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
9286 NT_PRSTATUS, &prstat, sizeof (prstat));
9287 }
9288 else
9289#endif
9290 {
9291 prstatus_t prstat;
9292
9293 memset (&prstat, 0, sizeof (prstat));
9294 prstat.pr_pid = pid;
9295 prstat.pr_cursig = cursig;
9296 memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
1f20dca5 9297 return elfcore_write_note (abfd, buf, bufsiz, "CORE",
183e98be
AM
9298 NT_PRSTATUS, &prstat, sizeof (prstat));
9299 }
7c76fa91
MS
9300#endif /* HAVE_PRSTATUS_T */
9301
1f20dca5
UW
9302 free (buf);
9303 return NULL;
9304}
9305
51316059
MS
9306#if defined (HAVE_LWPSTATUS_T)
9307char *
217aa764
AM
9308elfcore_write_lwpstatus (bfd *abfd,
9309 char *buf,
9310 int *bufsiz,
9311 long pid,
9312 int cursig,
9313 const void *gregs)
51316059
MS
9314{
9315 lwpstatus_t lwpstat;
183e98be 9316 const char *note_name = "CORE";
51316059
MS
9317
9318 memset (&lwpstat, 0, sizeof (lwpstat));
9319 lwpstat.pr_lwpid = pid >> 16;
9320 lwpstat.pr_cursig = cursig;
9321#if defined (HAVE_LWPSTATUS_T_PR_REG)
9322 memcpy (lwpstat.pr_reg, gregs, sizeof (lwpstat.pr_reg));
9323#elif defined (HAVE_LWPSTATUS_T_PR_CONTEXT)
9324#if !defined(gregs)
9325 memcpy (lwpstat.pr_context.uc_mcontext.gregs,
9326 gregs, sizeof (lwpstat.pr_context.uc_mcontext.gregs));
9327#else
9328 memcpy (lwpstat.pr_context.uc_mcontext.__gregs,
9329 gregs, sizeof (lwpstat.pr_context.uc_mcontext.__gregs));
9330#endif
9331#endif
47d9a591 9332 return elfcore_write_note (abfd, buf, bufsiz, note_name,
51316059
MS
9333 NT_LWPSTATUS, &lwpstat, sizeof (lwpstat));
9334}
9335#endif /* HAVE_LWPSTATUS_T */
9336
7c76fa91
MS
9337#if defined (HAVE_PSTATUS_T)
9338char *
217aa764
AM
9339elfcore_write_pstatus (bfd *abfd,
9340 char *buf,
9341 int *bufsiz,
9342 long pid,
6c10990d
NC
9343 int cursig ATTRIBUTE_UNUSED,
9344 const void *gregs ATTRIBUTE_UNUSED)
7c76fa91 9345{
183e98be
AM
9346 const char *note_name = "CORE";
9347#if defined (HAVE_PSTATUS32_T)
9348 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
7c76fa91 9349
183e98be
AM
9350 if (bed->s->elfclass == ELFCLASS32)
9351 {
9352 pstatus32_t pstat;
9353
9354 memset (&pstat, 0, sizeof (pstat));
9355 pstat.pr_pid = pid & 0xffff;
9356 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
9357 NT_PSTATUS, &pstat, sizeof (pstat));
9358 return buf;
9359 }
9360 else
9361#endif
9362 {
9363 pstatus_t pstat;
9364
9365 memset (&pstat, 0, sizeof (pstat));
9366 pstat.pr_pid = pid & 0xffff;
9367 buf = elfcore_write_note (abfd, buf, bufsiz, note_name,
9368 NT_PSTATUS, &pstat, sizeof (pstat));
9369 return buf;
9370 }
7c76fa91
MS
9371}
9372#endif /* HAVE_PSTATUS_T */
9373
9374char *
217aa764
AM
9375elfcore_write_prfpreg (bfd *abfd,
9376 char *buf,
9377 int *bufsiz,
9378 const void *fpregs,
9379 int size)
7c76fa91 9380{
183e98be 9381 const char *note_name = "CORE";
47d9a591 9382 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
9383 note_name, NT_FPREGSET, fpregs, size);
9384}
9385
9386char *
217aa764
AM
9387elfcore_write_prxfpreg (bfd *abfd,
9388 char *buf,
9389 int *bufsiz,
9390 const void *xfpregs,
9391 int size)
7c76fa91
MS
9392{
9393 char *note_name = "LINUX";
47d9a591 9394 return elfcore_write_note (abfd, buf, bufsiz,
7c76fa91
MS
9395 note_name, NT_PRXFPREG, xfpregs, size);
9396}
9397
4339cae0
L
9398char *
9399elfcore_write_xstatereg (bfd *abfd, char *buf, int *bufsiz,
9400 const void *xfpregs, int size)
9401{
9402 char *note_name = "LINUX";
9403 return elfcore_write_note (abfd, buf, bufsiz,
9404 note_name, NT_X86_XSTATE, xfpregs, size);
9405}
9406
97753bd5
AM
9407char *
9408elfcore_write_ppc_vmx (bfd *abfd,
9409 char *buf,
9410 int *bufsiz,
9411 const void *ppc_vmx,
9412 int size)
9413{
9414 char *note_name = "LINUX";
9415 return elfcore_write_note (abfd, buf, bufsiz,
9416 note_name, NT_PPC_VMX, ppc_vmx, size);
9417}
9418
89eeb0bc
LM
9419char *
9420elfcore_write_ppc_vsx (bfd *abfd,
9421 char *buf,
9422 int *bufsiz,
9423 const void *ppc_vsx,
9424 int size)
9425{
9426 char *note_name = "LINUX";
9427 return elfcore_write_note (abfd, buf, bufsiz,
9428 note_name, NT_PPC_VSX, ppc_vsx, size);
9429}
9430
0675e188
UW
9431static char *
9432elfcore_write_s390_high_gprs (bfd *abfd,
9433 char *buf,
9434 int *bufsiz,
9435 const void *s390_high_gprs,
9436 int size)
9437{
9438 char *note_name = "LINUX";
9439 return elfcore_write_note (abfd, buf, bufsiz,
9440 note_name, NT_S390_HIGH_GPRS,
9441 s390_high_gprs, size);
9442}
9443
d7eeb400
MS
9444char *
9445elfcore_write_s390_timer (bfd *abfd,
9446 char *buf,
9447 int *bufsiz,
9448 const void *s390_timer,
9449 int size)
9450{
9451 char *note_name = "LINUX";
9452 return elfcore_write_note (abfd, buf, bufsiz,
9453 note_name, NT_S390_TIMER, s390_timer, size);
9454}
9455
9456char *
9457elfcore_write_s390_todcmp (bfd *abfd,
9458 char *buf,
9459 int *bufsiz,
9460 const void *s390_todcmp,
9461 int size)
9462{
9463 char *note_name = "LINUX";
9464 return elfcore_write_note (abfd, buf, bufsiz,
9465 note_name, NT_S390_TODCMP, s390_todcmp, size);
9466}
9467
9468char *
9469elfcore_write_s390_todpreg (bfd *abfd,
9470 char *buf,
9471 int *bufsiz,
9472 const void *s390_todpreg,
9473 int size)
9474{
9475 char *note_name = "LINUX";
9476 return elfcore_write_note (abfd, buf, bufsiz,
9477 note_name, NT_S390_TODPREG, s390_todpreg, size);
9478}
9479
9480char *
9481elfcore_write_s390_ctrs (bfd *abfd,
9482 char *buf,
9483 int *bufsiz,
9484 const void *s390_ctrs,
9485 int size)
9486{
9487 char *note_name = "LINUX";
9488 return elfcore_write_note (abfd, buf, bufsiz,
9489 note_name, NT_S390_CTRS, s390_ctrs, size);
9490}
9491
9492char *
9493elfcore_write_s390_prefix (bfd *abfd,
9494 char *buf,
9495 int *bufsiz,
9496 const void *s390_prefix,
9497 int size)
9498{
9499 char *note_name = "LINUX";
9500 return elfcore_write_note (abfd, buf, bufsiz,
9501 note_name, NT_S390_PREFIX, s390_prefix, size);
9502}
9503
355b81d9
UW
9504char *
9505elfcore_write_s390_last_break (bfd *abfd,
9506 char *buf,
9507 int *bufsiz,
9508 const void *s390_last_break,
9509 int size)
9510{
9511 char *note_name = "LINUX";
9512 return elfcore_write_note (abfd, buf, bufsiz,
9513 note_name, NT_S390_LAST_BREAK,
9514 s390_last_break, size);
9515}
9516
9517char *
9518elfcore_write_s390_system_call (bfd *abfd,
9519 char *buf,
9520 int *bufsiz,
9521 const void *s390_system_call,
9522 int size)
9523{
9524 char *note_name = "LINUX";
9525 return elfcore_write_note (abfd, buf, bufsiz,
9526 note_name, NT_S390_SYSTEM_CALL,
9527 s390_system_call, size);
9528}
9529
abb3f6cc
NC
9530char *
9531elfcore_write_s390_tdb (bfd *abfd,
9532 char *buf,
9533 int *bufsiz,
9534 const void *s390_tdb,
9535 int size)
9536{
9537 char *note_name = "LINUX";
9538 return elfcore_write_note (abfd, buf, bufsiz,
9539 note_name, NT_S390_TDB, s390_tdb, size);
9540}
9541
faa9a424
UW
9542char *
9543elfcore_write_arm_vfp (bfd *abfd,
9544 char *buf,
9545 int *bufsiz,
9546 const void *arm_vfp,
9547 int size)
9548{
9549 char *note_name = "LINUX";
9550 return elfcore_write_note (abfd, buf, bufsiz,
9551 note_name, NT_ARM_VFP, arm_vfp, size);
9552}
9553
652451f8
YZ
9554char *
9555elfcore_write_aarch_tls (bfd *abfd,
9556 char *buf,
9557 int *bufsiz,
9558 const void *aarch_tls,
9559 int size)
9560{
9561 char *note_name = "LINUX";
9562 return elfcore_write_note (abfd, buf, bufsiz,
9563 note_name, NT_ARM_TLS, aarch_tls, size);
9564}
9565
9566char *
9567elfcore_write_aarch_hw_break (bfd *abfd,
9568 char *buf,
9569 int *bufsiz,
9570 const void *aarch_hw_break,
9571 int size)
9572{
9573 char *note_name = "LINUX";
9574 return elfcore_write_note (abfd, buf, bufsiz,
9575 note_name, NT_ARM_HW_BREAK, aarch_hw_break, size);
9576}
9577
9578char *
9579elfcore_write_aarch_hw_watch (bfd *abfd,
9580 char *buf,
9581 int *bufsiz,
9582 const void *aarch_hw_watch,
9583 int size)
9584{
9585 char *note_name = "LINUX";
9586 return elfcore_write_note (abfd, buf, bufsiz,
9587 note_name, NT_ARM_HW_WATCH, aarch_hw_watch, size);
9588}
9589
bb864ac1
CES
9590char *
9591elfcore_write_register_note (bfd *abfd,
9592 char *buf,
9593 int *bufsiz,
9594 const char *section,
9595 const void *data,
9596 int size)
9597{
9598 if (strcmp (section, ".reg2") == 0)
9599 return elfcore_write_prfpreg (abfd, buf, bufsiz, data, size);
9600 if (strcmp (section, ".reg-xfp") == 0)
9601 return elfcore_write_prxfpreg (abfd, buf, bufsiz, data, size);
4339cae0
L
9602 if (strcmp (section, ".reg-xstate") == 0)
9603 return elfcore_write_xstatereg (abfd, buf, bufsiz, data, size);
bb864ac1
CES
9604 if (strcmp (section, ".reg-ppc-vmx") == 0)
9605 return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
89eeb0bc
LM
9606 if (strcmp (section, ".reg-ppc-vsx") == 0)
9607 return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
0675e188
UW
9608 if (strcmp (section, ".reg-s390-high-gprs") == 0)
9609 return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
d7eeb400
MS
9610 if (strcmp (section, ".reg-s390-timer") == 0)
9611 return elfcore_write_s390_timer (abfd, buf, bufsiz, data, size);
9612 if (strcmp (section, ".reg-s390-todcmp") == 0)
9613 return elfcore_write_s390_todcmp (abfd, buf, bufsiz, data, size);
9614 if (strcmp (section, ".reg-s390-todpreg") == 0)
9615 return elfcore_write_s390_todpreg (abfd, buf, bufsiz, data, size);
9616 if (strcmp (section, ".reg-s390-ctrs") == 0)
9617 return elfcore_write_s390_ctrs (abfd, buf, bufsiz, data, size);
9618 if (strcmp (section, ".reg-s390-prefix") == 0)
9619 return elfcore_write_s390_prefix (abfd, buf, bufsiz, data, size);
355b81d9
UW
9620 if (strcmp (section, ".reg-s390-last-break") == 0)
9621 return elfcore_write_s390_last_break (abfd, buf, bufsiz, data, size);
9622 if (strcmp (section, ".reg-s390-system-call") == 0)
9623 return elfcore_write_s390_system_call (abfd, buf, bufsiz, data, size);
abb3f6cc
NC
9624 if (strcmp (section, ".reg-s390-tdb") == 0)
9625 return elfcore_write_s390_tdb (abfd, buf, bufsiz, data, size);
faa9a424
UW
9626 if (strcmp (section, ".reg-arm-vfp") == 0)
9627 return elfcore_write_arm_vfp (abfd, buf, bufsiz, data, size);
652451f8
YZ
9628 if (strcmp (section, ".reg-aarch-tls") == 0)
9629 return elfcore_write_aarch_tls (abfd, buf, bufsiz, data, size);
9630 if (strcmp (section, ".reg-aarch-hw-break") == 0)
9631 return elfcore_write_aarch_hw_break (abfd, buf, bufsiz, data, size);
9632 if (strcmp (section, ".reg-aarch-hw-watch") == 0)
9633 return elfcore_write_aarch_hw_watch (abfd, buf, bufsiz, data, size);
bb864ac1
CES
9634 return NULL;
9635}
9636
b34976b6 9637static bfd_boolean
718175fa 9638elf_parse_notes (bfd *abfd, char *buf, size_t size, file_ptr offset)
252b5132 9639{
c044fabd 9640 char *p;
252b5132 9641
252b5132
RH
9642 p = buf;
9643 while (p < buf + size)
9644 {
c044fabd
KH
9645 /* FIXME: bad alignment assumption. */
9646 Elf_External_Note *xnp = (Elf_External_Note *) p;
252b5132
RH
9647 Elf_Internal_Note in;
9648
baea7ef1
AM
9649 if (offsetof (Elf_External_Note, name) > buf - p + size)
9650 return FALSE;
9651
dc810e39 9652 in.type = H_GET_32 (abfd, xnp->type);
252b5132 9653
dc810e39 9654 in.namesz = H_GET_32 (abfd, xnp->namesz);
252b5132 9655 in.namedata = xnp->name;
baea7ef1
AM
9656 if (in.namesz > buf - in.namedata + size)
9657 return FALSE;
252b5132 9658
dc810e39 9659 in.descsz = H_GET_32 (abfd, xnp->descsz);
252b5132
RH
9660 in.descdata = in.namedata + BFD_ALIGN (in.namesz, 4);
9661 in.descpos = offset + (in.descdata - buf);
baea7ef1
AM
9662 if (in.descsz != 0
9663 && (in.descdata >= buf + size
9664 || in.descsz > buf - in.descdata + size))
9665 return FALSE;
252b5132 9666
718175fa
JK
9667 switch (bfd_get_format (abfd))
9668 {
9669 default:
9670 return TRUE;
9671
9672 case bfd_core:
9673 if (CONST_STRNEQ (in.namedata, "NetBSD-CORE"))
9674 {
9675 if (! elfcore_grok_netbsd_note (abfd, &in))
9676 return FALSE;
9677 }
67cc5033
MK
9678 else if (CONST_STRNEQ (in.namedata, "OpenBSD"))
9679 {
9680 if (! elfcore_grok_openbsd_note (abfd, &in))
9681 return FALSE;
9682 }
718175fa
JK
9683 else if (CONST_STRNEQ (in.namedata, "QNX"))
9684 {
9685 if (! elfcore_grok_nto_note (abfd, &in))
9686 return FALSE;
9687 }
b15fa79e
AM
9688 else if (CONST_STRNEQ (in.namedata, "SPU/"))
9689 {
9690 if (! elfcore_grok_spu_note (abfd, &in))
9691 return FALSE;
9692 }
718175fa
JK
9693 else
9694 {
9695 if (! elfcore_grok_note (abfd, &in))
9696 return FALSE;
9697 }
9698 break;
9699
9700 case bfd_object:
9701 if (in.namesz == sizeof "GNU" && strcmp (in.namedata, "GNU") == 0)
9702 {
9703 if (! elfobj_grok_gnu_note (abfd, &in))
9704 return FALSE;
9705 }
e21e5835
NC
9706 else if (in.namesz == sizeof "stapsdt"
9707 && strcmp (in.namedata, "stapsdt") == 0)
9708 {
9709 if (! elfobj_grok_stapsdt_note (abfd, &in))
9710 return FALSE;
9711 }
718175fa 9712 break;
08a40648 9713 }
252b5132
RH
9714
9715 p = in.descdata + BFD_ALIGN (in.descsz, 4);
9716 }
9717
718175fa
JK
9718 return TRUE;
9719}
9720
9721static bfd_boolean
9722elf_read_notes (bfd *abfd, file_ptr offset, bfd_size_type size)
9723{
9724 char *buf;
9725
9726 if (size <= 0)
9727 return TRUE;
9728
9729 if (bfd_seek (abfd, offset, SEEK_SET) != 0)
9730 return FALSE;
9731
a50b1753 9732 buf = (char *) bfd_malloc (size);
718175fa
JK
9733 if (buf == NULL)
9734 return FALSE;
9735
9736 if (bfd_bread (buf, size, abfd) != size
9737 || !elf_parse_notes (abfd, buf, size, offset))
9738 {
9739 free (buf);
9740 return FALSE;
9741 }
9742
252b5132 9743 free (buf);
b34976b6 9744 return TRUE;
252b5132 9745}
98d8431c
JB
9746\f
9747/* Providing external access to the ELF program header table. */
9748
9749/* Return an upper bound on the number of bytes required to store a
9750 copy of ABFD's program header table entries. Return -1 if an error
9751 occurs; bfd_get_error will return an appropriate code. */
c044fabd 9752
98d8431c 9753long
217aa764 9754bfd_get_elf_phdr_upper_bound (bfd *abfd)
98d8431c
JB
9755{
9756 if (abfd->xvec->flavour != bfd_target_elf_flavour)
9757 {
9758 bfd_set_error (bfd_error_wrong_format);
9759 return -1;
9760 }
9761
936e320b 9762 return elf_elfheader (abfd)->e_phnum * sizeof (Elf_Internal_Phdr);
98d8431c
JB
9763}
9764
98d8431c
JB
9765/* Copy ABFD's program header table entries to *PHDRS. The entries
9766 will be stored as an array of Elf_Internal_Phdr structures, as
9767 defined in include/elf/internal.h. To find out how large the
9768 buffer needs to be, call bfd_get_elf_phdr_upper_bound.
9769
9770 Return the number of program header table entries read, or -1 if an
9771 error occurs; bfd_get_error will return an appropriate code. */
c044fabd 9772
98d8431c 9773int
217aa764 9774bfd_get_elf_phdrs (bfd *abfd, void *phdrs)
98d8431c
JB
9775{
9776 int num_phdrs;
9777
9778 if (abfd->xvec->flavour != bfd_target_elf_flavour)
9779 {
9780 bfd_set_error (bfd_error_wrong_format);
9781 return -1;
9782 }
9783
9784 num_phdrs = elf_elfheader (abfd)->e_phnum;
c044fabd 9785 memcpy (phdrs, elf_tdata (abfd)->phdr,
98d8431c
JB
9786 num_phdrs * sizeof (Elf_Internal_Phdr));
9787
9788 return num_phdrs;
9789}
ae4221d7 9790
db6751f2 9791enum elf_reloc_type_class
7e612e98
AM
9792_bfd_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
9793 const asection *rel_sec ATTRIBUTE_UNUSED,
9794 const Elf_Internal_Rela *rela ATTRIBUTE_UNUSED)
db6751f2
JJ
9795{
9796 return reloc_class_normal;
9797}
f8df10f4 9798
47d9a591 9799/* For RELA architectures, return the relocation value for a
f8df10f4
JJ
9800 relocation against a local symbol. */
9801
9802bfd_vma
217aa764
AM
9803_bfd_elf_rela_local_sym (bfd *abfd,
9804 Elf_Internal_Sym *sym,
8517fae7 9805 asection **psec,
217aa764 9806 Elf_Internal_Rela *rel)
f8df10f4 9807{
8517fae7 9808 asection *sec = *psec;
f8df10f4
JJ
9809 bfd_vma relocation;
9810
9811 relocation = (sec->output_section->vma
9812 + sec->output_offset
9813 + sym->st_value);
9814 if ((sec->flags & SEC_MERGE)
c629eae0 9815 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
dbaa2011 9816 && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
f8df10f4 9817 {
f8df10f4 9818 rel->r_addend =
8517fae7 9819 _bfd_merged_section_offset (abfd, psec,
65765700 9820 elf_section_data (sec)->sec_info,
753731ee
AM
9821 sym->st_value + rel->r_addend);
9822 if (sec != *psec)
9823 {
9824 /* If we have changed the section, and our original section is
9825 marked with SEC_EXCLUDE, it means that the original
9826 SEC_MERGE section has been completely subsumed in some
9827 other SEC_MERGE section. In this case, we need to leave
9828 some info around for --emit-relocs. */
9829 if ((sec->flags & SEC_EXCLUDE) != 0)
9830 sec->kept_section = *psec;
9831 sec = *psec;
9832 }
8517fae7
AM
9833 rel->r_addend -= relocation;
9834 rel->r_addend += sec->output_section->vma + sec->output_offset;
f8df10f4
JJ
9835 }
9836 return relocation;
9837}
c629eae0
JJ
9838
9839bfd_vma
217aa764
AM
9840_bfd_elf_rel_local_sym (bfd *abfd,
9841 Elf_Internal_Sym *sym,
9842 asection **psec,
9843 bfd_vma addend)
47d9a591 9844{
c629eae0
JJ
9845 asection *sec = *psec;
9846
dbaa2011 9847 if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
c629eae0
JJ
9848 return sym->st_value + addend;
9849
9850 return _bfd_merged_section_offset (abfd, psec,
65765700 9851 elf_section_data (sec)->sec_info,
753731ee 9852 sym->st_value + addend);
c629eae0
JJ
9853}
9854
9855bfd_vma
217aa764 9856_bfd_elf_section_offset (bfd *abfd,
92e4ec35 9857 struct bfd_link_info *info,
217aa764
AM
9858 asection *sec,
9859 bfd_vma offset)
c629eae0 9860{
68bfbfcc 9861 switch (sec->sec_info_type)
65765700 9862 {
dbaa2011 9863 case SEC_INFO_TYPE_STABS:
eea6121a
AM
9864 return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
9865 offset);
dbaa2011 9866 case SEC_INFO_TYPE_EH_FRAME:
92e4ec35 9867 return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
65765700 9868 default:
310fd250
L
9869 if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
9870 {
9871 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9872 bfd_size_type address_size = bed->s->arch_size / 8;
9873 offset = sec->size - offset - address_size;
9874 }
65765700
JJ
9875 return offset;
9876 }
c629eae0 9877}
3333a7c3
RM
9878\f
9879/* Create a new BFD as if by bfd_openr. Rather than opening a file,
9880 reconstruct an ELF file by reading the segments out of remote memory
9881 based on the ELF file header at EHDR_VMA and the ELF program headers it
9882 points to. If not null, *LOADBASEP is filled in with the difference
9883 between the VMAs from which the segments were read, and the VMAs the
9884 file headers (and hence BFD's idea of each section's VMA) put them at.
9885
9886 The function TARGET_READ_MEMORY is called to copy LEN bytes from the
9887 remote memory at target address VMA into the local buffer at MYADDR; it
9888 should return zero on success or an `errno' code on failure. TEMPL must
9889 be a BFD for an ELF target with the word size and byte order found in
9890 the remote memory. */
9891
9892bfd *
217aa764
AM
9893bfd_elf_bfd_from_remote_memory
9894 (bfd *templ,
9895 bfd_vma ehdr_vma,
9896 bfd_vma *loadbasep,
fe78531d 9897 int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
3333a7c3
RM
9898{
9899 return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
9900 (templ, ehdr_vma, loadbasep, target_read_memory);
9901}
4c45e5c9
JJ
9902\f
9903long
c9727e01
AM
9904_bfd_elf_get_synthetic_symtab (bfd *abfd,
9905 long symcount ATTRIBUTE_UNUSED,
9906 asymbol **syms ATTRIBUTE_UNUSED,
8615f3f2 9907 long dynsymcount,
c9727e01
AM
9908 asymbol **dynsyms,
9909 asymbol **ret)
4c45e5c9
JJ
9910{
9911 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
9912 asection *relplt;
9913 asymbol *s;
9914 const char *relplt_name;
9915 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
9916 arelent *p;
9917 long count, i, n;
9918 size_t size;
9919 Elf_Internal_Shdr *hdr;
9920 char *names;
9921 asection *plt;
9922
8615f3f2
AM
9923 *ret = NULL;
9924
90e3cdf2
JJ
9925 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
9926 return 0;
9927
8615f3f2
AM
9928 if (dynsymcount <= 0)
9929 return 0;
9930
4c45e5c9
JJ
9931 if (!bed->plt_sym_val)
9932 return 0;
9933
9934 relplt_name = bed->relplt_name;
9935 if (relplt_name == NULL)
d35fd659 9936 relplt_name = bed->rela_plts_and_copies_p ? ".rela.plt" : ".rel.plt";
4c45e5c9
JJ
9937 relplt = bfd_get_section_by_name (abfd, relplt_name);
9938 if (relplt == NULL)
9939 return 0;
9940
9941 hdr = &elf_section_data (relplt)->this_hdr;
9942 if (hdr->sh_link != elf_dynsymtab (abfd)
9943 || (hdr->sh_type != SHT_REL && hdr->sh_type != SHT_RELA))
9944 return 0;
9945
9946 plt = bfd_get_section_by_name (abfd, ".plt");
9947 if (plt == NULL)
9948 return 0;
9949
9950 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
c9727e01 9951 if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
4c45e5c9
JJ
9952 return -1;
9953
eea6121a 9954 count = relplt->size / hdr->sh_entsize;
4c45e5c9
JJ
9955 size = count * sizeof (asymbol);
9956 p = relplt->relocation;
cb53bf42 9957 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
041de40d
AM
9958 {
9959 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
9960 if (p->addend != 0)
9961 {
9962#ifdef BFD64
9963 size += sizeof ("+0x") - 1 + 8 + 8 * (bed->s->elfclass == ELFCLASS64);
9964#else
9965 size += sizeof ("+0x") - 1 + 8;
9966#endif
9967 }
9968 }
4c45e5c9 9969
a50b1753 9970 s = *ret = (asymbol *) bfd_malloc (size);
4c45e5c9
JJ
9971 if (s == NULL)
9972 return -1;
9973
9974 names = (char *) (s + count);
9975 p = relplt->relocation;
9976 n = 0;
cb53bf42 9977 for (i = 0; i < count; i++, p += bed->s->int_rels_per_ext_rel)
4c45e5c9
JJ
9978 {
9979 size_t len;
9980 bfd_vma addr;
9981
9982 addr = bed->plt_sym_val (i, plt, p);
9983 if (addr == (bfd_vma) -1)
9984 continue;
9985
9986 *s = **p->sym_ptr_ptr;
65a7a66f
AM
9987 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
9988 we are defining a symbol, ensure one of them is set. */
9989 if ((s->flags & BSF_LOCAL) == 0)
9990 s->flags |= BSF_GLOBAL;
6ba2a415 9991 s->flags |= BSF_SYNTHETIC;
4c45e5c9
JJ
9992 s->section = plt;
9993 s->value = addr - plt->vma;
9994 s->name = names;
8f39ba8e 9995 s->udata.p = NULL;
4c45e5c9
JJ
9996 len = strlen ((*p->sym_ptr_ptr)->name);
9997 memcpy (names, (*p->sym_ptr_ptr)->name, len);
9998 names += len;
041de40d
AM
9999 if (p->addend != 0)
10000 {
1d770845 10001 char buf[30], *a;
d324f6d6 10002
041de40d
AM
10003 memcpy (names, "+0x", sizeof ("+0x") - 1);
10004 names += sizeof ("+0x") - 1;
1d770845
L
10005 bfd_sprintf_vma (abfd, buf, p->addend);
10006 for (a = buf; *a == '0'; ++a)
10007 ;
10008 len = strlen (a);
10009 memcpy (names, a, len);
10010 names += len;
041de40d 10011 }
4c45e5c9
JJ
10012 memcpy (names, "@plt", sizeof ("@plt"));
10013 names += sizeof ("@plt");
8f39ba8e 10014 ++s, ++n;
4c45e5c9
JJ
10015 }
10016
10017 return n;
10018}
3d7f7666 10019
3b22753a
L
10020/* It is only used by x86-64 so far. */
10021asection _bfd_elf_large_com_section
10022 = BFD_FAKE_SECTION (_bfd_elf_large_com_section,
f592407e 10023 SEC_IS_COMMON, NULL, "LARGE_COMMON", 0);
ecca9871 10024
d1036acb 10025void
78245035
L
10026_bfd_elf_post_process_headers (bfd * abfd,
10027 struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
d1036acb
L
10028{
10029 Elf_Internal_Ehdr * i_ehdrp; /* ELF file header, internal form. */
10030
10031 i_ehdrp = elf_elfheader (abfd);
10032
10033 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
d8045f23
NC
10034
10035 /* To make things simpler for the loader on Linux systems we set the
9c55345c 10036 osabi field to ELFOSABI_GNU if the binary contains symbols of
f64b2e8d 10037 the STT_GNU_IFUNC type or STB_GNU_UNIQUE binding. */
d8045f23 10038 if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE
f64b2e8d 10039 && elf_tdata (abfd)->has_gnu_symbols)
9c55345c 10040 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_GNU;
d1036acb 10041}
fcb93ecf
PB
10042
10043
10044/* Return TRUE for ELF symbol types that represent functions.
10045 This is the default version of this function, which is sufficient for
d8045f23 10046 most targets. It returns true if TYPE is STT_FUNC or STT_GNU_IFUNC. */
fcb93ecf
PB
10047
10048bfd_boolean
10049_bfd_elf_is_function_type (unsigned int type)
10050{
d8045f23
NC
10051 return (type == STT_FUNC
10052 || type == STT_GNU_IFUNC);
fcb93ecf 10053}
9f296da3 10054
aef36ac1
AM
10055/* If the ELF symbol SYM might be a function in SEC, return the
10056 function size and set *CODE_OFF to the function's entry point,
10057 otherwise return zero. */
9f296da3 10058
aef36ac1
AM
10059bfd_size_type
10060_bfd_elf_maybe_function_sym (const asymbol *sym, asection *sec,
10061 bfd_vma *code_off)
9f296da3 10062{
aef36ac1
AM
10063 bfd_size_type size;
10064
ff9e0f5b 10065 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
aef36ac1
AM
10066 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0
10067 || sym->section != sec)
10068 return 0;
ff9e0f5b 10069
ff9e0f5b 10070 *code_off = sym->value;
aef36ac1
AM
10071 size = 0;
10072 if (!(sym->flags & BSF_SYNTHETIC))
10073 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
10074 if (size == 0)
10075 size = 1;
10076 return size;
9f296da3 10077}
This page took 1.64684 seconds and 4 git commands to generate.